diff --git a/app/Http/Controllers/Admin/ServiceController.php b/app/Http/Controllers/Admin/ServiceController.php index ed475660a..e0496d1b0 100644 --- a/app/Http/Controllers/Admin/ServiceController.php +++ b/app/Http/Controllers/Admin/ServiceController.php @@ -53,12 +53,27 @@ class ServiceController extends Controller public function getNew(Request $request) { - // + return view('admin.services.new'); } public function postNew(Request $request) { - // + try { + $repo = new ServiceRepository\Service; + $id = $repo->create($request->except([ + '_token' + ])); + Alert::success('Successfully created new service!')->flash(); + return redirect()->route('admin.services.service', $id); + } catch (DisplayValidationException $ex) { + return redirect()->route('admin.services.new')->withErrors(json_decode($ex->getMessage()))->withInput(); + } catch (DisplayException $ex) { + Alert::danger($ex->getMessage())->flash(); + } catch (\Exception $ex) { + Log::error($ex); + Alert::danger('An error occured while attempting to add a new service.')->flash(); + } + return redirect()->route('admin.services.new')->withInput(); } public function getService(Request $request, $service) diff --git a/app/Http/Routes/AdminRoutes.php b/app/Http/Routes/AdminRoutes.php index 34bcf94a9..c9a20441b 100644 --- a/app/Http/Routes/AdminRoutes.php +++ b/app/Http/Routes/AdminRoutes.php @@ -348,6 +348,15 @@ class AdminRoutes { 'uses' => 'Admin\ServiceController@getIndex' ]); + $router->get('/new', [ + 'as' => 'admin.services.new', + 'uses' => 'Admin\ServiceController@getNew' + ]); + + $router->post('/new', [ + 'uses' => 'Admin\ServiceController@postNew' + ]); + $router->get('/service/{id}', [ 'as' => 'admin.services.service', 'uses' => 'Admin\ServiceController@getService' diff --git a/app/Repositories/ServiceRepository/Service.php b/app/Repositories/ServiceRepository/Service.php index bd9f6a9f4..2595c47ea 100644 --- a/app/Repositories/ServiceRepository/Service.php +++ b/app/Repositories/ServiceRepository/Service.php @@ -40,6 +40,31 @@ class Service // } + public function create(array $data) + { + $validator = Validator::make($data, [ + 'name' => 'required|string|min:1|max:255', + 'description' => 'required|string', + 'file' => 'required|regex:/^[\w.-]{1,50}$/', + 'executable' => 'required|max:255|regex:/^(.*)$/', + 'startup' => 'required|string' + ]); + + if ($validator->fails()) { + throw new DisplayValidationException($validator->errors()); + } + + if (Models\Service::where('file', $data['file'])->first()) { + throw new DisplayException('A service using that configuration file already exists on the system.'); + } + + $service = new Models\Service; + $service->fill($data); + $service->save(); + + return $service->id; + } + public function update($id, array $data) { $service = Models\Service::findOrFail($id); diff --git a/resources/views/admin/services/new.blade.php b/resources/views/admin/services/new.blade.php index e69de29bb..2961834a8 100644 --- a/resources/views/admin/services/new.blade.php +++ b/resources/views/admin/services/new.blade.php @@ -0,0 +1,95 @@ +{{-- Copyright (c) 2015 - 2016 Dane Everitt --}} + +{{-- Permission is hereby granted, free of charge, to any person obtaining a copy --}} +{{-- of this software and associated documentation files (the "Software"), to deal --}} +{{-- in the Software without restriction, including without limitation the rights --}} +{{-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell --}} +{{-- copies of the Software, and to permit persons to whom the Software is --}} +{{-- furnished to do so, subject to the following conditions: --}} + +{{-- The above copyright notice and this permission notice shall be included in all --}} +{{-- copies or substantial portions of the Software. --}} + +{{-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --}} +{{-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --}} +{{-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --}} +{{-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --}} +{{-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --}} +{{-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE --}} +{{-- SOFTWARE. --}} +@extends('layouts.admin') + +@section('title') + Manage Services +@endsection + +@section('content') +
+ +

Add New Service


+
+
+
+ +
+ +

This should be a descriptive category name that emcompasses all of the options within the service.

+
+
+
+ +
+ +
+
+
+
+
+ +
+ /src/services/ + + /index.js +
+

This should be the name of the folder on the daemon that contains all of the service logic.

+
+
+ +
+ +
+

Changing this has no effect on operation of the daemon, it is simply used for display purposes on the panel. This can be changed per-option.

+
+
+
+
+ +
+ + +
+

This is the default startup that will be used for all servers created using this service. This can be changed per-option.

+
+
+
+
+
You will be able to add service options and variables once the service is created.
+ {!! csrf_field() !!} + +
+
+
+
+ +@endsection