From a3da1bed63a5c25329f0167f215d4af1ac811576 Mon Sep 17 00:00:00 2001 From: Leon Morival Date: Wed, 22 Apr 2026 20:35:47 +0200 Subject: [PATCH] feat: users ulid --- app/Enums/PriorityStatus.php | 17 --- app/Enums/TodoProgress.php | 16 --- .../Resources/Todos/Pages/CreateTodo.php | 11 -- .../Resources/Todos/Pages/EditTodo.php | 21 ---- .../Resources/Todos/Pages/ListTodos.php | 19 ---- .../Resources/Todos/Pages/ViewTodo.php | 19 ---- .../Resources/Todos/Schemas/TodoForm.php | 33 ------ .../Resources/Todos/Schemas/TodoInfolist.php | 33 ------ .../Resources/Todos/Tables/TodosTable.php | 49 --------- app/Filament/Resources/Todos/TodoResource.php | 56 ---------- app/Http/Controllers/AuthController.php | 4 +- app/Http/Controllers/todoController.php | 101 ------------------ app/Http/Requests/TodoRequest.php | 36 ------- app/Http/Resources/todoResource.php | 26 ----- app/Models/Todo.php | 54 ---------- app/Models/User.php | 8 +- app/Policies/TodoPolicy.php | 50 --------- database/factories/todoFactory.php | 26 ----- .../0001_01_01_000000_create_users_table.php | 6 +- ...19_create_personal_access_tokens_table.php | 2 +- .../2026_03_09_120925_create_todo_table.php | 23 ---- ..._09_231500_add_image_url_to_todo_table.php | 22 ---- .../2026_03_10_130433_add_status_to_todos.php | 29 ----- ..._03_10_140113_add_description_to_todos.php | 28 ----- ...1_000001_add_avatar_url_to_users_table.php | 28 ----- ...531_add_due_date_and_priority_to_tasks.php | 30 ------ routes/api.php | 8 -- 27 files changed, 9 insertions(+), 746 deletions(-) delete mode 100644 app/Enums/PriorityStatus.php delete mode 100644 app/Enums/TodoProgress.php delete mode 100644 app/Filament/Resources/Todos/Pages/CreateTodo.php delete mode 100644 app/Filament/Resources/Todos/Pages/EditTodo.php delete mode 100644 app/Filament/Resources/Todos/Pages/ListTodos.php delete mode 100644 app/Filament/Resources/Todos/Pages/ViewTodo.php delete mode 100644 app/Filament/Resources/Todos/Schemas/TodoForm.php delete mode 100644 app/Filament/Resources/Todos/Schemas/TodoInfolist.php delete mode 100644 app/Filament/Resources/Todos/Tables/TodosTable.php delete mode 100644 app/Filament/Resources/Todos/TodoResource.php delete mode 100644 app/Http/Controllers/todoController.php delete mode 100644 app/Http/Requests/TodoRequest.php delete mode 100644 app/Http/Resources/todoResource.php delete mode 100644 app/Models/Todo.php delete mode 100644 app/Policies/TodoPolicy.php delete mode 100644 database/factories/todoFactory.php delete mode 100644 database/migrations/2026_03_09_120925_create_todo_table.php delete mode 100644 database/migrations/2026_03_09_231500_add_image_url_to_todo_table.php delete mode 100644 database/migrations/2026_03_10_130433_add_status_to_todos.php delete mode 100644 database/migrations/2026_03_10_140113_add_description_to_todos.php delete mode 100644 database/migrations/2026_03_11_000001_add_avatar_url_to_users_table.php delete mode 100644 database/migrations/2026_03_11_082531_add_due_date_and_priority_to_tasks.php diff --git a/app/Enums/PriorityStatus.php b/app/Enums/PriorityStatus.php deleted file mode 100644 index 725f439..0000000 --- a/app/Enums/PriorityStatus.php +++ /dev/null @@ -1,17 +0,0 @@ -components([ - TextInput::make('name') - ->required(), - Select::make('user_id') - ->relationship('user', 'name') - ->required(), - FileUpload::make('image_url') - ->image(), - Select::make('status') - ->options(TodoProgress::class) - ->default('to_do') - ->required(), - Textarea::make('description') - ->columnSpanFull(), - ]); - } -} diff --git a/app/Filament/Resources/Todos/Schemas/TodoInfolist.php b/app/Filament/Resources/Todos/Schemas/TodoInfolist.php deleted file mode 100644 index f69fdc0..0000000 --- a/app/Filament/Resources/Todos/Schemas/TodoInfolist.php +++ /dev/null @@ -1,33 +0,0 @@ -components([ - TextEntry::make('name'), - TextEntry::make('user.name') - ->label('User'), - TextEntry::make('created_at') - ->dateTime() - ->placeholder('-'), - TextEntry::make('updated_at') - ->dateTime() - ->placeholder('-'), - ImageEntry::make('image_url') - ->placeholder('-'), - TextEntry::make('status') - ->badge(), - TextEntry::make('description') - ->placeholder('-') - ->columnSpanFull(), - ]); - } -} diff --git a/app/Filament/Resources/Todos/Tables/TodosTable.php b/app/Filament/Resources/Todos/Tables/TodosTable.php deleted file mode 100644 index 3e04622..0000000 --- a/app/Filament/Resources/Todos/Tables/TodosTable.php +++ /dev/null @@ -1,49 +0,0 @@ -columns([ - TextColumn::make('name') - ->searchable(), - TextColumn::make('user.name') - ->searchable(), - TextColumn::make('created_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('updated_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - ImageColumn::make('image_url'), - TextColumn::make('status') - ->badge() - ->searchable(), - ]) - ->filters([ - // - ]) - ->recordActions([ - ViewAction::make(), - EditAction::make(), - ]) - ->toolbarActions([ - BulkActionGroup::make([ - DeleteBulkAction::make(), - ]), - ]); - } -} diff --git a/app/Filament/Resources/Todos/TodoResource.php b/app/Filament/Resources/Todos/TodoResource.php deleted file mode 100644 index ed23ccd..0000000 --- a/app/Filament/Resources/Todos/TodoResource.php +++ /dev/null @@ -1,56 +0,0 @@ - ListTodos::route('/'), - 'create' => CreateTodo::route('/create'), - 'view' => ViewTodo::route('/{record}'), - 'edit' => EditTodo::route('/{record}/edit'), - ]; - } -} diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 9d3f5f3..d24d710 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -29,7 +29,7 @@ class AuthController extends Controller 'avatar_url' => $avatarPath, ]); - $token = $user->createToken('todos', ['user'])->plainTextToken; + $token = $user->createToken('api', ['user'])->plainTextToken; return response()->json([ 'user' => new UserResource($user), @@ -48,7 +48,7 @@ class AuthController extends Controller ], 401); } - $token = $user->createToken('todos')->plainTextToken; + $token = $user->createToken('api')->plainTextToken; return response()->json([ 'user' => new UserResource($user), diff --git a/app/Http/Controllers/todoController.php b/app/Http/Controllers/todoController.php deleted file mode 100644 index 493285e..0000000 --- a/app/Http/Controllers/todoController.php +++ /dev/null @@ -1,101 +0,0 @@ -query('per_page', 15); - $perPage = max(1, min($perPage, 100)); - - $todos = $request->user() - ->todos() - ->latest() - ->paginate($perPage) - ->withQueryString(); - - return todoResource::collection($todos); - } - - /** - * Création d'un nouveau todo avec image optionnelle. - */ - public function store(TodoRequest $request) - { - $data = $request->validated(); - - if ($request->hasFile('image')) { - // On stocke dans le dossier 'todos' du disque 'public' - // $path contiendra par ex: "todos/nom_du_fichier.jpg" - $path = $request->file('image')->store('todos', 'public'); - $data['image_url'] = $path; - } - - $todo = $request->user()->todos()->create($data); - - return new todoResource($todo); - } - - /** - * Mise à jour du todo (texte, statut ou image). - */ - public function update(TodoRequest $request, Todo $todo) - { - Gate::authorize('update', $todo); - - $data = $request->validated(); - - if ($request->hasFile('image')) { - // 1. Supprimer l'ancienne image si elle existe - if ($todo->image_url) { - Storage::disk('public')->delete($todo->image_url); - } - - // 2. Stocker la nouvelle image - $path = $request->file('image')->store('todos', 'public'); - $data['image_url'] = $path; - } - - $todo->update($data); - - return new todoResource($todo); - } - - /** - * Affichage d'un todo précis. - */ - public function show(Todo $todo) - { - Gate::authorize('view', $todo); - - return new todoResource($todo); - } - - /** - * Suppression d'un todo et de son image associée. - */ - public function destroy(Todo $todo) - { - Gate::authorize('delete', $todo); - - // Nettoyage : supprimer l'image du serveur avant de supprimer le record - if ($todo->image_url) { - Storage::disk('public')->delete($todo->image_url); - } - - $todo->delete(); - - return response()->json(['message' => 'Todo supprimé avec succès']); - } -} diff --git a/app/Http/Requests/TodoRequest.php b/app/Http/Requests/TodoRequest.php deleted file mode 100644 index f86190f..0000000 --- a/app/Http/Requests/TodoRequest.php +++ /dev/null @@ -1,36 +0,0 @@ - [$this->isMethod('post') ? 'required' : 'sometimes', 'string', 'max:255'], - 'status' => ['sometimes','required', Rule::enum(TodoProgress::class)], - 'description'=> ['sometimes','nullable', 'string'], - 'image' => ['sometimes', 'nullable', 'image', 'max:2048'], - 'due_date' => ['sometimes', 'nullable', 'date'], - 'priority' => ['sometimes', 'required', Rule::enum(PriorityStatus::class)], - - ]; - } - - public function messages(): array - { - return [ - 'image.max' => "L'image ne doit pas dépasser 2 Mo.", - ]; - } - - public function authorize(): bool - { - return true; - } -} diff --git a/app/Http/Resources/todoResource.php b/app/Http/Resources/todoResource.php deleted file mode 100644 index 400a66a..0000000 --- a/app/Http/Resources/todoResource.php +++ /dev/null @@ -1,26 +0,0 @@ - $this->id, - 'name' => $this->name, - 'status' => $this->status, - 'description' => $this->description, - 'image_url' => $this->image_url ? asset(Storage::url($this->image_url)): null, - 'due_date' => $this->due_date, - 'priority' => $this->priority, - 'created_at' => $this->created_at, - 'updated_at' => $this->updated_at, - 'user_id' => $this->user_id, - ]; - } -} diff --git a/app/Models/Todo.php b/app/Models/Todo.php deleted file mode 100644 index ee051ed..0000000 --- a/app/Models/Todo.php +++ /dev/null @@ -1,54 +0,0 @@ -belongsTo(User::class); - } - - protected function casts(): array - { - return [ - 'status' => TodoProgress::class, - 'due_date' => 'date', - 'priority' => PriorityStatus::class, - ]; - } - - /** - * Get the indexable data array for the model. - * - * @return array - */ - public function toSearchableArray(): array - { - $array = $this->toArray(); - - // Customize the data array... - - return $array; - } -} diff --git a/app/Models/User.php b/app/Models/User.php index acb483e..4f6b171 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,8 +5,8 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Filament\Models\Contracts\FilamentUser; use Filament\Panel; +use Illuminate\Database\Eloquent\Concerns\HasUlids; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; @@ -14,7 +14,7 @@ use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable implements FilamentUser { /** @use HasFactory<\Database\Factories\UserFactory> */ - use HasFactory, Notifiable, HasApiTokens; + use HasFactory, Notifiable, HasApiTokens, HasUlids; /** * The attributes that are mass assignable. @@ -51,10 +51,6 @@ class User extends Authenticatable implements FilamentUser ]; } - public function todos(): HasMany - { - return $this->hasMany(Todo::class); - } public function isAdmin() { diff --git a/app/Policies/TodoPolicy.php b/app/Policies/TodoPolicy.php deleted file mode 100644 index 1ce93fc..0000000 --- a/app/Policies/TodoPolicy.php +++ /dev/null @@ -1,50 +0,0 @@ -id === $todo->user_id; - } - - /** - * Determine whether the user can create models. - */ - public function create(User $user): bool - { - return true; - } - - /** - * Determine whether the user can update the model. - */ - public function update(User $user, Todo $todo): bool - { - return $user->id === $todo->user_id; - } - - /** - * Determine whether the user can delete the model. - */ - public function delete(User $user, Todo $todo): bool - { - return $user->id === $todo->user_id; - } -} diff --git a/database/factories/todoFactory.php b/database/factories/todoFactory.php deleted file mode 100644 index f325fc0..0000000 --- a/database/factories/todoFactory.php +++ /dev/null @@ -1,26 +0,0 @@ - $this->faker->name(), - 'is_done' => $this->faker->boolean(), - 'image_url' => null, - 'created_at' => Carbon::now(), - 'updated_at' => Carbon::now(), - - 'user_id' => User::factory(), - ]; - } -} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 05fb5d9..48383eb 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -12,11 +12,13 @@ return new class extends Migration public function up(): void { Schema::create('users', function (Blueprint $table) { - $table->id(); + $table->ulid('id')->primary(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->string('avatar_url', 2048)->nullable(); + $table->rememberToken(); $table->timestamps(); }); @@ -29,7 +31,7 @@ return new class extends Migration Schema::create('sessions', function (Blueprint $table) { $table->string('id')->primary(); - $table->foreignId('user_id')->nullable()->index(); + $table->foreignUlid('user_id')->nullable()->index(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->longText('payload'); diff --git a/database/migrations/2026_03_09_120219_create_personal_access_tokens_table.php b/database/migrations/2026_03_09_120219_create_personal_access_tokens_table.php index 40ff706..c31f2ce 100644 --- a/database/migrations/2026_03_09_120219_create_personal_access_tokens_table.php +++ b/database/migrations/2026_03_09_120219_create_personal_access_tokens_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('personal_access_tokens', function (Blueprint $table) { $table->id(); - $table->morphs('tokenable'); + $table->ulidMorphs('tokenable'); $table->text('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); diff --git a/database/migrations/2026_03_09_120925_create_todo_table.php b/database/migrations/2026_03_09_120925_create_todo_table.php deleted file mode 100644 index ff90956..0000000 --- a/database/migrations/2026_03_09_120925_create_todo_table.php +++ /dev/null @@ -1,23 +0,0 @@ -id(); - $table->string('name'); - $table->boolean('is_done')->default(false); - $table->foreignId('user_id')->constrained('users'); - $table->timestamps(); - }); - } - - public function down(): void - { - Schema::dropIfExists('todo'); - } -}; diff --git a/database/migrations/2026_03_09_231500_add_image_url_to_todo_table.php b/database/migrations/2026_03_09_231500_add_image_url_to_todo_table.php deleted file mode 100644 index 180dcce..0000000 --- a/database/migrations/2026_03_09_231500_add_image_url_to_todo_table.php +++ /dev/null @@ -1,22 +0,0 @@ -string('image_url')->nullable()->after('is_done'); - }); - } - - public function down(): void - { - Schema::table('todo', function (Blueprint $table) { - $table->dropColumn('image_url'); - }); - } -}; diff --git a/database/migrations/2026_03_10_130433_add_status_to_todos.php b/database/migrations/2026_03_10_130433_add_status_to_todos.php deleted file mode 100644 index 1c2cf4a..0000000 --- a/database/migrations/2026_03_10_130433_add_status_to_todos.php +++ /dev/null @@ -1,29 +0,0 @@ -string('status')->default('to_do'); - $table->dropColumn('is_done'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('todo', function (Blueprint $table) { - $table->dropColumn('status'); - }); - } -}; diff --git a/database/migrations/2026_03_10_140113_add_description_to_todos.php b/database/migrations/2026_03_10_140113_add_description_to_todos.php deleted file mode 100644 index 60fc63d..0000000 --- a/database/migrations/2026_03_10_140113_add_description_to_todos.php +++ /dev/null @@ -1,28 +0,0 @@ -text("description")->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('todo', function (Blueprint $table) { - $table->dropColumn('description'); - }); - } -}; diff --git a/database/migrations/2026_03_11_000001_add_avatar_url_to_users_table.php b/database/migrations/2026_03_11_000001_add_avatar_url_to_users_table.php deleted file mode 100644 index 5153501..0000000 --- a/database/migrations/2026_03_11_000001_add_avatar_url_to_users_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('avatar_url', 2048)->nullable()->after('password'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('avatar_url'); - }); - } -}; diff --git a/database/migrations/2026_03_11_082531_add_due_date_and_priority_to_tasks.php b/database/migrations/2026_03_11_082531_add_due_date_and_priority_to_tasks.php deleted file mode 100644 index fb3bf90..0000000 --- a/database/migrations/2026_03_11_082531_add_due_date_and_priority_to_tasks.php +++ /dev/null @@ -1,30 +0,0 @@ -string('priority')->default('low'); - $table->date('due_date')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('todo', function (Blueprint $table) { - $table->dropColumn('priority'); - $table->dropColumn('due_date'); - }); - } -}; diff --git a/routes/api.php b/routes/api.php index 111eb84..8cc0c07 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,7 +3,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; -use App\Http\Controllers\todoController; Route::prefix('auth')->group(function (): void { Route::post('register', [AuthController::class, 'register']); Route::post('login', [AuthController::class, 'login']); @@ -14,10 +13,3 @@ Route::prefix('auth')->group(function (): void { }); }); -Route::middleware('auth:sanctum')->prefix('todos')->group(function (): void { - Route::get('/', [todoController::class, 'index']); - Route::post('/', [todoController::class, 'store']); - Route::get('/{todo}', [todoController::class, 'show']); - Route::patch('/{todo}', [todoController::class, 'update']); - Route::delete('/{todo}', [todoController::class, 'destroy']); -});