From f488f7e01ddf1d4051352c92e26e59f80b3c77fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Wed, 4 Jun 2025 19:50:52 +0200 Subject: [PATCH] finished api --- Makefile | 5 +- images/init_laravel.sh | 2 +- .../app/Http/Controllers/BilletController.php | 69 ++++++++++++ .../Controllers/CommentaireController.php | 59 ++++++++++ .../app/Http/Controllers/UserController.php | 66 ++++++++++++ .../app/Http/Requests/StoreBilletRequest.php | 28 +++++ .../Requests/StoreCommentairesRequest.php | 50 +++++++++ .../app/Http/Requests/UpdateBilletRequest.php | 28 +++++ .../Requests/UpdateCommentairesRequest.php | 28 +++++ laravel/app/Http/Resources/BilletResource.php | 24 +++++ .../app/Http/Resources/BilletsResource.php | 23 ++++ .../Http/Resources/CommentaireResource.php | 23 ++++ laravel/app/Http/Resources/UserResource.php | 24 +++++ laravel/app/Models/Billet.php | 31 ++++++ laravel/app/Models/Commentaire.php | 60 +++++++++++ laravel/app/Models/User.php | 3 +- laravel/app/Policies/BilletPolicy.php | 66 ++++++++++++ laravel/app/Policies/CommentairesPolicy.php | 66 ++++++++++++ laravel/bootstrap/app.php | 8 +- laravel/composer.json | 1 + laravel/composer.lock | 102 ++++++++++++++---- laravel/config/sanctum.php | 84 +++++++++++++++ laravel/database/factories/BilletFactory.php | 27 +++++ .../factories/CommentairesFactory.php | 26 +++++ ...18_create_personal_access_tokens_table.php | 33 ++++++ ...2025_06_04_062336_create_billets_table.php | 30 ++++++ ...06_04_063420_create_commentaires_table.php | 41 +++++++ laravel/database/seeders/BilletSeeder.php | 18 ++++ .../database/seeders/CommentairesSeeder.php | 18 ++++ laravel/database/seeders/DatabaseSeeder.php | 12 +-- laravel/database/seeders/UserSeeder.php | 18 ++++ laravel/routes/api.php | 35 ++++++ 32 files changed, 1078 insertions(+), 30 deletions(-) create mode 100644 laravel/app/Http/Controllers/BilletController.php create mode 100644 laravel/app/Http/Controllers/CommentaireController.php create mode 100644 laravel/app/Http/Controllers/UserController.php create mode 100644 laravel/app/Http/Requests/StoreBilletRequest.php create mode 100644 laravel/app/Http/Requests/StoreCommentairesRequest.php create mode 100644 laravel/app/Http/Requests/UpdateBilletRequest.php create mode 100644 laravel/app/Http/Requests/UpdateCommentairesRequest.php create mode 100644 laravel/app/Http/Resources/BilletResource.php create mode 100644 laravel/app/Http/Resources/BilletsResource.php create mode 100644 laravel/app/Http/Resources/CommentaireResource.php create mode 100644 laravel/app/Http/Resources/UserResource.php create mode 100644 laravel/app/Models/Billet.php create mode 100644 laravel/app/Models/Commentaire.php create mode 100644 laravel/app/Policies/BilletPolicy.php create mode 100644 laravel/app/Policies/CommentairesPolicy.php create mode 100644 laravel/config/sanctum.php create mode 100644 laravel/database/factories/BilletFactory.php create mode 100644 laravel/database/factories/CommentairesFactory.php create mode 100644 laravel/database/migrations/2025_06_04_062118_create_personal_access_tokens_table.php create mode 100644 laravel/database/migrations/2025_06_04_062336_create_billets_table.php create mode 100644 laravel/database/migrations/2025_06_04_063420_create_commentaires_table.php create mode 100644 laravel/database/seeders/BilletSeeder.php create mode 100644 laravel/database/seeders/CommentairesSeeder.php create mode 100644 laravel/database/seeders/UserSeeder.php create mode 100755 laravel/routes/api.php diff --git a/Makefile b/Makefile index 02ccf0c..ef918f8 100644 --- a/Makefile +++ b/Makefile @@ -14,4 +14,7 @@ exec_container: docker exec -i awa-laravel-1 bash down: - docker compose down -v \ No newline at end of file + docker compose down -v + +seed: + docker exec -i awa-laravel-1 php artisan db:seed --class=$(CLASS) \ No newline at end of file diff --git a/images/init_laravel.sh b/images/init_laravel.sh index 67cb3eb..8abd99b 100644 --- a/images/init_laravel.sh +++ b/images/init_laravel.sh @@ -1,4 +1,4 @@ #!/bin/sh composer install -php artisan migrate +php artisan migrate --force php artisan db:seed \ No newline at end of file diff --git a/laravel/app/Http/Controllers/BilletController.php b/laravel/app/Http/Controllers/BilletController.php new file mode 100644 index 0000000..3af1ab7 --- /dev/null +++ b/laravel/app/Http/Controllers/BilletController.php @@ -0,0 +1,69 @@ +error('Erreur accès base de données'); + return response()->json([ + 'message' => 'Ressource indisponible.', + ], 500); + } + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + */ + public function show($id) { + try { + return new BilletResource(Billet::with('commentaires', 'commentaires.user')->findOrFail($id)); + } + catch (\Illuminate\Database\QueryException $e) { + Log::error('Erreur accès base de données'); + return response()->json([ + 'message' => 'Ressource indisponible.', + ], 500); + } + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/laravel/app/Http/Controllers/CommentaireController.php b/laravel/app/Http/Controllers/CommentaireController.php new file mode 100644 index 0000000..325c3f6 --- /dev/null +++ b/laravel/app/Http/Controllers/CommentaireController.php @@ -0,0 +1,59 @@ +validated()); + return response()->json($commentaire, 201); + } catch (\Illuminate\Database\QueryException $e) { + Log::channel('projectError')->error('Erreur accès base de données'); + return response()->json([ + 'message' => $e->getMessage(), + ], 500); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/laravel/app/Http/Controllers/UserController.php b/laravel/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..7f89779 --- /dev/null +++ b/laravel/app/Http/Controllers/UserController.php @@ -0,0 +1,66 @@ +validate([ + 'name' => 'required|string|max:50', + 'email' => 'required|email|max:50|unique:users', + 'password' => 'required|string|min:8|', + ]); + + // Create a new user + $user = \App\Models\User::create([ + 'name' => $validatedData['name'], + 'email' => $validatedData['email'], + 'password' => bcrypt($validatedData['password']), + ]); + $token = $user->createToken('auth_token')->plainTextToken; + return response()->json([ + 'access_token' => $token, + 'token_type' => 'Bearer', + ], 201); + } + + /** + * Display the specified resource. + */ + public function show(Request $request) + { + return new UserResource($request->user()); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/laravel/app/Http/Requests/StoreBilletRequest.php b/laravel/app/Http/Requests/StoreBilletRequest.php new file mode 100644 index 0000000..52179c5 --- /dev/null +++ b/laravel/app/Http/Requests/StoreBilletRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/laravel/app/Http/Requests/StoreCommentairesRequest.php b/laravel/app/Http/Requests/StoreCommentairesRequest.php new file mode 100644 index 0000000..0eac5c1 --- /dev/null +++ b/laravel/app/Http/Requests/StoreCommentairesRequest.php @@ -0,0 +1,50 @@ +|string> + */ + public function rules(): array + { + return [ + 'COM_DATE' => ['required', 'date'], + 'COM_CONTENU' => ['required', 'string', 'max:200'], + 'billet_id' => ['required', 'integer'], + 'user_id' => ['required', 'integer', Rule::exists('users', 'id')->where(function ($query) { + $query->where('id', $this->user()->id); + })], + ]; + } + + public function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) { + throw new HttpResponseException( + response()->json([ + 'success' => false, + 'message' => 'Validation failed', + 'data' => $validator->errors(), + ], 422) + ); + } + + public function validated($key = null, $default = null) + { + return parent::validated($key, $default); + } +} diff --git a/laravel/app/Http/Requests/UpdateBilletRequest.php b/laravel/app/Http/Requests/UpdateBilletRequest.php new file mode 100644 index 0000000..f845086 --- /dev/null +++ b/laravel/app/Http/Requests/UpdateBilletRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/laravel/app/Http/Requests/UpdateCommentairesRequest.php b/laravel/app/Http/Requests/UpdateCommentairesRequest.php new file mode 100644 index 0000000..e197fd0 --- /dev/null +++ b/laravel/app/Http/Requests/UpdateCommentairesRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/laravel/app/Http/Resources/BilletResource.php b/laravel/app/Http/Resources/BilletResource.php new file mode 100644 index 0000000..41da043 --- /dev/null +++ b/laravel/app/Http/Resources/BilletResource.php @@ -0,0 +1,24 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'Date' => $this->BIL_DATE, + 'Titre' => $this->BIL_TITRE, + 'Contenu' => $this->BIL_CONTENU, + 'Commentaires' => CommentaireResource::collection($this->whenLoaded('commentaires')), + ]; + } +} diff --git a/laravel/app/Http/Resources/BilletsResource.php b/laravel/app/Http/Resources/BilletsResource.php new file mode 100644 index 0000000..2066b30 --- /dev/null +++ b/laravel/app/Http/Resources/BilletsResource.php @@ -0,0 +1,23 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'Date' => $this->BIL_DATE, + 'Titre' => $this->BIL_TITRE, + 'Contenu' => $this->BIL_CONTENU, + ]; + } +} diff --git a/laravel/app/Http/Resources/CommentaireResource.php b/laravel/app/Http/Resources/CommentaireResource.php new file mode 100644 index 0000000..594dd2d --- /dev/null +++ b/laravel/app/Http/Resources/CommentaireResource.php @@ -0,0 +1,23 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'Date' => $this->COM_DATE, + 'Auteur' => $this->user->name, + 'Contenu' => $this->COM_CONTENU, + ]; + } +} diff --git a/laravel/app/Http/Resources/UserResource.php b/laravel/app/Http/Resources/UserResource.php new file mode 100644 index 0000000..1a2a6ee --- /dev/null +++ b/laravel/app/Http/Resources/UserResource.php @@ -0,0 +1,24 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->getKey(), + 'nom' => $this->name, + 'email' => $this->email, + ]; + } +} diff --git a/laravel/app/Models/Billet.php b/laravel/app/Models/Billet.php new file mode 100644 index 0000000..c5a672a --- /dev/null +++ b/laravel/app/Models/Billet.php @@ -0,0 +1,31 @@ + */ + use HasFactory; + + protected $fillable = [ + 'BIL_DATE', + 'BIL_TITRE', + 'BIL_CONTENU', + ]; + + protected $hidden = [ + 'id', + 'created_at', + 'updated_at', + ]; + + // Un billet a plusieurs commentaires. + // Cette fonction sera utile pour afficher les commentaires d'un billet sélectionné. + public function commentaires() + { + return $this->hasMany(Commentaire::class); + } +} \ No newline at end of file diff --git a/laravel/app/Models/Commentaire.php b/laravel/app/Models/Commentaire.php new file mode 100644 index 0000000..f7b882f --- /dev/null +++ b/laravel/app/Models/Commentaire.php @@ -0,0 +1,60 @@ + 'datetime', + 'billet_id' => 'int' + ]; + + protected $fillable = [ + 'COM_DATE', + 'COM_AUTEUR', + 'COM_CONTENU', + 'billet_id', + 'user_id' + ]; + + protected $hidden = [ + 'id', + 'created_at', + 'updated_at', + 'billet_id' + ]; + + public function billet() + { + return $this->belongsTo(Billet::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/laravel/app/Models/User.php b/laravel/app/Models/User.php index 749c7b7..91135d7 100644 --- a/laravel/app/Models/User.php +++ b/laravel/app/Models/User.php @@ -6,11 +6,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ - use HasFactory, Notifiable; + use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. diff --git a/laravel/app/Policies/BilletPolicy.php b/laravel/app/Policies/BilletPolicy.php new file mode 100644 index 0000000..d9c4550 --- /dev/null +++ b/laravel/app/Policies/BilletPolicy.php @@ -0,0 +1,66 @@ +withRouting( web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) @@ -14,5 +17,8 @@ return Application::configure(basePath: dirname(__DIR__)) // }) ->withExceptions(function (Exceptions $exceptions) { - // + $exceptions->renderable(function (NotFoundHttpException $e) { + Log::channel('projectLog')->error('Resource not found: '.$e->getMessage()); + return response()->json(['message' => 'Resource not found'], 404); + }); })->create(); diff --git a/laravel/composer.json b/laravel/composer.json index 9c446ae..87430b8 100644 --- a/laravel/composer.json +++ b/laravel/composer.json @@ -8,6 +8,7 @@ "require": { "php": "^8.2", "laravel/framework": "^12.0", + "laravel/sanctum": "^4.0", "laravel/tinker": "^2.10.1" }, "require-dev": { diff --git a/laravel/composer.lock b/laravel/composer.lock index 30561e3..a6cce71 100644 --- a/laravel/composer.lock +++ b/laravel/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "88970a0117c062eed55fa8728fc43833", + "content-hash": "85c1d2065f70e38b0d6bf66559fb13c5", "packages": [ { "name": "brick/math", - "version": "0.12.3", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -56,7 +56,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -64,7 +64,7 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -1056,20 +1056,20 @@ }, { "name": "laravel/framework", - "version": "v12.16.0", + "version": "v12.17.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "293bb1c70224faebfd3d4328e201c37115da055f" + "reference": "8729d084510480fdeec9b6ad198180147d4a7f06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/293bb1c70224faebfd3d4328e201c37115da055f", - "reference": "293bb1c70224faebfd3d4328e201c37115da055f", + "url": "https://api.github.com/repos/laravel/framework/zipball/8729d084510480fdeec9b6ad198180147d4a7f06", + "reference": "8729d084510480fdeec9b6ad198180147d4a7f06", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12", + "brick/math": "^0.11|^0.12|^0.13", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -1267,7 +1267,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-05-27T15:49:44+00:00" + "time": "2025-06-03T14:04:18+00:00" }, { "name": "laravel/prompts", @@ -1328,6 +1328,70 @@ }, "time": "2025-02-11T13:34:40+00:00" }, + { + "name": "laravel/sanctum", + "version": "v4.1.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", + "php": "^8.2", + "symfony/console": "^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0|^10.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2025-04-23T13:03:38+00:00" + }, { "name": "laravel/serializable-closure", "version": "v2.0.4", @@ -5846,16 +5910,16 @@ }, { "name": "filp/whoops", - "version": "2.18.0", + "version": "2.18.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" + "reference": "8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "url": "https://api.github.com/repos/filp/whoops/zipball/8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26", + "reference": "8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26", "shasum": "" }, "require": { @@ -5905,7 +5969,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.0" + "source": "https://github.com/filp/whoops/tree/2.18.1" }, "funding": [ { @@ -5913,7 +5977,7 @@ "type": "github" } ], - "time": "2025-03-15T12:00:00+00:00" + "time": "2025-06-03T18:56:14+00:00" }, { "name": "hamcrest/hamcrest-php", diff --git a/laravel/config/sanctum.php b/laravel/config/sanctum.php new file mode 100644 index 0000000..44527d6 --- /dev/null +++ b/laravel/config/sanctum.php @@ -0,0 +1,84 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort(), + // Sanctum::currentRequestHost(), + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/laravel/database/factories/BilletFactory.php b/laravel/database/factories/BilletFactory.php new file mode 100644 index 0000000..9049ab7 --- /dev/null +++ b/laravel/database/factories/BilletFactory.php @@ -0,0 +1,27 @@ + + */ +class BilletFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'BIL_DATE' => $this->faker->date(), + 'BIL_TITRE' => $this->faker->text(20), + 'BIL_CONTENU' => $this->faker->text(100), + 'created_at' => now(), + 'updated_at' => now(), + ]; + } +} diff --git a/laravel/database/factories/CommentairesFactory.php b/laravel/database/factories/CommentairesFactory.php new file mode 100644 index 0000000..b53d65b --- /dev/null +++ b/laravel/database/factories/CommentairesFactory.php @@ -0,0 +1,26 @@ + + */ +class CommentairesFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'COM_DATE' => now(), + 'COM_CONTENU' => fake()->text(200), + 'billet_id' => fake()->numberBetween(1, 10), + 'user_id' => fake()->numberBetween(1, 2), + ]; + } +} diff --git a/laravel/database/migrations/2025_06_04_062118_create_personal_access_tokens_table.php b/laravel/database/migrations/2025_06_04_062118_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/laravel/database/migrations/2025_06_04_062118_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/laravel/database/migrations/2025_06_04_062336_create_billets_table.php b/laravel/database/migrations/2025_06_04_062336_create_billets_table.php new file mode 100644 index 0000000..5c0fc3b --- /dev/null +++ b/laravel/database/migrations/2025_06_04_062336_create_billets_table.php @@ -0,0 +1,30 @@ +id(); + $table->date('BIL_DATE'); + $table->text('BIL_TITRE'); + $table->text('BIL_CONTENU'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('billets'); + } +}; diff --git a/laravel/database/migrations/2025_06_04_063420_create_commentaires_table.php b/laravel/database/migrations/2025_06_04_063420_create_commentaires_table.php new file mode 100644 index 0000000..4c115a1 --- /dev/null +++ b/laravel/database/migrations/2025_06_04_063420_create_commentaires_table.php @@ -0,0 +1,41 @@ +id(); + $table->date('COM_DATE'); + $table->text('COM_CONTENU'); + $table->unsignedBigInteger('billet_id'); + $table->unsignedBigInteger('user_id'); + $table->foreign('billet_id') + ->references('id') + ->on('billets') + ->onDelete('cascade') + ->onUpdate('cascade'); + $table->foreign('user_id') + ->references('id') + ->on('users') + ->onDelete('cascade') + ->onUpdate('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('commentaires'); + } +}; diff --git a/laravel/database/seeders/BilletSeeder.php b/laravel/database/seeders/BilletSeeder.php new file mode 100644 index 0000000..32cd165 --- /dev/null +++ b/laravel/database/seeders/BilletSeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/laravel/database/seeders/CommentairesSeeder.php b/laravel/database/seeders/CommentairesSeeder.php new file mode 100644 index 0000000..a7b9909 --- /dev/null +++ b/laravel/database/seeders/CommentairesSeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/laravel/database/seeders/DatabaseSeeder.php b/laravel/database/seeders/DatabaseSeeder.php index d01a0ef..87fd65c 100644 --- a/laravel/database/seeders/DatabaseSeeder.php +++ b/laravel/database/seeders/DatabaseSeeder.php @@ -11,13 +11,11 @@ class DatabaseSeeder extends Seeder /** * Seed the application's database. */ - public function run(): void - { - // User::factory(10)->create(); + public function run(): void{ - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', - ]); + // User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); } } diff --git a/laravel/database/seeders/UserSeeder.php b/laravel/database/seeders/UserSeeder.php new file mode 100644 index 0000000..b26627e --- /dev/null +++ b/laravel/database/seeders/UserSeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/laravel/routes/api.php b/laravel/routes/api.php new file mode 100755 index 0000000..ce6a133 --- /dev/null +++ b/laravel/routes/api.php @@ -0,0 +1,35 @@ +group(function () { + Route::get('/user', [\App\Http\Controllers\UserController::class, 'show']); + Route::post('/user/logout', function (Request $request) { + $request->user()->tokens()->delete(); + }); + Route::get('/billets/{id}', [BilletController::class, 'show'])->whereNumber('id'); + Route::post('/commentaires', [\App\Http\Controllers\CommentaireController::class, 'store']); +}); + +Route::post('/register', [\App\Http\Controllers\UserController::class, 'store']); + +Route::post('/login', function (Request $request) { + $request->validate([ + 'email' => 'required|email|max:50', + 'password' => 'required|string|min:8', + ]); + + $user = \App\Models\User::where('email', $request->email)->first(); + if (!$user || !Hash::check($request->password, $user->password)) { + throw \Illuminate\Validation\ValidationException::withMessages([ + 'email' => ['The provided credentials are incorrect.'], + ]); + } + + return $user->createToken('auth_token')->plainTextToken; +}); \ No newline at end of file