diff --git a/README.md b/README.md index 1b307f7..939bc8f 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,48 @@ All API requests must be appended with `api/` e.g `mydomain.com/api/servers/gYk8 `shared/{id}` +**POST requests** + +Create a server + +`/servers` + +Body content template + +```json +{ +"active": 1, +"show_public": 0, +"hostname": "test.domain.com", +"ns1": "ns1", +"ns2": "ns2", +"server_type": 1, +"os_id": 2, +"provider_id": 10, +"location_id": 15, +"ssh_port": 22, +"bandwidth": 2000, +"ram": 2024, +"ram_type": "MB", +"ram_as_mb": 2024, +"disk": 30, +"disk_type": "GB", +"disk_as_gb": 30, +"cpu": 2, +"has_yabs": 0, +"was_promo": 1, +"ip1": "127.0.0.1", +"ip2": null, +"owned_since": "2022-01-01", +"currency": "USD", +"price": 4.00, +"payment_term": 1, +"as_usd": 4.00, +"usd_per_month": 4.00, +"next_due_date": "2022-02-01" +} +``` + ## Notes **Public viewable listings** diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php index ced080c..342ac00 100644 --- a/app/Http/Controllers/ApiController.php +++ b/app/Http/Controllers/ApiController.php @@ -13,6 +13,8 @@ use App\Models\Shared; use DataTables; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Str; class ApiController extends Controller { @@ -23,7 +25,7 @@ class ApiController extends Controller ->join('providers as pr', 's.provider_id', '=', 'pr.id') ->join('locations as l', 's.location_id', '=', 'l.id') ->join('os as o', 's.os_id', '=', 'o.id') - ->get(['s.*', 'p.id as price_id', 'p.currency', 'p.price', 'p.term', 'p.as_usd', 'p.usd_per_month', 'p.next_due_date', 'pr.name as provider', 'l.name as location','o.name as os'])->toJson(JSON_PRETTY_PRINT); + ->get(['s.*', 'p.id as price_id', 'p.currency', 'p.price', 'p.term', 'p.as_usd', 'p.usd_per_month', 'p.next_due_date', 'pr.name as provider', 'l.name as location', 'o.name as os'])->toJson(JSON_PRETTY_PRINT); return response($servers, 200); } @@ -36,7 +38,7 @@ class ApiController extends Controller ->join('locations as l', 's.location_id', '=', 'l.id') ->join('os as o', 's.os_id', '=', 'o.id') ->where('s.id', '=', $id) - ->get(['s.*', 'p.id as price_id', 'p.currency', 'p.price', 'p.term', 'p.as_usd', 'p.usd_per_month', 'p.next_due_date', 'pr.name as provider', 'l.name as location','o.name as os']); + ->get(['s.*', 'p.id as price_id', 'p.currency', 'p.price', 'p.term', 'p.as_usd', 'p.usd_per_month', 'p.next_due_date', 'pr.name as provider', 'l.name as location', 'o.name as os']); $yabs = DB::table('yabs') ->where('yabs.server_id', '=', $id) @@ -316,4 +318,95 @@ class ApiController extends Controller return response(array('ip' => null), 200); } + protected function storeServer(Request $request) + { + $rules = array( + 'hostname' => 'min:3', + 'server_type' => 'required|integer', + 'os_id' => 'required|integer', + 'provider_id' => 'required|integer', + 'location_id' => 'required|integer', + 'ssh_port' => 'required|integer', + 'ram' => 'required|integer', + 'ram_as_mb' => 'required|integer', + 'disk' => 'required|integer', + 'disk_as_gb' => 'required|integer', + 'cpu' => 'required|integer', + 'bandwidth' => 'required|integer', + 'was_promo' => 'required|integer', + 'active' => 'required|integer', + 'show_public' => 'required|integer', + 'owned_since' => 'required|date', + 'ram_type' => 'required|string|size:2', + 'disk_type' => 'required|string|size:2', + 'currency' => 'required|string|size:3', + 'price' => 'required|numeric', + 'payment_term' => 'required|integer', + 'next_due_date' => 'date', + ); + + $messages = array( + 'required' => ':attribute is required', + 'min' => ':attribute must be longer than 3', + 'integer' => ':attribute must be an integer', + 'string' => ':attribute must be a string', + 'size' => ':attribute must be exactly :size characters', + 'numeric' => ':attribute must be a float', + 'date' => ':attribute must be a date Y-m-d', + ); + + $validator = Validator::make($request->all(), $rules, $messages); + + if ($validator->fails()) { + return response()->json(['result' => 'fail', 'messages' => $validator->messages()], 400); + } + + $server_id = Str::random(8); + + $pricing = new Pricing(); + + $as_usd = $pricing->convertToUSD($request->price, $request->currency); + + $pricing->insertPricing(1, $server_id, $request->currency, $request->price, $request->payment_term, $as_usd, $request->next_due_date); + + if (!is_null($request->ip1)) { + IPs::insertIP($server_id, $request->ip1); + } + + if (!is_null($request->ip2)) { + IPs::insertIP($server_id, $request->ip2); + } + + $insert = Server::create([ + 'id' => $server_id, + 'hostname' => $request->hostname, + 'server_type' => $request->server_type, + 'os_id' => $request->os_id, + 'ssh_port' => $request->ssh_port, + 'provider_id' => $request->provider_id, + 'location_id' => $request->location_id, + 'ram' => $request->ram, + 'ram_type' => $request->ram_type, + 'ram_as_mb' => ($request->ram_type === 'MB') ? $request->ram : ($request->ram * 1024), + 'disk' => $request->disk, + 'disk_type' => $request->disk_type, + 'disk_as_gb' => ($request->disk_type === 'GB') ? $request->disk : ($request->disk * 1024), + 'owned_since' => $request->owned_since, + 'ns1' => $request->ns1, + 'ns2' => $request->ns2, + 'bandwidth' => $request->bandwidth, + 'cpu' => $request->cpu, + 'was_promo' => $request->was_promo, + 'show_public' => (isset($request->show_public)) ? 1 : 0 + ]); + + Server::serverRelatedCacheForget(); + + if ($insert) { + return response()->json(array('result' => 'success', 'server_id' => $server_id), 200); + } + + return response()->json(array('result' => 'fail', 'request' => $request->post()), 500); + } + } diff --git a/routes/api.php b/routes/api.php index 71f4515..d860d70 100644 --- a/routes/api.php +++ b/routes/api.php @@ -28,6 +28,10 @@ Route::middleware('auth:api')->get('domains/{id}', 'App\Http\Controllers\ApiCont Route::middleware('auth:api')->get('servers', 'App\Http\Controllers\ApiController@getAllServers'); Route::middleware('auth:api')->get('servers/{id}', 'App\Http\Controllers\ApiController@getServer'); +Route::middleware('auth:api')->post('servers', 'App\Http\Controllers\ApiController@storeServer'); +Route::middleware('auth:api')->put('servers/{id}', 'App\Http\Controllers\ApiController@updateServer'); +Route::middleware('auth:api')->delete('servers/{id}', 'App\Http\Controllers\ApiController@destroyServer'); + Route::middleware('auth:api')->get('IPs/', 'App\Http\Controllers\ApiController@getAllIPs'); Route::middleware('auth:api')->get('IPs/{id}', 'App\Http\Controllers\ApiController@getIP');