diff --git a/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationRouteProvider.php b/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationRouteProvider.php deleted file mode 100644 index a327f1ab0..000000000 --- a/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationRouteProvider.php +++ /dev/null @@ -1,24 +0,0 @@ -middleware('web') - ->group(function (): void { - Route::prefix('oauth')->group(function (): void { - Route::get('/{provider}', [OAuthController::class, 'getAuthenticate']); - Route::get('/{provider}/redirect', [OAuthController::class, 'getRedirect']); - }); - }); - } -} diff --git a/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationServiceProvider.php b/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationServiceProvider.php deleted file mode 100644 index d9dd9484f..000000000 --- a/Heart/Authentication/OAuth/Infrastructure/Providers/AuthenticationServiceProvider.php +++ /dev/null @@ -1,20 +0,0 @@ -app->bind(ProviderRepository::class, ProviderEloquentRepository::class); - $this->app->bind(TokenRepository::class, TokenEloquentRepository::class); - } -} diff --git a/Heart/Character/CharacterDomain.php b/Heart/Character/CharacterDomain.php deleted file mode 100644 index a44d8b9e0..000000000 --- a/Heart/Character/CharacterDomain.php +++ /dev/null @@ -1,20 +0,0 @@ - 2, - 'character_id' => Character::factory(), - 'ranking_position' => $this->faker->numberBetween(1, 1000), - 'experience' => $this->faker->numberBetween(1, 1000), - 'level' => 1, - 'messages_count' => $this->faker->numberBetween(1, 1000), - 'badges_count' => $this->faker->numberBetween(1, 1000), - 'meetings_count' => $this->faker->numberBetween(1, 1000), - ]; - } -} diff --git a/Heart/Character/Infrastructure/Providers/CharacterRouteProvider.php b/Heart/Character/Infrastructure/Providers/CharacterRouteProvider.php deleted file mode 100644 index 7c4e0b919..000000000 --- a/Heart/Character/Infrastructure/Providers/CharacterRouteProvider.php +++ /dev/null @@ -1,28 +0,0 @@ -middleware(['api', 'bot-auth'])->group(function (): void { - Route::prefix('characters')->group(function (): void { - Route::get('/', [CharactersController::class, 'getCharacters']) - ->name('characters.getCharacters'); - Route::get('/{provider}', [CharactersController::class, 'getCharacter']) - ->name('characters.getCharacter'); - Route::post('/{provider}/{providerId}/daily', [CharactersController::class, 'postDailyBonus']) - ->name('characters.dailyReward'); - Route::post('/{provider}/{providerId}/claimBadge', [CharactersController::class, 'postClaimBadge']) - ->name('characters.claimBadge'); - }); - }); - } -} diff --git a/Heart/Character/Infrastructure/Providers/CharacterServiceProvider.php b/Heart/Character/Infrastructure/Providers/CharacterServiceProvider.php deleted file mode 100644 index 671631207..000000000 --- a/Heart/Character/Infrastructure/Providers/CharacterServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->bind(CharacterRepository::class, CharacterEloquentRepository::class); - } -} diff --git a/Heart/Feedback/FeedbackDomain.php b/Heart/Feedback/FeedbackDomain.php deleted file mode 100644 index d37c9eafa..000000000 --- a/Heart/Feedback/FeedbackDomain.php +++ /dev/null @@ -1,20 +0,0 @@ -middleware(['api', 'bot-auth'])->group(function (): void { - Route::get('feedbacks/{feedbackId}', [FeedbacksController::class, 'getFeedback']) - ->name('feedbacks.show'); - Route::post('feedbacks', [FeedbacksController::class, 'postFeedback']) - ->name('feedbacks.create'); - Route::post('feedbacks/{feedbackId}/{action}', [FeedbacksController::class, 'postReview']) - ->name('feedbacks.review'); - }); - } -} diff --git a/Heart/Feedback/Infrastructure/Providers/FeedbackServiceProvider.php b/Heart/Feedback/Infrastructure/Providers/FeedbackServiceProvider.php deleted file mode 100644 index b04f01258..000000000 --- a/Heart/Feedback/Infrastructure/Providers/FeedbackServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->bind(FeedbackRepository::class, FeedbackEloquentRepository::class); - } -} diff --git a/Heart/Integrations/IntegrationsDomain.php b/Heart/Integrations/IntegrationsDomain.php deleted file mode 100644 index 828f64369..000000000 --- a/Heart/Integrations/IntegrationsDomain.php +++ /dev/null @@ -1,18 +0,0 @@ -app->bind(TwitchService::class, TwitchBaseClient::class); - $this->app->bind(TwitchOAuthService::class, TwitchOAuthClient::class); - } -} diff --git a/Heart/Integrations/Twitch/Common/TwitchService.php b/Heart/Integrations/Twitch/Common/TwitchService.php deleted file mode 100644 index 7b5eaaa04..000000000 --- a/Heart/Integrations/Twitch/Common/TwitchService.php +++ /dev/null @@ -1,15 +0,0 @@ -paginateMeetingsAction->handle($provider); - } -} diff --git a/Heart/Meeting/Infrastructure/Exceptions/MeetingExceptions.php b/Heart/Meeting/Infrastructure/Exceptions/MeetingExceptions.php deleted file mode 100644 index 035ccd05d..000000000 --- a/Heart/Meeting/Infrastructure/Exceptions/MeetingExceptions.php +++ /dev/null @@ -1,16 +0,0 @@ - $this->faker->name(), - 'week_day' => $this->faker->numberBetween(0, 6), - 'start_at' => $this->faker->numberBetween(0, 1439), - ]; - } -} diff --git a/Heart/Meeting/Infrastructure/Providers/MeetingRouteProvider.php b/Heart/Meeting/Infrastructure/Providers/MeetingRouteProvider.php deleted file mode 100644 index 28a08484a..000000000 --- a/Heart/Meeting/Infrastructure/Providers/MeetingRouteProvider.php +++ /dev/null @@ -1,25 +0,0 @@ -middleware(['api', 'bot-auth'])->group(function (): void { - Route::prefix('events/{provider}')->name('events.')->group(function (): void { - Route::prefix('meeting')->name('meeting.')->group(function (): void { - Route::get('/', [MeetingController::class, 'getMeetings'])->name('getMeetings'); - Route::post('/start', [MeetingController::class, 'postMeeting'])->name('postMeeting'); - Route::post('/end', [MeetingController::class, 'postEndMeeting'])->name('postEndMeeting'); - }); - }); - }); - } -} diff --git a/Heart/Meeting/Infrastructure/Providers/MeetingServiceProvider.php b/Heart/Meeting/Infrastructure/Providers/MeetingServiceProvider.php deleted file mode 100644 index 59604ee53..000000000 --- a/Heart/Meeting/Infrastructure/Providers/MeetingServiceProvider.php +++ /dev/null @@ -1,20 +0,0 @@ -app->bind(MeetingRepository::class, MeetingEloquentRepository::class); - $this->app->bind(MeetingTypeRepository::class, MeetingTypeEloquentRepository::class); - } -} diff --git a/Heart/Meeting/MeetingDomain.php b/Heart/Meeting/MeetingDomain.php deleted file mode 100644 index 56c32fb12..000000000 --- a/Heart/Meeting/MeetingDomain.php +++ /dev/null @@ -1,20 +0,0 @@ - $this->faker->uuid(), - 'user_id' => User::factory(), - 'provider' => $this->faker->randomElement(['twitch', 'discord']), - 'provider_id' => $this->faker->randomNumber(6), - 'email' => $this->faker->unique()->email, - ]; - } -} diff --git a/Heart/Provider/Infrastructure/Factories/TokenFactory.php b/Heart/Provider/Infrastructure/Factories/TokenFactory.php deleted file mode 100644 index 5c76683b4..000000000 --- a/Heart/Provider/Infrastructure/Factories/TokenFactory.php +++ /dev/null @@ -1,25 +0,0 @@ - $this->faker->uuid(), - 'provider_id' => Provider::factory(), - 'access_token' => $this->faker->uuid(), - 'refresh_token' => $this->faker->uuid(), - 'expires_in' => $this->faker->randomNumber(4), - ]; - } -} diff --git a/Heart/Provider/Infrastructure/Providers/ProviderRouteProvider.php b/Heart/Provider/Infrastructure/Providers/ProviderRouteProvider.php deleted file mode 100644 index 188b02a04..000000000 --- a/Heart/Provider/Infrastructure/Providers/ProviderRouteProvider.php +++ /dev/null @@ -1,20 +0,0 @@ -middleware(['api', 'bot-auth'])->group(function (): void { - Route::post('/providers/{provider}', [ProvidersController::class, 'postProvider']) - ->name('providers.store'); - }); - } -} diff --git a/Heart/Provider/Infrastructure/Providers/ProviderServiceProvider.php b/Heart/Provider/Infrastructure/Providers/ProviderServiceProvider.php deleted file mode 100644 index f66055922..000000000 --- a/Heart/Provider/Infrastructure/Providers/ProviderServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->bind(ProviderRepository::class, ProviderEloquentRepository::class); - } -} diff --git a/Heart/Provider/ProviderDomain.php b/Heart/Provider/ProviderDomain.php deleted file mode 100644 index 768bc1842..000000000 --- a/Heart/Provider/ProviderDomain.php +++ /dev/null @@ -1,20 +0,0 @@ -prefix('api') - ->group(function (): void { - Route::get('/ranking/leveling', [RankingByLevel::class, 'handle'])->name('ranking.leveling'); - }); - } -} diff --git a/Heart/Ranking/Infrastructure/Providers/RankingServiceProvider.php b/Heart/Ranking/Infrastructure/Providers/RankingServiceProvider.php deleted file mode 100644 index 3092e4808..000000000 --- a/Heart/Ranking/Infrastructure/Providers/RankingServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->bind(RankingRepository::class, RankingEloquentRepository::class); - } -} diff --git a/Heart/Ranking/RankingDomain.php b/Heart/Ranking/RankingDomain.php deleted file mode 100644 index cdf5b269c..000000000 --- a/Heart/Ranking/RankingDomain.php +++ /dev/null @@ -1,20 +0,0 @@ - $this->faker->uuid(), - 'user_id' => User::factory(), - 'country' => $this->faker->countryCode(), - 'state' => $this->faker->randomElement(['SP', 'RJ', 'BH']), - 'city' => $this->faker->city(), - 'zip_code' => $this->faker->randomNumber(8), - ]; - } -} diff --git a/Heart/User/Infrastructure/Factories/InformationFactory.php b/Heart/User/Infrastructure/Factories/InformationFactory.php deleted file mode 100644 index fc2bc8457..000000000 --- a/Heart/User/Infrastructure/Factories/InformationFactory.php +++ /dev/null @@ -1,28 +0,0 @@ - $this->faker->uuid(), - 'user_id' => User::factory(), - 'name' => $this->faker->name(), - 'nickname' => $this->faker->userName(), - 'linkedin_url' => $this->faker->url(), - 'github_url' => $this->faker->url(), - 'birthdate' => $this->faker->date(), - 'about' => $this->faker->text(), - ]; - } -} diff --git a/Heart/User/Infrastructure/Providers/UserRouteProvider.php b/Heart/User/Infrastructure/Providers/UserRouteProvider.php deleted file mode 100644 index 95d989881..000000000 --- a/Heart/User/Infrastructure/Providers/UserRouteProvider.php +++ /dev/null @@ -1,25 +0,0 @@ -middleware(['api', 'bot-auth'])->group(function (): void { - Route::prefix('users')->group(function (): void { - Route::get('/', [UsersController::class, 'getUsers'])->name('get-users'); - Route::get('/profile/{value}', [UsersController::class, 'getProfile'])->name('users.profile'); - Route::put('/profile/{value}', [UsersController::class, 'putProfile']) - ->name('users.profile.update'); - Route::get('/{id}', [UsersController::class, 'getUser'])->name('get-user'); - }); - }); - } -} diff --git a/Heart/User/Infrastructure/Providers/UserServiceProvider.php b/Heart/User/Infrastructure/Providers/UserServiceProvider.php deleted file mode 100644 index 41a030c1e..000000000 --- a/Heart/User/Infrastructure/Providers/UserServiceProvider.php +++ /dev/null @@ -1,17 +0,0 @@ -app->bind(UserRepository::class, UserEloquentRepository::class); - } -} diff --git a/Heart/User/UserDomain.php b/Heart/User/UserDomain.php deleted file mode 100644 index e8cd48f72..000000000 --- a/Heart/User/UserDomain.php +++ /dev/null @@ -1,20 +0,0 @@ -middleware('web') + ->group(function (): void { + Route::prefix('oauth')->group(function (): void { + Route::get('/{provider}', [OAuthController::class, 'getAuthenticate']); + Route::get('/{provider}/redirect', [OAuthController::class, 'getRedirect']); + }); + }); diff --git a/Heart/Authentication/OAuth/Domain/Interfaces/OAuthClientContract.php b/app-modules/authentication/src/Contracts/OAuthClientContract.php similarity index 60% rename from Heart/Authentication/OAuth/Domain/Interfaces/OAuthClientContract.php rename to app-modules/authentication/src/Contracts/OAuthClientContract.php index 7e22b74a1..4ab91338f 100644 --- a/Heart/Authentication/OAuth/Domain/Interfaces/OAuthClientContract.php +++ b/app-modules/authentication/src/Contracts/OAuthClientContract.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Domain\Interfaces; +namespace He4rt\Authentication\Contracts; -use Heart\Authentication\OAuth\Domain\DTO\OAuthAccessDTO; -use Heart\Authentication\OAuth\Domain\DTO\OAuthUserDTO; +use He4rt\Authentication\DTO\OAuthAccessDTO; +use He4rt\Authentication\DTO\OAuthUserDTO; interface OAuthClientContract { diff --git a/Heart/Authentication/OAuth/Domain/DTO/OAuthAccessDTO.php b/app-modules/authentication/src/DTO/OAuthAccessDTO.php similarity index 69% rename from Heart/Authentication/OAuth/Domain/DTO/OAuthAccessDTO.php rename to app-modules/authentication/src/DTO/OAuthAccessDTO.php index 885b17d66..1014d827d 100644 --- a/Heart/Authentication/OAuth/Domain/DTO/OAuthAccessDTO.php +++ b/app-modules/authentication/src/DTO/OAuthAccessDTO.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Domain\DTO; +namespace He4rt\Authentication\DTO; abstract class OAuthAccessDTO { public function __construct( - public readonly string $accessToken, - public readonly string $refreshToken, - public readonly ?int $expiresIn + public string $accessToken, + public string $refreshToken, + public ?int $expiresIn ) {} abstract public static function make(array $payload): self; diff --git a/Heart/Authentication/OAuth/Domain/DTO/OAuthUserDTO.php b/app-modules/authentication/src/DTO/OAuthUserDTO.php similarity index 93% rename from Heart/Authentication/OAuth/Domain/DTO/OAuthUserDTO.php rename to app-modules/authentication/src/DTO/OAuthUserDTO.php index a03bbcb78..0830bd64d 100644 --- a/Heart/Authentication/OAuth/Domain/DTO/OAuthUserDTO.php +++ b/app-modules/authentication/src/DTO/OAuthUserDTO.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Domain\DTO; +namespace He4rt\Authentication\DTO; abstract class OAuthUserDTO { diff --git a/Heart/Authentication/OAuth/Infrastructure/Enums/OAuthProviderEnum.php b/app-modules/authentication/src/Enums/OAuthProviderEnum.php similarity index 58% rename from Heart/Authentication/OAuth/Infrastructure/Enums/OAuthProviderEnum.php rename to app-modules/authentication/src/Enums/OAuthProviderEnum.php index 723831cf8..b3e9966f1 100644 --- a/Heart/Authentication/OAuth/Infrastructure/Enums/OAuthProviderEnum.php +++ b/app-modules/authentication/src/Enums/OAuthProviderEnum.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Infrastructure\Enums; +namespace He4rt\Authentication\Enums; -use Heart\Authentication\OAuth\Domain\Interfaces\OAuthClientContract; -use Heart\Integrations\Twitch\OAuth\Domain\TwitchOAuthService; +use He4rt\Authentication\Contracts\OAuthClientContract; +use He4rt\Integrations\Twitch\OAuth\Contracts\TwitchOAuthService; enum OAuthProviderEnum: string { diff --git a/Heart/Authentication/OAuth/Presentation/Controllers/OAuthController.php b/app-modules/authentication/src/Http/Controllers/OAuthController.php similarity index 74% rename from Heart/Authentication/OAuth/Presentation/Controllers/OAuthController.php rename to app-modules/authentication/src/Http/Controllers/OAuthController.php index 25b6e5145..f767d3f6a 100644 --- a/Heart/Authentication/OAuth/Presentation/Controllers/OAuthController.php +++ b/app-modules/authentication/src/Http/Controllers/OAuthController.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Presentation\Controllers; +namespace He4rt\Authentication\Http\Controllers; use App\Http\Controllers\Controller; -use Heart\Authentication\OAuth\Application\OAuthService; -use Heart\Authentication\OAuth\Domain\Actions\RedirectOAuthUrl; +use He4rt\Authentication\OAuth\Domain\Actions\RedirectOAuthUrl; +use Heart\Autentication\Services\OAuthService; use Illuminate\Http\RedirectResponse; final class OAuthController extends Controller diff --git a/app-modules/authentication/src/Providers/AuthenticationServiceProvider.php b/app-modules/authentication/src/Providers/AuthenticationServiceProvider.php new file mode 100644 index 000000000..74eab02f5 --- /dev/null +++ b/app-modules/authentication/src/Providers/AuthenticationServiceProvider.php @@ -0,0 +1,22 @@ +app->bind(ProviderRepository::class, ProviderEloquentRepository::class); + $this->app->bind(TokenRepository::class, TokenEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Authentication/OAuth/Application/OAuthService.php b/app-modules/authentication/src/Services/OAuthService.php similarity index 84% rename from Heart/Authentication/OAuth/Application/OAuthService.php rename to app-modules/authentication/src/Services/OAuthService.php index 341962670..6037a9268 100644 --- a/Heart/Authentication/OAuth/Application/OAuthService.php +++ b/app-modules/authentication/src/Services/OAuthService.php @@ -2,12 +2,14 @@ declare(strict_types=1); -namespace Heart\Authentication\OAuth\Application; +namespace Heart\Autentication\Services; use GuzzleHttp\Exception\ClientException; -use Heart\Authentication\OAuth\Infrastructure\Enums\OAuthProviderEnum; -use Heart\Provider\Domain\Repositories\ProviderRepository; -use Heart\Provider\Domain\Repositories\TokenRepository; +use He4rt\Authentication\Enums\OAuthProviderEnum; +use He4rt\Authentication\OAuth\Application\SubscriberDTO; +use He4rt\Authentication\OAuth\Application\SubscribersRepository; +use He4rt\Provider\Contracts\ProviderRepository; +use He4rt\Provider\Contracts\TokenRepository; use Illuminate\Support\Facades\Auth; use Kingdom\Authentication\OAuth\Domain\Actions\GetOAuthUser; diff --git a/app-modules/badge/database/migrations/2025_10_30_002930_set_up_badge_module.php b/app-modules/badge/database/migrations/2025_10_30_002930_set_up_badge_module.php deleted file mode 100644 index 6551e8e1f..000000000 --- a/app-modules/badge/database/migrations/2025_10_30_002930_set_up_badge_module.php +++ /dev/null @@ -1,23 +0,0 @@ -bigIncrements('id'); - // $table->timestamps(); - // $table->softDeletes(); - // }); - } - - public function down(): void - { - // Don't listen to the haters - // Schema::dropIfExists('badge'); - } -}; diff --git a/app-modules/character/composer.json b/app-modules/character/composer.json new file mode 100644 index 000000000..54a2c184a --- /dev/null +++ b/app-modules/character/composer.json @@ -0,0 +1,23 @@ +{ + "name": "he4rt/character", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Character\\": "src/", + "He4rt\\Character\\Tests\\": "tests/", + "He4rt\\Character\\Database\\Factories\\": "database/factories/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Character\\Providers\\CharacterServiceProvider" + ] + } + } +} diff --git a/Heart/Character/Infrastructure/Factories/CharacterFactory.php b/app-modules/character/database/factories/CharacterFactory.php similarity index 82% rename from Heart/Character/Infrastructure/Factories/CharacterFactory.php rename to app-modules/character/database/factories/CharacterFactory.php index b0cb42a20..4aaf7295a 100644 --- a/Heart/Character/Infrastructure/Factories/CharacterFactory.php +++ b/app-modules/character/database/factories/CharacterFactory.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Factories; +namespace He4rt\Character\Database\Factories; -use Heart\Character\Infrastructure\Models\Character; -use Heart\User\Infrastructure\Models\User; +use He4rt\Character\Models\Character; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Model; diff --git a/app-modules/character/database/factories/PastSeasonFactory.php b/app-modules/character/database/factories/PastSeasonFactory.php new file mode 100644 index 000000000..55ca3f245 --- /dev/null +++ b/app-modules/character/database/factories/PastSeasonFactory.php @@ -0,0 +1,28 @@ + 2, + 'character_id' => Character::factory(), + 'ranking_position' => fake()->numberBetween(1, 1000), + 'experience' => fake()->numberBetween(1, 1000), + 'level' => 1, + 'messages_count' => fake()->numberBetween(1, 1000), + 'badges_count' => fake()->numberBetween(1, 1000), + 'meetings_count' => fake()->numberBetween(1, 1000), + ]; + } +} diff --git a/Heart/Character/Infrastructure/Factories/WalletFactory.php b/app-modules/character/database/factories/WalletFactory.php similarity index 77% rename from Heart/Character/Infrastructure/Factories/WalletFactory.php rename to app-modules/character/database/factories/WalletFactory.php index 3848eccd7..2ba14ebcc 100644 --- a/Heart/Character/Infrastructure/Factories/WalletFactory.php +++ b/app-modules/character/database/factories/WalletFactory.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Factories; +namespace He4rt\Character\Database\Factories; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Character\Infrastructure\Models\Wallet; +use He4rt\Character\Models\Character; +use He4rt\Character\Models\Wallet; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Model; diff --git a/app-modules/character/routes/character-routes.php b/app-modules/character/routes/character-routes.php new file mode 100644 index 000000000..b395f48da --- /dev/null +++ b/app-modules/character/routes/character-routes.php @@ -0,0 +1,20 @@ +middleware(['api', BotAuthentication::class])->group(function (): void { + Route::prefix('characters')->group(function (): void { + Route::get('/', [CharactersController::class, 'getCharacters']) + ->name('characters.getCharacters'); + Route::get('/{provider}', [CharactersController::class, 'getCharacter']) + ->name('characters.getCharacter'); + Route::post('/{provider}/{providerId}/daily', [CharactersController::class, 'postDailyBonus']) + ->name('characters.dailyReward'); + Route::post('/{provider}/{providerId}/claimBadge', [CharactersController::class, 'postClaimBadge']) + ->name('characters.claimBadge'); + }); +}); diff --git a/Heart/Character/Application/ClaimCharacterBadge.php b/app-modules/character/src/Actions/ClaimCharacterBadge.php similarity index 79% rename from Heart/Character/Application/ClaimCharacterBadge.php rename to app-modules/character/src/Actions/ClaimCharacterBadge.php index f6086adc4..a2c63c883 100644 --- a/Heart/Character/Application/ClaimCharacterBadge.php +++ b/app-modules/character/src/Actions/ClaimCharacterBadge.php @@ -2,11 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Application; +namespace He4rt\Character\Actions; -use Heart\Badges\Application\FindBadgeBySlug; -use Heart\Character\Domain\Actions\PersistClaimedBadge; -use Heart\Provider\Application\FindProvider; +use He4rt\Badge\Actions\FindBadgeBySlug; +use He4rt\Provider\Actions\FindProvider; final readonly class ClaimCharacterBadge { diff --git a/Heart/Character/Application/ClaimDailyBonus.php b/app-modules/character/src/Actions/ClaimDailyBonus.php similarity index 80% rename from Heart/Character/Application/ClaimDailyBonus.php rename to app-modules/character/src/Actions/ClaimDailyBonus.php index d5e2c6e9f..514fb2492 100644 --- a/Heart/Character/Application/ClaimDailyBonus.php +++ b/app-modules/character/src/Actions/ClaimDailyBonus.php @@ -2,10 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Application; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Actions\PersistDailyBonus; -use Heart\Provider\Application\FindProvider; +use He4rt\Provider\Actions\FindProvider; final readonly class ClaimDailyBonus { diff --git a/Heart/Character/Domain/Actions/FindCharacter.php b/app-modules/character/src/Actions/FindCharacter.php similarity index 66% rename from Heart/Character/Domain/Actions/FindCharacter.php rename to app-modules/character/src/Actions/FindCharacter.php index 82913b836..8d6e55502 100644 --- a/Heart/Character/Domain/Actions/FindCharacter.php +++ b/app-modules/character/src/Actions/FindCharacter.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Entities\CharacterEntity; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Entities\CharacterEntity; final readonly class FindCharacter { diff --git a/Heart/Character/Application/FindCharacterIdByUserId.php b/app-modules/character/src/Actions/FindCharacterIdByUserId.php similarity index 82% rename from Heart/Character/Application/FindCharacterIdByUserId.php rename to app-modules/character/src/Actions/FindCharacterIdByUserId.php index a20c0edfe..7d37a2f98 100644 --- a/Heart/Character/Application/FindCharacterIdByUserId.php +++ b/app-modules/character/src/Actions/FindCharacterIdByUserId.php @@ -2,10 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Application; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Actions\GetCharacterByUserId; -use Heart\Shared\Application\TTL; +use He4rt\Shared\TTL; use Illuminate\Support\Facades\Cache; class FindCharacterIdByUserId diff --git a/Heart/Character/Domain/Actions/GetCharacterByUserId.php b/app-modules/character/src/Actions/GetCharacterByUserId.php similarity index 66% rename from Heart/Character/Domain/Actions/GetCharacterByUserId.php rename to app-modules/character/src/Actions/GetCharacterByUserId.php index 038a569bb..73663013f 100644 --- a/Heart/Character/Domain/Actions/GetCharacterByUserId.php +++ b/app-modules/character/src/Actions/GetCharacterByUserId.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Entities\CharacterEntity; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Entities\CharacterEntity; final readonly class GetCharacterByUserId { diff --git a/Heart/Character/Domain/Actions/IncrementExperience.php b/app-modules/character/src/Actions/IncrementExperience.php similarity index 86% rename from Heart/Character/Domain/Actions/IncrementExperience.php rename to app-modules/character/src/Actions/IncrementExperience.php index 2a2783a14..1b2caaaa8 100644 --- a/Heart/Character/Domain/Actions/IncrementExperience.php +++ b/app-modules/character/src/Actions/IncrementExperience.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Enums\VoiceStatesEnum; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Enums\VoiceStatesEnum; class IncrementExperience { diff --git a/Heart/Character/Domain/Actions/ManageReputation.php b/app-modules/character/src/Actions/ManageReputation.php similarity index 81% rename from Heart/Character/Domain/Actions/ManageReputation.php rename to app-modules/character/src/Actions/ManageReputation.php index bfe2aa693..8c989b4f1 100644 --- a/Heart/Character/Domain/Actions/ManageReputation.php +++ b/app-modules/character/src/Actions/ManageReputation.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; final readonly class ManageReputation { diff --git a/Heart/Character/Domain/Actions/PaginateCharacters.php b/app-modules/character/src/Actions/PaginateCharacters.php similarity index 76% rename from Heart/Character/Domain/Actions/PaginateCharacters.php rename to app-modules/character/src/Actions/PaginateCharacters.php index 59e9df3a0..d5d023811 100644 --- a/Heart/Character/Domain/Actions/PaginateCharacters.php +++ b/app-modules/character/src/Actions/PaginateCharacters.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; use Illuminate\Contracts\Pagination\LengthAwarePaginator; final readonly class PaginateCharacters diff --git a/Heart/Character/Domain/Actions/PersistClaimedBadge.php b/app-modules/character/src/Actions/PersistClaimedBadge.php similarity index 75% rename from Heart/Character/Domain/Actions/PersistClaimedBadge.php rename to app-modules/character/src/Actions/PersistClaimedBadge.php index cec0a579c..e03290d90 100644 --- a/Heart/Character/Domain/Actions/PersistClaimedBadge.php +++ b/app-modules/character/src/Actions/PersistClaimedBadge.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; final readonly class PersistClaimedBadge { diff --git a/Heart/Character/Domain/Actions/PersistDailyBonus.php b/app-modules/character/src/Actions/PersistDailyBonus.php similarity index 75% rename from Heart/Character/Domain/Actions/PersistDailyBonus.php rename to app-modules/character/src/Actions/PersistDailyBonus.php index 100a55d08..2d2b114b2 100644 --- a/Heart/Character/Domain/Actions/PersistDailyBonus.php +++ b/app-modules/character/src/Actions/PersistDailyBonus.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Actions; +namespace He4rt\Character\Actions; -use Heart\Character\Domain\Exceptions\CharacterException; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Exceptions\CharacterException; final readonly class PersistDailyBonus { diff --git a/Heart/Character/Domain/Collections/PastSeasonCollection.php b/app-modules/character/src/Collections/PastSeasonCollection.php similarity index 86% rename from Heart/Character/Domain/Collections/PastSeasonCollection.php rename to app-modules/character/src/Collections/PastSeasonCollection.php index bef72dfe0..5e4043e8a 100644 --- a/Heart/Character/Domain/Collections/PastSeasonCollection.php +++ b/app-modules/character/src/Collections/PastSeasonCollection.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Collections; +namespace He4rt\Character\Collections; use ArrayIterator; -use Heart\Character\Domain\Entities\PastSeasonEntity; +use He4rt\Character\Entities\PastSeasonEntity; use JsonSerializable; final class PastSeasonCollection extends ArrayIterator implements JsonSerializable diff --git a/Heart/Character/Domain/Repositories/CharacterRepository.php b/app-modules/character/src/Contracts/CharacterRepository.php similarity index 85% rename from Heart/Character/Domain/Repositories/CharacterRepository.php rename to app-modules/character/src/Contracts/CharacterRepository.php index f13080353..b0684177f 100644 --- a/Heart/Character/Domain/Repositories/CharacterRepository.php +++ b/app-modules/character/src/Contracts/CharacterRepository.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Repositories; +namespace He4rt\Character\Contracts; -use Heart\Character\Domain\Entities\CharacterEntity; +use He4rt\Character\Entities\CharacterEntity; use Illuminate\Contracts\Pagination\LengthAwarePaginator; interface CharacterRepository diff --git a/Heart/Character/Domain/Entities/CharacterEntity.php b/app-modules/character/src/Entities/CharacterEntity.php similarity index 97% rename from Heart/Character/Domain/Entities/CharacterEntity.php rename to app-modules/character/src/Entities/CharacterEntity.php index bddc74706..fd7463ee7 100644 --- a/Heart/Character/Domain/Entities/CharacterEntity.php +++ b/app-modules/character/src/Entities/CharacterEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Entities; +namespace He4rt\Character\Entities; use JsonSerializable; diff --git a/Heart/Character/Domain/Entities/DailyRewardEntity.php b/app-modules/character/src/Entities/DailyRewardEntity.php similarity index 69% rename from Heart/Character/Domain/Entities/DailyRewardEntity.php rename to app-modules/character/src/Entities/DailyRewardEntity.php index 2c80616fe..56591bc47 100644 --- a/Heart/Character/Domain/Entities/DailyRewardEntity.php +++ b/app-modules/character/src/Entities/DailyRewardEntity.php @@ -2,17 +2,23 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Entities; +namespace He4rt\Character\Entities; use DateInterval; use DateTimeImmutable; -final class DailyRewardEntity +class DailyRewardEntity { public ?DateTimeImmutable $claimedAt; public function __construct(?string $claimedAt) { + if (is_null($claimedAt)) { + $this->claimedAt = null; + + return; + } + $dateTime = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $claimedAt); if (! $dateTime) { $dateTime = null; @@ -28,8 +34,8 @@ public function canClaim(): bool } $dateTimeInterval = DateInterval::createFromDateString('1 day'); - $oneDayLater = (clone $this->claimedAt)->add($dateTimeInterval); - $now = new DateTimeImmutable(now()); + $oneDayLater = ($this->claimedAt)->add($dateTimeInterval); + $now = new DateTimeImmutable(now()->toDateTimeString()); return $now > $oneDayLater; } diff --git a/Heart/Character/Domain/Entities/LevelEntity.php b/app-modules/character/src/Entities/LevelEntity.php similarity index 97% rename from Heart/Character/Domain/Entities/LevelEntity.php rename to app-modules/character/src/Entities/LevelEntity.php index 888430596..c5731604d 100644 --- a/Heart/Character/Domain/Entities/LevelEntity.php +++ b/app-modules/character/src/Entities/LevelEntity.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Entities; +namespace He4rt\Character\Entities; -use Heart\Character\Domain\Enums\VoiceStatesEnum; +use He4rt\Character\Enums\VoiceStatesEnum; final class LevelEntity { diff --git a/Heart/Character/Domain/Entities/PastSeasonEntity.php b/app-modules/character/src/Entities/PastSeasonEntity.php similarity index 97% rename from Heart/Character/Domain/Entities/PastSeasonEntity.php rename to app-modules/character/src/Entities/PastSeasonEntity.php index 329780f52..cbda7da2c 100644 --- a/Heart/Character/Domain/Entities/PastSeasonEntity.php +++ b/app-modules/character/src/Entities/PastSeasonEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Entities; +namespace He4rt\Character\Entities; use JsonSerializable; diff --git a/Heart/Character/Domain/Entities/ReputationEntity.php b/app-modules/character/src/Entities/ReputationEntity.php similarity index 95% rename from Heart/Character/Domain/Entities/ReputationEntity.php rename to app-modules/character/src/Entities/ReputationEntity.php index 823568ce4..df46f1c34 100644 --- a/Heart/Character/Domain/Entities/ReputationEntity.php +++ b/app-modules/character/src/Entities/ReputationEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Entities; +namespace He4rt\Character\Entities; final class ReputationEntity { diff --git a/Heart/Character/Domain/Enums/VoiceStatesEnum.php b/app-modules/character/src/Enums/VoiceStatesEnum.php similarity index 89% rename from Heart/Character/Domain/Enums/VoiceStatesEnum.php rename to app-modules/character/src/Enums/VoiceStatesEnum.php index eec080e6c..a0bcc5a26 100644 --- a/Heart/Character/Domain/Enums/VoiceStatesEnum.php +++ b/app-modules/character/src/Enums/VoiceStatesEnum.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Enums; +namespace He4rt\Character\Enums; enum VoiceStatesEnum: string { diff --git a/Heart/Character/Domain/Exceptions/CharacterException.php b/app-modules/character/src/Exceptions/CharacterException.php similarity index 81% rename from Heart/Character/Domain/Exceptions/CharacterException.php rename to app-modules/character/src/Exceptions/CharacterException.php index 29cc1d861..381d14a00 100644 --- a/Heart/Character/Domain/Exceptions/CharacterException.php +++ b/app-modules/character/src/Exceptions/CharacterException.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Exceptions; +namespace He4rt\Character\Exceptions; use Exception; -use Heart\Character\Domain\Entities\DailyRewardEntity; +use He4rt\Character\Entities\DailyRewardEntity; use Symfony\Component\HttpFoundation\Response; final class CharacterException extends Exception diff --git a/Heart/Character/Domain/Exceptions/LevelException.php b/app-modules/character/src/Exceptions/LevelException.php similarity index 89% rename from Heart/Character/Domain/Exceptions/LevelException.php rename to app-modules/character/src/Exceptions/LevelException.php index 08f428c83..4512c7fab 100644 --- a/Heart/Character/Domain/Exceptions/LevelException.php +++ b/app-modules/character/src/Exceptions/LevelException.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Domain\Exceptions; +namespace He4rt\Character\Exceptions; use Exception; use Symfony\Component\HttpFoundation\Response; diff --git a/Heart/Character/Presentation/Controllers/CharactersController.php b/app-modules/character/src/Http/Controllers/CharactersController.php similarity index 76% rename from Heart/Character/Presentation/Controllers/CharactersController.php rename to app-modules/character/src/Http/Controllers/CharactersController.php index 805665213..8722136e0 100644 --- a/Heart/Character/Presentation/Controllers/CharactersController.php +++ b/app-modules/character/src/Http/Controllers/CharactersController.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace Heart\Character\Presentation\Controllers; +namespace He4rt\Character\Http\Controllers; use App\Http\Controllers\Controller; -use Heart\Character\Application\ClaimCharacterBadge; -use Heart\Character\Application\ClaimDailyBonus; -use Heart\Character\Domain\Actions\FindCharacter; -use Heart\Character\Domain\Actions\PaginateCharacters; -use Heart\Character\Domain\Exceptions\CharacterException; -use Heart\Character\Presentation\Requests\ClaimBadgeRequest; +use He4rt\Character\Actions\ClaimCharacterBadge; +use He4rt\Character\Actions\ClaimDailyBonus; +use He4rt\Character\Actions\FindCharacter; +use He4rt\Character\Actions\PaginateCharacters; +use He4rt\Character\Exceptions\CharacterException; +use He4rt\Character\Http\Requests\ClaimBadgeRequest; use Illuminate\Http\JsonResponse; use Illuminate\Http\Response; diff --git a/Heart/Character/Presentation/Requests/ClaimBadgeRequest.php b/app-modules/character/src/Http/Requests/ClaimBadgeRequest.php similarity index 87% rename from Heart/Character/Presentation/Requests/ClaimBadgeRequest.php rename to app-modules/character/src/Http/Requests/ClaimBadgeRequest.php index 5b5fa65c0..ef1e51d48 100644 --- a/Heart/Character/Presentation/Requests/ClaimBadgeRequest.php +++ b/app-modules/character/src/Http/Requests/ClaimBadgeRequest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Presentation\Requests; +namespace He4rt\Character\Http\Requests; use Illuminate\Foundation\Http\FormRequest; diff --git a/Heart/Character/Infrastructure/Models/Character.php b/app-modules/character/src/Models/Character.php similarity index 88% rename from Heart/Character/Infrastructure/Models/Character.php rename to app-modules/character/src/Models/Character.php index 81f2a4ad6..f14e97473 100644 --- a/Heart/Character/Infrastructure/Models/Character.php +++ b/app-modules/character/src/Models/Character.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Models; +namespace He4rt\Character\Models; use Carbon\Carbon; -use Heart\Badges\Infrastructure\Model\Badge; -use Heart\Character\Domain\Entities\LevelEntity; -use Heart\Character\Infrastructure\Factories\CharacterFactory; -use Heart\User\Infrastructure\Models\User; +use He4rt\Badge\Models\Badge; +use He4rt\Character\Database\Factories\CharacterFactory; +use He4rt\Character\Entities\LevelEntity; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/Character/Infrastructure/Models/PastSeason.php b/app-modules/character/src/Models/PastSeason.php similarity index 84% rename from Heart/Character/Infrastructure/Models/PastSeason.php rename to app-modules/character/src/Models/PastSeason.php index c08b2256f..0a047db0c 100644 --- a/Heart/Character/Infrastructure/Models/PastSeason.php +++ b/app-modules/character/src/Models/PastSeason.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Models; +namespace He4rt\Character\Models; -use Heart\Character\Infrastructure\Factories\PastSeasonFactory; +use He4rt\Character\Database\Factories\PastSeasonFactory; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/Character/Infrastructure/Models/Wallet.php b/app-modules/character/src/Models/Wallet.php similarity index 90% rename from Heart/Character/Infrastructure/Models/Wallet.php rename to app-modules/character/src/Models/Wallet.php index 6a14b4699..f7fd1c58f 100644 --- a/Heart/Character/Infrastructure/Models/Wallet.php +++ b/app-modules/character/src/Models/Wallet.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Models; +namespace He4rt\Character\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; diff --git a/app-modules/character/src/Providers/CharacterServiceProvider.php b/app-modules/character/src/Providers/CharacterServiceProvider.php new file mode 100644 index 000000000..a17ecb76a --- /dev/null +++ b/app-modules/character/src/Providers/CharacterServiceProvider.php @@ -0,0 +1,19 @@ +app->bind(CharacterRepository::class, CharacterEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Character/Infrastructure/Repositories/CharacterEloquentRepository.php b/app-modules/character/src/Repositories/CharacterEloquentRepository.php similarity index 87% rename from Heart/Character/Infrastructure/Repositories/CharacterEloquentRepository.php rename to app-modules/character/src/Repositories/CharacterEloquentRepository.php index 9169eecd5..7777f7836 100644 --- a/Heart/Character/Infrastructure/Repositories/CharacterEloquentRepository.php +++ b/app-modules/character/src/Repositories/CharacterEloquentRepository.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Character\Infrastructure\Repositories; +namespace He4rt\Character\Repositories; -use Heart\Character\Domain\Entities\CharacterEntity; -use Heart\Character\Domain\Repositories\CharacterRepository; -use Heart\Character\Infrastructure\Models\Character; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Entities\CharacterEntity; +use He4rt\Character\Models\Character; use Illuminate\Contracts\Pagination\LengthAwarePaginator; final class CharacterEloquentRepository implements CharacterRepository diff --git a/tests/Feature/Character/ClaimCharacterBadgeTest.php b/app-modules/character/tests/Feature/ClaimCharacterBadgeTest.php similarity index 74% rename from tests/Feature/Character/ClaimCharacterBadgeTest.php rename to app-modules/character/tests/Feature/ClaimCharacterBadgeTest.php index 83a7f5934..2ae10177d 100644 --- a/tests/Feature/Character/ClaimCharacterBadgeTest.php +++ b/app-modules/character/tests/Feature/ClaimCharacterBadgeTest.php @@ -2,15 +2,12 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Badges\Infrastructure\Model\Badge; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Provider\Infrastructure\Models\Provider; -use Heart\User\Infrastructure\Models\User; +use He4rt\Badge\Models\Badge; +use He4rt\Character\Models\Character; +use He4rt\Provider\Models\Provider; +use He4rt\User\Models\User; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('can claim badge', function (): void { $badge = Badge::factory() ->create(); diff --git a/tests/Feature/Character/ClaimDailyBonusTest.php b/app-modules/character/tests/Feature/ClaimDailyBonusTest.php similarity index 84% rename from tests/Feature/Character/ClaimDailyBonusTest.php rename to app-modules/character/tests/Feature/ClaimDailyBonusTest.php index ddc2bd9cc..0cdea9f93 100644 --- a/tests/Feature/Character/ClaimDailyBonusTest.php +++ b/app-modules/character/tests/Feature/ClaimDailyBonusTest.php @@ -2,14 +2,11 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Provider\Infrastructure\Models\Provider; -use Heart\User\Infrastructure\Models\User; +use He4rt\Character\Models\Character; +use He4rt\Provider\Models\Provider; +use He4rt\User\Models\User; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('success', function (): void { $user = User::factory() ->has(Provider::factory(), 'providers') @@ -32,6 +29,7 @@ 'daily_bonus_claimed_at' => $expected, ]); }); + test('should not claim before24 hours', function (): void { $user = User::factory() ->has(Provider::factory(), 'providers') diff --git a/app-modules/character/tests/Unit/Actions/ClaimCharacterBadgeTest.php b/app-modules/character/tests/Unit/Actions/ClaimCharacterBadgeTest.php new file mode 100644 index 000000000..ce44521f4 --- /dev/null +++ b/app-modules/character/tests/Unit/Actions/ClaimCharacterBadgeTest.php @@ -0,0 +1,75 @@ +characterRepositoryStub = Mockery::mock(CharacterRepository::class); + $this->badgeRepositoryStub = Mockery::mock(BadgeRepository::class); + $this->providerRepositoryStub = Mockery::mock(ProviderRepository::class); + $this->userRepositoryStub = Mockery::mock(UserRepository::class); + + // Action instances + $this->persistClaimedBadge = new PersistClaimedBadge($this->characterRepositoryStub); + $this->findBadgeBySlug = new FindBadgeBySlug($this->badgeRepositoryStub); + + // Action stubs + $this->findProviderStub = Mockery::mock(FindProvider::class); + $this->findCharacterIdByUserId = Mockery::mock(FindCharacterIdByUserId::class); + + // Sample entities + $this->providerEntity = $this->validProviderEntity(); + $this->badgeEntity = $this->validBadgeEntity(); +}); + +afterEach(function (): void { + Mockery::close(); +}); + +test('claim character badge success', function (): void { + $this->findProviderStub + ->shouldReceive('handle') + ->with('canhassi-provider', 'canhassi-id') + ->once() + ->andReturn($this->providerEntity); + + $this->findCharacterIdByUserId + ->shouldReceive('handle') + ->with($this->providerEntity->userId) + ->once() + ->andReturn('character-id'); + + $this->badgeRepositoryStub + ->shouldReceive('findBySlug') + ->with('é o canhas') + ->once() + ->andReturn($this->badgeEntity); + + $this->characterRepositoryStub + ->shouldReceive('claimBadge') + ->with('character-id', $this->badgeEntity->id) + ->once(); + + $test = new ClaimCharacterBadge( + $this->persistClaimedBadge, + $this->findProviderStub, + $this->findCharacterIdByUserId, + $this->findBadgeBySlug + ); + + $test->handle('canhassi-provider', 'canhassi-id', 'é o canhas'); +}); diff --git a/app-modules/character/tests/Unit/Actions/ClaimDailyBonusTest.php b/app-modules/character/tests/Unit/Actions/ClaimDailyBonusTest.php new file mode 100644 index 000000000..214a66b60 --- /dev/null +++ b/app-modules/character/tests/Unit/Actions/ClaimDailyBonusTest.php @@ -0,0 +1,60 @@ +characterRepositoryStub = Mockery::mock(CharacterRepository::class); + $this->persistDailyBonus = new PersistDailyBonus($this->characterRepositoryStub); + $this->findProviderStub = Mockery::mock(FindProvider::class); + $this->findCharacterIdByUserIdStub = Mockery::mock(FindCharacterIdByUserId::class); + $this->providerEntity = $this->validProviderEntity(); + $this->characterEntity = $this->validCharacterEntity([ + 'daily_bonus_claimed_at' => null, + ]); +}); + +afterEach(function (): void { + Mockery::close(); +}); + +test('claim daily bonus success', function (): void { + $this->findProviderStub + ->shouldReceive('handle') + ->with('canhassi-provider', 'canhassi-id') + ->once() + ->andReturn($this->providerEntity); + + $this->findCharacterIdByUserIdStub + ->shouldReceive('handle') + ->with($this->providerEntity->userId) + ->once() + ->andReturn('character-id'); + + $this->characterRepositoryStub + ->shouldReceive('findById') + ->with('character-id') + ->once() + ->andReturn($this->characterEntity); + + $this->characterRepositoryStub + ->shouldReceive('claimDailyBonus') + ->once(); + + $test = new ClaimDailyBonus( + $this->persistDailyBonus, + $this->findProviderStub, + $this->findCharacterIdByUserIdStub + ); + + $test->handle('canhassi-provider', 'canhassi-id'); +}); diff --git a/app-modules/character/tests/Unit/Actions/FindCharacterIdByUserIdTest.php b/app-modules/character/tests/Unit/Actions/FindCharacterIdByUserIdTest.php new file mode 100644 index 000000000..c402023cc --- /dev/null +++ b/app-modules/character/tests/Unit/Actions/FindCharacterIdByUserIdTest.php @@ -0,0 +1,32 @@ +characterRepositoryStub = Mockery::mock(CharacterRepository::class); + $this->getCharacterIdByUserId = new GetCharacterByUserId($this->characterRepositoryStub); + $this->characterEntity = $this->validCharacterEntity(); +}); + +afterEach(function (): void { + Mockery::close(); +}); + +test('find character by user id', function (): void { + $this->characterRepositoryStub + ->shouldReceive('findByUserId') + ->with('canhassi-id') + ->once() + ->andReturn($this->characterEntity); + + $test = new FindCharacterIdByUserId($this->getCharacterIdByUserId); + + $test->handle('canhassi-id'); +}); diff --git a/tests/Unit/Character/Domain/Actions/FindCharacterTest.php b/app-modules/character/tests/Unit/Actions/FindCharacterTest.php similarity index 79% rename from tests/Unit/Character/Domain/Actions/FindCharacterTest.php rename to app-modules/character/tests/Unit/Actions/FindCharacterTest.php index fd337b8b6..d9695697c 100644 --- a/tests/Unit/Character/Domain/Actions/FindCharacterTest.php +++ b/app-modules/character/tests/Unit/Actions/FindCharacterTest.php @@ -2,9 +2,10 @@ declare(strict_types=1); -use Tests\Unit\Character\CharacterProviderTrait; -use Heart\Character\Domain\Actions\FindCharacter; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Actions\FindCharacter; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Tests\Unit\CharacterProviderTrait; +use Mockery as m; uses(CharacterProviderTrait::class); diff --git a/tests/Unit/Character/Domain/Actions/GetCharacterByUserIDTest.php b/app-modules/character/tests/Unit/Actions/GetCharacterByUserIDTest.php similarity index 60% rename from tests/Unit/Character/Domain/Actions/GetCharacterByUserIDTest.php rename to app-modules/character/tests/Unit/Actions/GetCharacterByUserIDTest.php index 9db9c87ce..ad2e5f8ba 100644 --- a/tests/Unit/Character/Domain/Actions/GetCharacterByUserIDTest.php +++ b/app-modules/character/tests/Unit/Actions/GetCharacterByUserIDTest.php @@ -2,27 +2,29 @@ declare(strict_types=1); -use Tests\Unit\Character\CharacterProviderTrait; -use Heart\Character\Domain\Actions\GetCharacterByUserId; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Actions\GetCharacterByUserId; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Tests\Unit\CharacterProviderTrait; uses(CharacterProviderTrait::class); beforeEach(function (): void { - $this->characterRepositoryStub = m::mock(CharacterRepository::class); + $this->characterRepositoryStub = Mockery::mock(CharacterRepository::class); $this->characterEntity = $this->validCharacterEntity(); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('get character by user id', function (): void { $this->characterRepositoryStub ->shouldReceive('findByUserId') - ->with(12) + ->with('12') ->once() ->andReturn($this->characterEntity); $test = new GetCharacterByUserId($this->characterRepositoryStub); - $test->handle(12); + $test->handle('12'); }); diff --git a/tests/Unit/Character/Domain/Actions/IncrementExperienceTest.php b/app-modules/character/tests/Unit/Actions/IncrementExperienceTest.php similarity index 59% rename from tests/Unit/Character/Domain/Actions/IncrementExperienceTest.php rename to app-modules/character/tests/Unit/Actions/IncrementExperienceTest.php index 7354b4037..58838bab8 100644 --- a/tests/Unit/Character/Domain/Actions/IncrementExperienceTest.php +++ b/app-modules/character/tests/Unit/Actions/IncrementExperienceTest.php @@ -2,35 +2,37 @@ declare(strict_types=1); -use Tests\Unit\Character\CharacterProviderTrait; -use Heart\Character\Domain\Actions\FindCharacter; -use Heart\Character\Domain\Actions\IncrementExperience; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Actions\FindCharacter; +use He4rt\Character\Actions\IncrementExperience; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Tests\Unit\CharacterProviderTrait; uses(CharacterProviderTrait::class); beforeEach(function (): void { - $this->characterRepositoryStub = m::mock(CharacterRepository::class); - $this->findCharacterStub = m::mock(FindCharacter::class); + $this->characterRepositoryStub = Mockery::mock(CharacterRepository::class); + $this->findCharacter = new FindCharacter($this->characterRepositoryStub); $this->characterEntity = $this->validCharacterEntity(); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('increment experience success', function (): void { $this->characterRepositoryStub - ->shouldReceive('updateExperience') - ->with($this->characterEntity) + ->shouldReceive('findById') + ->with($this->characterEntity->id) ->once() ->andReturn($this->characterEntity); - $this->findCharacterStub - ->shouldReceive('handle') - ->with($this->characterEntity->id) + $this->characterRepositoryStub + ->shouldReceive('updateExperience') + ->with($this->characterEntity) ->once() ->andReturn($this->characterEntity); - $test = new IncrementExperience($this->characterRepositoryStub, $this->findCharacterStub); + $test = new IncrementExperience($this->characterRepositoryStub, $this->findCharacter); $test->incrementByTextMessage($this->characterEntity->id, 'CONGRATS!!'); }); diff --git a/tests/Unit/Character/Domain/Actions/ManageReputationTest.php b/app-modules/character/tests/Unit/Actions/ManageReputationTest.php similarity index 81% rename from tests/Unit/Character/Domain/Actions/ManageReputationTest.php rename to app-modules/character/tests/Unit/Actions/ManageReputationTest.php index 3bfa84360..4a86a15e7 100644 --- a/tests/Unit/Character/Domain/Actions/ManageReputationTest.php +++ b/app-modules/character/tests/Unit/Actions/ManageReputationTest.php @@ -2,9 +2,10 @@ declare(strict_types=1); -use Tests\Unit\Character\CharacterProviderTrait; -use Heart\Character\Domain\Actions\ManageReputation; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Actions\ManageReputation; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Tests\Unit\CharacterProviderTrait; +use Mockery as m; uses(CharacterProviderTrait::class); diff --git a/tests/Unit/Character/Domain/Actions/PaginateCharactersTest.php b/app-modules/character/tests/Unit/Actions/PaginateCharactersTest.php similarity index 84% rename from tests/Unit/Character/Domain/Actions/PaginateCharactersTest.php rename to app-modules/character/tests/Unit/Actions/PaginateCharactersTest.php index 31b4867bf..92b47d8ce 100644 --- a/tests/Unit/Character/Domain/Actions/PaginateCharactersTest.php +++ b/app-modules/character/tests/Unit/Actions/PaginateCharactersTest.php @@ -1,9 +1,11 @@ characterRepository = m::mock(CharacterRepository::class); diff --git a/tests/Unit/Character/Domain/Actions/PersistDailyBonusTest.php b/app-modules/character/tests/Unit/Actions/PersistDailyBonusTest.php similarity index 84% rename from tests/Unit/Character/Domain/Actions/PersistDailyBonusTest.php rename to app-modules/character/tests/Unit/Actions/PersistDailyBonusTest.php index 121bd5a43..8c0c14053 100644 --- a/tests/Unit/Character/Domain/Actions/PersistDailyBonusTest.php +++ b/app-modules/character/tests/Unit/Actions/PersistDailyBonusTest.php @@ -2,11 +2,12 @@ declare(strict_types=1); -use Tests\Unit\Character\CharacterProviderTrait; -use Heart\Character\Domain\Actions\PersistDailyBonus; -use Heart\Character\Domain\Exceptions\CharacterException; -use Heart\Character\Domain\Repositories\CharacterRepository; +use He4rt\Character\Actions\PersistDailyBonus; +use He4rt\Character\Contracts\CharacterRepository; +use He4rt\Character\Exceptions\CharacterException; +use He4rt\Character\Tests\Unit\CharacterProviderTrait; use Illuminate\Support\Facades\Date; +use Mockery as m; uses(CharacterProviderTrait::class); diff --git a/tests/Unit/Character/CharacterProviderTrait.php b/app-modules/character/tests/Unit/CharacterProviderTrait.php similarity index 76% rename from tests/Unit/Character/CharacterProviderTrait.php rename to app-modules/character/tests/Unit/CharacterProviderTrait.php index 815a87609..66a4da252 100644 --- a/tests/Unit/Character/CharacterProviderTrait.php +++ b/app-modules/character/tests/Unit/CharacterProviderTrait.php @@ -2,17 +2,17 @@ declare(strict_types=1); -namespace Tests\Unit\Character; +namespace He4rt\Character\Tests\Unit; -use Heart\Character\Domain\Entities\CharacterEntity; +use He4rt\Character\Entities\CharacterEntity; trait CharacterProviderTrait { public function validCharacterPayload(array $fields = []): array { return [ - 'id' => 1, - 'user_id' => 1, + 'id' => '1', + 'user_id' => '1', 'experience' => 500, 'reputation' => 1, 'daily_bonus_claimed_at' => now()->format('Y-m-d H:i:s'), @@ -22,6 +22,6 @@ public function validCharacterPayload(array $fields = []): array public function validCharacterEntity(array $fields = []): CharacterEntity { - return CharacterEntity::make($this->validCharacterPayload()); + return CharacterEntity::make($this->validCharacterPayload($fields)); } } diff --git a/app-modules/character/tests/Unit/Entities/CharacterEntityTest.php b/app-modules/character/tests/Unit/Entities/CharacterEntityTest.php new file mode 100644 index 000000000..047a80b49 --- /dev/null +++ b/app-modules/character/tests/Unit/Entities/CharacterEntityTest.php @@ -0,0 +1,32 @@ + [ + ['1', '1', 1, 548, '2023-01-14 00:26:25', 4], + ['1', '1', 1, 89, '2023-01-14 00:26:25', 1], + ['1', '1', 1, 287, '2023-01-14 00:26:25', 3], +]); + +dataset('make character provider', fn () => [ + [['id' => '1', 'user_id' => '1', 'reputation' => 1, 'experience' => 548, 'daily_bonus_claimed_at' => '2023-01-14 00:26:25'], 4], + [['id' => '1', 'user_id' => '1', 'reputation' => 1, 'experience' => 98, 'daily_bonus_claimed_at' => '2023-01-14 00:26:25'], 2], +]); + +test('instance character entity test', function ( + string $id, string $userId, int $reputation, int $experience, string $claimedAt, int $expectedLevel +): void { + $characterEntity = new CharacterEntity($id, $userId, $reputation, $experience, $claimedAt); + + expect($expectedLevel)->toBe($characterEntity->getLevel()) + ->and($characterEntity)->toBeInstanceOf(CharacterEntity::class); +})->with('character provider'); + +test('make character', function (array $payload, int $expectedLevel): void { + $characterEntity = CharacterEntity::make($payload); + + expect($expectedLevel)->toBe($characterEntity->getLevel()) + ->and($characterEntity)->toBeInstanceOf(CharacterEntity::class); +})->with('make character provider'); diff --git a/tests/Unit/Character/Domain/Entities/LevelEntityTest.php b/app-modules/character/tests/Unit/Entities/LevelEntityTest.php similarity index 94% rename from tests/Unit/Character/Domain/Entities/LevelEntityTest.php rename to app-modules/character/tests/Unit/Entities/LevelEntityTest.php index 31f5a19c3..737a33625 100644 --- a/tests/Unit/Character/Domain/Entities/LevelEntityTest.php +++ b/app-modules/character/tests/Unit/Entities/LevelEntityTest.php @@ -1,7 +1,8 @@ [ +use He4rt\Character\Entities\ReputationEntity; + +dataset('reputationDataProvider', fn () => [ 'increment #1' => ['points' => 5, 'operation' => 'increment', 'expectedPoints' => 6, 'expectedBadge' => 'Lenda'], 'increment #2' => ['points' => 7, 'operation' => 'increment', 'expectedPoints' => 8, 'expectedBadge' => 'Lenda'], - 'increment #3' => ['points' => -2, 'operation' => 'increment', 'expectedPoints' => -1, 'expectedBadge' => 'Vacilão'], - 'decrement #1' => ['points' => -3, 'operation' => 'decrement', 'expectedPoints' => -4, 'expectedBadge' => 'Vacilão'], - 'decrement #2' => ['points' => 1, 'operation' => 'decrement', 'expectedPoints' => 0, 'expectedBadge' => 'Sem informações'], + 'increment #3' => [ + 'points' => -2, 'operation' => 'increment', 'expectedPoints' => -1, 'expectedBadge' => 'Vacilão', + ], + 'decrement #1' => [ + 'points' => -3, 'operation' => 'decrement', 'expectedPoints' => -4, 'expectedBadge' => 'Vacilão', + ], + 'decrement #2' => [ + 'points' => 1, 'operation' => 'decrement', 'expectedPoints' => 0, 'expectedBadge' => 'Sem informações', + ], 'decrement #3' => ['points' => 0, 'operation' => 'decrement', 'expectedPoints' => -1, 'expectedBadge' => 'Vacilão'], ]); test('reputation', function (int $points, string $operation, int $expectedPoints, string $expectedBadge): void { diff --git a/tests/Unit/Character/ProviderProviderTrait.php b/app-modules/character/tests/Unit/ProviderProviderTrait.php similarity index 86% rename from tests/Unit/Character/ProviderProviderTrait.php rename to app-modules/character/tests/Unit/ProviderProviderTrait.php index 81548e18b..6389f7922 100644 --- a/tests/Unit/Character/ProviderProviderTrait.php +++ b/app-modules/character/tests/Unit/ProviderProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\Character; +namespace He4rt\Character\Tests\Unit; -use Heart\Provider\Domain\Entities\ProviderEntity; +use He4rt\Provider\Entities\ProviderEntity; trait ProviderProviderTrait { diff --git a/app-modules/feedback/composer.json b/app-modules/feedback/composer.json new file mode 100644 index 000000000..e5a39f953 --- /dev/null +++ b/app-modules/feedback/composer.json @@ -0,0 +1,23 @@ +{ + "name": "he4rt/feedback", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Feedback\\": "src/", + "He4rt\\Feedback\\Tests\\": "tests/", + "He4rt\\Feedback\\Database\\Factories\\": "database/factories/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Feedback\\Providers\\FeedbackServiceProvider" + ] + } + } +} diff --git a/Heart/Feedback/Infrastructure/Factories/FeedbackFactory.php b/app-modules/feedback/database/factories/FeedbackFactory.php similarity index 51% rename from Heart/Feedback/Infrastructure/Factories/FeedbackFactory.php rename to app-modules/feedback/database/factories/FeedbackFactory.php index b2b70a1c3..b61bf7648 100644 --- a/Heart/Feedback/Infrastructure/Factories/FeedbackFactory.php +++ b/app-modules/feedback/database/factories/FeedbackFactory.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Infrastructure\Factories; +namespace He4rt\Feedback\Database\Factories; -use Heart\Feedback\Infrastructure\Models\Feedback; -use Heart\User\Infrastructure\Models\User; +use He4rt\Feedback\Models\Feedback; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; final class FeedbackFactory extends Factory @@ -15,11 +15,11 @@ final class FeedbackFactory extends Factory public function definition(): array { return [ - 'id' => $this->faker->uuid(), + 'id' => fake()->uuid(), 'sender_id' => User::factory(), 'target_id' => User::factory(), - 'type' => $this->faker->randomElement(['compliment', 'improvement']), - 'message' => $this->faker->sentence(), + 'type' => fake()->randomElement(['compliment', 'improvement']), + 'message' => fake()->sentence(), ]; } } diff --git a/app-modules/feedback/routes/feedback-routes.php b/app-modules/feedback/routes/feedback-routes.php new file mode 100644 index 000000000..6ae7617d7 --- /dev/null +++ b/app-modules/feedback/routes/feedback-routes.php @@ -0,0 +1,16 @@ +middleware(['api', BotAuthentication::class])->group(function (): void { + Route::get('feedbacks/{feedbackId}', [FeedbacksController::class, 'getFeedback']) + ->name('feedbacks.show'); + Route::post('feedbacks', [FeedbacksController::class, 'postFeedback']) + ->name('feedbacks.create'); + Route::post('feedbacks/{feedbackId}/{action}', [FeedbacksController::class, 'postReview']) + ->name('feedbacks.review'); +}); diff --git a/Heart/Feedback/Domain/Actions/CreateFeedback.php b/app-modules/feedback/src/Actions/CreateFeedback.php similarity index 76% rename from Heart/Feedback/Domain/Actions/CreateFeedback.php rename to app-modules/feedback/src/Actions/CreateFeedback.php index 70140bec3..ec19daa80 100644 --- a/Heart/Feedback/Domain/Actions/CreateFeedback.php +++ b/app-modules/feedback/src/Actions/CreateFeedback.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Actions; +namespace He4rt\Feedback\Actions; -use Heart\Feedback\Domain\DTOs\NewFeedbackDTO; -use Heart\Feedback\Domain\Entities\FeedbackEntity; -use Heart\Feedback\Domain\Repositories\FeedbackRepository; -use Heart\Provider\Application\FindProvider; -use Heart\Provider\Domain\Enums\ProviderEnum; +use He4rt\Feedback\Contracts\FeedbackRepository; +use He4rt\Feedback\DTO\NewFeedbackDTO; +use He4rt\Feedback\Entities\FeedbackEntity; +use He4rt\Provider\Actions\FindProvider; +use He4rt\Provider\Enums\ProviderEnum; final readonly class CreateFeedback { diff --git a/Heart/Feedback/Domain/Actions/GetFeedbackById.php b/app-modules/feedback/src/Actions/GetFeedbackById.php similarity index 63% rename from Heart/Feedback/Domain/Actions/GetFeedbackById.php rename to app-modules/feedback/src/Actions/GetFeedbackById.php index 1e6b0096d..e8e5cbb8d 100644 --- a/Heart/Feedback/Domain/Actions/GetFeedbackById.php +++ b/app-modules/feedback/src/Actions/GetFeedbackById.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Actions; +namespace He4rt\Feedback\Actions; -use Heart\Feedback\Domain\Entities\FeedbackEntity; -use Heart\Feedback\Domain\Repositories\FeedbackRepository; +use He4rt\Feedback\Contracts\FeedbackRepository; +use He4rt\Feedback\Entities\FeedbackEntity; final readonly class GetFeedbackById { diff --git a/Heart/Feedback/Domain/Actions/PersistFeedbackReview.php b/app-modules/feedback/src/Actions/PersistFeedbackReview.php similarity index 68% rename from Heart/Feedback/Domain/Actions/PersistFeedbackReview.php rename to app-modules/feedback/src/Actions/PersistFeedbackReview.php index 67f72190d..c6580317e 100644 --- a/Heart/Feedback/Domain/Actions/PersistFeedbackReview.php +++ b/app-modules/feedback/src/Actions/PersistFeedbackReview.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Actions; +namespace He4rt\Feedback\Actions; -use Heart\Feedback\Domain\DTOs\FeedbackReviewDTO; -use Heart\Feedback\Domain\Repositories\FeedbackRepository; +use He4rt\Feedback\Contracts\FeedbackRepository; +use He4rt\Feedback\DTO\FeedbackReviewDTO; final readonly class PersistFeedbackReview { diff --git a/Heart/Feedback/Application/ReviewFeedback.php b/app-modules/feedback/src/Actions/ReviewFeedback.php similarity index 72% rename from Heart/Feedback/Application/ReviewFeedback.php rename to app-modules/feedback/src/Actions/ReviewFeedback.php index e8f69fedd..720767728 100644 --- a/Heart/Feedback/Application/ReviewFeedback.php +++ b/app-modules/feedback/src/Actions/ReviewFeedback.php @@ -2,12 +2,11 @@ declare(strict_types=1); -namespace Heart\Feedback\Application; +namespace He4rt\Feedback\Actions; -use Heart\Feedback\Domain\Actions\PersistFeedbackReview; -use Heart\Feedback\Domain\DTOs\FeedbackReviewDTO; -use Heart\Provider\Application\FindProvider; -use Heart\Provider\Domain\Enums\ProviderEnum; +use He4rt\Feedback\DTO\FeedbackReviewDTO; +use He4rt\Provider\Actions\FindProvider; +use He4rt\Provider\Enums\ProviderEnum; final readonly class ReviewFeedback { diff --git a/Heart/Feedback/Domain/Repositories/FeedbackRepository.php b/app-modules/feedback/src/Contracts/FeedbackRepository.php similarity index 57% rename from Heart/Feedback/Domain/Repositories/FeedbackRepository.php rename to app-modules/feedback/src/Contracts/FeedbackRepository.php index b1b415a6f..de23f1dda 100644 --- a/Heart/Feedback/Domain/Repositories/FeedbackRepository.php +++ b/app-modules/feedback/src/Contracts/FeedbackRepository.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Repositories; +namespace He4rt\Feedback\Contracts; -use Heart\Feedback\Domain\DTOs\FeedbackReviewDTO; -use Heart\Feedback\Domain\DTOs\NewFeedbackDTO; -use Heart\Feedback\Domain\Entities\FeedbackEntity; +use He4rt\Feedback\DTO\FeedbackReviewDTO; +use He4rt\Feedback\DTO\NewFeedbackDTO; +use He4rt\Feedback\Entities\FeedbackEntity; interface FeedbackRepository { diff --git a/Heart/Feedback/Domain/DTOs/FeedbackReviewDTO.php b/app-modules/feedback/src/DTO/FeedbackReviewDTO.php similarity index 88% rename from Heart/Feedback/Domain/DTOs/FeedbackReviewDTO.php rename to app-modules/feedback/src/DTO/FeedbackReviewDTO.php index bb87b4fc4..371252140 100644 --- a/Heart/Feedback/Domain/DTOs/FeedbackReviewDTO.php +++ b/app-modules/feedback/src/DTO/FeedbackReviewDTO.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\DTOs; +namespace He4rt\Feedback\DTO; -use Heart\Feedback\Domain\Enums\ReviewTypeEnum; -use Heart\Provider\Domain\Entities\ProviderEntity; +use He4rt\Feedback\Enum\ReviewTypeEnum; +use He4rt\Provider\Entities\ProviderEntity; use JsonSerializable; final readonly class FeedbackReviewDTO implements JsonSerializable diff --git a/Heart/Feedback/Domain/DTOs/NewFeedbackDTO.php b/app-modules/feedback/src/DTO/NewFeedbackDTO.php similarity index 95% rename from Heart/Feedback/Domain/DTOs/NewFeedbackDTO.php rename to app-modules/feedback/src/DTO/NewFeedbackDTO.php index 8ff9ce7fd..abf71ee6d 100644 --- a/Heart/Feedback/Domain/DTOs/NewFeedbackDTO.php +++ b/app-modules/feedback/src/DTO/NewFeedbackDTO.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\DTOs; +namespace He4rt\Feedback\DTO; use JsonSerializable; diff --git a/Heart/Feedback/Domain/Entities/FeedbackEntity.php b/app-modules/feedback/src/Entities/FeedbackEntity.php similarity index 95% rename from Heart/Feedback/Domain/Entities/FeedbackEntity.php rename to app-modules/feedback/src/Entities/FeedbackEntity.php index 4df91a4aa..736d7fbea 100644 --- a/Heart/Feedback/Domain/Entities/FeedbackEntity.php +++ b/app-modules/feedback/src/Entities/FeedbackEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Entities; +namespace He4rt\Feedback\Entities; use JsonSerializable; diff --git a/Heart/Feedback/Domain/Enums/ReviewTypeEnum.php b/app-modules/feedback/src/Enum/ReviewTypeEnum.php similarity index 88% rename from Heart/Feedback/Domain/Enums/ReviewTypeEnum.php rename to app-modules/feedback/src/Enum/ReviewTypeEnum.php index 37d0cc63e..d4ba717c5 100644 --- a/Heart/Feedback/Domain/Enums/ReviewTypeEnum.php +++ b/app-modules/feedback/src/Enum/ReviewTypeEnum.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Feedback\Domain\Enums; +namespace He4rt\Feedback\Enum; enum ReviewTypeEnum: string { diff --git a/Heart/Feedback/Infrastructure/Exceptions/FeedbackException.php b/app-modules/feedback/src/Exceptions/FeedbackException.php similarity index 90% rename from Heart/Feedback/Infrastructure/Exceptions/FeedbackException.php rename to app-modules/feedback/src/Exceptions/FeedbackException.php index 6db3cccf1..d8ff45690 100644 --- a/Heart/Feedback/Infrastructure/Exceptions/FeedbackException.php +++ b/app-modules/feedback/src/Exceptions/FeedbackException.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Feedback\Infrastructure\Exceptions; +namespace He4rt\Feedback\Exceptions; use Exception; use Illuminate\Http\JsonResponse; diff --git a/Heart/Feedback/Presentation/Controllers/FeedbacksController.php b/app-modules/feedback/src/Http/Controllers/FeedbacksController.php similarity index 75% rename from Heart/Feedback/Presentation/Controllers/FeedbacksController.php rename to app-modules/feedback/src/Http/Controllers/FeedbacksController.php index 0825e8a5b..ee017ea1a 100644 --- a/Heart/Feedback/Presentation/Controllers/FeedbacksController.php +++ b/app-modules/feedback/src/Http/Controllers/FeedbacksController.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Feedback\Presentation\Controllers; +namespace He4rt\Feedback\Http\Controllers; -use Heart\Feedback\Application\ReviewFeedback; -use Heart\Feedback\Domain\Actions\CreateFeedback; -use Heart\Feedback\Domain\Actions\GetFeedbackById; -use Heart\Feedback\Presentation\Requests\CreateFeedbackRequest; -use Heart\Feedback\Presentation\Requests\FeedbackReviewRequest; +use He4rt\Feedback\Actions\CreateFeedback; +use He4rt\Feedback\Actions\GetFeedbackById; +use He4rt\Feedback\Actions\ReviewFeedback; +use He4rt\Feedback\Http\Requests\CreateFeedbackRequest; +use He4rt\Feedback\Http\Requests\FeedbackReviewRequest; use Illuminate\Http\JsonResponse; use Symfony\Component\HttpFoundation\Response; diff --git a/Heart/Feedback/Presentation/Requests/CreateFeedbackRequest.php b/app-modules/feedback/src/Http/Requests/CreateFeedbackRequest.php similarity index 93% rename from Heart/Feedback/Presentation/Requests/CreateFeedbackRequest.php rename to app-modules/feedback/src/Http/Requests/CreateFeedbackRequest.php index 7f5624236..ee858c064 100644 --- a/Heart/Feedback/Presentation/Requests/CreateFeedbackRequest.php +++ b/app-modules/feedback/src/Http/Requests/CreateFeedbackRequest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Feedback\Presentation\Requests; +namespace He4rt\Feedback\Http\Requests; use Illuminate\Foundation\Http\FormRequest; diff --git a/Heart/Feedback/Presentation/Requests/FeedbackReviewRequest.php b/app-modules/feedback/src/Http/Requests/FeedbackReviewRequest.php similarity index 86% rename from Heart/Feedback/Presentation/Requests/FeedbackReviewRequest.php rename to app-modules/feedback/src/Http/Requests/FeedbackReviewRequest.php index 87a5ac371..a577f5291 100644 --- a/Heart/Feedback/Presentation/Requests/FeedbackReviewRequest.php +++ b/app-modules/feedback/src/Http/Requests/FeedbackReviewRequest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Feedback\Presentation\Requests; +namespace He4rt\Feedback\Http\Requests; -use Heart\Feedback\Domain\Enums\ReviewTypeEnum; +use He4rt\Feedback\Enum\ReviewTypeEnum; use Illuminate\Foundation\Http\FormRequest; final class FeedbackReviewRequest extends FormRequest diff --git a/Heart/Feedback/Infrastructure/Models/Feedback.php b/app-modules/feedback/src/Models/Feedback.php similarity index 86% rename from Heart/Feedback/Infrastructure/Models/Feedback.php rename to app-modules/feedback/src/Models/Feedback.php index 53ddae5ab..245685e48 100644 --- a/Heart/Feedback/Infrastructure/Models/Feedback.php +++ b/app-modules/feedback/src/Models/Feedback.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Infrastructure\Models; +namespace He4rt\Feedback\Models; -use Heart\Feedback\Infrastructure\Factories\FeedbackFactory; -use Heart\User\Infrastructure\Models\User; +use He4rt\Feedback\Database\Factories\FeedbackFactory; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/Feedback/Infrastructure/Models/Review.php b/app-modules/feedback/src/Models/Review.php similarity index 70% rename from Heart/Feedback/Infrastructure/Models/Review.php rename to app-modules/feedback/src/Models/Review.php index a2590f287..b35107c5c 100644 --- a/Heart/Feedback/Infrastructure/Models/Review.php +++ b/app-modules/feedback/src/Models/Review.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Feedback\Infrastructure\Models; +namespace He4rt\Feedback\Models; -use Heart\Feedback\Domain\Enums\ReviewTypeEnum; -use Heart\User\Infrastructure\Models\User; +use He4rt\Feedback\Enum\ReviewTypeEnum; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -25,11 +25,6 @@ final class Review extends Model 'received_at', ]; - protected $casts = [ - 'status' => ReviewTypeEnum::class, - 'received_at' => 'timestamp', - ]; - public function feedback(): BelongsTo { return $this->belongsTo(Feedback::class); @@ -39,4 +34,12 @@ public function staff(): BelongsTo { return $this->belongsTo(User::class, 'staff_id'); } + + protected function casts(): array + { + return [ + 'status' => ReviewTypeEnum::class, + 'received_at' => 'timestamp', + ]; + } } diff --git a/app-modules/feedback/src/Providers/FeedbackServiceProvider.php b/app-modules/feedback/src/Providers/FeedbackServiceProvider.php new file mode 100644 index 000000000..59756832d --- /dev/null +++ b/app-modules/feedback/src/Providers/FeedbackServiceProvider.php @@ -0,0 +1,19 @@ +app->bind(FeedbackRepository::class, FeedbackEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Feedback/Infrastructure/Repositories/FeedbackEloquentRepository.php b/app-modules/feedback/src/Repositories/FeedbackEloquentRepository.php similarity index 66% rename from Heart/Feedback/Infrastructure/Repositories/FeedbackEloquentRepository.php rename to app-modules/feedback/src/Repositories/FeedbackEloquentRepository.php index 52abc6e7e..4fcaff94b 100644 --- a/Heart/Feedback/Infrastructure/Repositories/FeedbackEloquentRepository.php +++ b/app-modules/feedback/src/Repositories/FeedbackEloquentRepository.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Heart\Feedback\Infrastructure\Repositories; +namespace He4rt\Feedback\Repositories; -use Heart\Feedback\Domain\DTOs\FeedbackReviewDTO; -use Heart\Feedback\Domain\DTOs\NewFeedbackDTO; -use Heart\Feedback\Domain\Entities\FeedbackEntity; -use Heart\Feedback\Domain\Repositories\FeedbackRepository; -use Heart\Feedback\Infrastructure\Exceptions\FeedbackException; -use Heart\Feedback\Infrastructure\Models\Feedback; +use He4rt\Feedback\Contracts\FeedbackRepository; +use He4rt\Feedback\DTO\FeedbackReviewDTO; +use He4rt\Feedback\DTO\NewFeedbackDTO; +use He4rt\Feedback\Entities\FeedbackEntity; +use He4rt\Feedback\Exceptions\FeedbackException; +use He4rt\Feedback\Models\Feedback; final readonly class FeedbackEloquentRepository implements FeedbackRepository { @@ -21,7 +21,7 @@ public function findById(string $id): FeedbackEntity ->newQuery() ->find($id); - throw_unless($model, FeedbackException::idNotFound($id)); + throw_unless($model, FeedbackException::idNotFound((int) $id)); return FeedbackEntity::make($model->toArray()); } diff --git a/tests/Feature/Feedback/CreateFeedbackTest.php b/app-modules/feedback/tests/Feature/CreateFeedbackTest.php similarity index 84% rename from tests/Feature/Feedback/CreateFeedbackTest.php rename to app-modules/feedback/tests/Feature/CreateFeedbackTest.php index 54aa0eb4f..d48505a27 100644 --- a/tests/Feature/Feedback/CreateFeedbackTest.php +++ b/app-modules/feedback/tests/Feature/CreateFeedbackTest.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Provider\Models\Provider; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('can create', function (): void { $providerSender = Provider::factory()->create(['provider' => 'discord']); $providerTarget = Provider::factory()->create(['provider' => 'discord']); diff --git a/tests/Feature/Feedback/GetFeedbackByIdTest.php b/app-modules/feedback/tests/Feature/GetFeedbackByIdTest.php similarity index 69% rename from tests/Feature/Feedback/GetFeedbackByIdTest.php rename to app-modules/feedback/tests/Feature/GetFeedbackByIdTest.php index cc9a97044..76fd1576c 100644 --- a/tests/Feature/Feedback/GetFeedbackByIdTest.php +++ b/app-modules/feedback/tests/Feature/GetFeedbackByIdTest.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Feedback\Infrastructure\Models\Feedback; +use He4rt\Feedback\Models\Feedback; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('can find by id', function (): void { $feedback = Feedback::factory()->create(); diff --git a/tests/Feature/Feedback/ReviewFeedbackTest.php b/app-modules/feedback/tests/Feature/ReviewFeedbackTest.php similarity index 81% rename from tests/Feature/Feedback/ReviewFeedbackTest.php rename to app-modules/feedback/tests/Feature/ReviewFeedbackTest.php index cbc7f1059..76763527b 100644 --- a/tests/Feature/Feedback/ReviewFeedbackTest.php +++ b/app-modules/feedback/tests/Feature/ReviewFeedbackTest.php @@ -2,14 +2,11 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Feedback\Infrastructure\Models\Feedback; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Feedback\Models\Feedback; +use He4rt\Provider\Models\Provider; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - -dataset('dataProvider', fn() => [ +dataset('data provider', fn () => [ 'approve feedback' => [ 'action' => 'approved', 'payload' => [], @@ -28,6 +25,7 @@ ], ], ]); + test('can handle feedback', function (string $action, array $payload, array $expected): void { $feedback = Feedback::factory()->create(); $staffProvider = Provider::factory()->create(['provider' => 'discord']); @@ -44,4 +42,4 @@ $expected['staff_id'] = $staffProvider->user_id; $this->assertDatabaseHas('feedback_reviews', $expected); -})->with('dataProvider'); +})->with('data provider'); diff --git a/app-modules/integrations/composer.json b/app-modules/integrations/composer.json new file mode 100644 index 000000000..0c35c2169 --- /dev/null +++ b/app-modules/integrations/composer.json @@ -0,0 +1,21 @@ +{ + "name": "he4rt/integrations", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Integrations\\": "src/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Integrations\\Providers\\IntegrationsServiceProvider" + ] + } + } +} diff --git a/Heart/Integrations/Twitch/Common/TwitchBaseClient.php b/app-modules/integrations/src/Common/Client/TwitchBaseClient.php similarity index 53% rename from Heart/Integrations/Twitch/Common/TwitchBaseClient.php rename to app-modules/integrations/src/Common/Client/TwitchBaseClient.php index 25357170f..ed74d2d67 100644 --- a/Heart/Integrations/Twitch/Common/TwitchBaseClient.php +++ b/app-modules/integrations/src/Common/Client/TwitchBaseClient.php @@ -2,13 +2,14 @@ declare(strict_types=1); -namespace Heart\Integrations\Twitch\Common; +namespace He4rt\Integrations\Common\Client; use GuzzleHttp\Client; -use Heart\Integrations\Twitch\OAuth\Domain\TwitchOAuthService; -use Heart\Integrations\Twitch\OAuth\Infrastructure\TwitchOAuthClient; -use Heart\Integrations\Twitch\Subscriber\Domain\TwitchSubscribersService; -use Heart\Integrations\Twitch\Subscriber\Infrastructure\TwitchSubscribersClient; +use He4rt\Integrations\Common\Contracts\TwitchService; +use He4rt\Integrations\Twitch\OAuth\Client\TwitchOAuthClient; +use He4rt\Integrations\Twitch\OAuth\Contracts\TwitchOAuthService; +use He4rt\Integrations\Twitch\Subscriber\Client\TwitchSubscribersClient; +use He4rt\Integrations\Twitch\Subscriber\Contracts\TwitchSubscribersService; final readonly class TwitchBaseClient implements TwitchService { diff --git a/app-modules/integrations/src/Common/Contracts/TwitchService.php b/app-modules/integrations/src/Common/Contracts/TwitchService.php new file mode 100644 index 000000000..6ff263145 --- /dev/null +++ b/app-modules/integrations/src/Common/Contracts/TwitchService.php @@ -0,0 +1,15 @@ +app->bind(TwitchService::class, TwitchBaseClient::class); + $this->app->bind(TwitchOAuthService::class, TwitchOAuthClient::class); + } + + public function boot(): void {} +} diff --git a/Heart/Integrations/Twitch/OAuth/Infrastructure/TwitchOAuthClient.php b/app-modules/integrations/src/Twitch/OAuth/Client/TwitchOAuthClient.php similarity index 85% rename from Heart/Integrations/Twitch/OAuth/Infrastructure/TwitchOAuthClient.php rename to app-modules/integrations/src/Twitch/OAuth/Client/TwitchOAuthClient.php index a2a5393c9..0929c22c5 100644 --- a/Heart/Integrations/Twitch/OAuth/Infrastructure/TwitchOAuthClient.php +++ b/app-modules/integrations/src/Twitch/OAuth/Client/TwitchOAuthClient.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Integrations\Twitch\OAuth\Infrastructure; +namespace He4rt\Integrations\Twitch\OAuth\Client; use GuzzleHttp\Client; -use Heart\Authentication\OAuth\Domain\DTO\OAuthAccessDTO; -use Heart\Integrations\Twitch\OAuth\Domain\DTO\TwitchOAuthAccessDTO; -use Heart\Integrations\Twitch\OAuth\Domain\DTO\TwitchOAuthDTO; -use Heart\Integrations\Twitch\OAuth\Domain\TwitchOAuthService; +use He4rt\Authentication\DTO\OAuthAccessDTO; +use He4rt\Integrations\Twitch\OAuth\Contracts\TwitchOAuthService; +use He4rt\Integrations\Twitch\OAuth\DTO\TwitchOAuthAccessDTO; +use He4rt\Integrations\Twitch\OAuth\DTO\TwitchOAuthDTO; final readonly class TwitchOAuthClient implements TwitchOAuthService { diff --git a/app-modules/integrations/src/Twitch/OAuth/Contracts/TwitchOAuthService.php b/app-modules/integrations/src/Twitch/OAuth/Contracts/TwitchOAuthService.php new file mode 100644 index 000000000..db3ee3b9f --- /dev/null +++ b/app-modules/integrations/src/Twitch/OAuth/Contracts/TwitchOAuthService.php @@ -0,0 +1,9 @@ + $this->faker->uuid(), + 'id' => fake()->uuid(), 'meeting_type_id' => MeetingType::factory(), 'admin_id' => User::factory(), 'content' => 'Fake content', - 'starts_at' => $this->faker->dateTimeBetween('-1 hour'), - 'ends_at' => $this->faker->dateTimeBetween('+1 hour', '+2 hour'), + 'starts_at' => fake()->dateTimeBetween('-1 hour'), + 'ends_at' => fake()->dateTimeBetween('+1 hour', '+2 hour'), ]; } diff --git a/app-modules/meeting/database/factories/MeetingTypeFactory.php b/app-modules/meeting/database/factories/MeetingTypeFactory.php new file mode 100644 index 000000000..03d8421af --- /dev/null +++ b/app-modules/meeting/database/factories/MeetingTypeFactory.php @@ -0,0 +1,22 @@ + fake()->name(), + 'week_day' => fake()->numberBetween(0, 6), + 'start_at' => fake()->numberBetween(0, 1439), + ]; + } +} diff --git a/app-modules/meeting/routes/meeting-routes.php b/app-modules/meeting/routes/meeting-routes.php new file mode 100644 index 000000000..554f209de --- /dev/null +++ b/app-modules/meeting/routes/meeting-routes.php @@ -0,0 +1,17 @@ +middleware(['api', BotAuthentication::class])->group(function (): void { + Route::prefix('events/{provider}')->name('events.')->group(function (): void { + Route::prefix('meeting')->name('meeting.')->group(function (): void { + Route::get('/', [MeetingController::class, 'getMeetings'])->name('getMeetings'); + Route::post('/start', [MeetingController::class, 'postMeeting'])->name('postMeeting'); + Route::post('/end', [MeetingController::class, 'postEndMeeting'])->name('postEndMeeting'); + }); + }); +}); diff --git a/Heart/Meeting/Application/AttendMeeting.php b/app-modules/meeting/src/Actions/AttendMeeting.php similarity index 74% rename from Heart/Meeting/Application/AttendMeeting.php rename to app-modules/meeting/src/Actions/AttendMeeting.php index 755aa68f7..50691501d 100644 --- a/Heart/Meeting/Application/AttendMeeting.php +++ b/app-modules/meeting/src/Actions/AttendMeeting.php @@ -2,17 +2,16 @@ declare(strict_types=1); -namespace Heart\Meeting\Application; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Actions\PersistAttendMeeting; -use Heart\Meeting\Domain\Exceptions\MeetingException; -use Heart\Shared\Application\TTL; +use He4rt\Meeting\Exceptions\MeetingException; +use He4rt\Shared\TTL; use Illuminate\Support\Facades\Cache; class AttendMeeting { public function __construct( - private readonly PersistAttendMeeting $persistAttendMeeting + private readonly PersistAttendMeetingAction $persistAttendMeeting ) {} public function handle(string $userId): void diff --git a/Heart/Meeting/Domain/Actions/CreateMeeting.php b/app-modules/meeting/src/Actions/CreateMeetingAction.php similarity index 53% rename from Heart/Meeting/Domain/Actions/CreateMeeting.php rename to app-modules/meeting/src/Actions/CreateMeetingAction.php index e6e8257e9..d2c18dacd 100644 --- a/Heart/Meeting/Domain/Actions/CreateMeeting.php +++ b/app-modules/meeting/src/Actions/CreateMeetingAction.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Actions; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\DTO\NewMeetingDTO; -use Heart\Meeting\Domain\Entities\MeetingEntity; -use Heart\Meeting\Domain\Repositories\MeetingRepository; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\DTO\NewMeetingDTO; +use He4rt\Meeting\Entities\MeetingEntity; -final readonly class CreateMeeting +final readonly class CreateMeetingAction { public function __construct(private MeetingRepository $repository) {} diff --git a/Heart/Meeting/Application/EndMeeting.php b/app-modules/meeting/src/Actions/EndMeeting.php similarity index 77% rename from Heart/Meeting/Application/EndMeeting.php rename to app-modules/meeting/src/Actions/EndMeeting.php index e03fd3ead..f006d7388 100644 --- a/Heart/Meeting/Application/EndMeeting.php +++ b/app-modules/meeting/src/Actions/EndMeeting.php @@ -2,14 +2,13 @@ declare(strict_types=1); -namespace Heart\Meeting\Application; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Actions\FinishMeeting; use Illuminate\Support\Facades\Cache; final readonly class EndMeeting { - public function __construct(private FinishMeeting $finishMeeting) {} + public function __construct(private FinishMeetingAction $finishMeeting) {} public function handle(): void { diff --git a/Heart/Meeting/Domain/Actions/FindMeetingType.php b/app-modules/meeting/src/Actions/FindMeetingTypeAction.php similarity index 61% rename from Heart/Meeting/Domain/Actions/FindMeetingType.php rename to app-modules/meeting/src/Actions/FindMeetingTypeAction.php index fb0ba2d79..096a48306 100644 --- a/Heart/Meeting/Domain/Actions/FindMeetingType.php +++ b/app-modules/meeting/src/Actions/FindMeetingTypeAction.php @@ -2,16 +2,20 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Actions; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Entities\MeetingTypeEntity; -use Heart\Meeting\Domain\Exceptions\MeetingException; -use Heart\Meeting\Domain\Repositories\MeetingTypeRepository; +use He4rt\Meeting\Contracts\MeetingTypeRepository; +use He4rt\Meeting\Entities\MeetingTypeEntity; +use He4rt\Meeting\Exceptions\MeetingException; +use Throwable; -final readonly class FindMeetingType +final readonly class FindMeetingTypeAction { public function __construct(private MeetingTypeRepository $meetingTypeRepository) {} + /** + * @throws Throwable + */ public function handle(int $meetingType): MeetingTypeEntity { $meetingTypeEntity = $this->meetingTypeRepository->findById($meetingType); diff --git a/Heart/Meeting/Domain/Actions/FinishMeeting.php b/app-modules/meeting/src/Actions/FinishMeetingAction.php similarity index 58% rename from Heart/Meeting/Domain/Actions/FinishMeeting.php rename to app-modules/meeting/src/Actions/FinishMeetingAction.php index 75d9b0af2..b87b0948f 100644 --- a/Heart/Meeting/Domain/Actions/FinishMeeting.php +++ b/app-modules/meeting/src/Actions/FinishMeetingAction.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Actions; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Entities\MeetingEntity; -use Heart\Meeting\Domain\Repositories\MeetingRepository; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\Entities\MeetingEntity; -final readonly class FinishMeeting +final readonly class FinishMeetingAction { public function __construct(private MeetingRepository $meetingRepository) {} diff --git a/app-modules/meeting/src/Actions/PaginateMeetings.php b/app-modules/meeting/src/Actions/PaginateMeetings.php new file mode 100644 index 000000000..312400d93 --- /dev/null +++ b/app-modules/meeting/src/Actions/PaginateMeetings.php @@ -0,0 +1,20 @@ +paginateMeetingsAction->handle(); + } +} diff --git a/Heart/Meeting/Domain/Actions/PaginateMeetings.php b/app-modules/meeting/src/Actions/PaginateMeetingsAction.php similarity index 57% rename from Heart/Meeting/Domain/Actions/PaginateMeetings.php rename to app-modules/meeting/src/Actions/PaginateMeetingsAction.php index 8ca3917c4..f216edbfd 100644 --- a/Heart/Meeting/Domain/Actions/PaginateMeetings.php +++ b/app-modules/meeting/src/Actions/PaginateMeetingsAction.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Actions; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Repositories\MeetingRepository; -use Heart\Shared\Domain\Paginator; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Shared\Contract\Paginator; -final readonly class PaginateMeetings +final readonly class PaginateMeetingsAction { public function __construct(private MeetingRepository $repository) {} diff --git a/Heart/Meeting/Domain/Actions/PersistAttendMeeting.php b/app-modules/meeting/src/Actions/PersistAttendMeetingAction.php similarity index 66% rename from Heart/Meeting/Domain/Actions/PersistAttendMeeting.php rename to app-modules/meeting/src/Actions/PersistAttendMeetingAction.php index 9dcf854ce..93472bae3 100644 --- a/Heart/Meeting/Domain/Actions/PersistAttendMeeting.php +++ b/app-modules/meeting/src/Actions/PersistAttendMeetingAction.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Actions; +namespace He4rt\Meeting\Actions; -use Heart\Meeting\Domain\Repositories\MeetingRepository; +use He4rt\Meeting\Contracts\MeetingRepository; -final readonly class PersistAttendMeeting +final readonly class PersistAttendMeetingAction { public function __construct(private MeetingRepository $meetingRepository) {} diff --git a/Heart/Meeting/Application/StartMeeting.php b/app-modules/meeting/src/Actions/StartMeeting.php similarity index 68% rename from Heart/Meeting/Application/StartMeeting.php rename to app-modules/meeting/src/Actions/StartMeeting.php index a1aca6a50..d9c2331ad 100644 --- a/Heart/Meeting/Application/StartMeeting.php +++ b/app-modules/meeting/src/Actions/StartMeeting.php @@ -2,22 +2,20 @@ declare(strict_types=1); -namespace Heart\Meeting\Application; - -use Heart\Meeting\Domain\Actions\CreateMeeting; -use Heart\Meeting\Domain\Actions\FindMeetingType; -use Heart\Meeting\Domain\DTO\NewMeetingDTO; -use Heart\Meeting\Domain\Entities\MeetingEntity; -use Heart\Provider\Application\FindProvider; -use Heart\Shared\Application\TTL; +namespace He4rt\Meeting\Actions; + +use He4rt\Meeting\DTO\NewMeetingDTO; +use He4rt\Meeting\Entities\MeetingEntity; +use He4rt\Provider\Actions\FindProvider; +use He4rt\Shared\TTL; use Illuminate\Support\Facades\Cache; final readonly class StartMeeting { public function __construct( - private CreateMeeting $createMeetingAction, + private CreateMeetingAction $createMeetingAction, private FindProvider $findProvider, - private FindMeetingType $findMeetingType, + private FindMeetingTypeAction $findMeetingType, ) {} public function handle(string $provider, string $providerId, int $meetingTypeId): MeetingEntity diff --git a/Heart/Meeting/Domain/Repositories/MeetingRepository.php b/app-modules/meeting/src/Contracts/MeetingRepository.php similarity index 68% rename from Heart/Meeting/Domain/Repositories/MeetingRepository.php rename to app-modules/meeting/src/Contracts/MeetingRepository.php index 8c25e4691..69c634dd2 100644 --- a/Heart/Meeting/Domain/Repositories/MeetingRepository.php +++ b/app-modules/meeting/src/Contracts/MeetingRepository.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Repositories; +namespace He4rt\Meeting\Contracts; -use Heart\Meeting\Domain\DTO\NewMeetingDTO; -use Heart\Meeting\Domain\Entities\MeetingEntity; -use Heart\Shared\Domain\Paginator; +use He4rt\Meeting\DTO\NewMeetingDTO; +use He4rt\Meeting\Entities\MeetingEntity; +use He4rt\Shared\Contract\Paginator; interface MeetingRepository { diff --git a/Heart/Meeting/Domain/Repositories/MeetingTypeRepository.php b/app-modules/meeting/src/Contracts/MeetingTypeRepository.php similarity index 58% rename from Heart/Meeting/Domain/Repositories/MeetingTypeRepository.php rename to app-modules/meeting/src/Contracts/MeetingTypeRepository.php index 24e330223..b1c583905 100644 --- a/Heart/Meeting/Domain/Repositories/MeetingTypeRepository.php +++ b/app-modules/meeting/src/Contracts/MeetingTypeRepository.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Repositories; +namespace He4rt\Meeting\Contracts; -use Heart\Meeting\Domain\Entities\MeetingTypeEntity; +use He4rt\Meeting\Entities\MeetingTypeEntity; interface MeetingTypeRepository { diff --git a/Heart/Meeting/Domain/DTO/NewMeetingDTO.php b/app-modules/meeting/src/DTO/NewMeetingDTO.php similarity index 85% rename from Heart/Meeting/Domain/DTO/NewMeetingDTO.php rename to app-modules/meeting/src/DTO/NewMeetingDTO.php index 4f2109b98..2501e6770 100644 --- a/Heart/Meeting/Domain/DTO/NewMeetingDTO.php +++ b/app-modules/meeting/src/DTO/NewMeetingDTO.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\DTO; +namespace He4rt\Meeting\DTO; -use Heart\Provider\Domain\Enums\ProviderEnum; +use He4rt\Provider\Enums\ProviderEnum; final readonly class NewMeetingDTO { diff --git a/Heart/Meeting/Domain/Entities/MeetingEntity.php b/app-modules/meeting/src/Entities/MeetingEntity.php similarity index 58% rename from Heart/Meeting/Domain/Entities/MeetingEntity.php rename to app-modules/meeting/src/Entities/MeetingEntity.php index 685630db5..e50ba9ef7 100644 --- a/Heart/Meeting/Domain/Entities/MeetingEntity.php +++ b/app-modules/meeting/src/Entities/MeetingEntity.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Entities; +namespace He4rt\Meeting\Entities; use DateTimeImmutable; +use DateTimeInterface; final class MeetingEntity { @@ -21,19 +22,19 @@ public function __construct( public static function make(array $payload): self { - $endsAt = empty($payload['ends_at']) - ? null - : new DateTimeImmutable($payload['ends_at']); + $toImmutable = fn ($value) => $value instanceof DateTimeInterface + ? DateTimeImmutable::createFromMutable($value) + : new DateTimeImmutable($value); return new self( id: $payload['id'], content: $payload['content'] ?? null, meetingTypeId: $payload['meeting_type_id'], adminId: $payload['admin_id'], - startsAt: new DateTimeImmutable($payload['starts_at']), - endsAt: $endsAt, - createdAt: new DateTimeImmutable($payload['created_at']), - updatedAt: new DateTimeImmutable($payload['updated_at']) + startsAt: $toImmutable($payload['starts_at']), + endsAt: isset($payload['ends_at']) ? $toImmutable($payload['ends_at']) : null, + createdAt: $toImmutable($payload['created_at']), + updatedAt: $toImmutable($payload['updated_at']) ); } } diff --git a/Heart/Meeting/Domain/Entities/MeetingTypeEntity.php b/app-modules/meeting/src/Entities/MeetingTypeEntity.php similarity index 74% rename from Heart/Meeting/Domain/Entities/MeetingTypeEntity.php rename to app-modules/meeting/src/Entities/MeetingTypeEntity.php index 89b74c291..c6ae1eb9e 100644 --- a/Heart/Meeting/Domain/Entities/MeetingTypeEntity.php +++ b/app-modules/meeting/src/Entities/MeetingTypeEntity.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Entities; +namespace He4rt\Meeting\Entities; use DateTimeImmutable; +use DateTimeInterface; final readonly class MeetingTypeEntity { @@ -17,11 +18,15 @@ public function __construct( public static function make(array $payload): self { + $toImmutable = fn ($value) => $value instanceof DateTimeInterface + ? DateTimeImmutable::createFromMutable($value) + : new DateTimeImmutable($value); + return new self( id: $payload['id'], name: $payload['name'], weekDay: $payload['week_day'], - startAt: new DateTimeImmutable($payload['start_at']), + startAt: $toImmutable($payload['start_at']), ); } diff --git a/Heart/Meeting/Domain/Exceptions/MeetingException.php b/app-modules/meeting/src/Exceptions/MeetingException.php similarity index 91% rename from Heart/Meeting/Domain/Exceptions/MeetingException.php rename to app-modules/meeting/src/Exceptions/MeetingException.php index 15f30356d..ba506b2ff 100644 --- a/Heart/Meeting/Domain/Exceptions/MeetingException.php +++ b/app-modules/meeting/src/Exceptions/MeetingException.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Meeting\Domain\Exceptions; +namespace He4rt\Meeting\Exceptions; use Exception; use Symfony\Component\HttpFoundation\Response; diff --git a/Heart/Meeting/Presentation/Controllers/MeetingController.php b/app-modules/meeting/src/Http/Controllers/MeetingController.php similarity index 79% rename from Heart/Meeting/Presentation/Controllers/MeetingController.php rename to app-modules/meeting/src/Http/Controllers/MeetingController.php index 082d1c500..4af857ad4 100644 --- a/Heart/Meeting/Presentation/Controllers/MeetingController.php +++ b/app-modules/meeting/src/Http/Controllers/MeetingController.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Heart\Meeting\Presentation\Controllers; +namespace He4rt\Meeting\Http\Controllers; use App\Http\Controllers\Controller; -use Heart\Meeting\Application\EndMeeting; -use Heart\Meeting\Application\PaginateMeetings; -use Heart\Meeting\Application\StartMeeting; -use Heart\Meeting\Domain\Exceptions\MeetingException; -use Heart\Meeting\Presentation\Requests\MeetingRequest; +use He4rt\Meeting\Actions\EndMeeting; +use He4rt\Meeting\Actions\PaginateMeetings; +use He4rt\Meeting\Actions\StartMeeting; +use He4rt\Meeting\Exceptions\MeetingException; +use He4rt\Meeting\Http\Requests\MeetingRequest; use Illuminate\Http\JsonResponse; use Symfony\Component\HttpFoundation\Response; diff --git a/Heart/Meeting/Presentation/Requests/MeetingRequest.php b/app-modules/meeting/src/Http/Requests/MeetingRequest.php similarity index 92% rename from Heart/Meeting/Presentation/Requests/MeetingRequest.php rename to app-modules/meeting/src/Http/Requests/MeetingRequest.php index 370ccc2c5..7114d63b6 100644 --- a/Heart/Meeting/Presentation/Requests/MeetingRequest.php +++ b/app-modules/meeting/src/Http/Requests/MeetingRequest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Meeting\Presentation\Requests; +namespace He4rt\Meeting\Http\Requests; use Illuminate\Foundation\Http\FormRequest; diff --git a/Heart/Meeting/Infrastructure/Models/Meeting.php b/app-modules/meeting/src/Models/Meeting.php similarity index 89% rename from Heart/Meeting/Infrastructure/Models/Meeting.php rename to app-modules/meeting/src/Models/Meeting.php index 43dca8185..227be4486 100644 --- a/Heart/Meeting/Infrastructure/Models/Meeting.php +++ b/app-modules/meeting/src/Models/Meeting.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Meeting\Infrastructure\Models; +namespace He4rt\Meeting\Models; -use Heart\Meeting\Infrastructure\Factories\MeetingFactory; -use Heart\User\Infrastructure\Models\User; +use He4rt\Meeting\Database\Factories\MeetingFactory; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/Meeting/Infrastructure/Models/MeetingType.php b/app-modules/meeting/src/Models/MeetingType.php similarity index 86% rename from Heart/Meeting/Infrastructure/Models/MeetingType.php rename to app-modules/meeting/src/Models/MeetingType.php index c415d388f..4637bb711 100644 --- a/Heart/Meeting/Infrastructure/Models/MeetingType.php +++ b/app-modules/meeting/src/Models/MeetingType.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Meeting\Infrastructure\Models; +namespace He4rt\Meeting\Models; use Carbon\Carbon; -use Heart\Meeting\Infrastructure\Factories\MeetingTypeFactory; +use He4rt\Meeting\Database\Factories\MeetingTypeFactory; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -41,8 +41,9 @@ protected function startAt(): Attribute private function generateStartAt(string $value): string { + $value = (int) $value; $hours = (string) intdiv($value, 60); - $minutes = $value % 60; + $minutes = (string) ($value % 60); $hours = mb_str_pad($hours, 2, '0', STR_PAD_LEFT); $minutes = mb_str_pad($minutes, 2, '0', STR_PAD_LEFT); diff --git a/app-modules/meeting/src/Providers/MeetingServiceProvider.php b/app-modules/meeting/src/Providers/MeetingServiceProvider.php new file mode 100644 index 000000000..26f63b606 --- /dev/null +++ b/app-modules/meeting/src/Providers/MeetingServiceProvider.php @@ -0,0 +1,22 @@ +app->bind(MeetingRepository::class, MeetingEloquentRepository::class); + $this->app->bind(MeetingTypeRepository::class, MeetingTypeEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Meeting/Infrastructure/Repositories/MeetingEloquentRepository.php b/app-modules/meeting/src/Repositories/MeetingEloquentRepository.php similarity index 79% rename from Heart/Meeting/Infrastructure/Repositories/MeetingEloquentRepository.php rename to app-modules/meeting/src/Repositories/MeetingEloquentRepository.php index 98804bad7..7b0558748 100644 --- a/Heart/Meeting/Infrastructure/Repositories/MeetingEloquentRepository.php +++ b/app-modules/meeting/src/Repositories/MeetingEloquentRepository.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Heart\Meeting\Infrastructure\Repositories; - -use Heart\Meeting\Domain\DTO\NewMeetingDTO; -use Heart\Meeting\Domain\Entities\MeetingEntity; -use Heart\Meeting\Domain\Repositories\MeetingRepository; -use Heart\Meeting\Infrastructure\Models\Meeting; -use Heart\Shared\Domain\Paginator; -use Heart\Shared\Infrastructure\Paginator as PaginatorConcrete; +namespace He4rt\Meeting\Repositories; + +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\DTO\NewMeetingDTO; +use He4rt\Meeting\Entities\MeetingEntity; +use He4rt\Meeting\Models\Meeting; +use He4rt\Shared\Contract\Paginator; +use He4rt\Shared\Paginator as PaginatorConcrete; final readonly class MeetingEloquentRepository implements MeetingRepository { diff --git a/Heart/Meeting/Infrastructure/Repositories/MeetingTypeEloquentRepository.php b/app-modules/meeting/src/Repositories/MeetingTypeEloquentRepository.php similarity index 68% rename from Heart/Meeting/Infrastructure/Repositories/MeetingTypeEloquentRepository.php rename to app-modules/meeting/src/Repositories/MeetingTypeEloquentRepository.php index e9bd914e5..a53e4aedf 100644 --- a/Heart/Meeting/Infrastructure/Repositories/MeetingTypeEloquentRepository.php +++ b/app-modules/meeting/src/Repositories/MeetingTypeEloquentRepository.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Meeting\Infrastructure\Repositories; +namespace He4rt\Meeting\Repositories; -use Heart\Meeting\Domain\Entities\MeetingTypeEntity; -use Heart\Meeting\Domain\Repositories\MeetingTypeRepository; -use Heart\Meeting\Infrastructure\Models\MeetingType; +use He4rt\Meeting\Contracts\MeetingTypeRepository; +use He4rt\Meeting\Entities\MeetingTypeEntity; +use He4rt\Meeting\Models\MeetingType; final readonly class MeetingTypeEloquentRepository implements MeetingTypeRepository { diff --git a/tests/Feature/Meeting/EndMeetingTest.php b/app-modules/meeting/tests/Feature/EndMeetingTest.php similarity index 77% rename from tests/Feature/Meeting/EndMeetingTest.php rename to app-modules/meeting/tests/Feature/EndMeetingTest.php index 98e6e97a0..6f53dd658 100644 --- a/tests/Feature/Meeting/EndMeetingTest.php +++ b/app-modules/meeting/tests/Feature/EndMeetingTest.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Meeting\Infrastructure\Models\Meeting; +use He4rt\Meeting\Models\Meeting; use Illuminate\Support\Facades\Cache; -uses(DatabaseTransactions::class); - test('end meeting', function (): void { $meeting = Meeting::factory()->create(); Cache::tags(['meetings'])->set('current-meeting', $meeting->id); diff --git a/tests/Feature/Meeting/IndexMeetingTest.php b/app-modules/meeting/tests/Feature/IndexMeetingTest.php similarity index 87% rename from tests/Feature/Meeting/IndexMeetingTest.php rename to app-modules/meeting/tests/Feature/IndexMeetingTest.php index 04996f806..d1caed7ca 100644 --- a/tests/Feature/Meeting/IndexMeetingTest.php +++ b/app-modules/meeting/tests/Feature/IndexMeetingTest.php @@ -2,10 +2,7 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Meeting\Infrastructure\Models\Meeting; - -uses(DatabaseTransactions::class); +use He4rt\Meeting\Models\Meeting; test('bot can list all meetings', function (): void { // Arrange diff --git a/tests/Feature/Meeting/StartMeetingTest.php b/app-modules/meeting/tests/Feature/StartMeetingTest.php similarity index 89% rename from tests/Feature/Meeting/StartMeetingTest.php rename to app-modules/meeting/tests/Feature/StartMeetingTest.php index a93948a61..168f74cb0 100644 --- a/tests/Feature/Meeting/StartMeetingTest.php +++ b/app-modules/meeting/tests/Feature/StartMeetingTest.php @@ -2,14 +2,11 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Meeting\Infrastructure\Models\MeetingType; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Meeting\Models\MeetingType; +use He4rt\Provider\Models\Provider; use Illuminate\Support\Facades\Cache; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('bot can start new meeting', function (): void { // Arrange $providerName = 'discord'; @@ -40,6 +37,7 @@ $this->assertDatabaseHas('meetings', $expectedResponse); expect(Cache::tags(['meetings'])->has('current-meeting'))->toBeTrue(); }); + test('meeting type not found', function (): void { // Arrange $providerName = 'discord'; diff --git a/tests/Unit/Meeting/Domain/Actions/CreateMeetingTest.php b/app-modules/meeting/tests/Unit/Action/CreateMeetingTest.php similarity index 73% rename from tests/Unit/Meeting/Domain/Actions/CreateMeetingTest.php rename to app-modules/meeting/tests/Unit/Action/CreateMeetingTest.php index 2c2b23bb1..b342d3092 100644 --- a/tests/Unit/Meeting/Domain/Actions/CreateMeetingTest.php +++ b/app-modules/meeting/tests/Unit/Action/CreateMeetingTest.php @@ -2,10 +2,11 @@ declare(strict_types=1); -use Tests\Unit\Meeting\MeetingProviderTrait; -use Heart\Meeting\Domain\Actions\CreateMeeting; -use Heart\Meeting\Domain\DTO\NewMeetingDTO; -use Heart\Meeting\Domain\Repositories\MeetingRepository; +use He4rt\Meeting\Actions\CreateMeetingAction; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\DTO\NewMeetingDTO; +use He4rt\Meeting\Tests\Unit\MeetingProviderTrait; +use Mockery as m; uses(MeetingProviderTrait::class); @@ -28,7 +29,7 @@ ->once() ->andReturn($this->meetingEntity); - $test = new CreateMeeting($this->meetingTypeRepositoryStub); + $test = new CreateMeetingAction($this->meetingTypeRepositoryStub); $test->handle($this->payloadDTO, $this->meetingEntity->adminId); }); diff --git a/tests/Unit/Meeting/Domain/Actions/FindMeetingTypeTest.php b/app-modules/meeting/tests/Unit/Action/FindMeetingTypeTest.php similarity index 68% rename from tests/Unit/Meeting/Domain/Actions/FindMeetingTypeTest.php rename to app-modules/meeting/tests/Unit/Action/FindMeetingTypeTest.php index 887e4c731..74c2d34df 100644 --- a/tests/Unit/Meeting/Domain/Actions/FindMeetingTypeTest.php +++ b/app-modules/meeting/tests/Unit/Action/FindMeetingTypeTest.php @@ -2,10 +2,11 @@ declare(strict_types=1); -use Tests\Unit\Meeting\MeetingTypeProviderTrait; -use Heart\Meeting\Domain\Actions\FindMeetingType; -use Heart\Meeting\Domain\Exceptions\MeetingException; -use Heart\Meeting\Domain\Repositories\MeetingTypeRepository; +use He4rt\Meeting\Actions\FindMeetingTypeAction; +use He4rt\Meeting\Contracts\MeetingTypeRepository; +use He4rt\Meeting\Exceptions\MeetingException; +use He4rt\Meeting\Tests\Unit\MeetingTypeProviderTrait; +use Mockery as m; uses(MeetingTypeProviderTrait::class); @@ -25,7 +26,7 @@ ->once() ->andReturn(null); - $test = new FindMeetingType($this->meetingTypeRepositoryStub); + $test = new FindMeetingTypeAction($this->meetingTypeRepositoryStub); $test->handle(12); }); @@ -36,7 +37,7 @@ ->once() ->andReturn($this->meetingEntity); - $test = new FindMeetingType($this->meetingTypeRepositoryStub); + $test = new FindMeetingTypeAction($this->meetingTypeRepositoryStub); $test->handle(2); }); diff --git a/tests/Unit/Meeting/Domain/Actions/FinishMeetingTest.php b/app-modules/meeting/tests/Unit/Action/FinishMeetingTest.php similarity index 59% rename from tests/Unit/Meeting/Domain/Actions/FinishMeetingTest.php rename to app-modules/meeting/tests/Unit/Action/FinishMeetingTest.php index 63e16c8ec..5e080d49a 100644 --- a/tests/Unit/Meeting/Domain/Actions/FinishMeetingTest.php +++ b/app-modules/meeting/tests/Unit/Action/FinishMeetingTest.php @@ -2,19 +2,21 @@ declare(strict_types=1); -use Tests\Unit\Meeting\MeetingProviderTrait; -use Heart\Meeting\Domain\Actions\FinishMeeting; -use Heart\Meeting\Domain\Repositories\MeetingRepository; +use He4rt\Meeting\Actions\FinishMeetingAction; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\Tests\Unit\MeetingProviderTrait; uses(MeetingProviderTrait::class); beforeEach(function (): void { - $this->meetingRepositoryStub = m::mock(MeetingRepository::class); + $this->meetingRepositoryStub = Mockery::mock(MeetingRepository::class); $this->meetingEntity = $this->validMeetingEntity(); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('finish meeting', function (): void { $this->meetingRepositoryStub ->shouldReceive('endMeeting') @@ -22,7 +24,7 @@ ->once() ->andReturn($this->meetingEntity); - $test = new FinishMeeting($this->meetingRepositoryStub); + $test = new FinishMeetingAction($this->meetingRepositoryStub); $test->handle($this->meetingEntity->id); }); diff --git a/tests/Unit/Meeting/Domain/Actions/PaginateMeetingsTest.php b/app-modules/meeting/tests/Unit/Action/PaginateMeetingsTest.php similarity index 50% rename from tests/Unit/Meeting/Domain/Actions/PaginateMeetingsTest.php rename to app-modules/meeting/tests/Unit/Action/PaginateMeetingsTest.php index 9aa615dd9..d62114060 100644 --- a/tests/Unit/Meeting/Domain/Actions/PaginateMeetingsTest.php +++ b/app-modules/meeting/tests/Unit/Action/PaginateMeetingsTest.php @@ -2,21 +2,23 @@ declare(strict_types=1); -use Tests\Unit\Meeting\MeetingProviderTrait; -use Heart\Meeting\Domain\Actions\PaginateMeetings; -use Heart\Meeting\Domain\Repositories\MeetingRepository; -use Heart\Shared\Domain\Paginator; +use He4rt\Meeting\Actions\PaginateMeetingsAction; +use He4rt\Meeting\Contracts\MeetingRepository; +use He4rt\Meeting\Tests\Unit\MeetingProviderTrait; +use He4rt\Shared\Contract\Paginator; uses(MeetingProviderTrait::class); beforeEach(function (): void { - $this->meetingRepositoryStub = m::mock(MeetingRepository::class); + $this->meetingRepositoryStub = Mockery::mock(MeetingRepository::class); $this->meetingEntity = $this->validMeetingEntity(); - $this->paginatorStub = m::mock(Paginator::class); + $this->paginatorStub = Mockery::mock(Paginator::class); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('paginate meetings', function (): void { $this->meetingRepositoryStub ->shouldReceive('paginate') @@ -24,7 +26,7 @@ ->once() ->andReturn($this->paginatorStub); - $test = new PaginateMeetings($this->meetingRepositoryStub); + $test = new PaginateMeetingsAction($this->meetingRepositoryStub); $test->handle(); }); diff --git a/app-modules/meeting/tests/Unit/Action/PersistAttendMeetingTest.php b/app-modules/meeting/tests/Unit/Action/PersistAttendMeetingTest.php new file mode 100644 index 000000000..17d93b75a --- /dev/null +++ b/app-modules/meeting/tests/Unit/Action/PersistAttendMeetingTest.php @@ -0,0 +1,29 @@ +meetingTypeRepositoryStub = Mockery::mock(MeetingRepository::class); + $this->meetingEntity = $this->validMeetingEntity(); +}); + +afterEach(function (): void { + Mockery::close(); +}); + +test('persist attend meeting', function (): void { + $this->meetingTypeRepositoryStub + ->shouldReceive('attendMeeting') + ->with($this->meetingEntity->id, '12') + ->once(); + + $test = new PersistAttendMeetingAction($this->meetingTypeRepositoryStub); + + $test->handle($this->meetingEntity->id, '12'); +}); diff --git a/tests/Unit/Meeting/MeetingProviderTrait.php b/app-modules/meeting/tests/Unit/MeetingProviderTrait.php similarity index 77% rename from tests/Unit/Meeting/MeetingProviderTrait.php rename to app-modules/meeting/tests/Unit/MeetingProviderTrait.php index 106469330..fc31d506d 100644 --- a/tests/Unit/Meeting/MeetingProviderTrait.php +++ b/app-modules/meeting/tests/Unit/MeetingProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\Meeting; +namespace He4rt\Meeting\Tests\Unit; -use Heart\Meeting\Domain\Entities\MeetingEntity; +use He4rt\Meeting\Entities\MeetingEntity; use Illuminate\Support\Facades\Date; trait MeetingProviderTrait @@ -12,12 +12,12 @@ trait MeetingProviderTrait public function validMeetingPayload(array $fields = []): array { return [ - 'id' => 12, + 'id' => '12', 'content' => null, 'meeting_type_id' => 12, 'admin_id' => '12', 'starts_at' => $time = Date::now(), - 'ends_at' => $time->addMinutes(12), + 'ends_at' => $time->addMinutes(12)->toString(), 'created_at' => Date::now(), 'updated_at' => Date::now(), ]; diff --git a/tests/Unit/Meeting/MeetingTypeProviderTrait.php b/app-modules/meeting/tests/Unit/MeetingTypeProviderTrait.php similarity index 85% rename from tests/Unit/Meeting/MeetingTypeProviderTrait.php rename to app-modules/meeting/tests/Unit/MeetingTypeProviderTrait.php index 158549213..2ec3632c2 100644 --- a/tests/Unit/Meeting/MeetingTypeProviderTrait.php +++ b/app-modules/meeting/tests/Unit/MeetingTypeProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\Meeting; +namespace He4rt\Meeting\Tests\Unit; -use Heart\Meeting\Domain\Entities\MeetingTypeEntity; +use He4rt\Meeting\Entities\MeetingTypeEntity; use Illuminate\Support\Facades\Date; trait MeetingTypeProviderTrait diff --git a/app-modules/message/database/factories/MessageFactory.php b/app-modules/message/database/factories/MessageFactory.php index 59887c4dd..7363a0639 100644 --- a/app-modules/message/database/factories/MessageFactory.php +++ b/app-modules/message/database/factories/MessageFactory.php @@ -5,7 +5,7 @@ namespace He4rt\Message\Database\Factories; use He4rt\Message\Models\Message; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Provider\Models\Provider; use Illuminate\Database\Eloquent\Factories\Factory; final class MessageFactory extends Factory diff --git a/app-modules/message/database/migrations/2025_10_29_221021_set_up_message_module.php b/app-modules/message/database/migrations/2025_10_29_221021_set_up_message_module.php deleted file mode 100644 index 7570eae5f..000000000 --- a/app-modules/message/database/migrations/2025_10_29_221021_set_up_message_module.php +++ /dev/null @@ -1,23 +0,0 @@ -bigIncrements('id'); - // $table->timestamps(); - // $table->softDeletes(); - // }); - } - - public function down(): void - { - // Don't listen to the haters - // Schema::dropIfExists('message'); - } -}; diff --git a/app-modules/message/src/Actions/NewMessage.php b/app-modules/message/src/Actions/NewMessage.php index 74967348b..783226ffa 100644 --- a/app-modules/message/src/Actions/NewMessage.php +++ b/app-modules/message/src/Actions/NewMessage.php @@ -4,14 +4,14 @@ namespace He4rt\Message\Actions; -use He4rt\Message\DTOs\NewMessageDTO; -use Heart\Character\Application\FindCharacterIdByUserId; -use Heart\Character\Domain\Actions\IncrementExperience; -use Heart\Meeting\Application\AttendMeeting; -use Heart\Provider\Application\FindProvider; -use Heart\Provider\Application\NewAccountByProvider; -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Provider\Infrastructure\Exceptions\ProviderException; +use He4rt\Character\Actions\FindCharacterIdByUserId; +use He4rt\Character\Actions\IncrementExperience; +use He4rt\Meeting\Actions\AttendMeeting; +use He4rt\Message\DTO\NewMessageDTO; +use He4rt\Provider\Actions\FindProvider; +use He4rt\Provider\Actions\NewAccountByProvider; +use He4rt\Provider\Entities\ProviderEntity; +use He4rt\Provider\Exceptions\ProviderException; use Illuminate\Support\Facades\Cache; final readonly class NewMessage diff --git a/app-modules/message/src/Actions/NewVoiceMessage.php b/app-modules/message/src/Actions/NewVoiceMessage.php index 036e77bb7..d8790c999 100644 --- a/app-modules/message/src/Actions/NewVoiceMessage.php +++ b/app-modules/message/src/Actions/NewVoiceMessage.php @@ -4,11 +4,11 @@ namespace He4rt\Message\Actions; -use He4rt\Message\DTOs\NewVoiceMessageDTO; -use He4rt\Message\Repositories\VoiceRepository; -use Heart\Character\Application\FindCharacterIdByUserId; -use Heart\Character\Domain\Actions\IncrementExperience; -use Heart\Provider\Application\FindProvider; +use He4rt\Character\Actions\FindCharacterIdByUserId; +use He4rt\Character\Actions\IncrementExperience; +use He4rt\Message\Contracts\VoiceRepository; +use He4rt\Message\DTO\NewVoiceMessageDTO; +use He4rt\Provider\Actions\FindProvider; final readonly class NewVoiceMessage { diff --git a/app-modules/message/src/Actions/PersistMessage.php b/app-modules/message/src/Actions/PersistMessage.php index e576434ae..5753b58e1 100644 --- a/app-modules/message/src/Actions/PersistMessage.php +++ b/app-modules/message/src/Actions/PersistMessage.php @@ -4,9 +4,9 @@ namespace He4rt\Message\Actions; -use He4rt\Message\DTOs\NewMessageDTO; +use He4rt\Message\Contracts\MessageRepository; +use He4rt\Message\DTO\NewMessageDTO; use He4rt\Message\Entities\MessageEntity; -use He4rt\Message\Repositories\MessageRepository; class PersistMessage { diff --git a/app-modules/message/src/Repositories/MessageRepository.php b/app-modules/message/src/Contracts/MessageRepository.php similarity index 74% rename from app-modules/message/src/Repositories/MessageRepository.php rename to app-modules/message/src/Contracts/MessageRepository.php index 6c268625b..34b9413f0 100644 --- a/app-modules/message/src/Repositories/MessageRepository.php +++ b/app-modules/message/src/Contracts/MessageRepository.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace He4rt\Message\Repositories; +namespace He4rt\Message\Contracts; -use He4rt\Message\DTOs\NewMessageDTO; +use He4rt\Message\DTO\NewMessageDTO; use He4rt\Message\Entities\MessageEntity; interface MessageRepository diff --git a/app-modules/message/src/Repositories/VoiceRepository.php b/app-modules/message/src/Contracts/VoiceRepository.php similarity index 73% rename from app-modules/message/src/Repositories/VoiceRepository.php rename to app-modules/message/src/Contracts/VoiceRepository.php index 22eb47eb3..99e5c68c0 100644 --- a/app-modules/message/src/Repositories/VoiceRepository.php +++ b/app-modules/message/src/Contracts/VoiceRepository.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace He4rt\Message\Repositories; +namespace He4rt\Message\Contracts; -use He4rt\Message\DTOs\NewVoiceMessageDTO; +use He4rt\Message\DTO\NewVoiceMessageDTO; use He4rt\Message\Entities\VoiceEntity; interface VoiceRepository diff --git a/app-modules/message/src/DTOs/NewMessageDTO.php b/app-modules/message/src/DTO/NewMessageDTO.php similarity index 91% rename from app-modules/message/src/DTOs/NewMessageDTO.php rename to app-modules/message/src/DTO/NewMessageDTO.php index 18547f2b1..03bc65cb0 100644 --- a/app-modules/message/src/DTOs/NewMessageDTO.php +++ b/app-modules/message/src/DTO/NewMessageDTO.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace He4rt\Message\DTOs; +namespace He4rt\Message\DTO; use DateTimeImmutable; -use Heart\Provider\Domain\Enums\ProviderEnum; +use He4rt\Provider\Enums\ProviderEnum; final class NewMessageDTO { diff --git a/app-modules/message/src/DTOs/NewVoiceMessageDTO.php b/app-modules/message/src/DTO/NewVoiceMessageDTO.php similarity index 82% rename from app-modules/message/src/DTOs/NewVoiceMessageDTO.php rename to app-modules/message/src/DTO/NewVoiceMessageDTO.php index 3c1f36870..ad035d33f 100644 --- a/app-modules/message/src/DTOs/NewVoiceMessageDTO.php +++ b/app-modules/message/src/DTO/NewVoiceMessageDTO.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace He4rt\Message\DTOs; +namespace He4rt\Message\DTO; -use Heart\Character\Domain\Enums\VoiceStatesEnum; -use Heart\Provider\Domain\Enums\ProviderEnum; +use He4rt\Character\Enums\VoiceStatesEnum; +use He4rt\Provider\Enums\ProviderEnum; final readonly class NewVoiceMessageDTO { diff --git a/app-modules/message/src/Entities/VoiceEntity.php b/app-modules/message/src/Entities/VoiceEntity.php index 205fc6280..1c3a9e8e0 100644 --- a/app-modules/message/src/Entities/VoiceEntity.php +++ b/app-modules/message/src/Entities/VoiceEntity.php @@ -4,7 +4,7 @@ namespace He4rt\Message\Entities; -use Heart\Character\Domain\Enums\VoiceStatesEnum; +use He4rt\Character\Enums\VoiceStatesEnum; final class VoiceEntity { diff --git a/app-modules/message/src/Models/Voice.php b/app-modules/message/src/Models/Voice.php index 85935a62e..60bd9487e 100644 --- a/app-modules/message/src/Models/Voice.php +++ b/app-modules/message/src/Models/Voice.php @@ -4,7 +4,7 @@ namespace He4rt\Message\Models; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Provider\Model\Provider; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; diff --git a/app-modules/message/src/Providers/MessageServiceProvider.php b/app-modules/message/src/Providers/MessageServiceProvider.php index 1ef2a3656..810409ab7 100644 --- a/app-modules/message/src/Providers/MessageServiceProvider.php +++ b/app-modules/message/src/Providers/MessageServiceProvider.php @@ -4,24 +4,17 @@ namespace He4rt\Message\Providers; +use He4rt\Message\Contracts\MessageRepository; +use He4rt\Message\Contracts\VoiceRepository; use He4rt\Message\Repositories\MessageEloquentRepository; -use He4rt\Message\Repositories\MessageRepository; use He4rt\Message\Repositories\VoiceEloquentRepository; -use He4rt\Message\Repositories\VoiceRepository; use Illuminate\Support\ServiceProvider; final class MessageServiceProvider extends ServiceProvider { public function register(): void { - // Register repository bindings $this->app->bind(MessageRepository::class, MessageEloquentRepository::class); $this->app->bind(VoiceRepository::class, VoiceEloquentRepository::class); } - - public function boot(): void - { - // Load routes - $this->loadRoutesFrom(__DIR__.'/../../routes/message-routes.php'); - } } diff --git a/app-modules/message/src/Repositories/MessageEloquentRepository.php b/app-modules/message/src/Repositories/MessageEloquentRepository.php index 823b46c91..f63e82de9 100644 --- a/app-modules/message/src/Repositories/MessageEloquentRepository.php +++ b/app-modules/message/src/Repositories/MessageEloquentRepository.php @@ -4,7 +4,8 @@ namespace He4rt\Message\Repositories; -use He4rt\Message\DTOs\NewMessageDTO; +use He4rt\Message\Contracts\MessageRepository; +use He4rt\Message\DTO\NewMessageDTO; use He4rt\Message\Entities\MessageEntity; use He4rt\Message\Models\Message; use Illuminate\Database\Eloquent\Builder; diff --git a/app-modules/message/src/Repositories/VoiceEloquentRepository.php b/app-modules/message/src/Repositories/VoiceEloquentRepository.php index d6f9494f4..4b4a46250 100644 --- a/app-modules/message/src/Repositories/VoiceEloquentRepository.php +++ b/app-modules/message/src/Repositories/VoiceEloquentRepository.php @@ -4,7 +4,8 @@ namespace He4rt\Message\Repositories; -use He4rt\Message\DTOs\NewVoiceMessageDTO; +use He4rt\Message\Contracts\VoiceRepository; +use He4rt\Message\DTO\NewVoiceMessageDTO; use He4rt\Message\Entities\VoiceEntity; use He4rt\Message\Models\Voice; diff --git a/app-modules/message/tests/Feature/NewMessageTest.php b/app-modules/message/tests/Feature/NewMessageTest.php index 35eb1d72d..c589541b4 100644 --- a/app-modules/message/tests/Feature/NewMessageTest.php +++ b/app-modules/message/tests/Feature/NewMessageTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -use Heart\Character\Infrastructure\Models\Character; -use Heart\Meeting\Infrastructure\Models\Meeting; -use Heart\Provider\Infrastructure\Models\Provider; -use Heart\User\Infrastructure\Models\User; +use He4rt\Character\Models\Character; +use He4rt\Meeting\Models\Meeting; +use He4rt\Provider\Models\Provider; +use He4rt\User\Models\User; use Illuminate\Support\Facades\Cache; test('can create amessage', function (): void { diff --git a/app-modules/message/tests/Feature/NewVoiceMessageTest.php b/app-modules/message/tests/Feature/NewVoiceMessageTest.php index 78eb4335c..840edd7f7 100644 --- a/app-modules/message/tests/Feature/NewVoiceMessageTest.php +++ b/app-modules/message/tests/Feature/NewVoiceMessageTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -use Heart\Character\Domain\Enums\VoiceStatesEnum; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Provider\Infrastructure\Models\Provider; -use Heart\User\Infrastructure\Models\User; +use He4rt\Character\Enums\VoiceStatesEnum; +use He4rt\Character\Models\Character; +use He4rt\Provider\Models\Provider; +use He4rt\User\Models\User; test('can create voice message', function (): void { config(['he4rt.season.id' => 2]); diff --git a/app-modules/message/tests/Unit/Actions/NewMessageTest.php b/app-modules/message/tests/Unit/Actions/NewMessageTest.php index aa45cf1f8..8679b8244 100644 --- a/app-modules/message/tests/Unit/Actions/NewMessageTest.php +++ b/app-modules/message/tests/Unit/Actions/NewMessageTest.php @@ -2,15 +2,15 @@ declare(strict_types=1); +use He4rt\Character\Actions\FindCharacterIdByUserId; +use He4rt\Character\Actions\IncrementExperience; +use He4rt\Meeting\Actions\AttendMeeting; use He4rt\Message\Actions\NewMessage; use He4rt\Message\Actions\PersistMessage; -use He4rt\Message\DTOs\NewMessageDTO; -use Heart\Character\Application\FindCharacterIdByUserId; -use Heart\Character\Domain\Actions\IncrementExperience; -use Heart\Meeting\Application\AttendMeeting; -use Heart\Provider\Application\FindProvider; -use Heart\Provider\Application\NewAccountByProvider; -use Heart\Provider\Domain\Entities\ProviderEntity; +use He4rt\Message\DTO\NewMessageDTO; +use He4rt\Provider\Actions\FindProvider; +use He4rt\Provider\Actions\NewAccountByProvider; +use He4rt\Provider\Entities\ProviderEntity; use Illuminate\Support\Facades\Cache; test('new message', function (string $provider, array $payload): void { @@ -77,9 +77,9 @@ ); $action->persist($payload); -})->with('dataProvider'); +})->with('data provider'); -dataset('dataProvider', fn () => [ +dataset('data provider', fn () => [ 'twitch #1' => [ 'provider' => 'twitch', 'payload' => [ diff --git a/app-modules/message/tests/Unit/Actions/PersistMessageTest.php b/app-modules/message/tests/Unit/Actions/PersistMessageTest.php index f4ad604d9..1253a78d3 100644 --- a/app-modules/message/tests/Unit/Actions/PersistMessageTest.php +++ b/app-modules/message/tests/Unit/Actions/PersistMessageTest.php @@ -2,23 +2,25 @@ declare(strict_types=1); +use Carbon\CarbonImmutable; use He4rt\Message\Actions\PersistMessage; -use He4rt\Message\DTOs\NewMessageDTO; -use He4rt\Message\Entities\MessageEntity; -use He4rt\Message\Repositories\MessageRepository; -use Heart\Provider\Domain\Enums\ProviderEnum; -use Illuminate\Support\Facades\Date; +use He4rt\Message\Contracts\MessageRepository; +use He4rt\Message\DTO\NewMessageDTO; +use He4rt\Message\Tests\Unit\MessageProviderTrait; +use He4rt\Provider\Enums\ProviderEnum; + +uses(MessageProviderTrait::class); beforeEach(function (): void { $this->messageRepositoryStub = Mockery::mock(MessageRepository::class); - $this->messageEntity = validMessageEntity(); + $this->messageEntity = $this->validMessageEntity(); $this->messageDTO = new NewMessageDTO( ProviderEnum::Discord, $this->messageEntity->providerId, $this->messageEntity->providerMessageId, $this->messageEntity->channelId, $this->messageEntity->content, - Date::parse('2023-01-24')->toDateTimeImmutable() // sentAt in string + sentAt: CarbonImmutable::parse('2023-01-24'), ); }); @@ -37,23 +39,3 @@ $test->handle($this->messageDTO, $this->messageEntity->obtainedExperience, 'canhassi'); }); - -function validMessagePayload(array $fields = []): array -{ - return [ - 'id' => 'canhassi-id', - 'provider_id' => 'é-o-canhas-id', - 'provider_message_id' => 'he4rtDevelopers', - 'season_id' => 12, - 'channel_id' => 'canal-foda', - 'content' => 'conteudo-foda', - 'sent_at' => new DateTimeImmutable(Date::now()->toString()), - 'obtained_experience' => 12, - ...$fields, - ]; -} - -function validMessageEntity(): MessageEntity -{ - return MessageEntity::make(validMessagePayload()); -} diff --git a/tests/Unit/Message/MessageProviderTrait.php b/app-modules/message/tests/Unit/MessageProviderTrait.php similarity index 76% rename from tests/Unit/Message/MessageProviderTrait.php rename to app-modules/message/tests/Unit/MessageProviderTrait.php index 68bf64e8a..0c24c61c0 100644 --- a/tests/Unit/Message/MessageProviderTrait.php +++ b/app-modules/message/tests/Unit/MessageProviderTrait.php @@ -2,14 +2,18 @@ declare(strict_types=1); -namespace Tests\Unit\Message; +namespace He4rt\Message\Tests\Unit; +use DateMalformedStringException; use DateTimeImmutable; -use Heart\Message\Domain\Entities\MessageEntity; +use He4rt\Message\Entities\MessageEntity; use Illuminate\Support\Facades\Date; trait MessageProviderTrait { + /** + * @throws DateMalformedStringException + */ public function validMessagePayload(array $fields = []): array { return [ @@ -25,6 +29,9 @@ public function validMessagePayload(array $fields = []): array ]; } + /** + * @throws DateMalformedStringException + */ public function validMessageEntity(): MessageEntity { return MessageEntity::make($this->validMessagePayload()); diff --git a/app-modules/provider/composer.json b/app-modules/provider/composer.json new file mode 100644 index 000000000..af7d8c318 --- /dev/null +++ b/app-modules/provider/composer.json @@ -0,0 +1,23 @@ +{ + "name": "he4rt/provider", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Provider\\": "src/", + "He4rt\\Provider\\Tests\\": "tests/", + "He4rt\\Provider\\Database\\Factories\\": "database/factories/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Provider\\Providers\\ProviderServiceProvider" + ] + } + } +} diff --git a/app-modules/provider/database/factories/ProviderFactory.php b/app-modules/provider/database/factories/ProviderFactory.php new file mode 100644 index 000000000..60c06c56d --- /dev/null +++ b/app-modules/provider/database/factories/ProviderFactory.php @@ -0,0 +1,25 @@ + fake()->uuid(), + 'user_id' => User::factory(), + 'provider' => fake()->randomElement(['twitch', 'discord']), + 'provider_id' => fake()->numerify('######'), + 'email' => fake()->unique()->email(), + ]; + } +} diff --git a/app-modules/provider/database/factories/TokenFactory.php b/app-modules/provider/database/factories/TokenFactory.php new file mode 100644 index 000000000..4aa962580 --- /dev/null +++ b/app-modules/provider/database/factories/TokenFactory.php @@ -0,0 +1,25 @@ + fake()->uuid(), + 'provider_id' => Provider::factory(), + 'access_token' => fake()->uuid(), + 'refresh_token' => fake()->uuid(), + 'expires_in' => fake()->randomNumber(4), + ]; + } +} diff --git a/app-modules/provider/routes/provider-routes.php b/app-modules/provider/routes/provider-routes.php new file mode 100644 index 000000000..2ef86dd4f --- /dev/null +++ b/app-modules/provider/routes/provider-routes.php @@ -0,0 +1,12 @@ +middleware(['api', BotAuthentication::class])->group(function (): void { + Route::post('/providers/{provider}', [ProvidersController::class, 'postProvider']) + ->name('providers.store'); +}); diff --git a/Heart/Provider/Application/FindProvider.php b/app-modules/provider/src/Actions/FindProvider.php similarity index 79% rename from Heart/Provider/Application/FindProvider.php rename to app-modules/provider/src/Actions/FindProvider.php index 29610874b..69ee25b60 100644 --- a/Heart/Provider/Application/FindProvider.php +++ b/app-modules/provider/src/Actions/FindProvider.php @@ -2,11 +2,10 @@ declare(strict_types=1); -namespace Heart\Provider\Application; +namespace He4rt\Provider\Actions; -use Heart\Provider\Domain\Actions\GetProviderById; -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Shared\Application\TTL; +use He4rt\Provider\Entities\ProviderEntity; +use He4rt\Shared\TTL; use Illuminate\Support\Facades\Cache; class FindProvider diff --git a/Heart/Provider/Domain/Actions/GetProviderById.php b/app-modules/provider/src/Actions/GetProviderById.php similarity index 68% rename from Heart/Provider/Domain/Actions/GetProviderById.php rename to app-modules/provider/src/Actions/GetProviderById.php index 547610ee4..21c33ed19 100644 --- a/Heart/Provider/Domain/Actions/GetProviderById.php +++ b/app-modules/provider/src/Actions/GetProviderById.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Provider\Domain\Actions; +namespace He4rt\Provider\Actions; -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Provider\Domain\Repositories\ProviderRepository; +use He4rt\Provider\Contracts\ProviderRepository; +use He4rt\Provider\Entities\ProviderEntity; final readonly class GetProviderById { diff --git a/Heart/Provider/Application/NewAccountByProvider.php b/app-modules/provider/src/Actions/NewAccountByProvider.php similarity index 73% rename from Heart/Provider/Application/NewAccountByProvider.php rename to app-modules/provider/src/Actions/NewAccountByProvider.php index 41a180c58..2a0bfe649 100644 --- a/Heart/Provider/Application/NewAccountByProvider.php +++ b/app-modules/provider/src/Actions/NewAccountByProvider.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Provider\Application; +namespace He4rt\Provider\Actions; -use Heart\Provider\Domain\DTOs\NewProviderDTO; -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Provider\Domain\Enums\ProviderEnum; -use Heart\Provider\Domain\Repositories\ProviderRepository; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\Provider\Contracts\ProviderRepository; +use He4rt\Provider\DTO\NewProviderDTO; +use He4rt\Provider\Entities\ProviderEntity; +use He4rt\Provider\Enums\ProviderEnum; +use He4rt\User\Contracts\UserRepository; class NewAccountByProvider { diff --git a/Heart/Provider/Domain/Repositories/ProviderRepository.php b/app-modules/provider/src/Contracts/ProviderRepository.php similarity index 74% rename from Heart/Provider/Domain/Repositories/ProviderRepository.php rename to app-modules/provider/src/Contracts/ProviderRepository.php index 4c0e3070d..a04f20bd2 100644 --- a/Heart/Provider/Domain/Repositories/ProviderRepository.php +++ b/app-modules/provider/src/Contracts/ProviderRepository.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Provider\Domain\Repositories; +namespace He4rt\Provider\Contracts; -use Heart\Provider\Domain\DTOs\NewProviderDTO; -use Heart\Provider\Domain\Entities\ProviderEntity; +use He4rt\Provider\DTO\NewProviderDTO; +use He4rt\Provider\Entities\ProviderEntity; interface ProviderRepository { diff --git a/app-modules/provider/src/Contracts/TokenRepository.php b/app-modules/provider/src/Contracts/TokenRepository.php new file mode 100644 index 000000000..f618baf93 --- /dev/null +++ b/app-modules/provider/src/Contracts/TokenRepository.php @@ -0,0 +1,13 @@ +app->bind(ProviderRepository::class, ProviderEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Provider/Infrastructure/Repositories/ProviderEloquentRepository.php b/app-modules/provider/src/Repositories/ProviderEloquentRepository.php similarity index 80% rename from Heart/Provider/Infrastructure/Repositories/ProviderEloquentRepository.php rename to app-modules/provider/src/Repositories/ProviderEloquentRepository.php index e7ba8862e..1fd60bf0d 100644 --- a/Heart/Provider/Infrastructure/Repositories/ProviderEloquentRepository.php +++ b/app-modules/provider/src/Repositories/ProviderEloquentRepository.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Heart\Provider\Infrastructure\Repositories; +namespace He4rt\Provider\Repositories; -use Heart\Provider\Domain\DTOs\NewProviderDTO; -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Provider\Domain\Repositories\ProviderRepository; -use Heart\Provider\Infrastructure\Exceptions\ProviderException; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Provider\Contracts\ProviderRepository; +use He4rt\Provider\DTO\NewProviderDTO; +use He4rt\Provider\Entities\ProviderEntity; +use He4rt\Provider\Exceptions\ProviderException; +use He4rt\Provider\Models\Provider; final class ProviderEloquentRepository implements ProviderRepository { diff --git a/Heart/Provider/Infrastructure/Repositories/TokenEloquentRepository.php b/app-modules/provider/src/Repositories/TokenEloquentRepository.php similarity index 60% rename from Heart/Provider/Infrastructure/Repositories/TokenEloquentRepository.php rename to app-modules/provider/src/Repositories/TokenEloquentRepository.php index 1efa0c0f9..80ff74521 100644 --- a/Heart/Provider/Infrastructure/Repositories/TokenEloquentRepository.php +++ b/app-modules/provider/src/Repositories/TokenEloquentRepository.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\Provider\Infrastructure\Repositories; +namespace He4rt\Provider\Repositories; -use Heart\Authentication\OAuth\Domain\DTO\OAuthAccessDTO; -use Heart\Provider\Domain\Repositories\TokenRepository; -use Heart\Provider\Infrastructure\Models\Token; +use He4rt\Authentication\DTO\OAuthAccessDTO; +use He4rt\Provider\Contracts\TokenRepository; +use He4rt\Provider\Models\Token; final class TokenEloquentRepository implements TokenRepository { diff --git a/Heart/Provider/Domain/ValueObjects/ProviderData.php b/app-modules/provider/src/ValueObjects/ProviderData.php similarity index 88% rename from Heart/Provider/Domain/ValueObjects/ProviderData.php rename to app-modules/provider/src/ValueObjects/ProviderData.php index e36f8bee1..ab9a1ddf8 100644 --- a/Heart/Provider/Domain/ValueObjects/ProviderData.php +++ b/app-modules/provider/src/ValueObjects/ProviderData.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Provider\Domain\ValueObjects; +namespace He4rt\Provider\ValueObjects; final readonly class ProviderData { diff --git a/tests/Feature/Providers/NewAccountByProviderTest.php b/app-modules/provider/tests/Feature/NewAccountByProviderTest.php similarity index 90% rename from tests/Feature/Providers/NewAccountByProviderTest.php rename to app-modules/provider/tests/Feature/NewAccountByProviderTest.php index 279cc7b70..e033c5a08 100644 --- a/tests/Feature/Providers/NewAccountByProviderTest.php +++ b/app-modules/provider/tests/Feature/NewAccountByProviderTest.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Provider\Infrastructure\Models\Provider; +use He4rt\Provider\Models\Provider; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('can create account by provider', function (): void { $provider = 'discord'; $payload = [ @@ -34,6 +31,7 @@ 'user_id' => $response['userId'], ]); }); + test('should not create account with a registered provider', function (): void { $provider = Provider::factory()->create(); diff --git a/app-modules/provider/tests/Unit/FindProviderTest.php b/app-modules/provider/tests/Unit/FindProviderTest.php new file mode 100644 index 000000000..cafa4b476 --- /dev/null +++ b/app-modules/provider/tests/Unit/FindProviderTest.php @@ -0,0 +1,28 @@ +once() + ->with($cacheKey, TTL::fromDays(2), Mockery::type('closure')) + ->andReturn($providerEntity); + + $action = new FindProvider($getProvider); + $result = $action->handle('twitch', '123'); + + expect($result)->toBeInstanceOf(ProviderEntity::class); +}); diff --git a/tests/Unit/Providers/Domain/Actions/GetProviderByIdTest.php b/app-modules/provider/tests/Unit/GetProviderByIdTest.php similarity index 67% rename from tests/Unit/Providers/Domain/Actions/GetProviderByIdTest.php rename to app-modules/provider/tests/Unit/GetProviderByIdTest.php index 8c48f54f7..697f4afb8 100644 --- a/tests/Unit/Providers/Domain/Actions/GetProviderByIdTest.php +++ b/app-modules/provider/tests/Unit/GetProviderByIdTest.php @@ -1,9 +1,11 @@ shouldReceive('findByProvider') ->once() ->with('twitch', '12345678') - ->andReturn(new ProviderEntity(1, 1, 1, 1, 'email@foda.com')); + ->andReturn(new ProviderEntity('1', '1', '1', '1', 'email@foda.com')); $action = new GetProviderById($providerRepositoryStub); diff --git a/app-modules/ranking/composer.json b/app-modules/ranking/composer.json new file mode 100644 index 000000000..f5ee9ef11 --- /dev/null +++ b/app-modules/ranking/composer.json @@ -0,0 +1,22 @@ +{ + "name": "he4rt/ranking", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Ranking\\": "src/", + "He4rt\\Ranking\\Tests\\": "tests/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Ranking\\Providers\\RankingServiceProvider" + ] + } + } +} diff --git a/app-modules/ranking/routes/ranking-routes.php b/app-modules/ranking/routes/ranking-routes.php new file mode 100644 index 000000000..673dac746 --- /dev/null +++ b/app-modules/ranking/routes/ranking-routes.php @@ -0,0 +1,12 @@ +prefix('api') + ->group(function (): void { + Route::get('/ranking/leveling', [RankingByLevel::class, 'handle'])->name('ranking.leveling'); + }); diff --git a/Heart/Ranking/Domain/Actions/RankingByLevel.php b/app-modules/ranking/src/Actions/RankingByLevel.php similarity index 68% rename from Heart/Ranking/Domain/Actions/RankingByLevel.php rename to app-modules/ranking/src/Actions/RankingByLevel.php index 0e5824a34..43d62d409 100644 --- a/Heart/Ranking/Domain/Actions/RankingByLevel.php +++ b/app-modules/ranking/src/Actions/RankingByLevel.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\Ranking\Domain\Actions; +namespace He4rt\Ranking\Actions; -use Heart\Ranking\Domain\Repositories\RankingRepository; -use Heart\Shared\Domain\Paginator; +use He4rt\Ranking\Contracts\RankingRepository; +use He4rt\Shared\Contract\Paginator; final readonly class RankingByLevel { diff --git a/Heart/Ranking/Domain/Repositories/RankingRepository.php b/app-modules/ranking/src/Contracts/RankingRepository.php similarity index 59% rename from Heart/Ranking/Domain/Repositories/RankingRepository.php rename to app-modules/ranking/src/Contracts/RankingRepository.php index 03ce150f5..cd690be92 100644 --- a/Heart/Ranking/Domain/Repositories/RankingRepository.php +++ b/app-modules/ranking/src/Contracts/RankingRepository.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Ranking\Domain\Repositories; +namespace He4rt\Ranking\Contracts; -use Heart\Shared\Domain\Paginator; +use He4rt\Shared\Contract\Paginator; interface RankingRepository { diff --git a/app-modules/ranking/src/Providers/RankingServiceProvider.php b/app-modules/ranking/src/Providers/RankingServiceProvider.php new file mode 100644 index 000000000..7d98cd996 --- /dev/null +++ b/app-modules/ranking/src/Providers/RankingServiceProvider.php @@ -0,0 +1,19 @@ +app->bind(RankingRepository::class, RankingEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/Ranking/Infrastructure/Repositories/RankingEloquentRepository.php b/app-modules/ranking/src/Repositories/RankingEloquentRepository.php similarity index 56% rename from Heart/Ranking/Infrastructure/Repositories/RankingEloquentRepository.php rename to app-modules/ranking/src/Repositories/RankingEloquentRepository.php index c94893f32..133ac4b09 100644 --- a/Heart/Ranking/Infrastructure/Repositories/RankingEloquentRepository.php +++ b/app-modules/ranking/src/Repositories/RankingEloquentRepository.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Heart\Ranking\Infrastructure\Repositories; +namespace He4rt\Ranking\Repositories; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Ranking\Domain\Repositories\RankingRepository; -use Heart\Shared\Domain\Paginator; -use Heart\Shared\Infrastructure\Paginator as PaginatorConcrete; +use He4rt\Character\Models\Character; +use He4rt\Ranking\Contracts\RankingRepository; +use He4rt\Shared\Contract\Paginator; +use He4rt\Shared\Paginator as PaginatorConcrete; final class RankingEloquentRepository implements RankingRepository { diff --git a/tests/Feature/Ranking/RankingByLevelTest.php b/app-modules/ranking/tests/Feature/RankingByLevelTest.php similarity index 68% rename from tests/Feature/Ranking/RankingByLevelTest.php rename to app-modules/ranking/tests/Feature/RankingByLevelTest.php index 987a39638..1edc841fc 100644 --- a/tests/Feature/Ranking/RankingByLevelTest.php +++ b/app-modules/ranking/tests/Feature/RankingByLevelTest.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Heart\Character\Infrastructure\Models\Character; +use He4rt\Character\Models\Character; use Symfony\Component\HttpFoundation\Response; -uses(DatabaseTransactions::class); - test('can fetch ranking', function (): void { Character::factory()->count(5)->create(); diff --git a/app-modules/season/src/Models/Season.php b/app-modules/season/src/Models/Season.php index b0f2dd7ee..b292654c7 100644 --- a/app-modules/season/src/Models/Season.php +++ b/app-modules/season/src/Models/Season.php @@ -5,8 +5,8 @@ namespace He4rt\Season\Models; use He4rt\Badge\Models\Badge; +use He4rt\Meeting\Models\Meeting; use He4rt\Season\Database\Factories\SeasonFactory; -use Heart\Meeting\Infrastructure\Models\Meeting; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/app-modules/shared/composer.json b/app-modules/shared/composer.json new file mode 100644 index 000000000..8dca634d0 --- /dev/null +++ b/app-modules/shared/composer.json @@ -0,0 +1,21 @@ +{ + "name": "he4rt/shared", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\Shared\\": "src/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Shared\\Providers\\SharedServiceProvider" + ] + } + } +} diff --git a/Heart/Shared/Domain/Paginator.php b/app-modules/shared/src/Contract/Paginator.php similarity index 98% rename from Heart/Shared/Domain/Paginator.php rename to app-modules/shared/src/Contract/Paginator.php index 8693e15e1..9b91d6e7e 100644 --- a/Heart/Shared/Domain/Paginator.php +++ b/app-modules/shared/src/Contract/Paginator.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Shared\Domain; +namespace He4rt\Shared\Contract; interface Paginator { diff --git a/Heart/Shared/Infrastructure/Factory.php b/app-modules/shared/src/Factory.php similarity index 83% rename from Heart/Shared/Infrastructure/Factory.php rename to app-modules/shared/src/Factory.php index 468457592..72b07f385 100644 --- a/Heart/Shared/Infrastructure/Factory.php +++ b/app-modules/shared/src/Factory.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Shared\Infrastructure; +namespace He4rt\Shared; use Illuminate\Database\Eloquent\Factories\Factory as EloquentFactory; diff --git a/Heart/Shared/Infrastructure/Paginator.php b/app-modules/shared/src/Paginator.php similarity index 85% rename from Heart/Shared/Infrastructure/Paginator.php rename to app-modules/shared/src/Paginator.php index e5b93a42a..599f67ec3 100644 --- a/Heart/Shared/Infrastructure/Paginator.php +++ b/app-modules/shared/src/Paginator.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Shared\Infrastructure; +namespace He4rt\Shared; -use Heart\Shared\Domain\Paginator as PaginatorInterface; +use He4rt\Shared\Contract\Paginator as PaginatorInterface; use Illuminate\Contracts\Pagination\LengthAwarePaginator as LengthAwarePaginatorContract; use Illuminate\Pagination\LengthAwarePaginator; diff --git a/app-modules/shared/src/Providers/SharedServiceProvider.php b/app-modules/shared/src/Providers/SharedServiceProvider.php new file mode 100644 index 000000000..8631cbb1e --- /dev/null +++ b/app-modules/shared/src/Providers/SharedServiceProvider.php @@ -0,0 +1,17 @@ +app->bind(PaginatorInterface::class, Paginator::class); + } +} diff --git a/Heart/Shared/Application/TTL.php b/app-modules/shared/src/TTL.php similarity index 90% rename from Heart/Shared/Application/TTL.php rename to app-modules/shared/src/TTL.php index ab22fa4d1..b1d4904a1 100644 --- a/Heart/Shared/Application/TTL.php +++ b/app-modules/shared/src/TTL.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\Shared\Application; +namespace He4rt\Shared; final class TTL { diff --git a/Heart/Shared/Domain/ValueObjects/IntValueObject.php b/app-modules/shared/src/ValueObjects/IntValueObject.php similarity index 67% rename from Heart/Shared/Domain/ValueObjects/IntValueObject.php rename to app-modules/shared/src/ValueObjects/IntValueObject.php index f5f08110f..8459571d0 100644 --- a/Heart/Shared/Domain/ValueObjects/IntValueObject.php +++ b/app-modules/shared/src/ValueObjects/IntValueObject.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\Shared\Domain\ValueObjects; +namespace He4rt\Shared\ValueObjects; -final readonly class IntValueObject +readonly class IntValueObject { public function __construct(private int $value) {} diff --git a/Heart/Shared/Domain/ValueObjects/StringValueObject.php b/app-modules/shared/src/ValueObjects/StringValueObject.php similarity index 61% rename from Heart/Shared/Domain/ValueObjects/StringValueObject.php rename to app-modules/shared/src/ValueObjects/StringValueObject.php index 7e7257b17..6fca9ed1e 100644 --- a/Heart/Shared/Domain/ValueObjects/StringValueObject.php +++ b/app-modules/shared/src/ValueObjects/StringValueObject.php @@ -2,6 +2,6 @@ declare(strict_types=1); -namespace Heart\Shared\Domain\ValueObjects; +namespace He4rt\Shared\ValueObjects; abstract class StringValueObject {} diff --git a/app-modules/user/composer.json b/app-modules/user/composer.json new file mode 100644 index 000000000..aa281a120 --- /dev/null +++ b/app-modules/user/composer.json @@ -0,0 +1,23 @@ +{ + "name": "he4rt/user", + "description": "", + "type": "library", + "version": "1.0", + "license": "proprietary", + "require": {}, + "autoload": { + "psr-4": { + "He4rt\\User\\": "src/", + "He4rt\\User\\Tests\\": "tests/", + "He4rt\\User\\Database\\Factories\\": "database/factories/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\User\\Providers\\UserServiceProvider" + ] + } + } +} diff --git a/app-modules/user/database/factories/AddressFactory.php b/app-modules/user/database/factories/AddressFactory.php new file mode 100644 index 000000000..8e9c5562d --- /dev/null +++ b/app-modules/user/database/factories/AddressFactory.php @@ -0,0 +1,26 @@ + fake()->uuid(), + 'user_id' => User::factory(), + 'country' => fake()->countryCode(), + 'state' => fake()->randomElement(['SP', 'RJ', 'BH']), + 'city' => fake()->city(), + 'zip_code' => fake()->randomNumber(8), + ]; + } +} diff --git a/app-modules/user/database/factories/InformationFactory.php b/app-modules/user/database/factories/InformationFactory.php new file mode 100644 index 000000000..64816784b --- /dev/null +++ b/app-modules/user/database/factories/InformationFactory.php @@ -0,0 +1,28 @@ + fake()->uuid(), + 'user_id' => User::factory(), + 'name' => fake()->name(), + 'nickname' => fake()->userName(), + 'linkedin_url' => fake()->url(), + 'github_url' => fake()->url(), + 'birthdate' => fake()->date(), + 'about' => fake()->text(), + ]; + } +} diff --git a/Heart/User/Infrastructure/Factories/UserFactory.php b/app-modules/user/database/factories/UserFactory.php similarity index 60% rename from Heart/User/Infrastructure/Factories/UserFactory.php rename to app-modules/user/database/factories/UserFactory.php index ef7c11599..9384da293 100644 --- a/Heart/User/Infrastructure/Factories/UserFactory.php +++ b/app-modules/user/database/factories/UserFactory.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\User\Infrastructure\Factories; +namespace He4rt\User\Database\Factories; -use Heart\User\Infrastructure\Models\User; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; final class UserFactory extends Factory @@ -14,8 +14,8 @@ final class UserFactory extends Factory public function definition(): array { return [ - 'id' => $this->faker->uuid(), - 'username' => $this->faker->userName(), + 'id' => fake()->uuid(), + 'username' => fake()->userName(), 'is_donator' => false, ]; } diff --git a/app-modules/user/routes/user-routes.php b/app-modules/user/routes/user-routes.php new file mode 100644 index 000000000..f53bb2f08 --- /dev/null +++ b/app-modules/user/routes/user-routes.php @@ -0,0 +1,17 @@ +middleware(['api', BotAuthentication::class])->group(function (): void { + Route::prefix('users')->group(function (): void { + Route::get('/', [UsersController::class, 'getUsers'])->name('get-users'); + Route::get('/profile/{value}', [UsersController::class, 'getProfile'])->name('users.profile'); + Route::put('/profile/{value}', [UsersController::class, 'putProfile']) + ->name('users.profile.update'); + Route::get('/{id}', [UsersController::class, 'getUser'])->name('get-user'); + }); +}); diff --git a/Heart/User/Application/FindProfile.php b/app-modules/user/src/Actions/FindProfile.php similarity index 68% rename from Heart/User/Application/FindProfile.php rename to app-modules/user/src/Actions/FindProfile.php index 05172698b..d38fe8620 100644 --- a/Heart/User/Application/FindProfile.php +++ b/app-modules/user/src/Actions/FindProfile.php @@ -2,15 +2,14 @@ declare(strict_types=1); -namespace Heart\User\Application; - -use Heart\Provider\Domain\Entities\ProviderEntity; -use Heart\Provider\Domain\Repositories\ProviderRepository; -use Heart\User\Application\Exceptions\ProfileException; -use Heart\User\Domain\Actions\GetProfile; -use Heart\User\Domain\Entities\ProfileEntity; -use Heart\User\Domain\Entities\UserEntity; -use Heart\User\Domain\Repositories\UserRepository; +namespace He4rt\User\Actions; + +use He4rt\Provider\Contracts\ProviderRepository; +use He4rt\Provider\Entities\ProviderEntity; +use He4rt\User\Contracts\UserRepository; +use He4rt\User\Entities\ProfileEntity; +use He4rt\User\Entities\UserEntity; +use He4rt\User\Exceptions\ProfileException; final readonly class FindProfile { diff --git a/Heart/User/Domain/Actions/GetProfile.php b/app-modules/user/src/Actions/GetProfile.php similarity index 67% rename from Heart/User/Domain/Actions/GetProfile.php rename to app-modules/user/src/Actions/GetProfile.php index bd08c2ee2..e5d25d49d 100644 --- a/Heart/User/Domain/Actions/GetProfile.php +++ b/app-modules/user/src/Actions/GetProfile.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\User\Domain\Actions; +namespace He4rt\User\Actions; -use Heart\User\Domain\Entities\ProfileEntity; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\User\Contracts\UserRepository; +use He4rt\User\Entities\ProfileEntity; final readonly class GetProfile { diff --git a/Heart/User/Application/GetUser.php b/app-modules/user/src/Actions/GetUser.php similarity index 61% rename from Heart/User/Application/GetUser.php rename to app-modules/user/src/Actions/GetUser.php index b94da1845..4139de222 100644 --- a/Heart/User/Application/GetUser.php +++ b/app-modules/user/src/Actions/GetUser.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\User\Application; +namespace He4rt\User\Actions; -use Heart\User\Domain\Entities\UserEntity; -use Heart\User\Domain\Exceptions\UserEntityException; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\User\Contracts\UserRepository; +use He4rt\User\Entities\UserEntity; +use He4rt\User\Exceptions\UserEntityException; final readonly class GetUser { diff --git a/Heart/User/Application/GetUsersPaginated.php b/app-modules/user/src/Actions/GetUsersPaginated.php similarity index 68% rename from Heart/User/Application/GetUsersPaginated.php rename to app-modules/user/src/Actions/GetUsersPaginated.php index 24ad75ad6..bb87d6032 100644 --- a/Heart/User/Application/GetUsersPaginated.php +++ b/app-modules/user/src/Actions/GetUsersPaginated.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Heart\User\Application; +namespace He4rt\User\Actions; -use Heart\Shared\Domain\Paginator; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\Shared\Contract\Paginator; +use He4rt\User\Contracts\UserRepository; final readonly class GetUsersPaginated { diff --git a/Heart/User/Application/UpdateProfile.php b/app-modules/user/src/Actions/UpdateProfile.php similarity index 84% rename from Heart/User/Application/UpdateProfile.php rename to app-modules/user/src/Actions/UpdateProfile.php index f7f18111c..b3f803d33 100644 --- a/Heart/User/Application/UpdateProfile.php +++ b/app-modules/user/src/Actions/UpdateProfile.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\User\Application; +namespace He4rt\User\Actions; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\User\Contracts\UserRepository; final readonly class UpdateProfile { @@ -15,7 +15,6 @@ public function __construct( public function handle(string $value, array $payload): void { - $profileEntity = $this->findProfile->handle($value); $profileEntity->informationEntity->update($payload['info']); diff --git a/Heart/User/Domain/Repositories/UserRepository.php b/app-modules/user/src/Contracts/UserRepository.php similarity index 70% rename from Heart/User/Domain/Repositories/UserRepository.php rename to app-modules/user/src/Contracts/UserRepository.php index 645299698..58515dcc5 100644 --- a/Heart/User/Domain/Repositories/UserRepository.php +++ b/app-modules/user/src/Contracts/UserRepository.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Heart\User\Domain\Repositories; +namespace He4rt\User\Contracts; -use Heart\Shared\Domain\Paginator; -use Heart\User\Domain\Entities\ProfileEntity; -use Heart\User\Domain\Entities\UserEntity; -use Heart\User\Domain\Exceptions\UserEntityException; +use He4rt\Shared\Contract\Paginator; +use He4rt\User\Entities\ProfileEntity; +use He4rt\User\Entities\UserEntity; +use He4rt\User\Exceptions\UserEntityException; interface UserRepository { diff --git a/Heart/User/Domain/Entities/AddressEntity.php b/app-modules/user/src/Entities/AddressEntity.php similarity index 82% rename from Heart/User/Domain/Entities/AddressEntity.php rename to app-modules/user/src/Entities/AddressEntity.php index d82a76585..8a0d2664b 100644 --- a/Heart/User/Domain/Entities/AddressEntity.php +++ b/app-modules/user/src/Entities/AddressEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\User\Domain\Entities; +namespace He4rt\User\Entities; use JsonSerializable; @@ -20,8 +20,8 @@ public static function make(array $payload): self id: $payload['id'], country: $payload['country'], state: $payload['state'], - city: $payload['city'], - zipCode: $payload['zip_code'] + // city: $payload['city'], + // zipCode: $payload['zip_code'] ); } diff --git a/Heart/User/Domain/Entities/InformationEntity.php b/app-modules/user/src/Entities/InformationEntity.php similarity index 97% rename from Heart/User/Domain/Entities/InformationEntity.php rename to app-modules/user/src/Entities/InformationEntity.php index a57b96072..874bda939 100644 --- a/Heart/User/Domain/Entities/InformationEntity.php +++ b/app-modules/user/src/Entities/InformationEntity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\User\Domain\Entities; +namespace He4rt\User\Entities; use JsonSerializable; diff --git a/Heart/User/Domain/Entities/ProfileEntity.php b/app-modules/user/src/Entities/ProfileEntity.php similarity index 89% rename from Heart/User/Domain/Entities/ProfileEntity.php rename to app-modules/user/src/Entities/ProfileEntity.php index 50ea84109..63f3f27fb 100644 --- a/Heart/User/Domain/Entities/ProfileEntity.php +++ b/app-modules/user/src/Entities/ProfileEntity.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\User\Domain\Entities; +namespace He4rt\User\Entities; -use Heart\Badges\Domain\Collections\BadgeCollection; -use Heart\Character\Domain\Collections\PastSeasonCollection; -use Heart\Character\Domain\Entities\CharacterEntity; +use He4rt\Badge\Collections\BadgeCollection; +use He4rt\Character\Collections\PastSeasonCollection; +use He4rt\Character\Entities\CharacterEntity; use JsonSerializable; final readonly class ProfileEntity implements JsonSerializable diff --git a/Heart/User/Domain/Entities/UserEntity.php b/app-modules/user/src/Entities/UserEntity.php similarity index 82% rename from Heart/User/Domain/Entities/UserEntity.php rename to app-modules/user/src/Entities/UserEntity.php index a92c829ec..35d1fb080 100644 --- a/Heart/User/Domain/Entities/UserEntity.php +++ b/app-modules/user/src/Entities/UserEntity.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\User\Domain\Entities; +namespace He4rt\User\Entities; use Exception; -use Heart\User\Domain\Exceptions\UserEntityException; -use Heart\User\Domain\ValueObjects\UserName; +use He4rt\User\Exceptions\UserEntityException; +use He4rt\User\ValueObjects\UserName; final readonly class UserEntity { @@ -30,7 +30,6 @@ public static function make(array $payload): self } } - /** @throws UserEntityException */ public static function fromArray(array $user): self { return new self( diff --git a/Heart/User/Application/Exceptions/ProfileException.php b/app-modules/user/src/Exceptions/ProfileException.php similarity index 86% rename from Heart/User/Application/Exceptions/ProfileException.php rename to app-modules/user/src/Exceptions/ProfileException.php index ff75402fd..ac20ff2b0 100644 --- a/Heart/User/Application/Exceptions/ProfileException.php +++ b/app-modules/user/src/Exceptions/ProfileException.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\User\Application\Exceptions; +namespace He4rt\User\Exceptions; use Exception; use Symfony\Component\HttpFoundation\Response; diff --git a/Heart/User/Domain/Exceptions/UserEntityException.php b/app-modules/user/src/Exceptions/UserEntityException.php similarity index 85% rename from Heart/User/Domain/Exceptions/UserEntityException.php rename to app-modules/user/src/Exceptions/UserEntityException.php index 801250f08..94cc18df3 100644 --- a/Heart/User/Domain/Exceptions/UserEntityException.php +++ b/app-modules/user/src/Exceptions/UserEntityException.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\User\Domain\Exceptions; +namespace He4rt\User\Exceptions; use Exception; diff --git a/Heart/User/Presentation/Controllers/UsersController.php b/app-modules/user/src/Http/Controllers/UsersController.php similarity index 74% rename from Heart/User/Presentation/Controllers/UsersController.php rename to app-modules/user/src/Http/Controllers/UsersController.php index 10f91113f..ee73899e6 100644 --- a/Heart/User/Presentation/Controllers/UsersController.php +++ b/app-modules/user/src/Http/Controllers/UsersController.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace Heart\User\Presentation\Controllers; +namespace He4rt\User\Http\Controllers; use App\Http\Controllers\Controller; -use Heart\User\Application\Exceptions\ProfileException; -use Heart\User\Application\FindProfile; -use Heart\User\Application\GetUser; -use Heart\User\Application\GetUsersPaginated; -use Heart\User\Application\UpdateProfile; -use Heart\User\Domain\Exceptions\UserEntityException; -use Heart\User\Presentation\Requests\UpdateProfileRequest; +use He4rt\User\Actions\FindProfile; +use He4rt\User\Actions\GetUser; +use He4rt\User\Actions\GetUsersPaginated; +use He4rt\User\Actions\UpdateProfile; +use He4rt\User\Exceptions\ProfileException; +use He4rt\User\Exceptions\UserEntityException; +use He4rt\User\Http\Requests\UpdateProfileRequest; use Illuminate\Http\JsonResponse; final class UsersController extends Controller diff --git a/Heart/User/Presentation/Requests/UpdateProfileRequest.php b/app-modules/user/src/Http/Requests/UpdateProfileRequest.php similarity index 93% rename from Heart/User/Presentation/Requests/UpdateProfileRequest.php rename to app-modules/user/src/Http/Requests/UpdateProfileRequest.php index 776f259df..2b9c639d8 100644 --- a/Heart/User/Presentation/Requests/UpdateProfileRequest.php +++ b/app-modules/user/src/Http/Requests/UpdateProfileRequest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Heart\User\Presentation\Requests; +namespace He4rt\User\Http\Requests; use Illuminate\Foundation\Http\FormRequest; diff --git a/Heart/User/Infrastructure/Models/Address.php b/app-modules/user/src/Models/Address.php similarity index 87% rename from Heart/User/Infrastructure/Models/Address.php rename to app-modules/user/src/Models/Address.php index 9eef7df98..072e3d244 100644 --- a/Heart/User/Infrastructure/Models/Address.php +++ b/app-modules/user/src/Models/Address.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\User\Infrastructure\Models; +namespace He4rt\User\Models; -use Heart\User\Infrastructure\Factories\AddressFactory; +use He4rt\User\Database\Factories\AddressFactory; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/User/Infrastructure/Models/Information.php b/app-modules/user/src/Models/Information.php similarity index 88% rename from Heart/User/Infrastructure/Models/Information.php rename to app-modules/user/src/Models/Information.php index be0d18a19..d30167253 100644 --- a/Heart/User/Infrastructure/Models/Information.php +++ b/app-modules/user/src/Models/Information.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Heart\User\Infrastructure\Models; +namespace He4rt\User\Models; -use Heart\User\Infrastructure\Factories\InformationFactory; +use He4rt\User\Database\Factories\InformationFactory; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; diff --git a/Heart/User/Infrastructure/Models/User.php b/app-modules/user/src/Models/User.php similarity index 80% rename from Heart/User/Infrastructure/Models/User.php rename to app-modules/user/src/Models/User.php index 229e1f01d..8c514c833 100644 --- a/Heart/User/Infrastructure/Models/User.php +++ b/app-modules/user/src/Models/User.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Heart\User\Infrastructure\Models; +namespace He4rt\User\Models; -use Heart\Character\Infrastructure\Models\Character; -use Heart\Provider\Infrastructure\Models\Provider; -use Heart\User\Infrastructure\Factories\UserFactory; +use He4rt\Character\Models\Character; +use He4rt\Provider\Models\Provider; +use He4rt\User\Database\Factories\UserFactory; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -55,4 +55,11 @@ protected static function newFactory(): UserFactory { return UserFactory::new(); } + + protected function casts(): array + { + return [ + 'is_donator' => 'boolean', + ]; + } } diff --git a/app-modules/user/src/Providers/UserServiceProvider.php b/app-modules/user/src/Providers/UserServiceProvider.php new file mode 100644 index 000000000..c8fbe7c06 --- /dev/null +++ b/app-modules/user/src/Providers/UserServiceProvider.php @@ -0,0 +1,19 @@ +app->bind(UserRepository::class, UserEloquentRepository::class); + } + + public function boot(): void {} +} diff --git a/Heart/User/Infrastructure/Repositories/UserEloquentRepository.php b/app-modules/user/src/Repositories/UserEloquentRepository.php similarity index 85% rename from Heart/User/Infrastructure/Repositories/UserEloquentRepository.php rename to app-modules/user/src/Repositories/UserEloquentRepository.php index 32f67429c..bd77b2c52 100644 --- a/Heart/User/Infrastructure/Repositories/UserEloquentRepository.php +++ b/app-modules/user/src/Repositories/UserEloquentRepository.php @@ -2,15 +2,15 @@ declare(strict_types=1); -namespace Heart\User\Infrastructure\Repositories; - -use Heart\Shared\Domain\Paginator; -use Heart\Shared\Infrastructure\Paginator as PaginatorConcrete; -use Heart\User\Domain\Entities\ProfileEntity; -use Heart\User\Domain\Entities\UserEntity; -use Heart\User\Domain\Exceptions\UserEntityException; -use Heart\User\Domain\Repositories\UserRepository; -use Heart\User\Infrastructure\Models\User; +namespace He4rt\User\Repositories; + +use He4rt\Shared\Contract\Paginator; +use He4rt\Shared\Paginator as PaginatorConcrete; +use He4rt\User\Contracts\UserRepository; +use He4rt\User\Entities\ProfileEntity; +use He4rt\User\Entities\UserEntity; +use He4rt\User\Exceptions\UserEntityException; +use He4rt\User\Models\User; use Illuminate\Database\Eloquent\Builder; use Ramsey\Uuid\Uuid; diff --git a/app-modules/user/src/ValueObjects/UserId.php b/app-modules/user/src/ValueObjects/UserId.php new file mode 100644 index 000000000..eedab0a8b --- /dev/null +++ b/app-modules/user/src/ValueObjects/UserId.php @@ -0,0 +1,9 @@ +has(Character::factory()->has(PastSeason::factory()), 'character') @@ -55,6 +52,7 @@ ], ]); }); + test('can find profile with provider id', function (): void { $user = User::factory() ->has(Character::factory()->has(PastSeason::factory()), 'character') diff --git a/tests/Feature/User/UpdateProfileTest.php b/app-modules/user/tests/Feature/UpdateProfileTest.php similarity index 84% rename from tests/Feature/User/UpdateProfileTest.php rename to app-modules/user/tests/Feature/UpdateProfileTest.php index 407badff2..6e44b9136 100644 --- a/tests/Feature/User/UpdateProfileTest.php +++ b/app-modules/user/tests/Feature/UpdateProfileTest.php @@ -1,13 +1,14 @@ userRepositoryStub = m::mock(UserRepository::class); - $this->getProfileStub = m::mock(GetProfile::class); - $this->providerRepositoryStub = m::mock(ProviderRepository::class); + $this->userRepositoryStub = Mockery::mock(UserRepository::class); + $this->providerRepositoryStub = Mockery::mock(ProviderRepository::class); + $this->getProfile = new GetProfile($this->userRepositoryStub); + $this->providerEntity = $this->validProviderEntity(); $this->userEntity = $this->validUserEntity(); $this->profileEntity = $this->validProfileEntity(); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('find profile with username success', function (): void { $this->userRepositoryStub ->shouldReceive('findByUsername') @@ -35,16 +34,17 @@ ->once() ->andReturn($this->userEntity); - $this->getProfileStub - ->shouldReceive('handle') + $this->userRepositoryStub + ->shouldReceive('findProfile') ->with($this->userEntity->id) ->once() ->andReturn($this->profileEntity); - $test = new FindProfile($this->getProfileStub, $this->userRepositoryStub, $this->providerRepositoryStub); + $test = new FindProfile($this->getProfile, $this->userRepositoryStub, $this->providerRepositoryStub); $test->handle('canhassi'); }); + test('find profile with provider id success', function (): void { $this->userRepositoryStub ->shouldReceive('findByUsername') @@ -57,16 +57,17 @@ ->once() ->andReturn($this->providerEntity); - $this->getProfileStub - ->shouldReceive('handle') + $this->userRepositoryStub + ->shouldReceive('findProfile') ->with($this->providerEntity->userId) ->once() ->andReturn($this->profileEntity); - $test = new FindProfile($this->getProfileStub, $this->userRepositoryStub, $this->providerRepositoryStub); + $test = new FindProfile($this->getProfile, $this->userRepositoryStub, $this->providerRepositoryStub); $test->handle('canhassi-id'); }); + test('profile not found', function (): void { $this->expectException(ProfileException::class); @@ -80,7 +81,11 @@ ->with('canhassi-id') ->once(); - $test = new FindProfile($this->getProfileStub, $this->userRepositoryStub, $this->providerRepositoryStub); + $this->userRepositoryStub + ->shouldReceive('findProfile') + ->never(); + + $test = new FindProfile($this->getProfile, $this->userRepositoryStub, $this->providerRepositoryStub); $test->handle('canhassi-id'); }); diff --git a/tests/Unit/User/Application/GetUserTest.php b/app-modules/user/tests/Unit/Actions/GetUserTest.php similarity index 67% rename from tests/Unit/User/Application/GetUserTest.php rename to app-modules/user/tests/Unit/Actions/GetUserTest.php index 69be73809..251800677 100644 --- a/tests/Unit/User/Application/GetUserTest.php +++ b/app-modules/user/tests/Unit/Actions/GetUserTest.php @@ -2,19 +2,21 @@ declare(strict_types=1); -use Tests\Unit\User\UserProviderTrait; -use Heart\User\Application\GetUser; -use Heart\User\Domain\Repositories\UserRepository; +use He4rt\User\Actions\GetUser; +use He4rt\User\Contracts\UserRepository; +use He4rt\User\Tests\Unit\UserProviderTrait; uses(UserProviderTrait::class); beforeEach(function (): void { - $this->repositoryStub = m::mock(UserRepository::class); + $this->repositoryStub = Mockery::mock(UserRepository::class); $this->userEntity = $this->validUserEntity(); }); + afterEach(function (): void { - m::close(); + Mockery::close(); }); + test('get user', function (): void { $this->repositoryStub ->shouldReceive('find') diff --git a/tests/Unit/User/Application/GetUsersPaginatedTest.php b/app-modules/user/tests/Unit/Actions/GetUsersPaginatedTest.php similarity index 77% rename from tests/Unit/User/Application/GetUsersPaginatedTest.php rename to app-modules/user/tests/Unit/Actions/GetUsersPaginatedTest.php index 11d621dc4..8657c825e 100644 --- a/tests/Unit/User/Application/GetUsersPaginatedTest.php +++ b/app-modules/user/tests/Unit/Actions/GetUsersPaginatedTest.php @@ -1,9 +1,11 @@ repositoryStub = m::mock(UserRepository::class); diff --git a/tests/Unit/User/AddressProviderTrait.php b/app-modules/user/tests/Unit/AddressProviderTrait.php similarity index 87% rename from tests/Unit/User/AddressProviderTrait.php rename to app-modules/user/tests/Unit/AddressProviderTrait.php index a9e9b3f60..c1b2278b3 100644 --- a/tests/Unit/User/AddressProviderTrait.php +++ b/app-modules/user/tests/Unit/AddressProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\User; +namespace He4rt\User\Tests\Unit; -use Heart\User\Domain\Entities\AddressEntity; +use He4rt\User\Entities\AddressEntity; trait AddressProviderTrait { diff --git a/tests/Unit/User/Domain/Entities/UserEntityTest.php b/app-modules/user/tests/Unit/Entities/UserEntityTest.php similarity index 79% rename from tests/Unit/User/Domain/Entities/UserEntityTest.php rename to app-modules/user/tests/Unit/Entities/UserEntityTest.php index 03f3b47c4..8c989f200 100644 --- a/tests/Unit/User/Domain/Entities/UserEntityTest.php +++ b/app-modules/user/tests/Unit/Entities/UserEntityTest.php @@ -1,22 +1,24 @@ [ +use He4rt\User\Entities\UserEntity; + +dataset('validUserPayloads', fn () => [ [[ - 'id' => 123, + 'id' => '123', 'name' => 'Luis Alberto Suárez', 'username' => 'brabo3k', 'is_donator' => true, ]], [[ - 'id' => 1, + 'id' => '1', 'name' => 'Diego Souza', 'username' => 'brabo4k', 'is_donator' => false, ]], ]); + test('can create entity', function (array $userPayload): void { $user = UserEntity::fromArray($userPayload); diff --git a/tests/Unit/User/InformationProviderTrait.php b/app-modules/user/tests/Unit/InformationProviderTrait.php similarity index 91% rename from tests/Unit/User/InformationProviderTrait.php rename to app-modules/user/tests/Unit/InformationProviderTrait.php index ecb11e738..3622481d1 100644 --- a/tests/Unit/User/InformationProviderTrait.php +++ b/app-modules/user/tests/Unit/InformationProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\User; +namespace He4rt\User\Tests\Unit; -use Heart\User\Domain\Entities\InformationEntity; +use He4rt\User\Entities\InformationEntity; trait InformationProviderTrait { diff --git a/tests/Unit/User/ProfileProviderTrait.php b/app-modules/user/tests/Unit/ProfileProviderTrait.php similarity index 97% rename from tests/Unit/User/ProfileProviderTrait.php rename to app-modules/user/tests/Unit/ProfileProviderTrait.php index 343f391c8..4afc9caca 100644 --- a/tests/Unit/User/ProfileProviderTrait.php +++ b/app-modules/user/tests/Unit/ProfileProviderTrait.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Tests\Unit\User; +namespace He4rt\User\Tests\Unit; -use Heart\User\Domain\Entities\ProfileEntity; +use He4rt\User\Entities\ProfileEntity; trait ProfileProviderTrait { @@ -45,7 +45,7 @@ public function validProfilePayload(array $fields = []): array ], 'past_seasons' => [ [ - 'id' => 1, + 'id' => '1', 'season_id' => '2', 'character_id' => 'c58fde47-ec6f-31c2-82e1-0c929a9e181d', 'ranking_position' => 220, diff --git a/tests/Unit/User/UserProviderTrait.php b/app-modules/user/tests/Unit/UserProviderTrait.php similarity index 74% rename from tests/Unit/User/UserProviderTrait.php rename to app-modules/user/tests/Unit/UserProviderTrait.php index fff14f038..c6dc045be 100644 --- a/tests/Unit/User/UserProviderTrait.php +++ b/app-modules/user/tests/Unit/UserProviderTrait.php @@ -2,17 +2,17 @@ declare(strict_types=1); -namespace Tests\Unit\User; +namespace He4rt\User\Tests\Unit; -use Heart\User\Domain\Entities\UserEntity; -use Heart\User\Domain\ValueObjects\UserName; +use He4rt\User\Entities\UserEntity; +use He4rt\User\ValueObjects\UserName; trait UserProviderTrait { public function validUserPayload(array $fields = []): array { return [ - 'id' => 12, + 'id' => '12', 'username' => new UserName('canhassi'), 'isDonator' => false, ...$fields, diff --git a/composer.json b/composer.json index 9ceca9ebd..13780ec9d 100644 --- a/composer.json +++ b/composer.json @@ -10,9 +10,18 @@ "require": { "php": "^8.3", "guzzlehttp/guzzle": "^7.10.0", + "he4rt/authentication": ">=1", "he4rt/badge": "^1.0.0", + "he4rt/character": ">=1", + "he4rt/feedback": ">=1", + "he4rt/integrations": ">=1", + "he4rt/meeting": ">=1", "he4rt/message": "^1.0.0", + "he4rt/provider": ">=1", + "he4rt/ranking": ">=1", "he4rt/season": "^1.0.0", + "he4rt/shared": ">=1", + "he4rt/user": ">=1", "internachi/modular": "^2.3.0", "laravel/framework": "^12.36.1", "laravel/sanctum": "^4.2.0", diff --git a/composer.lock b/composer.lock index 3f190999a..5616e9429 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c34adfb1cbd5a44b517c61d01b693d50", + "content-hash": "cde60ac59d1eb95e3da8ccb209e01663", "packages": [ { "name": "brick/math", @@ -1674,6 +1674,35 @@ ], "time": "2025-08-22T14:27:06+00:00" }, + { + "name": "he4rt/authentication", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/authentication", + "reference": "378308b889c04819dd97619898a2107ebf09b68e" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Authentication\\Providers\\AuthenticationServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Authentication\\": "src/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "he4rt/badge", "version": "1.0.0", @@ -1705,6 +1734,128 @@ "relative": true } }, + { + "name": "he4rt/character", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/character", + "reference": "bf450394fb6662fcc1b0cd3214f11edc86e6b9d0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Character\\Providers\\CharacterServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Character\\": "src/", + "He4rt\\Character\\Tests\\": "tests/", + "He4rt\\Character\\Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, + { + "name": "he4rt/feedback", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/feedback", + "reference": "454e99c8aa23d942e20fb183482bb4edd3ed4b84" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Feedback\\Providers\\FeedbackServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Feedback\\": "src/", + "He4rt\\Feedback\\Tests\\": "tests/", + "He4rt\\Feedback\\Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, + { + "name": "he4rt/integrations", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/integrations", + "reference": "0cbc485eef0eb216c9443cf7d19e36b6371dbbd2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Integrations\\Providers\\IntegrationsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Integrations\\": "src/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, + { + "name": "he4rt/meeting", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/meeting", + "reference": "8a43c60ddbe831bf61793cc328a3ce39c66845ce" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Meeting\\Providers\\MeetingServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Meeting\\": "src/", + "He4rt\\Meeting\\Tests\\": "tests/", + "He4rt\\Meeting\\Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "he4rt/message", "version": "1.0.0", @@ -1737,6 +1888,67 @@ "relative": true } }, + { + "name": "he4rt/provider", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/provider", + "reference": "1eea8b77a31da8dadac2dad2c7a56be86f8dc756" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Provider\\Providers\\ProviderServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Provider\\": "src/", + "He4rt\\Provider\\Tests\\": "tests/", + "He4rt\\Provider\\Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, + { + "name": "he4rt/ranking", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/ranking", + "reference": "2db71fc3edecca56ba2640ca7e28d9eda8665e20" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Ranking\\Providers\\RankingServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Ranking\\": "src/", + "He4rt\\Ranking\\Tests\\": "tests/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "he4rt/season", "version": "1.0.0", @@ -1769,6 +1981,66 @@ "relative": true } }, + { + "name": "he4rt/shared", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/shared", + "reference": "0059504007723c94b1dbf03ffc035b2db8f5d5a3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Shared\\Providers\\SharedServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Shared\\": "src/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, + { + "name": "he4rt/user", + "version": "1.0", + "dist": { + "type": "path", + "url": "app-modules/user", + "reference": "a0280b2b4fa029882895ebd8ba90ece3e65745e8" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\User\\Providers\\UserServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\User\\": "src/", + "He4rt\\User\\Tests\\": "tests/", + "He4rt\\User\\Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "internachi/modular", "version": "2.3.0", diff --git a/config/auth.php b/config/auth.php index 702384af6..abd7aa83d 100644 --- a/config/auth.php +++ b/config/auth.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use App\Models\Users\User; +use He4rt\User\Models\User; return [ diff --git a/database/migrations/2022_12_07_013057_create_meeting_types.php b/database/migrations/2022_12_07_013057_create_meeting_types.php index 60024b70c..22ca4f215 100644 --- a/database/migrations/2022_12_07_013057_create_meeting_types.php +++ b/database/migrations/2022_12_07_013057_create_meeting_types.php @@ -2,7 +2,7 @@ declare(strict_types=1); -use Heart\Meeting\Infrastructure\Models\MeetingType; +use He4rt\Meeting\Models\MeetingType; use Illuminate\Database\Migrations\Migration; return new class extends Migration diff --git a/phpstan.neon b/phpstan.neon index 319dfcf0d..9e7d3936a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,5 +5,6 @@ includes: parameters: reportUnmatchedIgnoredErrors: false - level: 1 + paths: + - app diff --git a/tests/Feature/.gitkeep b/tests/Feature/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Pest.php b/tests/Pest.php index 11d799e50..2c9c0fda7 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -18,7 +18,7 @@ pest()->extend(TestCase::class) ->use(RefreshDatabase::class) - ->in('Feature', 'Unit', '../app-modules/*/tests'); + ->in('Feature', 'Unit', '../app-modules/*/tests/Unit', '../app-modules/*/tests/Feature'); /* |-------------------------------------------------------------------------- diff --git a/tests/Unit/.gitkeep b/tests/Unit/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Unit/Badges/Application/CreateBadgeTest.php b/tests/Unit/Badges/Application/CreateBadgeTest.php deleted file mode 100644 index d679f1fcb..000000000 --- a/tests/Unit/Badges/Application/CreateBadgeTest.php +++ /dev/null @@ -1,38 +0,0 @@ -persistBadgeStub = m::mock(PersistBadge::class); - $this->badgeEntity = $this->validBadgeEntity(); - $this->payload = dataProvider(); -}); -afterEach(function (): void { - m::close(); -}); -test('create badge application success', function (): void { - $this->persistBadgeStub - ->shouldReceive('handle') - ->with(m::type(NewBadgeDTO::class)) - ->once() - ->andReturn($this->badgeEntity); - - $test = new CreateBadge($this->persistBadgeStub); - - $test->handle($this->payload); -}); -dataset('dataProvider', fn() => [ - 'provider' => 'canhassi-provider', - 'name' => 'canhassi', - 'description' => 'é o canhas, esqueça tudo!', - 'image_url' => 'https://canhassi.tech', - 'redeem_code' => 'he4rtDevelopers', - 'active' => true, -]); diff --git a/tests/Unit/Badges/Application/FindBadgeBySlugTest.php b/tests/Unit/Badges/Application/FindBadgeBySlugTest.php deleted file mode 100644 index 37881a313..000000000 --- a/tests/Unit/Badges/Application/FindBadgeBySlugTest.php +++ /dev/null @@ -1,29 +0,0 @@ -badgeRepositoryStub = m::mock(BadgeRepository::class); - $this->badgeEntity = $this->validBadgeEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('find badge by slug', function (): void { - $slug = 'é-o-canhas'; - $this->badgeRepositoryStub - ->shouldReceive('findBySlug') - ->with($slug) - ->once() - ->andReturn($this->badgeEntity); - - $test = new FindBadgeBySlug($this->badgeRepositoryStub); - - $test->handle($slug); -}); diff --git a/tests/Unit/Badges/Domain/Actions/DeleteBadgeTest.php b/tests/Unit/Badges/Domain/Actions/DeleteBadgeTest.php deleted file mode 100644 index eba67317b..000000000 --- a/tests/Unit/Badges/Domain/Actions/DeleteBadgeTest.php +++ /dev/null @@ -1,27 +0,0 @@ -badgeRepositoryStub = m::mock(BadgeRepository::class); - $this->badgeEntity = $this->validBadgeEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('delete badge success', function (): void { - $this->badgeRepositoryStub - ->shouldReceive('delete') - ->with($this->badgeEntity->id) - ->once(); - - $test = new DeleteBadge($this->badgeRepositoryStub); - - $test->handle($this->badgeEntity->id); -}); diff --git a/tests/Unit/Badges/Domain/Actions/PersistBadgeTest.php b/tests/Unit/Badges/Domain/Actions/PersistBadgeTest.php deleted file mode 100644 index 02d186814..000000000 --- a/tests/Unit/Badges/Domain/Actions/PersistBadgeTest.php +++ /dev/null @@ -1,37 +0,0 @@ -badgeRepositoryStub = m::mock(BadgeRepository::class); - $this->badgeEntity = $this->validBadgeEntity(); - $this->badgeDTO = new NewBadgeDTO( - 'canhassi', // provider - $this->badgeEntity->name, - $this->badgeEntity->description, - 'https://canhassi.tech', // image URL - $this->badgeEntity->redeemCode, - $this->badgeEntity->active - ); -}); -afterEach(function (): void { - m::close(); -}); -test('persist badge success', function (): void { - $this->badgeRepositoryStub - ->shouldReceive('create') - ->with($this->badgeDTO) - ->once() - ->andReturn($this->badgeEntity); - - $test = new PersistBadge($this->badgeRepositoryStub); - - $test->handle($this->badgeDTO); -}); diff --git a/tests/Unit/Character/Application/ClaimCharacterBadgeTest.php b/tests/Unit/Character/Application/ClaimCharacterBadgeTest.php deleted file mode 100644 index fbcb8e228..000000000 --- a/tests/Unit/Character/Application/ClaimCharacterBadgeTest.php +++ /dev/null @@ -1,60 +0,0 @@ -persistClaimBadgeStub = m::mock(PersistClaimedBadge::class); - $this->findProviderStub = m::mock(FindProvider::class); - $this->findCharacterIdByUserId = m::mock(FindCharacterIdByUserId::class); - $this->findBadgeBySlug = m::mock(FindBadgeBySlug::class); - $this->providerEntity = $this->validProviderEntity(); - $this->badgeEntity = $this->validBadgeEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('claim character badge success', function (): void { - $this->findProviderStub - ->shouldReceive('handle') - ->with('canhassi-provider', 'canhassi-id') - ->once() - ->andReturn($this->providerEntity); - - $this->findCharacterIdByUserId - ->shouldReceive('handle') - ->with($this->providerEntity->userId) - ->once() - ->andReturn('character-id'); - - $this->findBadgeBySlug - ->shouldReceive('handle') - ->with('é o canhas') - ->once() - ->andReturn($this->badgeEntity); - - $this->persistClaimBadgeStub - ->shouldReceive('handle') - ->with('character-id', $this->badgeEntity->id) - ->once(); - - $test = new ClaimCharacterBadge( - $this->persistClaimBadgeStub, - $this->findProviderStub, - $this->findCharacterIdByUserId, - $this->findBadgeBySlug - ); - - $test->handle('canhassi-provider', 'canhassi-id', 'é o canhas'); -}); diff --git a/tests/Unit/Character/Application/ClaimDailyBonusTest.php b/tests/Unit/Character/Application/ClaimDailyBonusTest.php deleted file mode 100644 index ec0a49e50..000000000 --- a/tests/Unit/Character/Application/ClaimDailyBonusTest.php +++ /dev/null @@ -1,47 +0,0 @@ -persistDailyStub = m::mock(PersistDailyBonus::class); - $this->findProviderStub = m::mock(FindProvider::class); - $this->findCharacterIdByUserId = m::mock(FindCharacterIdByUserId::class); - $this->providerEntity = $this->validProviderEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('claim daily bonus success', function (): void { - $this->findProviderStub - ->shouldReceive('handle') - ->with('canhassi-provider', 'canhassi-id') - ->once() - ->andReturn($this->providerEntity); - - $this->findCharacterIdByUserId - ->shouldReceive('handle') - ->with($this->providerEntity->userId) - ->once() - ->andReturn('character-id'); - - $this->persistDailyStub - ->shouldReceive('handle') - ->with('character-id') - ->once(); - - $test = new ClaimDailyBonus( - $this->persistDailyStub, - $this->findProviderStub, - $this->findCharacterIdByUserId - ); - - $test->handle('canhassi-provider', 'canhassi-id'); -}); diff --git a/tests/Unit/Character/Application/FindCharacterIdByUserIdTest.php b/tests/Unit/Character/Application/FindCharacterIdByUserIdTest.php deleted file mode 100644 index b334ee7c7..000000000 --- a/tests/Unit/Character/Application/FindCharacterIdByUserIdTest.php +++ /dev/null @@ -1,28 +0,0 @@ -getCharacterIdByUserId = m::mock(GetCharacterByUserId::class); - $this->characterEntity = $this->validCharacterEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('find character by user id', function (): void { - $this->getCharacterIdByUserId - ->shouldReceive('handle') - ->with('canhassi-id') - ->once() - ->andReturn($this->characterEntity); - - $test = new FindCharacterIdByUserId($this->getCharacterIdByUserId); - - $test->handle('canhassi-id'); -}); diff --git a/tests/Unit/Character/Domain/Entities/CharacterEntityTest.php b/tests/Unit/Character/Domain/Entities/CharacterEntityTest.php deleted file mode 100644 index 12f53c736..000000000 --- a/tests/Unit/Character/Domain/Entities/CharacterEntityTest.php +++ /dev/null @@ -1,26 +0,0 @@ - [ - [1, 1, 1, 548, '2023-01-14 00:26:25', 4], - [1, 1, 1, 89, '2023-01-14 00:26:25', 1], - [1, 1, 1, 287, '2023-01-14 00:26:25', 3], -]); -dataset('makeCharacterProvider', fn() => [ - [['id' => 1, 'user_id' => 1, 'reputation' => 1, 'experience' => 548, 'daily_bonus_claimed_at' => '2023-01-14 00:26:25'], 4], - [['id' => 1, 'user_id' => 1, 'reputation' => 1, 'experience' => 98, 'daily_bonus_claimed_at' => '2023-01-14 00:26:25'], 2], -]); -test('instance character entity test', function (int $id, int $userId, int $reputation, int $experience, string $claimedAt, int $expectedLevel): void { - $characterEntity = new CharacterEntity($id, $reputation, $userId, $experience, $claimedAt); - - self::assertEquals($expectedLevel, $characterEntity->getLevel()); - self::assertInstanceOf(CharacterEntity::class, $characterEntity); -})->with('characterProvider'); -test('make character', function (array $payload, int $expectedLevel): void { - $characterEntity = CharacterEntity::make($payload); - - self::assertEquals($expectedLevel, $characterEntity->getLevel()); - self::assertInstanceOf(CharacterEntity::class, $characterEntity); -})->with('makeCharacterProvider'); diff --git a/tests/Unit/Meeting/Domain/Actions/PersistAttendMeetingTest.php b/tests/Unit/Meeting/Domain/Actions/PersistAttendMeetingTest.php deleted file mode 100644 index f835da97d..000000000 --- a/tests/Unit/Meeting/Domain/Actions/PersistAttendMeetingTest.php +++ /dev/null @@ -1,27 +0,0 @@ -meetingTypeRepositoryStub = m::mock(MeetingRepository::class); - $this->meetingEntity = $this->validMeetingEntity(); -}); -afterEach(function (): void { - m::close(); -}); -test('persist attend meeting', function (): void { - $this->meetingTypeRepositoryStub - ->shouldReceive('attendMeeting') - ->with($this->meetingEntity->id, 12) - ->once(); - - $test = new PersistAttendMeeting($this->meetingTypeRepositoryStub); - - $test->handle($this->meetingEntity->id, 12); -}); diff --git a/tests/Unit/Message/Application/NewMessageTest.php b/tests/Unit/Message/Application/NewMessageTest.php deleted file mode 100644 index 143f0afc9..000000000 --- a/tests/Unit/Message/Application/NewMessageTest.php +++ /dev/null @@ -1,84 +0,0 @@ - [ - 'twitch #1' => [ - 'provider' => 'twitch', - 'payload' => [ - 'provider' => 'twitch', - 'provider_id' => '1234', - 'provider_message_id' => '78781237', - 'channel_id' => '31231267312', - 'content' => 'deixa o sub', - 'sent_at' => '2023-01-18 22:36:32', - ], - ], -]); -test('new message', function (string $provider, array $payload): void { - Cache::tags(['meetings'])->put('current-meeting', 'é o canhas'); - $findProviderStub = m::mock(FindProvider::class); - $findCharacterStub = m::mock(FindCharacterIdByUserId::class); - $characterExperienceStub = m::mock(IncrementExperience::class); - $persistMessageStub = m::mock(PersistMessage::class); - $attendMeetingStub = m::mock(AttendMeeting::class); - $newUserStub = m::mock(NewAccountByProvider::class); - - $obtainedExperience = 1; - $providerEntityMock = new ProviderEntity( - 1, - 'id-user-foda', - 'twitch', - '12312312', - 'email@foda.com' - ); - - $findProviderStub - ->shouldReceive('handle') - ->with($provider, $payload['provider_id']) - ->andReturn($providerEntityMock); - - $findCharacterStub - ->shouldReceive('handle') - ->once() - ->with($providerEntityMock->userId) - ->andReturn('id-character-foda'); - - $characterExperienceStub - ->shouldReceive('incrementByTextMessage') - ->once() - ->with('id-character-foda', $payload['content']) - ->andReturn($obtainedExperience); - - $persistMessageStub - ->shouldReceive('handle') - ->once() - ->with(m::type(NewMessageDTO::class), $obtainedExperience, $providerEntityMock->id); - - $attendMeetingStub - ->shouldReceive('handle') - ->once() - ->with($providerEntityMock->userId); - - $action = new NewMessage( - $persistMessageStub, - $findProviderStub, - $findCharacterStub, - $characterExperienceStub, - $attendMeetingStub, - $newUserStub - ); - - $action->persist($payload); - Cache::flush(); -})->with('dataProvider'); diff --git a/tests/Unit/Message/Domain/Actions/PersistMessageTest.php b/tests/Unit/Message/Domain/Actions/PersistMessageTest.php deleted file mode 100644 index d7ff4be54..000000000 --- a/tests/Unit/Message/Domain/Actions/PersistMessageTest.php +++ /dev/null @@ -1,39 +0,0 @@ -messageRepositoryStub = m::mock(MessageRepository::class); - $this->messageEntity = $this->validMessageEntity(); - $this->messageDTO = new NewMessageDTO( - ProviderEnum::Discord, - $this->messageEntity->providerId, - $this->messageEntity->providerMessageId, - $this->messageEntity->channelId, - $this->messageEntity->content, - Date::parse('2023-01-24') // sentAt in string - ); -}); -afterEach(function (): void { - m::close(); -}); -test('persist message success', function (): void { - $this->messageRepositoryStub - ->shouldReceive('create') - ->with($this->messageDTO, 'canhassi', $this->messageEntity->obtainedExperience) - ->once() - ->andReturn($this->messageEntity); - - $test = new PersistMessage($this->messageRepositoryStub); - - $test->handle($this->messageDTO, $this->messageEntity->obtainedExperience, 'canhassi'); -}); diff --git a/tests/Unit/Providers/Application/FindProviderTest.php b/tests/Unit/Providers/Application/FindProviderTest.php deleted file mode 100644 index 8d67121f7..000000000 --- a/tests/Unit/Providers/Application/FindProviderTest.php +++ /dev/null @@ -1,24 +0,0 @@ -once() - ->with($cacheKey, TTL::fromDays(2), m::type('closure')) - ->andReturn(new ProviderEntity(1, 1, 1, 1, '1')); - - $action = new FindProvider($getProviderStub); - - $result = $action->handle('twitch', '123'); - - expect($result)->toBeInstanceOf(ProviderEntity::class); -});