From 5b9df7d02ae87772a0bc64d738866f246e165be3 Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Mon, 3 Aug 2026 20:22:58 +0300 Subject: [PATCH] add set persistence --- backend/app/Providers/AppServiceProvider.php | 6 ++ backend/app/Set/CreateSetDto.php | 13 +++++ backend/app/Set/EloquentSetRepository.php | 56 +++++++++++++++++++ backend/app/Set/Set.php | 29 ++++++++++ backend/app/Set/SetModel.php | 26 +++++++++ backend/app/Set/SetRepository.php | 13 +++++ .../2026_08_03_000000_create_sets_table.php | 24 ++++++++ 7 files changed, 167 insertions(+) create mode 100644 backend/app/Set/CreateSetDto.php create mode 100644 backend/app/Set/EloquentSetRepository.php create mode 100644 backend/app/Set/Set.php create mode 100644 backend/app/Set/SetModel.php create mode 100644 backend/app/Set/SetRepository.php create mode 100644 backend/database/migrations/2026_08_03_000000_create_sets_table.php diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php index 2255353..c9490ba 100644 --- a/backend/app/Providers/AppServiceProvider.php +++ b/backend/app/Providers/AppServiceProvider.php @@ -16,6 +16,8 @@ use App\Email\Emailer; use App\Email\EmailFactory; use App\Email\LaravelEmailer; use App\Email\LaravelEmailFactory; +use App\Set\EloquentSetRepository; +use App\Set\SetRepository; use App\User\EloquentUserRepository; use App\User\UserRepository; use Carbon\CarbonImmutable; @@ -45,6 +47,10 @@ class AppServiceProvider extends ServiceProvider ); $this->app->bind(Emailer::class, LaravelEmailer::class); $this->app->bind(EmailFactory::class, LaravelEmailFactory::class); + $this->app->bind( + SetRepository::class, + EloquentSetRepository::class, + ); $this->app->bind(PasswordHasher::class, BcryptPasswordHasher::class); $this->app->bind(TokenGenerator::class, RandomTokenGenerator::class); $this->app->bind(Clock::class, SystemClock::class); diff --git a/backend/app/Set/CreateSetDto.php b/backend/app/Set/CreateSetDto.php new file mode 100644 index 0000000..ac7b460 --- /dev/null +++ b/backend/app/Set/CreateSetDto.php @@ -0,0 +1,13 @@ + $dto->name, + 'creator_id' => $dto->creator->getId(), + ]); + + return new Set( + id: $model->id, + name: $model->name, + creator: $dto->creator, + ); + } + + public function all(): array + { + $models = SetModel::query() + ->orderBy('name') + ->orderBy('id') + ->get(); + $sets = []; + + foreach ($models as $model) { + $sets[] = $this->toDomain($model); + } + + return $sets; + } + + private function toDomain(SetModel $model): Set + { + $creator = $this->userRepository->find($model->creator_id); + if ($creator === null) { + throw new RuntimeException('set creator not found'); + } + + return new Set( + id: $model->id, + name: $model->name, + creator: $creator, + ); + } +} diff --git a/backend/app/Set/Set.php b/backend/app/Set/Set.php new file mode 100644 index 0000000..064e475 --- /dev/null +++ b/backend/app/Set/Set.php @@ -0,0 +1,29 @@ +id; + } + + public function getName(): string + { + return $this->name; + } + + public function getCreator(): User + { + return $this->creator; + } +} diff --git a/backend/app/Set/SetModel.php b/backend/app/Set/SetModel.php new file mode 100644 index 0000000..021b3a5 --- /dev/null +++ b/backend/app/Set/SetModel.php @@ -0,0 +1,26 @@ +|SetModel newModelQuery() + * @method static Builder|SetModel newQuery() + * @method static Builder|SetModel query() + * + * @mixin \Eloquent + */ +#[Fillable(['name', 'creator_id'])] +class SetModel extends Model +{ + protected $table = 'sets'; + + public $timestamps = false; +} diff --git a/backend/app/Set/SetRepository.php b/backend/app/Set/SetRepository.php new file mode 100644 index 0000000..0545ab1 --- /dev/null +++ b/backend/app/Set/SetRepository.php @@ -0,0 +1,13 @@ + + */ + public function all(): array; +} diff --git a/backend/database/migrations/2026_08_03_000000_create_sets_table.php b/backend/database/migrations/2026_08_03_000000_create_sets_table.php new file mode 100644 index 0000000..589609b --- /dev/null +++ b/backend/database/migrations/2026_08_03_000000_create_sets_table.php @@ -0,0 +1,24 @@ +id(); + $table->string('name')->unique(); + $table->foreignId('creator_id') + ->constrained('users') + ->restrictOnDelete(); + }); + } + + public function down(): void + { + Schema::dropIfExists('sets'); + } +};