From 01b67d8f80b2c6da60cb36d33e2e5138dd366d35 Mon Sep 17 00:00:00 2001 From: Amirmahdi Nourkazemi Date: Wed, 27 Aug 2025 13:45:21 +0330 Subject: [PATCH] feat: add mood --- app/Http/Controllers/MoodController.php | 54 +++++++++++++++++++ app/Models/Mood.php | 15 ++++++ app/Models/UserMood.php | 19 +++++++ ...php => 2025_08_27_085127_create_moods.php} | 7 ++- .../2025_08_27_085130_create_user_moods.php | 30 +++++++++++ database/seeders/DatabaseSeeder.php | 27 +++++----- database/seeders/MoodSeeder.php | 49 +++++++++++++++++ routes/api.php | 10 ++++ 8 files changed, 197 insertions(+), 14 deletions(-) create mode 100644 app/Http/Controllers/MoodController.php create mode 100644 app/Models/Mood.php create mode 100644 app/Models/UserMood.php rename database/migrations/{2025_08_27_085130_create_user_mood.php => 2025_08_27_085127_create_moods.php} (65%) create mode 100644 database/migrations/2025_08_27_085130_create_user_moods.php create mode 100644 database/seeders/MoodSeeder.php diff --git a/app/Http/Controllers/MoodController.php b/app/Http/Controllers/MoodController.php new file mode 100644 index 0000000..e217737 --- /dev/null +++ b/app/Http/Controllers/MoodController.php @@ -0,0 +1,54 @@ +validate([ + 'mood_id' => 'required|exists:moods,id', + ]); + + $user = auth()->user(); + + $mood = UserMood::updateOrCreate( + [ + 'user_id' => $user->id, + 'date' => now()->toDateString(), + ], + [ + 'mood_id' => $data['mood_id'], + ] + ); + + return response()->json([ + 'message' => 'Mood saved successfully', + 'mood' => $mood->load('mood') + ]); + } + + // Get list of all moods user has set + public function getUserMoods() + { + $user = auth()->user(); + + $moods = UserMood::where('user_id', $user->id) + ->with('mood') + ->orderBy('date', 'desc') + ->get(); + + return response()->json($moods); + } + + public function getAllMoods() + { + $moods = Mood::all(); + return response()->json($moods); + } +} diff --git a/app/Models/Mood.php b/app/Models/Mood.php new file mode 100644 index 0000000..b0e8106 --- /dev/null +++ b/app/Models/Mood.php @@ -0,0 +1,15 @@ +hasMany(UserMood::class); + } +} diff --git a/app/Models/UserMood.php b/app/Models/UserMood.php new file mode 100644 index 0000000..ef2b562 --- /dev/null +++ b/app/Models/UserMood.php @@ -0,0 +1,19 @@ +belongsTo(User::class); + } + public function mood() + { + return $this->belongsTo(Mood::class); + } +} diff --git a/database/migrations/2025_08_27_085130_create_user_mood.php b/database/migrations/2025_08_27_085127_create_moods.php similarity index 65% rename from database/migrations/2025_08_27_085130_create_user_mood.php rename to database/migrations/2025_08_27_085127_create_moods.php index c783cc3..8889f38 100644 --- a/database/migrations/2025_08_27_085130_create_user_mood.php +++ b/database/migrations/2025_08_27_085127_create_moods.php @@ -11,8 +11,11 @@ */ public function up(): void { - Schema::create('user_mood', function (Blueprint $table) { + Schema::create('moods', function (Blueprint $table) { $table->id(); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('emoji'); $table->timestamps(); }); } @@ -22,6 +25,6 @@ public function up(): void */ public function down(): void { - Schema::dropIfExists('user_mood'); + Schema::dropIfExists('moods'); } }; diff --git a/database/migrations/2025_08_27_085130_create_user_moods.php b/database/migrations/2025_08_27_085130_create_user_moods.php new file mode 100644 index 0000000..d7231fc --- /dev/null +++ b/database/migrations/2025_08_27_085130_create_user_moods.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->foreignId('mood_id')->constrained('moods')->onDelete('cascade'); + $table->date('date'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_moods'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 7eff214..7c92eda 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -8,20 +8,23 @@ class DatabaseSeeder extends Seeder { - + public function run(): void +{ + $this->call(MoodSeeder::class); +} /** * Seed the application's database. */ - public function run(): void - { - // User::factory(10)->create(); -$this->call([ - BreathingTemplateSeeder::class, -]); - // User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); - } +// public function run(): void +// { +// // User::factory(10)->create(); +// $this->call([ +// BreathingTemplateSeeder::class, +// ]); +// // User::factory()->create([ +// // 'name' => 'Test User', +// // 'email' => 'test@example.com', +// // ]); +// } } diff --git a/database/seeders/MoodSeeder.php b/database/seeders/MoodSeeder.php new file mode 100644 index 0000000..8b520ef --- /dev/null +++ b/database/seeders/MoodSeeder.php @@ -0,0 +1,49 @@ + 'خوشحال', + 'emoji' => '😊', + 'description' => 'احساس شادی و رضایت از شرایط زندگی یا لحظه حال.' + ], + [ + 'name' => 'غمگین', + 'emoji' => '😢', + 'description' => 'حس ناراحتی و اندوه که ممکن است به دلیل اتفاقی ناخوشایند باشد.' + ], + [ + 'name' => 'آرام', + 'emoji' => '😌', + 'description' => 'احساسی از آرامش و رهایی از استرس و تنش.' + ], + [ + 'name' => 'عصبانی', + 'emoji' => '😠', + 'description' => 'حس خشم یا ناراحتی شدید نسبت به موقعیتی خاص.' + ], + [ + 'name' => 'هیجان‌زده', + 'emoji' => '🤩', + 'description' => 'احساس شور و شوق فراوان برای تجربه یا رویدادی خاص.' + ], + [ + 'name' => 'خسته', + 'emoji' => '😴', + 'description' => 'کمبود انرژی و نیاز به استراحت یا خواب.' + ] + ]; + + foreach ($moods as $mood) { + Mood::create($mood); + } + } +} diff --git a/routes/api.php b/routes/api.php index 04125a4..755480b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -7,6 +7,7 @@ use App\Http\Controllers\PackageNameController; use App\Http\Controllers\ProductController; use App\Http\Controllers\BreathingTemplate; +use App\Http\Controllers\MoodController; Route::get('package-names/{name}/products', [ProductController::class, 'index']); Route::prefix('auth')->controller(UserController::class)->group(function () { @@ -45,6 +46,15 @@ Route::get('/profile', [UserController::class, 'profile']); + ///-- mood routes + + Route::post('/moods/today', [MoodController::class, 'storeUserMood']); + Route::get('/moods/history', [MoodController::class, 'getUserMoods']); + + + // --------- get moods + Route::get('/moods', [MoodController::class, 'getAllMoods']); + // Route::post('breathing-exercises', [BreathingExerciseController::class, 'store']); // Route::get('profile', [BreathingExerciseController::class, 'profile']);