feat: add user fields

This commit is contained in:
2026-05-21 12:02:02 +02:00
parent 9d67a2c335
commit 6ac36e3de4
12 changed files with 262 additions and 15 deletions
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Enums;
enum PacePreference: string
{
case SLOW = 'slow';
case NORMAL = 'normal';
case FAST = 'fast';
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\Enums;
enum PhysicalActivityLevel: string
{
case SEDENTARY = 'sedentary';
case LIGHTLY_ACTIVE = 'lightly_active';
case MODERATELY_ACTIVE = 'moderately_active';
case VERY_ACTIVE = 'very_active';
case ATHLETE = 'athlete';
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Enums;
enum UserSex: string
{
case MAN = 'man';
case WOMAN = 'woman';
case OTHER = 'other';
case UNKNOWN = 'unknown';
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Enums;
enum WeightGoal: string
{
case LOSE_WEIGHT = 'lose_weight';
case MAINTAIN_WEIGHT = 'maintain_weight';
case GAIN_WEIGHT = 'gain_weight';
}
+45 -14
View File
@@ -12,6 +12,7 @@ use Illuminate\Auth\Events\Verified;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
@@ -29,12 +30,12 @@ class AuthController extends Controller
$avatarPath = $request->file('avatar')->store('avatars', 'public');
}
$user = User::create([
'name' => $data['name'],
'email' => strtolower($data['email']),
'password' => Hash::make($data['password']),
'avatar_url' => $avatarPath,
]);
$userAttributes = $this->userAttributesFromRequestData($data);
$userAttributes['email'] = strtolower($data['email']);
$userAttributes['password'] = Hash::make($data['password']);
$userAttributes['avatar_url'] = $avatarPath;
$user = User::create($userAttributes);
$user->sendEmailVerificationNotification();
@@ -158,18 +159,17 @@ class AuthController extends Controller
$data['avatar_url'] = $path;
}
unset($data['avatar']);
unset($data['nutritionGoals']);
$userAttributes = $this->userAttributesFromRequestData($data);
if (is_array($nutritionGoals)) {
$data['daily_calorie_goal'] = $nutritionGoals['calories'];
$data['daily_protein_goal'] = $nutritionGoals['proteins'];
$data['daily_carbs_goal'] = $nutritionGoals['carbs'];
$data['daily_fats_goal'] = $nutritionGoals['fats'];
$userAttributes['daily_calorie_goal'] = $nutritionGoals['calories'];
$userAttributes['daily_protein_goal'] = $nutritionGoals['proteins'];
$userAttributes['daily_carbs_goal'] = $nutritionGoals['carbs'];
$userAttributes['daily_fats_goal'] = $nutritionGoals['fats'];
}
if (! empty($data)) {
$user->update($data);
if (! empty($userAttributes)) {
$user->update($userAttributes);
}
return new UserResource($user->fresh());
@@ -212,4 +212,35 @@ class AuthController extends Controller
{
return filled($path) && ! Str::startsWith($path, ['http://', 'https://']);
}
/**
* @param array<string, mixed> $data
* @return array<string, mixed>
*/
private function userAttributesFromRequestData(array $data): array
{
$attributes = Arr::only($data, [
'name',
'avatar_url',
'height',
'bio',
'sex',
'date_of_birth',
]);
$attributeMap = [
'physicalActivityLevel' => 'physical_activity_level',
'weightGoal' => 'weight_goal',
'pacePreference' => 'pace_preference',
'dateOfBirth' => 'date_of_birth',
];
foreach ($attributeMap as $requestKey => $attribute) {
if (array_key_exists($requestKey, $data)) {
$attributes[$attribute] = $data[$requestKey];
}
}
return $attributes;
}
}
+11
View File
@@ -2,7 +2,12 @@
namespace App\Http\Requests;
use App\Enums\PacePreference;
use App\Enums\PhysicalActivityLevel;
use App\Enums\UserSex;
use App\Enums\WeightGoal;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class RegisterRequest extends FormRequest
{
@@ -28,6 +33,12 @@ class RegisterRequest extends FormRequest
'password' => ['required', 'string', 'min:8'],
'avatar' => ['sometimes', 'nullable', 'image', 'max:2048'],
'bio' => ['nullable', 'string'],
'physicalActivityLevel' => ['sometimes', Rule::enum(PhysicalActivityLevel::class)],
'weightGoal' => ['sometimes', Rule::enum(WeightGoal::class)],
'pacePreference' => ['sometimes', Rule::enum(PacePreference::class)],
'sex' => ['sometimes', Rule::enum(UserSex::class)],
'dateOfBirth' => ['sometimes', 'nullable', 'date_format:Y-m-d', 'before:today', 'after:1900-01-01'],
'date_of_birth' => ['sometimes', 'nullable', 'date_format:Y-m-d', 'before:today', 'after:1900-01-01'],
];
}
+11
View File
@@ -2,7 +2,12 @@
namespace App\Http\Requests;
use App\Enums\PacePreference;
use App\Enums\PhysicalActivityLevel;
use App\Enums\UserSex;
use App\Enums\WeightGoal;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateUserRequest extends FormRequest
{
@@ -23,6 +28,12 @@ class UpdateUserRequest extends FormRequest
'nutritionGoals.proteins' => ['required_with:nutritionGoals', 'numeric', 'min:0', 'max:10000'],
'nutritionGoals.carbs' => ['required_with:nutritionGoals', 'numeric', 'min:0', 'max:10000'],
'nutritionGoals.fats' => ['required_with:nutritionGoals', 'numeric', 'min:0', 'max:10000'],
'physicalActivityLevel' => ['sometimes', Rule::enum(PhysicalActivityLevel::class)],
'weightGoal' => ['sometimes', Rule::enum(WeightGoal::class)],
'pacePreference' => ['sometimes', Rule::enum(PacePreference::class)],
'sex' => ['sometimes', Rule::enum(UserSex::class)],
'dateOfBirth' => ['sometimes', 'nullable', 'date_format:Y-m-d', 'before:today', 'after:1900-01-01'],
'date_of_birth' => ['sometimes', 'nullable', 'date_format:Y-m-d', 'before:today', 'after:1900-01-01'],
];
}
+5
View File
@@ -23,6 +23,11 @@ class UserResource extends JsonResource
'height' => $this->height,
'avatarUrl' => $this->avatar_url ? asset(Storage::url($this->avatar_url)) : null,
'bio' => $this->bio,
'physicalActivityLevel' => $this->physical_activity_level,
'weightGoal' => $this->weight_goal,
'pacePreference' => $this->pace_preference,
'sex' => $this->sex,
'dateOfBirth' => $this->date_of_birth?->toDateString(),
'nutritionGoals' => [
'calories' => (int) $this->daily_calorie_goal,
'proteins' => (float) $this->daily_protein_goal,
+14
View File
@@ -2,6 +2,10 @@
namespace App\Models;
use App\Enums\PacePreference;
use App\Enums\PhysicalActivityLevel;
use App\Enums\UserSex;
use App\Enums\WeightGoal;
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Contracts\Auth\MustVerifyEmail;
@@ -35,6 +39,11 @@ class User extends Authenticatable implements FilamentUser, MustVerifyEmail
'daily_protein_goal',
'daily_carbs_goal',
'daily_fats_goal',
'physical_activity_level',
'weight_goal',
'pace_preference',
'sex',
'date_of_birth',
];
/**
@@ -61,6 +70,11 @@ class User extends Authenticatable implements FilamentUser, MustVerifyEmail
'daily_protein_goal' => 'float',
'daily_carbs_goal' => 'float',
'daily_fats_goal' => 'float',
'physical_activity_level' => PhysicalActivityLevel::class,
'weight_goal' => WeightGoal::class,
'pace_preference' => PacePreference::class,
'sex' => UserSex::class,
'date_of_birth' => 'immutable_date',
];
}