diff --git a/app/Actions/Challenge/CreateChallengeAction.php b/app/Actions/Challenge/CreateChallengeAction.php index bf3bf10..75e6fd4 100644 --- a/app/Actions/Challenge/CreateChallengeAction.php +++ b/app/Actions/Challenge/CreateChallengeAction.php @@ -4,6 +4,7 @@ use App\Enums\ChallengeStatus; use App\Events\ChallengeCreated; +use App\Exceptions\UserHaveUnCompletedChallengeException; use App\Models\Challenge; use App\Models\User; @@ -16,7 +17,7 @@ public function execute(User $user, array $data): Challenge ->where('status', ChallengeStatus::ONGOING->value); if ($ongoingChallenge->exists()) { - abort(400, 'You have an uncompleted challenge!'); + throw new UserHaveUnCompletedChallengeException(); } $data = array_merge($data, [ diff --git a/app/Actions/User/LoginUserAction.php b/app/Actions/User/LoginUserAction.php index e0a354a..27c0889 100644 --- a/app/Actions/User/LoginUserAction.php +++ b/app/Actions/User/LoginUserAction.php @@ -2,6 +2,7 @@ namespace App\Actions\User; +use App\Exceptions\UserNotFoundException; use App\Models\DeactivationRequest; use App\Models\User; use Illuminate\Support\Facades\Hash; @@ -13,7 +14,7 @@ public function execute(array $data): string $user = User::firstWhere('email', $data['email']); if (! $user || ! Hash::check($data['password'], $user->password)) { - abort(401, 'User not found!'); + throw new UserNotFoundException(); } // Logging into an account could save it from deletion diff --git a/app/Exceptions/UserHaveUnCompletedChallengeException.php b/app/Exceptions/UserHaveUnCompletedChallengeException.php new file mode 100644 index 0000000..67dd5e8 --- /dev/null +++ b/app/Exceptions/UserHaveUnCompletedChallengeException.php @@ -0,0 +1,10 @@ +execute($request->validated()); + try { + $token = $loginUserAction->execute($request->validated()); + } catch (UserNotFoundException) { + return $this->unauthorized([ + 'message' => 'Authentication failed', + ]); + } return $this->ok( UserTokenResource::make($token) diff --git a/app/Http/Controllers/ChallengesController.php b/app/Http/Controllers/ChallengesController.php index e22c70c..5556f01 100644 --- a/app/Http/Controllers/ChallengesController.php +++ b/app/Http/Controllers/ChallengesController.php @@ -4,6 +4,7 @@ use App\Actions\Challenge\CreateChallengeAction; use App\Actions\Challenge\StopChallengeAction; +use App\Exceptions\UserHaveUnCompletedChallengeException; use App\Http\Requests\CreateChallengeRequest; use App\Http\Resources\ChallengeResource; use App\Models\Challenge; @@ -32,7 +33,13 @@ public function index() public function store(CreateChallengeRequest $request, CreateChallengeAction $createChallengeAction) { - $challenge = $createChallengeAction->execute($request->user(), $request->validated()); + try { + $challenge = $createChallengeAction->execute($request->user(), $request->validated()); + } catch (UserHaveUnCompletedChallengeException) { + return $this->badRequest([ + 'message' => 'You have uncompleted challenge', + ]); + } return $this->created( ChallengeResource::make($challenge) diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index d82e3ee..e4b27a5 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -29,6 +29,16 @@ public function ok($resource = null): JsonResponse return $this->respondResourceWithStatusCode($resource, Response::HTTP_OK); } + public function badRequest($resource = null): JsonResponse + { + return $this->respondResourceWithStatusCode($resource, Response::HTTP_BAD_REQUEST); + } + + public function unauthorized($resource = null): JsonResponse + { + return $this->respondResourceWithStatusCode($resource, Response::HTTP_UNAUTHORIZED); + } + protected function respondResourceWithStatusCode($resource, $statusCode): JsonResponse { if (is_array($resource)) { diff --git a/tests/Feature/ChallengeCommentsControllerTest.php b/tests/Feature/ChallengeCommentsControllerTest.php index a19a535..16a204d 100644 --- a/tests/Feature/ChallengeCommentsControllerTest.php +++ b/tests/Feature/ChallengeCommentsControllerTest.php @@ -81,7 +81,7 @@ public function test_user_leaves_a_comment() $user = User::factory()->create([ 'email' => config('hope.hope_bot_mail'), ]); - + $this->signIn($user); $response = $this->postJson('api/challenges/1/comments', [ diff --git a/tests/Feature/ChallengeLikesControllerTest.php b/tests/Feature/ChallengeLikesControllerTest.php index ce7878e..3fcf62e 100644 --- a/tests/Feature/ChallengeLikesControllerTest.php +++ b/tests/Feature/ChallengeLikesControllerTest.php @@ -15,6 +15,7 @@ class ChallengeLikesControllerTest extends TestCase use RefreshDatabase; private $user; + private $challenge; public function setUp(): void @@ -29,7 +30,7 @@ public function setUp(): void $this->user = $this->signIn(); $this->challenge = Challenge::factory()->create([ - 'user_id' => (User::factory()->create())->id + 'user_id' => (User::factory()->create())->id, ]); } diff --git a/tests/Feature/ContinueChallengeControllerTest.php b/tests/Feature/ContinueChallengeControllerTest.php index 10d1f1b..5ca12d7 100644 --- a/tests/Feature/ContinueChallengeControllerTest.php +++ b/tests/Feature/ContinueChallengeControllerTest.php @@ -87,7 +87,6 @@ public function test_user_completes_a_challenge() 'created_at' => '2022-01-01 21:00:00', ]); - $this->travelTo('2023-01-31 21:01:00'); $this->postJson('api/challenges/1/continue');