feat: add mood

This commit is contained in:
2025-08-27 13:45:21 +03:30
parent 8f9829fc1f
commit 01b67d8f80
8 changed files with 197 additions and 14 deletions
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers;
use App\Models\Mood;
use App\Models\UserMood;
use Illuminate\Http\Request;
class MoodController extends Controller
{
// Store today's mood
public function storeUserMood(Request $request)
{
$data = $request->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);
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Mood extends Model
{
protected $fillable = ['name', 'emoji', 'description'];
public function userMoods()
{
return $this->hasMany(UserMood::class);
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class UserMood extends Model
{
protected $fillable = ['user_id', 'mood_id', 'date'];
public function user()
{
return $this->belongsTo(User::class);
}
public function mood()
{
return $this->belongsTo(Mood::class);
}
}
@@ -11,8 +11,11 @@
*/ */
public function up(): void public function up(): void
{ {
Schema::create('user_mood', function (Blueprint $table) { Schema::create('moods', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('name');
$table->string('description')->nullable();
$table->string('emoji');
$table->timestamps(); $table->timestamps();
}); });
} }
@@ -22,6 +25,6 @@ public function up(): void
*/ */
public function down(): void public function down(): void
{ {
Schema::dropIfExists('user_mood'); Schema::dropIfExists('moods');
} }
}; };
@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('user_moods', function (Blueprint $table) {
$table->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');
}
};
+15 -12
View File
@@ -8,20 +8,23 @@
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
{ {
public function run(): void
{
$this->call(MoodSeeder::class);
}
/** /**
* Seed the application's database. * Seed the application's database.
*/ */
public function run(): void // public function run(): void
{ // {
// User::factory(10)->create(); // // User::factory(10)->create();
$this->call([ // $this->call([
BreathingTemplateSeeder::class, // BreathingTemplateSeeder::class,
]); // ]);
// User::factory()->create([ // // User::factory()->create([
// 'name' => 'Test User', // // 'name' => 'Test User',
// 'email' => 'test@example.com', // // 'email' => 'test@example.com',
// ]); // // ]);
} // }
} }
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Mood;
class MoodSeeder extends Seeder
{
public function run()
{
$moods = [
[
'name' => 'خوشحال',
'emoji' => '😊',
'description' => 'احساس شادی و رضایت از شرایط زندگی یا لحظه حال.'
],
[
'name' => 'غمگین',
'emoji' => '😢',
'description' => 'حس ناراحتی و اندوه که ممکن است به دلیل اتفاقی ناخوشایند باشد.'
],
[
'name' => 'آرام',
'emoji' => '😌',
'description' => 'احساسی از آرامش و رهایی از استرس و تنش.'
],
[
'name' => 'عصبانی',
'emoji' => '😠',
'description' => 'حس خشم یا ناراحتی شدید نسبت به موقعیتی خاص.'
],
[
'name' => 'هیجان‌زده',
'emoji' => '🤩',
'description' => 'احساس شور و شوق فراوان برای تجربه یا رویدادی خاص.'
],
[
'name' => 'خسته',
'emoji' => '😴',
'description' => 'کمبود انرژی و نیاز به استراحت یا خواب.'
]
];
foreach ($moods as $mood) {
Mood::create($mood);
}
}
}
+10
View File
@@ -7,6 +7,7 @@
use App\Http\Controllers\PackageNameController; use App\Http\Controllers\PackageNameController;
use App\Http\Controllers\ProductController; use App\Http\Controllers\ProductController;
use App\Http\Controllers\BreathingTemplate; use App\Http\Controllers\BreathingTemplate;
use App\Http\Controllers\MoodController;
Route::get('package-names/{name}/products', [ProductController::class, 'index']); Route::get('package-names/{name}/products', [ProductController::class, 'index']);
Route::prefix('auth')->controller(UserController::class)->group(function () { Route::prefix('auth')->controller(UserController::class)->group(function () {
@@ -45,6 +46,15 @@
Route::get('/profile', [UserController::class, 'profile']); 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::post('breathing-exercises', [BreathingExerciseController::class, 'store']);
// Route::get('profile', [BreathingExerciseController::class, 'profile']); // Route::get('profile', [BreathingExerciseController::class, 'profile']);