From 45a3b5415b58a4c429b7c73a518af13ced2f64ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Thu, 17 Feb 2022 10:11:43 +0100 Subject: [PATCH] create/get upload request backend --- database/factories/UploadRequestFactory.php | 36 ++++++++++ ...9_164732_create_user_limitations_table.php | 2 + ...17_073653_create_upload_requests_table.php | 38 ++++++++++ routes/api.php | 4 -- routes/upload-request.php | 10 +++ src/App/Providers/RouteServiceProvider.php | 16 ++--- src/App/Users/Models/User.php | 6 ++ .../CreateUploadRequestController.php | 27 +++++++ .../GetUploadRequestController.php | 22 ++---- .../UploadRequest/Models/UploadRequest.php | 52 ++++++++++++++ .../UploadRequestNotification.php | 64 +++++++++++++++++ .../Resources/UploadRequestResource.php | 35 +++++++++ .../UploadRequest/UploadRequestTest.php | 71 +++++++++++++++++++ 13 files changed, 354 insertions(+), 29 deletions(-) create mode 100644 database/factories/UploadRequestFactory.php create mode 100644 database/migrations/2022_02_17_073653_create_upload_requests_table.php create mode 100644 routes/upload-request.php create mode 100644 src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php create mode 100644 src/Domain/UploadRequest/Models/UploadRequest.php create mode 100644 src/Domain/UploadRequest/Notifications/UploadRequestNotification.php create mode 100644 src/Domain/UploadRequest/Resources/UploadRequestResource.php create mode 100644 tests/Domain/UploadRequest/UploadRequestTest.php diff --git a/database/factories/UploadRequestFactory.php b/database/factories/UploadRequestFactory.php new file mode 100644 index 00000000..4934db60 --- /dev/null +++ b/database/factories/UploadRequestFactory.php @@ -0,0 +1,36 @@ + $this->faker->uuid, + 'user_id' => $this->faker->uuid, + 'folder_id' => $this->faker->uuid, + 'email' => $this->faker->email, + 'notes' => $this->faker->realText(80), + 'status' => $this->faker->randomElement( + ['active', 'filled', 'expired'] + ), + 'created_at' => $this->faker->dateTimeBetween('-1 months'), + ]; + } +} diff --git a/database/migrations/2021_11_19_164732_create_user_limitations_table.php b/database/migrations/2021_11_19_164732_create_user_limitations_table.php index 64b2d9df..bb54c3b8 100644 --- a/database/migrations/2021_11_19_164732_create_user_limitations_table.php +++ b/database/migrations/2021_11_19_164732_create_user_limitations_table.php @@ -17,6 +17,8 @@ class CreateUserLimitationsTable extends Migration $table->uuid('user_id'); $table->text('max_storage_amount'); $table->text('max_team_members'); + $table->charset = 'utf8mb4'; + $table->collation = 'utf8mb4_unicode_ci'; }); } diff --git a/database/migrations/2022_02_17_073653_create_upload_requests_table.php b/database/migrations/2022_02_17_073653_create_upload_requests_table.php new file mode 100644 index 00000000..d19b69cb --- /dev/null +++ b/database/migrations/2022_02_17_073653_create_upload_requests_table.php @@ -0,0 +1,38 @@ +uuid('id'); + $table->uuid('user_id'); + $table->uuid('folder_id'); + $table->enum('status', ['active', 'filled', 'expired'])->default('active'); + $table->string('email'); + $table->longText('notes'); + $table->timestamps(); + $table->charset = 'utf8mb4'; + $table->collation = 'utf8mb4_unicode_ci'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('upload_requests'); + } +} diff --git a/routes/api.php b/routes/api.php index b4dcf5a7..2d8d2d2b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -27,14 +27,10 @@ use Domain\Browsing\Controllers\BrowseTrashContentController; use Domain\Homepage\Controllers\SendContactMessageController; use Domain\Sharing\Controllers\GetShareLinkViaQrCodeController; use App\Users\Controllers\Authentication\RegisterUserController; -use Domain\UploadRequest\Controllers\GetUploadRequestController; // Ping Pong Route::get('/ping', PingAPIController::class); -// Upload Request -Route::get('/request', GetUploadRequestController::class); - // Pages Route::apiResource('/page', PagesController::class); diff --git a/routes/upload-request.php b/routes/upload-request.php new file mode 100644 index 00000000..ddc46ec9 --- /dev/null +++ b/routes/upload-request.php @@ -0,0 +1,10 @@ + ['auth:sanctum']], function () { + Route::post('/', CreateUploadRequestController::class); +}); diff --git a/src/App/Providers/RouteServiceProvider.php b/src/App/Providers/RouteServiceProvider.php index 97529bcc..2a35e655 100644 --- a/src/App/Providers/RouteServiceProvider.php +++ b/src/App/Providers/RouteServiceProvider.php @@ -30,21 +30,14 @@ class RouteServiceProvider extends ServiceProvider public function map() { $this->mapApiRoutes(); - $this->mapShareRoutes(); - + $this->mapUploadRequestRoutes(); $this->mapAdminApiRoutes(); - $this->mapSetupWizardApiRoutes(); - $this->mapUserApiRoutes(); - $this->mapMaintenanceRoutes(); - $this->mapFileRoutes(); - $this->mapTeamsRoutes(); - $this->mapWebRoutes(); } @@ -94,6 +87,13 @@ class RouteServiceProvider extends ServiceProvider ->group(base_path('routes/share.php')); } + protected function mapUploadRequestRoutes() + { + Route::prefix('api/upload-request') + ->middleware('api') + ->group(base_path('routes/upload-request.php')); + } + protected function mapAdminApiRoutes() { Route::prefix('api/admin') diff --git a/src/App/Users/Models/User.php b/src/App/Users/Models/User.php index 57389de0..bf762127 100644 --- a/src/App/Users/Models/User.php +++ b/src/App/Users/Models/User.php @@ -16,6 +16,7 @@ use Illuminate\Notifications\Notifiable; use App\Users\Notifications\ResetPassword; use Laravel\Fortify\TwoFactorAuthenticatable; use Illuminate\Contracts\Auth\MustVerifyEmail; +use Domain\UploadRequest\Models\UploadRequest; use App\Users\Restrictions\RestrictionsManager; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -180,6 +181,11 @@ class User extends Authenticatable implements MustVerifyEmail return $this->hasMany(Traffic::class); } + public function uploadRequest(): HasOne + { + return $this->hasOne(UploadRequest::class); + } + /** * Send the password reset notification. */ diff --git a/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php new file mode 100644 index 00000000..d2489fa2 --- /dev/null +++ b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php @@ -0,0 +1,27 @@ +uploadRequest()->create([ + 'folder_id' => $request->input('folder_id'), + 'email' => $request->input('email'), + 'notes' => $request->input('notes'), + ]); + + Notification::route('mail', $uploadRequest->email) + ->notify(new UploadRequestNotification($uploadRequest)); + + return response(new UploadRequestResource($uploadRequest), 201); + } +} \ No newline at end of file diff --git a/src/Domain/UploadRequest/Controllers/GetUploadRequestController.php b/src/Domain/UploadRequest/Controllers/GetUploadRequestController.php index 7c2d6e41..5f8cb576 100644 --- a/src/Domain/UploadRequest/Controllers/GetUploadRequestController.php +++ b/src/Domain/UploadRequest/Controllers/GetUploadRequestController.php @@ -1,25 +1,13 @@ [ - 'data' => [ - 'attributes' => [ - 'name' => 'Jane Doe', - 'avatar' => [ - 'md' => 'http://192.168.1.112:8000/avatars/md-f45abbe5-962c-4229-aef2-9991e96d54d9.png', - 'sm' => 'http://192.168.1.112:8000/avatars/md-f45abbe5-962c-4229-aef2-9991e96d54d9.png', - 'xs' => 'http://192.168.1.112:8000/avatars/md-f45abbe5-962c-4229-aef2-9991e96d54d9.png', - ], - ], - 'id' => '123', - 'type' => 'user', - ], - ], - ]; + return new UploadRequestResource($uploadRequest); } } diff --git a/src/Domain/UploadRequest/Models/UploadRequest.php b/src/Domain/UploadRequest/Models/UploadRequest.php new file mode 100644 index 00000000..d5235993 --- /dev/null +++ b/src/Domain/UploadRequest/Models/UploadRequest.php @@ -0,0 +1,52 @@ + 'string', + ]; + + protected $guarded = ['id']; + + public $incrementing = false; + + protected $keyType = 'string'; + + protected static function newFactory(): UploadRequestFactory + { + return UploadRequestFactory::new(); + } + + public function user(): HasOne + { + return $this->hasOne(User::class, 'id', 'user_id'); + } + + protected static function boot() + { + parent::boot(); + + static::creating(fn ($invitation) => $invitation->id = Str::uuid()); + } +} diff --git a/src/Domain/UploadRequest/Notifications/UploadRequestNotification.php b/src/Domain/UploadRequest/Notifications/UploadRequestNotification.php new file mode 100644 index 00000000..805bad4a --- /dev/null +++ b/src/Domain/UploadRequest/Notifications/UploadRequestNotification.php @@ -0,0 +1,64 @@ +subject("{$this->uploadRequest->user->settings->first_name} Request You for File Upload") + ->greeting('Hello') + ->line("We are emailing you because {$this->uploadRequest->user->settings->first_name} needs files from you. Please click on the link below and upload your files for {$this->uploadRequest->user->settings->first_name}.") + ->action('Upload Files', url('/')) + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + // + ]; + } +} diff --git a/src/Domain/UploadRequest/Resources/UploadRequestResource.php b/src/Domain/UploadRequest/Resources/UploadRequestResource.php new file mode 100644 index 00000000..70e69dbf --- /dev/null +++ b/src/Domain/UploadRequest/Resources/UploadRequestResource.php @@ -0,0 +1,35 @@ + [ + 'id' => $this->id, + 'type' => 'upload-request', + 'attributes' => [ + 'folder_id' => $this->folder_id, + 'status' => $this->status, + 'email' => $this->email, + 'notes' => $this->notes, + ], + 'relationships' => [ + 'user' => [ + 'data' => [ + 'id' => $this->user->id, + 'type' => 'user', + 'attributes' => [ + 'name' => $this->user->settings->name, + 'avatar' => $this->user->settings->avatar, + ], + ], + ], + ], + ], + ]; + } +} diff --git a/tests/Domain/UploadRequest/UploadRequestTest.php b/tests/Domain/UploadRequest/UploadRequestTest.php new file mode 100644 index 00000000..0cdb41de --- /dev/null +++ b/tests/Domain/UploadRequest/UploadRequestTest.php @@ -0,0 +1,71 @@ +create(); + + $this->assertModelExists($uploadRequest); + } + + /** + * @test + */ + public function user_create_upload_request() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $this + ->actingAs($user) + ->postJson("/api/upload-request", [ + 'folder_id' => '00cacdb9-1d09-4a32-8ad7-c0d45d66b758', + 'email' => 'howdy@hi5ve.digital', + 'notes' => 'Please send me your files...', + ]) + ->assertCreated(); + + $this->assertDatabasehas('upload_requests', [ + 'folder_id' => '00cacdb9-1d09-4a32-8ad7-c0d45d66b758', + 'email' => 'howdy@hi5ve.digital', + 'notes' => 'Please send me your files...', + ]); + + Notification::assertTimesSent(1, UploadRequestNotification::class); + } + + /** + * @test + */ + public function it_get_upload_request_detail() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $uploadRequest = UploadRequest::factory() + ->create([ + 'user_id' => $user->id, + ]); + + $this->getJson("/api/upload-request/$uploadRequest->id") + ->assertOk() + ->assertJsonFragment([ + 'id' => $uploadRequest->id, + ]); + } +} \ No newline at end of file