diff --git a/app/Actions/GenerateRandomSlug.php b/app/Actions/GenerateRandomSlug.php new file mode 100644 index 0000000..5e8f687 --- /dev/null +++ b/app/Actions/GenerateRandomSlug.php @@ -0,0 +1,22 @@ + new HetznerService(), + default => null, + }; + } +} diff --git a/app/Data/ServerProviders/CreatedServer.php b/app/Data/ServerProviders/CreatedServer.php new file mode 100644 index 0000000..b08c273 --- /dev/null +++ b/app/Data/ServerProviders/CreatedServer.php @@ -0,0 +1,15 @@ +route('organisation')); + return inertia('servers/Index', [ 'servers' => $organisation->servers()->paginate(30), ]); } + + public function create(Request $request) + { + $locations = null; + $serverTypes = null; + $images = null; + + if ($request->has('provider')) { + $providerService = app(GetProviderService::class)->execute($request->provider); + + if ($providerService) { + $locations = Cache::remember($request->provider . '.locations', now()->addHour(), function () use ($providerService) { + return $providerService->getLocations(); + }); + $serverTypes = Cache::remember($request->provider . '.serverTypes', now()->addHour(), function () use ($providerService) { + return $providerService->getServerTypes(); + }); + $images = Cache::remember($request->provider . '.images', now()->addHour(), function () use ($providerService) { + return $providerService->getImages(); + }); + } + } + + return inertia('servers/Create', [ + 'locations' => $locations, + 'serverTypes' => $serverTypes, + 'images' => $images, + ]); + } + + public function store(Request $request) + { + $rootPassword = Str::random(32); + $providerService = app(GetProviderService::class)->execute($request->provider); + + if (!$providerService) { + return back()->with('error', 'Invalid provider'); + } + + $createdServer = $providerService->createServer( + name: app(GenerateRandomSlug::class)->execute(), // @todo allow custom name + serverType: $request->server_type, + location: $request->location, + image: $request->image, + rootPassword: $rootPassword, + ); + + $organisation = Organisation::findOrFail($request->route('organisation')); + + $server = $organisation->servers()->create([ + 'name' => $createdServer->name, + 'provider' => ServerProvider::tryFrom($request->provider), + 'provider_id' => $createdServer->id, + 'ipv4' => $createdServer->ipv4, + 'ipv6' => $createdServer->ipv6, + 'provider_status' => $createdServer->status, + 'status' => ServerStatus::PENDING, + 'region' => $request->location, + 'os' => $request->image, + 'plan' => $request->server_type, + 'user' => '', + ]); + + return redirect()->route('servers.show', ['organisation' => $organisation->id, 'server' => $server->id]); + } + + public function show(Request $request) + { + $organisation = Organisation::findOrFail($request->route('organisation')); + $server = $organisation->servers()->findOrFail($request->route('server')); + + return inertia('servers/Show', [ + 'server' => $server, + ]); + } } diff --git a/app/Http/Integrations/Requests/Hetzner/Images/ListImagesRequest.php b/app/Http/Integrations/Requests/Hetzner/Images/GetImagesRequest.php similarity index 95% rename from app/Http/Integrations/Requests/Hetzner/Images/ListImagesRequest.php rename to app/Http/Integrations/Requests/Hetzner/Images/GetImagesRequest.php index 11b3cea..530ff7e 100644 --- a/app/Http/Integrations/Requests/Hetzner/Images/ListImagesRequest.php +++ b/app/Http/Integrations/Requests/Hetzner/Images/GetImagesRequest.php @@ -6,7 +6,7 @@ use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Traits\Body\HasJsonBody; -class ListImagesRequest extends Request +class GetImagesRequest extends Request { protected Method $method = Method::GET; diff --git a/app/Http/Integrations/Requests/Hetzner/Locations/ListLocationsRequest.php b/app/Http/Integrations/Requests/Hetzner/Locations/GetLocationsRequest.php similarity index 85% rename from app/Http/Integrations/Requests/Hetzner/Locations/ListLocationsRequest.php rename to app/Http/Integrations/Requests/Hetzner/Locations/GetLocationsRequest.php index 32a581a..674ab77 100644 --- a/app/Http/Integrations/Requests/Hetzner/Locations/ListLocationsRequest.php +++ b/app/Http/Integrations/Requests/Hetzner/Locations/GetLocationsRequest.php @@ -5,7 +5,7 @@ namespace App\Http\Integrations\Requests\Hetzner\Locations; use Saloon\Enums\Method; use Saloon\Http\Request; -class ListLocationsRequest extends Request +class GetLocationsRequest extends Request { protected Method $method = Method::GET; diff --git a/app/Http/Integrations/Requests/Hetzner/ServerTypes/ListServerTypesRequest.php b/app/Http/Integrations/Requests/Hetzner/ServerTypes/GetServerTypesRequest.php similarity index 85% rename from app/Http/Integrations/Requests/Hetzner/ServerTypes/ListServerTypesRequest.php rename to app/Http/Integrations/Requests/Hetzner/ServerTypes/GetServerTypesRequest.php index d09aaa9..f6f93d5 100644 --- a/app/Http/Integrations/Requests/Hetzner/ServerTypes/ListServerTypesRequest.php +++ b/app/Http/Integrations/Requests/Hetzner/ServerTypes/GetServerTypesRequest.php @@ -5,7 +5,7 @@ namespace App\Http\Integrations\Requests\Hetzner\ServerTypes; use Saloon\Enums\Method; use Saloon\Http\Request; -class ListServerTypesRequest extends Request +class GetServerTypesRequest extends Request { protected Method $method = Method::GET; diff --git a/app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php b/app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php index cdc1f83..3c85401 100644 --- a/app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php +++ b/app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php @@ -18,6 +18,7 @@ class CreateServerRequest extends Request implements HasBody protected ?string $name = null, protected ?string $serverType = null, protected ?string $location = null, + protected ?string $rootPassword = null, ) {} protected function defaultBody(): array @@ -27,6 +28,7 @@ class CreateServerRequest extends Request implements HasBody 'name' => $this->name, 'server_type' => $this->serverType, 'location' => $this->location, + 'root_password' => $this->rootPassword, ]; } diff --git a/app/Services/ServerProviders/HetznerService.php b/app/Services/ServerProviders/HetznerService.php index 4e1ac9d..6a5d2c9 100644 --- a/app/Services/ServerProviders/HetznerService.php +++ b/app/Services/ServerProviders/HetznerService.php @@ -2,17 +2,19 @@ namespace App\Services\ServerProviders; +use App\Data\ServerProviders\CreatedServer; use App\Data\ServerProviders\Image; use App\Data\ServerProviders\Location; use App\Data\ServerProviders\ServerType; use App\Http\Integrations\Connectors\HetznerConnector; -use App\Http\Integrations\Requests\Hetzner\Images\ListImagesRequest; -use App\Http\Integrations\Requests\Hetzner\Locations\ListLocationsRequest; -use App\Http\Integrations\Requests\Hetzner\ServerTypes\ListServerTypesRequest; +use App\Http\Integrations\Requests\Hetzner\Images\GetImagesRequest; +use App\Http\Integrations\Requests\Hetzner\Locations\GetLocationsRequest; +use App\Http\Integrations\Requests\Hetzner\Servers\CreateServerRequest; +use App\Http\Integrations\Requests\Hetzner\ServerTypes\GetServerTypesRequest; use Exception; use Illuminate\Support\Collection; -class HetznerService implements ServerProviderService +class HetznerService extends ServerProviderService { public function __construct() { @@ -24,13 +26,33 @@ class HetznerService implements ServerProviderService string $serverType, string $location, string $image, - ): bool { - return false; + string $rootPassword, + ): CreatedServer { + $response = $this->connector->send(new CreateServerRequest( + image: $image, + name: $name, + serverType: $serverType, + location: $location, + rootPassword: $rootPassword, + )); + + if ($response->status() !== 201) { + throw new Exception('Failed to create server on Hetzner'); + } + + return new CreatedServer( + id: $response->json('server.id'), + name: $name, + rootPassword: $rootPassword, + status: $response->json('server.status')['status'], + ipv4: $response->json('server.public_net.ipv4.ip'), + ipv6: $response->json('server.public_net.ipv6.ip'), + ); } - public function listServerTypes(): Collection + public function getServerTypes(): Collection { - $response = $this->connector->send(new ListServerTypesRequest); + $response = $this->connector->send(new GetServerTypesRequest); if ($response->status() !== 200) { throw new Exception('Failed to fetch server types from Hetzner'); @@ -41,17 +63,17 @@ class HetznerService implements ServerProviderService id: $serverType['id'], name: $serverType['name'], cores: $serverType['cores'], - memory: $serverType['memory'] * 1024, + memory: $serverType['memory'], disk: $serverType['disk'], priceMonthly: $serverType['prices'][0]['monthly']['gross'] ?? 0, priceHourly: $serverType['prices'][0]['hourly']['gross'] ?? 0, ); - }); + })->values(); } - public function listLocations(): Collection + public function getLocations(): Collection { - $response = $this->connector->send(new ListLocationsRequest); + $response = $this->connector->send(new GetLocationsRequest); if ($response->status() !== 200) { throw new Exception('Failed to fetch locations from Hetzner'); @@ -64,12 +86,12 @@ class HetznerService implements ServerProviderService country: $location['country'], city: $location['city'], ); - }); + })->values(); } - public function listImages(): Collection + public function getImages(): Collection { - $response = $this->connector->send(new ListImagesRequest( + $response = $this->connector->send(new GetImagesRequest( architecture: 'x86', )); @@ -84,6 +106,6 @@ class HetznerService implements ServerProviderService osFlavor: $image['os_flavor'], osVersion: $image['os_version'], ); - }); + })->values(); } } diff --git a/app/Services/ServerProviders/ServerProviderService.php b/app/Services/ServerProviders/ServerProviderService.php index 93297b7..c55e785 100644 --- a/app/Services/ServerProviders/ServerProviderService.php +++ b/app/Services/ServerProviders/ServerProviderService.php @@ -2,23 +2,25 @@ namespace App\Services\ServerProviders; +use App\Data\ServerProviders\CreatedServer; use Illuminate\Support\Collection; use Saloon\Http\Connector; -interface ServerProviderService +abstract class ServerProviderService { protected Connector $connector; - public function createServer( + abstract public function createServer( string $name, string $serverType, string $location, string $image, - ): bool; + string $rootPassword, + ): CreatedServer; - public function listServerTypes(): Collection; + abstract public function getServerTypes(): Collection; - public function listLocations(): Collection; + abstract public function getLocations(): Collection; - public function listImages(): Collection; + abstract public function getImages(): Collection; } \ No newline at end of file diff --git a/resources/js/components/RadioButton.vue b/resources/js/components/RadioButton.vue new file mode 100644 index 0000000..fbbb8a5 --- /dev/null +++ b/resources/js/components/RadioButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/resources/js/pages/servers/Create.vue b/resources/js/pages/servers/Create.vue index 7ff64db..bec2988 100644 --- a/resources/js/pages/servers/Create.vue +++ b/resources/js/pages/servers/Create.vue @@ -1,6 +1,51 @@ - diff --git a/resources/text/english-adjectives.txt b/resources/text/english-adjectives.txt new file mode 100644 index 0000000..a7ecef9 --- /dev/null +++ b/resources/text/english-adjectives.txt @@ -0,0 +1,1347 @@ +abandoned +able +absolute +adorable +adventurous +academic +acceptable +acclaimed +accomplished +accurate +aching +acidic +acrobatic +active +actual +adept +admirable +admired +adolescent +adorable +adored +advanced +afraid +affectionate +aged +aggravating +aggressive +agile +agitated +agonizing +agreeable +ajar +alarmed +alarming +alert +alienated +alive +all +altruistic +amazing +ambitious +ample +amused +amusing +anchored +ancient +angelic +angry +anguished +animated +annual +another +antique +anxious +any +apprehensive +appropriate +apt +arctic +arid +aromatic +artistic +ashamed +assured +astonishing +athletic +attached +attentive +attractive +austere +authentic +authorized +automatic +avaricious +average +aware +awesome +awful +awkward +babyish +bad +back +baggy +bare +barren +basic +beautiful +belated +beloved +beneficial +better +best +bewitched +big +big-hearted +biodegradable +bite-sized +bitter +black +black-and-white +bland +blank +blaring +bleak +blind +blissful +blond +blue +blushing +bogus +boiling +bold +bony +boring +bossy +both +bouncy +bountiful +bowed +brave +breakable +brief +bright +brilliant +brisk +broken +bronze +brown +bruised +bubbly +bulky +bumpy +buoyant +burdensome +burly +bustling +busy +buttery +buzzing +calculating +calm +candid +canine +capital +carefree +careful +careless +caring +cautious +cavernous +celebrated +charming +cheap +cheerful +cheery +chief +chilly +chubby +circular +classic +clean +clear +clear-cut +clever +close +closed +cloudy +clueless +clumsy +cluttered +coarse +cold +colorful +colorless +colossal +comfortable +common +compassionate +competent +complete +complex +complicated +composed +concerned +concrete +confused +conscious +considerate +constant +content +conventional +cooked +cool +cooperative +coordinated +corny +corrupt +costly +courageous +courteous +crafty +crazy +creamy +creative +creepy +criminal +crisp +critical +crooked +crowded +cruel +crushing +cuddly +cultivated +cultured +cumbersome +curly +curvy +cute +cylindrical +damaged +damp +dangerous +dapper +daring +darling +dark +dazzling +dead +deadly +deafening +dear +dearest +decent +decimal +decisive +deep +defenseless +defensive +defiant +deficient +definite +definitive +delayed +delectable +delicious +delightful +delirious +demanding +dense +dental +dependable +dependent +descriptive +deserted +detailed +determined +devoted +different +difficult +digital +diligent +dim +dimpled +dimwitted +direct +disastrous +discrete +disfigured +disgusting +disloyal +dismal +distant +downright +dreary +dirty +disguised +dishonest +dismal +distant +distinct +distorted +dizzy +dopey +doting +double +downright +drab +drafty +dramatic +dreary +droopy +dry +dual +dull +dutiful +each +eager +earnest +early +easy +easy-going +ecstatic +edible +educated +elaborate +elastic +elated +elderly +electric +elegant +elementary +elliptical +embarrassed +embellished +eminent +emotional +empty +enchanted +enchanting +energetic +enlightened +enormous +enraged +entire +envious +equal +equatorial +essential +esteemed +ethical +euphoric +even +evergreen +everlasting +every +evil +exalted +excellent +exemplary +exhausted +excitable +excited +exciting +exotic +expensive +experienced +expert +extraneous +extroverted +extra-large +extra-small +fabulous +failing +faint +fair +faithful +fake +false +familiar +famous +fancy +fantastic +far +faraway +far-flung +far-off +fast +fat +fatal +fatherly +favorable +favorite +fearful +fearless +feisty +feline +female +feminine +few +fickle +filthy +fine +finished +firm +first +firsthand +fitting +fixed +flaky +flamboyant +flashy +flat +flawed +flawless +flickering +flimsy +flippant +flowery +fluffy +fluid +flustered +focused +fond +foolhardy +foolish +forceful +forked +formal +forsaken +forthright +fortunate +fragrant +frail +frank +frayed +free +French +fresh +frequent +friendly +frightened +frightening +frigid +frilly +frizzy +frivolous +front +frosty +frozen +frugal +fruitful +full +fumbling +functional +funny +fussy +fuzzy +gargantuan +gaseous +general +generous +gentle +genuine +giant +giddy +gigantic +gifted +giving +glamorous +glaring +glass +gleaming +gleeful +glistening +glittering +gloomy +glorious +glossy +glum +golden +good +good-natured +gorgeous +graceful +gracious +grand +grandiose +granular +grateful +grave +gray +great +greedy +green +gregarious +grim +grimy +gripping +grizzled +gross +grotesque +grouchy +grounded +growing +growling +grown +grubby +gruesome +grumpy +guilty +gullible +gummy +hairy +half +handmade +handsome +handy +happy +happy-go-lucky +hard +hard-to-find +harmful +harmless +harmonious +harsh +hasty +hateful +haunting +healthy +heartfelt +hearty +heavenly +heavy +hefty +helpful +helpless +hidden +hideous +high +high-level +hilarious +hoarse +hollow +homely +honest +honorable +honored +hopeful +horrible +hospitable +hot +huge +humble +humiliating +humming +humongous +hungry +hurtful +husky +icky +icy +ideal +idealistic +identical +idle +idiotic +idolized +ignorant +ill +illegal +ill-fated +ill-informed +illiterate +illustrious +imaginary +imaginative +immaculate +immaterial +immediate +immense +impassioned +impeccable +impartial +imperfect +imperturbable +impish +impolite +important +impossible +impractical +impressionable +impressive +improbable +impure +inborn +incomparable +incompatible +incomplete +inconsequential +incredible +indelible +inexperienced +indolent +infamous +infantile +infatuated +inferior +infinite +informal +innocent +insecure +insidious +insignificant +insistent +instructive +insubstantial +intelligent +intent +intentional +interesting +internal +international +intrepid +ironclad +irresponsible +irritating +itchy +jaded +jagged +jam-packed +jaunty +jealous +jittery +joint +jolly +jovial +joyful +joyous +jubilant +judicious +juicy +jumbo +junior +jumpy +juvenile +kaleidoscopic +keen +key +kind +kindhearted +kindly +klutzy +knobby +knotty +knowledgeable +knowing +known +kooky +kosher +lame +lanky +large +last +lasting +late +lavish +lawful +lazy +leading +lean +leafy +left +legal +legitimate +light +lighthearted +likable +likely +limited +limp +limping +linear +lined +liquid +little +live +lively +livid +loathsome +lone +lonely +long +long-term +loose +lopsided +lost +loud +lovable +lovely +loving +low +loyal +lucky +lumbering +luminous +lumpy +lustrous +luxurious +mad +made-up +magnificent +majestic +major +male +mammoth +married +marvelous +masculine +massive +mature +meager +mealy +mean +measly +meaty +medical +mediocre +medium +meek +mellow +melodic +memorable +menacing +merry +messy +metallic +mild +milky +mindless +miniature +minor +minty +miserable +miserly +misguided +misty +mixed +modern +modest +moist +monstrous +monthly +monumental +moral +mortified +motherly +motionless +mountainous +muddy +muffled +multicolored +mundane +murky +mushy +musty +muted +mysterious +naive +narrow +nasty +natural +naughty +nautical +near +neat +necessary +needy +negative +neglected +negligible +neighboring +nervous +new +next +nice +nifty +nimble +nippy +nocturnal +noisy +nonstop +normal +notable +noted +noteworthy +novel +noxious +numb +nutritious +nutty +obedient +obese +oblong +oily +oblong +obvious +occasional +odd +oddball +offbeat +offensive +official +old +old-fashioned +only +open +optimal +optimistic +opulent +orange +orderly +organic +ornate +ornery +ordinary +original +other +our +outlying +outgoing +outlandish +outrageous +outstanding +oval +overcooked +overdue +overjoyed +overlooked +palatable +pale +paltry +parallel +parched +partial +passionate +past +pastel +peaceful +peppery +perfect +perfumed +periodic +perky +personal +pertinent +pesky +pessimistic +petty +phony +physical +piercing +pink +pitiful +plain +plaintive +plastic +playful +pleasant +pleased +pleasing +plump +plush +polished +polite +political +pointed +pointless +poised +poor +popular +portly +posh +positive +possible +potable +powerful +powerless +practical +precious +present +prestigious +pretty +precious +previous +pricey +prickly +primary +prime +pristine +private +prize +probable +productive +profitable +profuse +proper +proud +prudent +punctual +pungent +puny +pure +purple +pushy +putrid +puzzled +puzzling +quaint +qualified +quarrelsome +quarterly +queasy +querulous +questionable +quick +quick-witted +quiet +quintessential +quirky +quixotic +quizzical +radiant +ragged +rapid +rare +rash +raw +recent +reckless +rectangular +ready +real +realistic +reasonable +red +reflecting +regal +regular +reliable +relieved +remarkable +remorseful +remote +repentant +required +respectful +responsible +repulsive +revolving +rewarding +rich +rigid +right +ringed +ripe +roasted +robust +rosy +rotating +rotten +rough +round +rowdy +royal +rubbery +rundown +ruddy +rude +runny +rural +rusty +sad +safe +salty +same +sandy +sane +sarcastic +sardonic +satisfied +scaly +scarce +scared +scary +scented +scholarly +scientific +scornful +scratchy +scrawny +second +secondary +second-hand +secret +self-assured +self-reliant +selfish +sentimental +separate +serene +serious +serpentine +several +severe +shabby +shadowy +shady +shallow +shameful +shameless +sharp +shimmering +shiny +shocked +shocking +shoddy +short +short-term +showy +shrill +shy +sick +silent +silky +silly +silver +similar +simple +simplistic +sinful +single +sizzling +skeletal +skinny +sleepy +slight +slim +slimy +slippery +slow +slushy +small +smart +smoggy +smooth +smug +snappy +snarling +sneaky +sniveling +snoopy +sociable +soft +soggy +solid +somber +some +spherical +sophisticated +sore +sorrowful +soulful +soupy +sour +Spanish +sparkling +sparse +specific +spectacular +speedy +spicy +spiffy +spirited +spiteful +splendid +spotless +spotted +spry +square +squeaky +squiggly +stable +staid +stained +stale +standard +starchy +stark +starry +steep +sticky +stiff +stimulating +stingy +stormy +straight +strange +steel +strict +strident +striking +striped +strong +studious +stunning +stupendous +stupid +sturdy +stylish +subdued +submissive +substantial +subtle +suburban +sudden +sugary +sunny +super +superb +superficial +superior +supportive +sure-footed +surprised +suspicious +svelte +sweaty +sweet +sweltering +swift +sympathetic +tall +talkative +tame +tan +tangible +tart +tasty +tattered +taut +tedious +teeming +tempting +tender +tense +tepid +terrible +terrific +testy +thankful +that +these +thick +thin +third +thirsty +this +thorough +thorny +those +thoughtful +threadbare +thrifty +thunderous +tidy +tight +timely +tinted +tiny +tired +torn +total +tough +traumatic +treasured +tremendous +tragic +trained +tremendous +triangular +tricky +trifling +trim +trivial +troubled +true +trusting +trustworthy +trusty +truthful +tubby +turbulent +twin +ugly +ultimate +unacceptable +unaware +uncomfortable +uncommon +unconscious +understated +unequaled +uneven +unfinished +unfit +unfolded +unfortunate +unhappy +unhealthy +uniform +unimportant +unique +united +unkempt +unknown +unlawful +unlined +unlucky +unnatural +unpleasant +unrealistic +unripe +unruly +unselfish +unsightly +unsteady +unsung +untidy +untimely +untried +untrue +unused +unusual +unwelcome +unwieldy +unwilling +unwitting +unwritten +upbeat +upright +upset +urban +usable +used +useful +useless +utilized +utter +vacant +vague +vain +valid +valuable +vapid +variable +vast +velvety +venerated +vengeful +verifiable +vibrant +vicious +victorious +vigilant +vigorous +villainous +violet +violent +virtual +virtuous +visible +vital +vivacious +vivid +voluminous +wan +warlike +warm +warmhearted +warped +wary +wasteful +watchful +waterlogged +watery +wavy +wealthy +weak +weary +webbed +wee +weekly +weepy +weighty +weird +welcome +well-documented +well-groomed +well-informed +well-lit +well-made +well-off +well-to-do +well-worn +wet +which +whimsical +whirlwind +whispered +white +whole +whopping +wicked +wide +wide-eyed +wiggly +wild +willing +wilted +winding +windy +winged +wiry +wise +witty +wobbly +woeful +wonderful +wooden +woozy +wordy +worldly +worn +worried +worrisome +worse +worst +worthless +worthwhile +worthy +wrathful +wretched +writhing +wrong +wry +yawning +yearly +yellow +yellowish +young +youthful +yummy +zany +zealous +zesty +zigzag diff --git a/resources/text/english-nouns.txt b/resources/text/english-nouns.txt new file mode 100644 index 0000000..672484c --- /dev/null +++ b/resources/text/english-nouns.txt @@ -0,0 +1,1525 @@ +people +history +way +art +world +information +map +two +family +government +health +system +computer +meat +year +thanks +music +person +reading +method +data +food +understanding +theory +law +bird +literature +problem +software +control +knowledge +power +ability +economics +love +internet +television +science +library +nature +fact +product +idea +temperature +investment +area +society +activity +story +industry +media +thing +oven +community +definition +safety +quality +development +language +management +player +variety +video +week +security +country +exam +movie +organization +equipment +physics +analysis +policy +series +thought +basis +boyfriend +direction +strategy +technology +army +camera +freedom +paper +environment +child +instance +month +truth +marketing +university +writing +article +department +difference +goal +news +audience +fishing +growth +income +marriage +user +combination +failure +meaning +medicine +philosophy +teacher +communication +night +chemistry +disease +disk +energy +nation +road +role +soup +advertising +location +success +addition +apartment +education +math +moment +painting +politics +attention +decision +event +property +shopping +student +wood +competition +distribution +entertainment +office +population +president +unit +category +cigarette +context +introduction +opportunity +performance +driver +flight +length +magazine +newspaper +relationship +teaching +cell +dealer +finding +lake +member +message +phone +scene +appearance +association +concept +customer +death +discussion +housing +inflation +insurance +mood +woman +advice +blood +effort +expression +importance +opinion +payment +reality +responsibility +situation +skill +statement +wealth +application +city +county +depth +estate +foundation +grandmother +heart +perspective +photo +recipe +studio +topic +collection +depression +imagination +passion +percentage +resource +setting +ad +agency +college +connection +criticism +debt +description +memory +patience +secretary +solution +administration +aspect +attitude +director +personality +psychology +recommendation +response +selection +storage +version +alcohol +argument +complaint +contract +emphasis +highway +loss +membership +possession +preparation +steak +union +agreement +cancer +currency +employment +engineering +entry +interaction +mixture +preference +region +republic +tradition +virus +actor +classroom +delivery +device +difficulty +drama +election +engine +football +guidance +hotel +owner +priority +protection +suggestion +tension +variation +anxiety +atmosphere +awareness +bath +bread +candidate +climate +comparison +confusion +construction +elevator +emotion +employee +employer +guest +height +leadership +mall +manager +operation +recording +sample +transportation +charity +cousin +disaster +editor +efficiency +excitement +extent +feedback +guitar +homework +leader +mom +outcome +permission +presentation +promotion +reflection +refrigerator +resolution +revenue +session +singer +tennis +basket +bonus +cabinet +childhood +church +clothes +coffee +dinner +drawing +hair +hearing +initiative +judgment +lab +measurement +mode +mud +orange +poetry +police +possibility +procedure +queen +ratio +relation +restaurant +satisfaction +sector +signature +significance +song +tooth +town +vehicle +volume +wife +accident +airport +appointment +arrival +assumption +baseball +chapter +committee +conversation +database +enthusiasm +error +explanation +farmer +gate +girl +hall +historian +hospital +injury +instruction +maintenance +manufacturer +meal +perception +pie +poem +presence +proposal +reception +replacement +revolution +river +son +speech +tea +village +warning +winner +worker +writer +assistance +breath +buyer +chest +chocolate +conclusion +contribution +cookie +courage +dad +desk +drawer +establishment +examination +garbage +grocery +honey +impression +improvement +independence +insect +inspection +inspector +king +ladder +menu +penalty +piano +potato +profession +professor +quantity +reaction +requirement +salad +sister +supermarket +tongue +weakness +wedding +affair +ambition +analyst +apple +assignment +assistant +bathroom +bedroom +beer +birthday +celebration +championship +cheek +client +consequence +departure +diamond +dirt +ear +fortune +friendship +funeral +gene +girlfriend +hat +indication +intention +lady +midnight +negotiation +obligation +passenger +pizza +platform +poet +pollution +recognition +reputation +shirt +sir +speaker +stranger +surgery +sympathy +tale +throat +trainer +uncle +youth +time +work +film +water +money +example +while +business +study +game +life +form +air +day +place +number +part +field +fish +back +process +heat +hand +experience +job +book +end +point +type +home +economy +value +body +market +guide +interest +state +radio +course +company +price +size +card +list +mind +trade +line +care +group +risk +word +fat +force +key +light +training +name +school +top +amount +level +order +practice +research +sense +service +piece +web +boss +sport +fun +house +page +term +test +answer +sound +focus +matter +kind +soil +board +oil +picture +access +garden +range +rate +reason +future +site +demand +exercise +image +case +cause +coast +action +age +bad +boat +record +result +section +building +mouse +cash +class +nothing +period +plan +store +tax +side +subject +space +rule +stock +weather +chance +figure +man +model +source +beginning +earth +program +chicken +design +feature +head +material +purpose +question +rock +salt +act +birth +car +dog +object +scale +sun +note +profit +rent +speed +style +war +bank +craft +half +inside +outside +standard +bus +exchange +eye +fire +position +pressure +stress +advantage +benefit +box +frame +issue +step +cycle +face +item +metal +paint +review +room +screen +structure +view +account +ball +discipline +medium +share +balance +bit +black +bottom +choice +gift +impact +machine +shape +tool +wind +address +average +career +culture +morning +pot +sign +table +task +condition +contact +credit +egg +hope +ice +network +north +square +attempt +date +effect +link +post +star +voice +capital +challenge +friend +self +shot +brush +couple +debate +exit +front +function +lack +living +plant +plastic +spot +summer +taste +theme +track +wing +brain +button +click +desire +foot +gas +influence +notice +rain +wall +base +damage +distance +feeling +pair +savings +staff +sugar +target +text +animal +author +budget +discount +file +ground +lesson +minute +officer +phase +reference +register +sky +stage +stick +title +trouble +bowl +bridge +campaign +character +club +edge +evidence +fan +letter +lock +maximum +novel +option +pack +park +plenty +quarter +skin +sort +weight +baby +background +carry +dish +factor +fruit +glass +joint +master +muscle +red +strength +traffic +trip +vegetable +appeal +chart +gear +ideal +kitchen +land +log +mother +net +party +principle +relative +sale +season +signal +spirit +street +tree +wave +belt +bench +commission +copy +drop +minimum +path +progress +project +sea +south +status +stuff +ticket +tour +angle +blue +breakfast +confidence +daughter +degree +doctor +dot +dream +duty +essay +father +fee +finance +hour +juice +limit +luck +milk +mouth +peace +pipe +seat +stable +storm +substance +team +trick +afternoon +bat +beach +blank +catch +chain +consideration +cream +crew +detail +gold +interview +kid +mark +match +mission +pain +pleasure +score +screw +sex +shop +shower +suit +tone +window +agent +band +block +bone +calendar +cap +coat +contest +corner +court +cup +district +door +east +finger +garage +guarantee +hole +hook +implement +layer +lecture +lie +manner +meeting +nose +parking +partner +profile +respect +rice +routine +schedule +swimming +telephone +tip +winter +airline +bag +battle +bed +bill +bother +cake +code +curve +designer +dimension +dress +ease +emergency +evening +extension +farm +fight +gap +grade +holiday +horror +horse +host +husband +loan +mistake +mountain +nail +noise +occasion +package +patient +pause +phrase +proof +race +relief +sand +sentence +shoulder +smoke +stomach +string +tourist +towel +vacation +west +wheel +wine +arm +aside +associate +bet +blow +border +branch +breast +brother +buddy +bunch +chip +coach +cross +document +draft +dust +expert +floor +god +golf +habit +iron +judge +knife +landscape +league +mail +mess +native +opening +parent +pattern +pin +pool +pound +request +salary +shame +shelter +shoe +silver +tackle +tank +trust +assist +bake +bar +bell +bike +blame +boy +brick +chair +closet +clue +collar +comment +conference +devil +diet +fear +fuel +glove +jacket +lunch +monitor +mortgage +nurse +pace +panic +peak +plane +reward +row +sandwich +shock +spite +spray +surprise +till +transition +weekend +welcome +yard +alarm +bend +bicycle +bite +blind +bottle +cable +candle +clerk +cloud +concert +counter +flower +grandfather +harm +knee +lawyer +leather +load +mirror +neck +pension +plate +purple +ruin +ship +skirt +slice +snow +specialist +stroke +switch +trash +tune +zone +anger +award +bid +bitter +boot +bug +camp +candy +carpet +cat +champion +channel +clock +comfort +cow +crack +engineer +entrance +fault +grass +guy +hell +highlight +incident +island +joke +jury +leg +lip +mate +motor +nerve +passage +pen +pride +priest +prize +promise +resident +resort +ring +roof +rope +sail +scheme +script +sock +station +toe +tower +truck +witness +a +you +it +can +will +if +one +many +most +other +use +make +good +look +help +go +great +being +few +might +still +public +read +keep +start +give +human +local +general +she +specific +long +play +feel +high +tonight +put +common +set +change +simple +past +big +possible +particular +today +major +personal +current +national +cut +natural +physical +show +try +check +second +call +move +pay +let +increase +single +individual +turn +ask +buy +guard +hold +main +offer +potential +professional +international +travel +cook +alternative +following +special +working +whole +dance +excuse +cold +commercial +low +purchase +deal +primary +worth +fall +necessary +positive +produce +search +present +spend +talk +creative +tell +cost +drive +green +support +glad +remove +return +run +complex +due +effective +middle +regular +reserve +independent +leave +original +reach +rest +serve +watch +beautiful +charge +active +break +negative +safe +stay +visit +visual +affect +cover +report +rise +walk +white +beyond +junior +pick +unique +anything +classic +final +lift +mix +private +stop +teach +western +concern +familiar +fly +official +broad +comfortable +gain +maybe +rich +save +stand +young +fail +heavy +hello +lead +listen +valuable +worry +handle +leading +meet +release +sell +finish +normal +press +ride +secret +spread +spring +tough +wait +brown +deep +display +flow +hit +objective +shoot +touch +cancel +chemical +cry +dump +extreme +push +conflict +eat +fill +formal +jump +kick +opposite +pass +pitch +remote +total +treat +vast +abuse +beat +burn +deposit +print +raise +sleep +somewhere +advance +anywhere +consist +dark +double +draw +equal +fix +hire +internal +join +kill +sensitive +tap +win +attack +claim +constant +drag +drink +guess +minor +pull +raw +soft +solid +wear +weird +wonder +annual +count +dead +doubt +feed +forever +impress +nobody +repeat +round +sing +slide +strip +whereas +wish +combine +command +dig +divide +equivalent +hang +hunt +initial +march +mention +smell +spiritual +survey +tie +adult +brief +crazy +escape +gather +hate +prior +repair +rough +sad +scratch +sick +strike +employ +external +hurt +illegal +laugh +lay +mobile +nasty +ordinary +respond +royal +senior +split +strain +struggle +swim +train +upper +wash +yellow +convert +crash +dependent +fold +funny +grab +hide +miss +permit +quote +recover +resolve +roll +sink +slip +spare +suspect +sweet +swing +twist +upstairs +usual +abroad +brave +calm +concentrate +estimate +grand +male +mine +prompt +quiet +refuse +regret +reveal +rush +shake +shift +shine +steal +suck +surround +anybody +bear +brilliant +dare +dear +delay +drunk +female +hurry +inevitable +invite +kiss +neat +pop +punch +quit +reply +representative +resist +rip +rub +silly +smile +spell +stretch +stupid +tear +temporary +tomorrow +wake +wrap +yesterday diff --git a/routes/web.php b/routes/web.php index c74519a..8108318 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,8 +18,9 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::get('/', [OrganisationController::class, 'show'])->name('organisations.show'); Route::resource('servers', ServerController::class) - ->only('index', 'create', 'store') + ->only('index', 'show', 'create', 'store') ->name('index', 'servers.index') + ->name('show', 'servers.show') ->name('create', 'servers.create') ->name('store', 'servers.store');