Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
144 commits
Select commit Hold shift + click to select a range
f22658e
feat: add users table migration and User model
zigzagdev Jun 27, 2026
92b5e06
Merge pull request #488 from zigzagdev/feat/user_migration
zigzagdev Jun 27, 2026
11e509c
feat: add AgeRange enum
zigzagdev Jun 27, 2026
1c2620c
feat: add SubscriptionTier enum and Subscription value object
zigzagdev Jun 27, 2026
9cec682
feat: add UserEntity value object
zigzagdev Jun 27, 2026
ffb1ec1
feat: implement SubscriptionFactory
zigzagdev Jun 27, 2026
09ed612
feat: implement UserEntityFactory
zigzagdev Jun 27, 2026
30cdf74
Merge pull request #489 from zigzagdev/feat/user_domain
zigzagdev Jun 27, 2026
81ecfaf
fix: correct SubscriptionFactory namespace and add missing use statem…
zigzagdev Jun 28, 2026
03ff3d1
feat: add UserRepositoryInterface, UserRepository, and UserDto stub
zigzagdev Jun 28, 2026
91419df
test: add unit tests for UserRepository
zigzagdev Jun 28, 2026
d7553e9
Merge pull request #490 from zigzagdev/feat/user_register-infra_layer
zigzagdev Jun 28, 2026
06dc4fe
feat: add CreateUserCommand with required key validation
zigzagdev Jun 28, 2026
7592ae4
feat: add CreateUserUseCase
zigzagdev Jun 28, 2026
e40fcf7
feat: add UserDtoFactory
zigzagdev Jun 28, 2026
5ac2543
feat: update UserDto with typed public readonly properties
zigzagdev Jun 28, 2026
c24585c
refactor: update UserRepositoryInterface and UserRepository to use Cr…
zigzagdev Jun 28, 2026
e4e5807
test: update UserRepository tests to use CreateUserCommand
zigzagdev Jun 28, 2026
3e8a0ab
Merge pull request #491 from zigzagdev/feat/user_register-application…
zigzagdev Jun 28, 2026
45a76eb
feat: add password field to CreateUserCommand and UserRepository
zigzagdev Jun 28, 2026
f7fa76a
feat: add UserViewModel and UserViewModelFactory
zigzagdev Jun 28, 2026
873f644
feat: add UserController with try/catch and 500 error logging
zigzagdev Jun 28, 2026
93b1dea
feat: register POST /api/v1/user/create route
zigzagdev Jun 28, 2026
d083413
feat: bind UserRepositroyInterface to UserRepository in RepositoryPro…
zigzagdev Jun 28, 2026
658fd8b
feat: add coverage report configuration to phpunit.xml
zigzagdev Jun 28, 2026
6f67251
test: add integration tests for user creation endpoint
zigzagdev Jun 28, 2026
3b45bae
Merge pull request #492 from zigzagdev/feat/user_register-presentatio…
zigzagdev Jun 28, 2026
199df74
feat: add Codecov integration for PR coverage reporting
zigzagdev Jun 28, 2026
fa882fd
Merge pull request #494 from zigzagdev/feat/codecov-integration
zigzagdev Jun 28, 2026
48e9576
test: add unit tests for Subscription isActive, isExpired, and isFree
zigzagdev Jun 28, 2026
bd032ab
test: add unit tests for CreateUserCommand key validation
zigzagdev Jun 28, 2026
231d5c2
test: add unit tests for CreateUserUseCase
zigzagdev Jun 28, 2026
35f8178
test: add unit tests for UserViewModel toArray
zigzagdev Jun 28, 2026
692a143
test: add unit tests for UserDtoFactory
zigzagdev Jun 28, 2026
e803a08
test: update UserRepositoryTest to use Tests\TestCase and add passwor…
zigzagdev Jun 28, 2026
f9bdc18
chore: add storage/certs/ to .gitignore
zigzagdev Jun 28, 2026
ccc5e72
chore: update UNESCO world heritage site data (image URLs, typo fix, …
zigzagdev Jun 28, 2026
31e1420
Merge pull request #497 from zigzagdev/feat/user_register-improve_cov…
zigzagdev Jun 28, 2026
c4b682a
test: add unit tests for SubscriptionFactory
zigzagdev Jun 28, 2026
d3721f1
test: add unit tests for UserEntityFactory
zigzagdev Jun 28, 2026
f181310
test: add unit tests for UserEntity getters including getFullName
zigzagdev Jun 28, 2026
a77ced6
test: add unit test for UserViewModelFactory
zigzagdev Jun 28, 2026
2f6a66e
Merge pull request #498 from zigzagdev/feat/user_register-improve_cov…
zigzagdev Jun 28, 2026
b395402
refactor: move unit tests from tests/Unit/ to app/Packages/ and updat…
zigzagdev Jun 28, 2026
f8da0f5
Merge pull request #499 from zigzagdev/feat/user_register-improve_cov…
zigzagdev Jun 28, 2026
b78510f
Merge pull request #495 from zigzagdev/feat/user_register
zigzagdev Jun 28, 2026
fdd707e
refactor: change Repository interface argument from UseCommand to Use…
zigzagdev Jun 28, 2026
43d9c6f
test: update and add unit tests for Entity-based Repository interface
zigzagdev Jun 28, 2026
387e87c
fix: resolve merge conflicts by taking Entity-based test versions
zigzagdev Jun 29, 2026
a884076
fix: use array_key_exists to correctly handle null id in UserEntityTest
zigzagdev Jun 29, 2026
f54e8ec
Merge pull request #504 from zigzagdev/refactor/repository-accepts-en…
zigzagdev Jun 29, 2026
0a1611c
feat: add updateUser to UserRepositroyInterface and UserRepository
zigzagdev Jun 29, 2026
d410cdc
test: add unit tests for updateUser in UserRepositoryTest
zigzagdev Jun 29, 2026
d8cc2a5
Merge pull request #505 from zigzagdev/feat/user_update-infra-layer
zigzagdev Jun 29, 2026
52c87fa
feat: add findById signature to UserRepositroyInterface
zigzagdev Jun 29, 2026
80986e2
feat: implement findById in UserRepository
zigzagdev Jun 29, 2026
030a03e
test: rewrite UserRepositoryTest as DB integration tests
zigzagdev Jun 29, 2026
416137f
feat: add findById signature to UserRepositroyInterface
zigzagdev Jun 29, 2026
11a15b5
feat: implement findById in UserRepository
zigzagdev Jun 29, 2026
5abc5e2
test: rewrite UserRepositoryTest as DB integration tests
zigzagdev Jun 29, 2026
016762b
Merge pull request #510 from zigzagdev/feat/user_find_by_id-infra_layer
zigzagdev Jun 29, 2026
389eedf
Merge branch 'feat/user_find_by_id' into feat/user_find_by_id-applica…
zigzagdev Jun 29, 2026
6de59b4
feat: implement GetUserByIdUseCase
zigzagdev Jun 29, 2026
ef5b062
test: add unit tests for GetUserByIdUseCase
zigzagdev Jun 29, 2026
bc8de06
Merge pull request #511 from zigzagdev/feat/user_find_by_id-applicati…
zigzagdev Jun 30, 2026
41626cf
feat: add getUserById action to UserController
zigzagdev Jun 30, 2026
7568313
feat: register GET /api/v1/users/{id} route
zigzagdev Jun 30, 2026
658cadb
test: add integration test for GET /api/v1/users/{id}
zigzagdev Jun 30, 2026
5224faf
Merge pull request #512 from zigzagdev/feat/user_find_by_id-presentat…
zigzagdev Jun 30, 2026
0a1b83a
Merge pull request #513 from zigzagdev/feat/user_find_by_id
zigzagdev Jun 30, 2026
bd93177
feat: add UpdateUserCommand
zigzagdev Jul 1, 2026
f954829
feat: implement UpdateUserUseCase
zigzagdev Jul 1, 2026
62ea7ce
test: add unit tests for UpdateUserCommand
zigzagdev Jul 1, 2026
45effe3
test: add unit tests for UpdateUserUseCase
zigzagdev Jul 1, 2026
68d41e3
refactor: move UserViewModel to QueryUseCases/ViewModel/User
zigzagdev Jul 1, 2026
aefd39c
refactor: move UserViewModelFactory to QueryUseCases/Factory/ViewModel
zigzagdev Jul 1, 2026
b84f390
refactor: update UserController import to use QueryUseCases UserViewM…
zigzagdev Jul 1, 2026
807cf03
test: move UserViewModelTest to QueryUseCases/Tests/ViewModel
zigzagdev Jul 1, 2026
6806822
test: move UserViewModelFactoryTest to QueryUseCases/Tests/ViewModel
zigzagdev Jul 1, 2026
1ee3c41
chore: add root .gitignore to exclude .idea
zigzagdev Jul 1, 2026
3e4b21f
Merge pull request #518 from zigzagdev/feat/user_update-application_l…
zigzagdev Jul 2, 2026
d8bcc71
feat: add updateUser action to UserController
zigzagdev Jul 2, 2026
1e7423b
feat: register PATCH /api/v1/users/{id} route
zigzagdev Jul 2, 2026
0af8b3d
test: add integration test for PATCH /api/v1/users/{id}
zigzagdev Jul 2, 2026
21a990a
Merge pull request #519 from zigzagdev/feat/user_update-presentation_…
zigzagdev Jul 2, 2026
07483b1
Merge pull request #520 from zigzagdev/feat/user_update
zigzagdev Jul 3, 2026
39ad003
feat: add deleteUser to UserRepositroyInterface
zigzagdev Jul 3, 2026
f086bc0
feat: implement deleteUser in UserRepository
zigzagdev Jul 3, 2026
dd244d5
test: add deleteUser integration tests to UserRepositoryTest
zigzagdev Jul 3, 2026
97ca0bf
Merge pull request #521 from zigzagdev/feat/user-delete_infra-layer
zigzagdev Jul 3, 2026
304e16c
feat: implement DeleteUserUseCase
zigzagdev Jul 3, 2026
adf71bc
test: add unit tests for DeleteUserUseCase
zigzagdev Jul 3, 2026
6f93265
Merge pull request #522 from zigzagdev/feat/user-delete_application-l…
zigzagdev Jul 4, 2026
a08344b
feat: add deleteUser action to UserController
zigzagdev Jul 4, 2026
ab5e26a
feat: register DELETE /api/v1/users/{id} route
zigzagdev Jul 4, 2026
195533f
test: add integration tests for DELETE /api/v1/users/{id}
zigzagdev Jul 4, 2026
8836cc7
Merge pull request #523 from zigzagdev/feat/user-delete_presentation-…
zigzagdev Jul 4, 2026
1d8e53b
Merge pull request #524 from zigzagdev/feat/user-delete
zigzagdev Jul 12, 2026
42b54c3
refactor: move User domain files under Domains/User/
zigzagdev Jul 12, 2026
af6af97
refactor: move WorldHeritage domain files under Domains/WorldHeritage/
zigzagdev Jul 12, 2026
0ca7fd4
docs: add CLAUDE.md with project conventions
zigzagdev Jul 12, 2026
d5ae586
feat: add Email ValueObject to User domain
zigzagdev Jul 12, 2026
08c6550
feat: add findByEmail to UserRepositroyInterface
zigzagdev Jul 12, 2026
172e358
refactor: update UserEntityFactory to use Email ValueObject
zigzagdev Jul 12, 2026
92fa72e
refactor: update UserEntity to use Email ValueObject
zigzagdev Jul 12, 2026
435dc90
feat: implement findByEmail in UserRepository
zigzagdev Jul 12, 2026
2fabbf3
test: add findByEmail integration tests to UserRepositoryTest
zigzagdev Jul 12, 2026
0657750
fix: update UserEntityFactoryTest to call getEmail()->value() after E…
zigzagdev Jul 13, 2026
f4f1f88
fix: update UserEntityTest to wrap email string in Email VO
zigzagdev Jul 13, 2026
6fbefe0
Merge pull request #530 from zigzagdev/feat/user-login-domain-infra-f…
zigzagdev Jul 13, 2026
c931f74
feat: install laravel/sanctum
zigzagdev Jul 13, 2026
918f1b7
feat: add personal_access_tokens migration for Sanctum
zigzagdev Jul 13, 2026
4fa03dd
feat: add HasApiTokens trait to User model
zigzagdev Jul 13, 2026
f913adb
feat: add TokenServiceInterface to User domain
zigzagdev Jul 13, 2026
26da6b1
feat: implement SanctumTokenService
zigzagdev Jul 13, 2026
7f686de
feat: bind TokenServiceInterface to SanctumTokenService in AppService…
zigzagdev Jul 13, 2026
582e539
test: add integration tests for SanctumTokenService
zigzagdev Jul 13, 2026
743bb12
feat: publish Sanctum config and set token expiration to 1 day
zigzagdev Jul 13, 2026
824018e
Merge pull request #531 from zigzagdev/feat/user-login_infra-layer-to…
zigzagdev Jul 13, 2026
3243004
feat: add AuthTokenDto with token and token_type fields
zigzagdev Jul 13, 2026
868800e
refactor: rename TokenDto to AuthTokenDto and update LoginUseCase and…
zigzagdev Jul 13, 2026
f382085
Merge pull request #533 from zigzagdev/feat/user-login_application-layer
zigzagdev Jul 13, 2026
1fa30f4
feat: add AuthController with login action
zigzagdev Jul 13, 2026
449f04c
feat: register POST /v1/user/login route and refactor routes with Rou…
zigzagdev Jul 13, 2026
17259ce
test: add integration tests for POST /api/v1/user/login
zigzagdev Jul 13, 2026
84811c8
feat: add mago.toml with lint-based static analysis config
zigzagdev Jul 13, 2026
44d0ba0
feat: add static_analysis.yml CI workflow for mago lint
zigzagdev Jul 13, 2026
50d4017
chore: add .composer to .gitignore
zigzagdev Jul 13, 2026
b75a51f
chore: tune mago.toml lint scope and rule thresholds
zigzagdev Jul 13, 2026
e53fed5
refactor: remove final from LoginUseCase to allow mocking in tests
zigzagdev Jul 14, 2026
16fc4df
test: add 500 error case for POST /api/v1/user/login
zigzagdev Jul 14, 2026
01ba6d8
Merge pull request #534 from zigzagdev/feat/user-login_presentation-l…
zigzagdev Jul 14, 2026
e24f4c2
test: add unit tests for Email ValueObject
zigzagdev Jul 14, 2026
7ce1092
Merge pull request #535 from zigzagdev/feat/user-login
zigzagdev Jul 14, 2026
392adf9
feat: add revokeCurrentToken to TokenServiceInterface and SanctumToke…
zigzagdev Jul 15, 2026
d6a5f04
test: add integration tests for revokeCurrentToken in SanctumTokenSer…
zigzagdev Jul 15, 2026
e9b1016
Merge pull request #536 from zigzagdev/feat/user-logout-infra
zigzagdev Jul 15, 2026
495523d
feat: add LogoutUseCase
zigzagdev Jul 15, 2026
4ccb559
test: add unit tests for LogoutUseCase
zigzagdev Jul 15, 2026
d2b599f
Merge pull request #537 from zigzagdev/feat/user-logout_application-l…
zigzagdev Jul 15, 2026
c2a6884
feat: add logout action to AuthController and register POST /v1/user/…
zigzagdev Jul 15, 2026
cd841fb
test: add integration tests for POST /api/v1/user/logout
zigzagdev Jul 15, 2026
bf1b3f3
Merge pull request #538 from zigzagdev/feat/user-logout_presentation-…
zigzagdev Jul 15, 2026
0ea56e1
Merge pull request #539 from zigzagdev/feat/user-logout
zigzagdev Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions .github/workflows/server_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ jobs:
with:
php-version: "8.2"
tools: composer:v2
coverage: pcov

- name: Cache Composer dependencies
uses: actions/cache@v4
Expand Down Expand Up @@ -102,5 +103,12 @@ jobs:
APP_ENV: testing

- name: Run tests
run: ./vendor/bin/phpunit --stop-on-failure --testdox
working-directory: ./src
run: ./vendor/bin/phpunit --stop-on-failure --testdox --coverage-clover coverage/clover.xml
working-directory: ./src

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./src/coverage/clover.xml
fail_ci_if_error: false
41 changes: 41 additions & 0 deletions .github/workflows/static_analysis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Static Analysis

on:
pull_request:
types: [opened, synchronize]
paths:
- "src/**/*.php"
workflow_dispatch: {}

jobs:
mago:
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.2"
coverage: none
tools: composer

- name: Cache Composer dependencies
uses: actions/cache@v4
with:
path: ~/.cache/composer
key: ${{ runner.os }}-composer-${{ hashFiles('src/composer.lock') }}

- name: Install dependencies
run: composer install --prefer-dist --no-progress
working-directory: ./src

- name: Setup Mago
uses: nhedger/setup-mago@v1

- name: Run Mago lint
run: ./vendor/bin/mago lint
working-directory: ./src
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea/
14 changes: 14 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
coverage:
status:
project:
default:
target: auto
threshold: 1%
patch:
default:
target: 85%

comment:
layout: "reach,diff,flags,files"
behavior: default
require_changes: false
2 changes: 2 additions & 0 deletions src/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/.phpunit.cache
/.composer
/node_modules
/public/build
/public/hot
Expand All @@ -7,6 +8,7 @@
/storage/app/public
/storage/app/private/unesco/world-heritage-sites.json
/storage/app/private/unesco/normalized/world_heritage_sites_translation.json
/storage/certs/

/vendor
.env
Expand Down
71 changes: 71 additions & 0 deletions src/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# CLAUDE.md

## Commit Rules

- コミットは必ず細分化する(1つの論理的変更 = 1コミット)
- コミットメッセージに Claude の署名(`Co-Authored-By`, `Generated with Claude Code` など)を含めない
- コミットメッセージは英語で記述する(例: `feat: add deleteUser to UserRepositroyInterface`)

## Branch Rules

- 機能ごとに親ブランチを切り、層ごとに子ブランチを切る
- 例: `feat/user-delete`(親)
- 例: `feat/user-delete_infra-layer`(子)
- 例: `feat/user-delete_application-layer`(子)
- 例: `feat/user-delete_presentation-layer`(子)
- 子ブランチは親ブランチへ PR を出す
- 親ブランチはさらに上位ブランチへ PR を出す

## PR Rules

### Title
- 日英併記にする
- 例: `feat: implement Presentation layer for DELETE /api/v1/users/{id} / ユーザー削除APIのPresentation層実装`

### Description
以下の構成で記述する:

```
## Motivation / 目的

(英語で動機・背景を説明。日本語でも補足する)

## What I have done / 実施内容

(実装内容を箇条書きで記述)

## Test Results / テスト結果

(実行したテストのメソッド名を列挙)

Closes #xxx
```

- PR description に Claude の署名(`Generated with Claude Code` など)を含めない

## Testing Rules

- テストファイルはすべて `app/Packages/` 配下に置く(`tests/` ではない)
- phpunit.xml が `app/Packages` のみをスキャンするため
- Infra 層のテストは実 DB(Docker の `heritage-mysql-test`)を使ったインテグレーションテストにする(Mockery 不使用)
- Application 層・Domain 層のテストは Mockery を使ったユニットテストにする
- void を返すメソッドのテストでは `#[\PHPUnit\Framework\Attributes\DoesNotPerformAssertions]` アトリビュートを使う

## Architecture Rules (DDD / CQRS)

- `QueryUseCases`: 読み取り専用(副作用なし)
- UseCase, Dto, Factory/Dto, ViewModel, Factory/ViewModel
- `CommandUseCases`: 書き込み(状態変更あり)
- UseCase, UseCommand
- `UserRepositroyInterface` の引数は `UserEntity`(Command オブジェクトを直接渡さない)
- パスワードのハッシュ化は Application 層(UseCase)で行う
- パスワード変更は独立した別 API とし、更新系 Command には含めない

## Docker File Sync

- macOS + Docker Desktop ではファイル同期に遅延が発生することがある
- テストが古い挙動を示す場合は `docker cp` でファイルを強制同期する
```bash
docker cp <host_path> heritage-app:<container_path>
docker exec heritage-app php artisan route:clear
```
36 changes: 36 additions & 0 deletions src/app/Models/User.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
use HasApiTokens;
protected $table = 'users';

protected $fillable = [
'first_name',
'last_name',
'email',
'password',
'age_range',
'subscription_tier',
'subscription_expires_at',
'email_verified_at',
];

protected $hidden = [
'password',
];

protected function casts(): array
{
return [
'password' => 'hashed',
'subscription_expires_at' => 'datetime',
'email_verified_at' => 'datetime',
];
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Packages\Domains;
namespace App\Packages\Domains\Image;

class ImageEntity
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Packages\Domains;
namespace App\Packages\Domains\Image;

class ImageEntityCollection
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?php

namespace App\Packages\Domains\Test;
namespace App\Packages\Domains\Image\Tests;

use Tests\TestCase;
use App\Packages\Domains\ImageEntity;
use App\Packages\Domains\ImageEntityCollection;
use App\Packages\Domains\Image\ImageEntity;
use App\Packages\Domains\Image\ImageEntityCollection;
use Mockery;

class ImageEntityCollectionTest extends TestCase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace App\Packages\Domains\Test;
namespace App\Packages\Domains\Image\Tests;

use App\Packages\Domains\ImageEntity;
use App\Packages\Domains\Image\ImageEntity;
use Tests\TestCase;

class ImageEntityTest extends TestCase
Expand Down
13 changes: 13 additions & 0 deletions src/app/Packages/Domains/User/AgeRange.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Packages\Domains\User;

enum AgeRange: string
{
case Teens = 'teens';
case Twenties = '20s';
case Thirties = '30s';
case Forties = '40s';
case Fifties = '50s';
case SixtyPlus = '60plus';
}
29 changes: 29 additions & 0 deletions src/app/Packages/Domains/User/Factory/SubscriptionFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Packages\Domains\User\Factory;

use App\Packages\Domains\User\Subscription\Subscription;
use App\Packages\Domains\User\Subscription\SubscriptionTier;
use DateTimeImmutable;

final class SubscriptionFactory
{
public static function build(array $data): Subscription
{
$expiresAt = $data['expires_at'] ?? null;
if ($expiresAt !== null && !$expiresAt instanceof DateTimeImmutable) {
$expiresAt = new DateTimeImmutable($expiresAt);
}

$now = $data['now'] ?? null;
if ($now !== null && !$now instanceof DateTimeImmutable) {
$now = new DateTimeImmutable($now);
}

return new Subscription(
SubscriptionTier::from($data['tier']),
$expiresAt,
$now,
);
}
}
30 changes: 30 additions & 0 deletions src/app/Packages/Domains/User/Factory/UserEntityFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace App\Packages\Domains\User\Factory;

use App\Packages\Domains\User\Factory\SubscriptionFactory;
use App\Packages\Domains\User\UserEntity;
use App\Packages\Domains\User\AgeRange;
use App\Packages\Domains\User\ValueObject\Email;

final class UserEntityFactory
{
public static function build(array $data): UserEntity
{
$subscription = SubscriptionFactory::build([
'tier' => $data['subscription_tier'],
'expires_at' => $data['subscription_expires_at'] ?? null,
'now' => $data['now'] ?? null,
]);

return new UserEntity(
id: isset($data['id']) ? (int) $data['id'] : null,
firstName: $data['first_name'],
lastName: $data['last_name'],
email: new Email($data['email']),
ageRange: AgeRange::from($data['age_range']),
subscription: $subscription,
passwordHash: $data['password_hash'] ?? null,
);
}
}
14 changes: 14 additions & 0 deletions src/app/Packages/Domains/User/Interface/TokenServiceInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace App\Packages\Domains\User\Interface;

use App\Packages\Domains\User\UserEntity;

interface TokenServiceInterface
{
public function createToken(UserEntity $entity): string;

public function revokeAllTokens(UserEntity $entity): void;

public function revokeCurrentToken(string $plainTextToken): void;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace App\Packages\Domains\User\Interface;

use App\Packages\Domains\User\UserEntity;
use App\Packages\Features\QueryUseCases\Dto\User\UserDto;
use App\Packages\Domains\User\ValueObject\Email;

interface UserRepositroyInterface
{
public function createUser(UserEntity $entity): UserDto;

public function findById(int $id): ?UserDto;

public function updateUser(UserEntity $entity): UserDto;

public function deleteUser(int $id): void;

public function findByEmail(Email $email): ?UserEntity;
}
Loading
Loading