mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-05 18:23:48 +00:00
create/get upload request backend
This commit is contained in:
36
database/factories/UploadRequestFactory.php
Normal file
36
database/factories/UploadRequestFactory.php
Normal 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'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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
10
routes/upload-request.php
Normal 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);
|
||||
});
|
||||
@@ -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')
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
52
src/Domain/UploadRequest/Models/UploadRequest.php
Normal file
52
src/Domain/UploadRequest/Models/UploadRequest.php
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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 [
|
||||
//
|
||||
];
|
||||
}
|
||||
}
|
||||
35
src/Domain/UploadRequest/Resources/UploadRequestResource.php
Normal file
35
src/Domain/UploadRequest/Resources/UploadRequestResource.php
Normal 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,
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
71
tests/Domain/UploadRequest/UploadRequestTest.php
Normal file
71
tests/Domain/UploadRequest/UploadRequestTest.php
Normal 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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user