create/get upload request backend

This commit is contained in:
Čarodej
2022-02-17 10:11:43 +01:00
parent 394a7b6baf
commit 45a3b5415b
13 changed files with 354 additions and 29 deletions

View File

@@ -0,0 +1,36 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Domain\UploadRequest\Models\UploadRequest;
class UploadRequestFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = UploadRequest::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'id' => $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'),
];
}
}

View File

@@ -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';
});
}

View File

@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUploadRequestsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('upload_requests', function (Blueprint $table) {
$table->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');
}
}

View File

@@ -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);

10
routes/upload-request.php Normal file
View File

@@ -0,0 +1,10 @@
<?php
use Domain\UploadRequest\Controllers\CreateUploadRequestController;
use Domain\UploadRequest\Controllers\GetUploadRequestController;
Route::get('/{uploadRequest}', GetUploadRequestController::class);
Route::group(['middleware' => ['auth:sanctum']], function () {
Route::post('/', CreateUploadRequestController::class);
});

View File

@@ -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')

View File

@@ -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.
*/

View File

@@ -0,0 +1,27 @@
<?php
namespace Domain\UploadRequest\Controllers;
use App\Http\Controllers\Controller;
use Auth;
use Domain\UploadRequest\Notifications\UploadRequestNotification;
use Domain\UploadRequest\Resources\UploadRequestResource;
use Illuminate\Http\Request;
use Notification;
class CreateUploadRequestController extends Controller
{
public function __invoke(Request $request)
{
$uploadRequest = Auth::user()->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);
}
}

View File

@@ -1,25 +1,13 @@
<?php
namespace Domain\UploadRequest\Controllers;
use Domain\UploadRequest\Models\UploadRequest;
use Domain\UploadRequest\Resources\UploadRequestResource;
class GetUploadRequestController
{
public function __invoke()
public function __invoke(UploadRequest $uploadRequest)
{
return [
'user' => [
'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);
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Domain\UploadRequest\Models;
use App\Users\Models\User;
use Database\Factories\UploadRequestFactory;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Factories\HasFactory;
/**
* @method static create(array $array)
* @property string id
* @property string user_id
* @property string folder_id
* @property string status
* @property string email
* @property string notes
* @property string created_at
* @property string updated_at
*/
class UploadRequest extends Model
{
use HasFactory;
protected $casts = [
'id' => '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());
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Domain\UploadRequest\Notifications;
use Domain\UploadRequest\Models\UploadRequest;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class UploadRequestNotification extends Notification implements ShouldQueue
{
use Queueable;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(
public UploadRequest $uploadRequest
) {}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
// TODO: add to language strings
return (new MailMessage)
->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 [
//
];
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Domain\UploadRequest\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UploadRequestResource extends JsonResource
{
public function toArray($request): array
{
return [
'data' => [
'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,
],
],
],
],
],
];
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace Tests\Domain\UploadRequest;
use Domain\UploadRequest\Notifications\UploadRequestNotification;
use Domain\UploadRequest\Models\UploadRequest;
use App\Users\Models\User;
use Tests\TestCase;
use Notification;
class UploadRequestTest extends TestCase
{
/**
* @test
*/
public function it_test_upload_request_factory()
{
$uploadRequest = UploadRequest::factory()
->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,
]);
}
}