diff --git a/app/Http/Controllers/Remote/ProviderController.php b/app/Http/Controllers/Remote/ModuleController.php similarity index 82% rename from app/Http/Controllers/Remote/ProviderController.php rename to app/Http/Controllers/Remote/ModuleController.php index ef7cd39..46a1b36 100644 --- a/app/Http/Controllers/Remote/ProviderController.php +++ b/app/Http/Controllers/Remote/ModuleController.php @@ -5,7 +5,7 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; -class ProviderController extends Controller +class ModuleController extends Controller { public function index() { diff --git a/app/Http/Controllers/Remote/ServerController.php b/app/Http/Controllers/Remote/ServerController.php index 94a74d6..6636589 100644 --- a/app/Http/Controllers/Remote/ServerController.php +++ b/app/Http/Controllers/Remote/ServerController.php @@ -46,23 +46,24 @@ public function index() * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function store(Request $request, Status $status) + public function store(Request $request, Status $server) { // $request->validate([ 'name' => 'required|string', 'ip' => 'sometimes|ip', - 'status' => 'required|string', + // status only allow online or offline + 'status' => 'required|in:online,offline,maintenance', ]); - $status = $status->create([ + $server = $server->create([ 'name' => $request->name, 'ip' => $request->ip, 'status' => $request->status, - 'provider_id' => auth('remote')->id() + 'module_id' => auth('remote')->id() ]); - return $this->success($status); + return $this->success($server); } @@ -73,22 +74,18 @@ public function store(Request $request, Status $status) * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, Status $status) + public function update(Request $request, Status $server) { - // update + // only allow name,ip,status $request->validate([ 'name' => 'sometimes|string', 'ip' => 'sometimes|ip', - 'status' => 'sometimes|string', + 'status' => 'sometimes|in:online,offline,maintenance', ]); - $status->provider()->update([ - 'name' => $request->name, - 'ip' => $request->ip, - 'status' => $request->status, - ]); + $server->update($request->only(['name', 'ip', 'status'])); - return $this->updated($status); + return $this->updated($server); } /** diff --git a/app/Models/Module/Module.php b/app/Models/Module/Module.php index 0514f51..7a8c95e 100644 --- a/app/Models/Module/Module.php +++ b/app/Models/Module/Module.php @@ -2,8 +2,9 @@ namespace App\Models\Module; -use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Factories\HasFactory; class Module extends Model { @@ -11,8 +12,25 @@ class Module extends Model protected $table = 'modules'; + // primary key + public $incrementing = false; + protected $keyType = 'string'; + public $timestamps = false; + protected $fillable = [ - 'name', + 'id', 'type', + 'api_token' ]; + + protected static function boot() + { + parent::boot(); + static::creating(function ($model) { + // if local + if (!app()->environment('local')) { + $model->api_token = Str::random(60); + } + }); + } } diff --git a/app/Models/Module/Provider.php b/app/Models/Module/Provider.php deleted file mode 100644 index a7ffcb5..0000000 --- a/app/Models/Module/Provider.php +++ /dev/null @@ -1,30 +0,0 @@ -environment('local')) { - $model->api_token = Str::random(60); - } - }); - } -} diff --git a/app/Models/Module/ProviderModule.php b/app/Models/Module/ProviderModule.php deleted file mode 100644 index cd23fd9..0000000 --- a/app/Models/Module/ProviderModule.php +++ /dev/null @@ -1,51 +0,0 @@ -belongsTo(Provider::class); - } - - public function module() - { - return $this->belongsTo(Module::class); - } - - public function getIsEnabledAttribute($value) - { - return (bool) $value; - } - - protected static function boot() - { - parent::boot(); - static::creating(function ($model) { - // if local - if (!app()->environment('local')) { - $model->api_token = Str::random(60); - } - }); - } - - -} diff --git a/app/Models/Server/Status.php b/app/Models/Server/Status.php index d0e9a5e..4bda10b 100644 --- a/app/Models/Server/Status.php +++ b/app/Models/Server/Status.php @@ -15,12 +15,24 @@ class Status extends Model 'name', 'ip', 'status', - 'provider_id', + 'module_id', ]; // scope - public function scopeProvider($query) + public function scopeModule($query) { - return $query->where('provider_id', auth('remote')->id()); + return $query->where('module_id', auth('remote')->id()); + } + + + // when update, check owner + protected static function boot() + { + parent::boot(); + static::updating(function ($model) { + if ($model->module_id !== auth('remote')->id()) { + abort(403, 'Unauthorized action.'); + } + }); } } diff --git a/config/auth.php b/config/auth.php index 28a678a..66cb360 100644 --- a/config/auth.php +++ b/config/auth.php @@ -82,7 +82,7 @@ 'providers' => [ 'driver' => 'eloquent', - 'model' => App\Models\Module\Provider::class, + 'model' => App\Models\Module\Module::class, ], // 'users' => [ diff --git a/database/migrations/2022_08_12_123308_create_modules_table.php b/database/migrations/2022_08_12_123308_create_modules_table.php index 031583e..8f55a2d 100644 --- a/database/migrations/2022_08_12_123308_create_modules_table.php +++ b/database/migrations/2022_08_12_123308_create_modules_table.php @@ -15,22 +15,21 @@ public function up() { Schema::create('modules', function (Blueprint $table) { - $table->id(); - - // name - $table->string('name')->index(); + $table->string('id')->index()->primary()->unique(); // type $table->string('type')->index(); - $table->timestamps(); + // api token + $table->string('api_token')->nullable()->unique()->index(); }); // if env is local if (env('APP_ENV') == 'local') { $module = [ - 'name' => 'Example Model', + 'id' => 'Example Model', 'type' => 'test', + 'api_token' => '123456' ]; Module::create($module); diff --git a/database/migrations/2022_08_13_051119_create_providers_table.php b/database/migrations/2022_08_13_051119_create_providers_table.php deleted file mode 100644 index 10da825..0000000 --- a/database/migrations/2022_08_13_051119_create_providers_table.php +++ /dev/null @@ -1,49 +0,0 @@ -id(); - - // name - $table->string('name')->index(); - - // api_token - $table->string('api_token')->index()->unique(); - - $table->timestamps(); - }); - - // if env is local - if (env('APP_ENV') == 'local') { - $provider = [ - 'name' => 'Example Provider', - 'api_token' => 123456, - ]; - - Provider::create($provider); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('providers'); - } -}; diff --git a/database/migrations/2022_08_13_051148_create_hosts_table.php b/database/migrations/2022_08_13_051148_create_hosts_table.php index 1e282d1..2404761 100644 --- a/database/migrations/2022_08_13_051148_create_hosts_table.php +++ b/database/migrations/2022_08_13_051148_create_hosts_table.php @@ -22,8 +22,8 @@ public function up() $table->string('name')->index(); // provider id - $table->unsignedBigInteger('provider_id')->index(); - $table->foreign('provider_id')->references('id')->on('providers')->onDelete('cascade'); + $table->string('module_id')->index(); + // $table->foreign('module_id')->references('id')->on('modules')->onDelete('set null'); // user_id $table->unsignedBigInteger('user_id')->index(); diff --git a/database/migrations/2022_08_13_053432_create_provider_modules_table.php b/database/migrations/2022_08_13_053432_create_provider_modules_table.php deleted file mode 100644 index e54aeca..0000000 --- a/database/migrations/2022_08_13_053432_create_provider_modules_table.php +++ /dev/null @@ -1,65 +0,0 @@ -id(); - - // provider id (on delete cascade) - $table->unsignedBigInteger('provider_id')->index(); - $table->foreign('provider_id')->references('id')->on('providers')->onDelete('cascade'); - - // module id - $table->unsignedBigInteger('module_id')->index(); - $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade'); - - // api_token - // $table->string('api_token')->index()->unique(); - - // backend url - $table->string('backend_url')->nullable(); - - // enabled - $table->boolean('is_enabled')->default(false)->index(); - - - $table->timestamps(); - }); - - // if env is local - if (env('APP_ENV') == 'local') { - $provider = [ - 'provider_id' => 1, - 'module_id' => 1, - 'is_enabled' => 1, - // 'api_token' => 123456, - ]; - - ProviderModule::create($provider); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('provider_modules'); - } -}; diff --git a/database/migrations/2022_08_13_083649_create_tasks_table.php b/database/migrations/2022_08_13_083649_create_tasks_table.php index 1c8cece..69822f8 100644 --- a/database/migrations/2022_08_13_083649_create_tasks_table.php +++ b/database/migrations/2022_08_13_083649_create_tasks_table.php @@ -31,9 +31,8 @@ public function up() $table->unsignedBigInteger('user_id')->index(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - // provider module id - $table->unsignedBigInteger('provider_module_id')->index(); - $table->foreign('provider_module_id')->references('id')->on('provider_modules')->onDelete('cascade'); + $table->string('module_id')->index(); + $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade'); // host id $table->unsignedBigInteger('host_id')->index(); diff --git a/database/migrations/2022_08_13_100808_create_server_status_table.php b/database/migrations/2022_08_13_100808_create_server_status_table.php index 794170a..37ac7eb 100644 --- a/database/migrations/2022_08_13_100808_create_server_status_table.php +++ b/database/migrations/2022_08_13_100808_create_server_status_table.php @@ -23,9 +23,8 @@ public function up() $table->string('status'); - // provider foreign key - $table->unsignedBigInteger('provider_id')->index(); - $table->foreign('provider_id')->references('id')->on('providers')->onDelete('cascade'); + $table->string('module_id')->index(); + $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade'); $table->timestamps(); diff --git a/routes/api/remote.php b/routes/api/remote.php index ef53b9c..9c19a75 100644 --- a/routes/api/remote.php +++ b/routes/api/remote.php @@ -3,7 +3,8 @@ use App\Http\Controllers\Remote; use Illuminate\Support\Facades\Route; -Route::name('remote.')->middleware(['api', 'auth:remote'])->group(function () { - Route::apiResource('providers', Remote\ProviderController::class)->only(['index']); +Route::name('remote.')->middleware(['api'])->group(function () { + Route::apiResource('providers', Remote\ModuleController::class)->only(['index']); + Route::apiResource('servers', Remote\ServerController::class); // Route::apiResource('users', Controllers\User\UserController::class); });