diff --git a/app/Annotations/OpenApi/controllersAnnotations/tagAnnotations/AnnotationsTag.php b/app/Annotations/OpenApi/controllersAnnotations/tagAnnotations/AnnotationsTag.php index 2cdf8439..09d5a11e 100644 --- a/app/Annotations/OpenApi/controllersAnnotations/tagAnnotations/AnnotationsTag.php +++ b/app/Annotations/OpenApi/controllersAnnotations/tagAnnotations/AnnotationsTag.php @@ -31,6 +31,7 @@ class AnnotationsTag * ) * ) * ), + * * @OA\Response( * response=401, * description="Unauthorized", @@ -41,6 +42,7 @@ class AnnotationsTag * @OA\Property(property="message", type="string", example="Unauthorized") * ) * ), + * * @OA\Response( * response=404, * description="No tags found.", @@ -65,14 +67,17 @@ public function index() {} * * @OA\RequestBody( * required=true, + * * @OA\JsonContent( * type="object", + * * @OA\Property(property="id", type="integer", example=1), * @OA\Property(property="tag_name", type="string", example="Laravel"), * @OA\Property(property="created_at", type="string", format="date-time", example="2024-01-25T12:34:56Z"), * @OA\Property(property="updated_at", type="string", format="date-time", example="2024-01-25T12:34:56Z"), * ) * ), + * * @OA\Response( * response=201, * description="Tag created successfully.", @@ -86,7 +91,9 @@ public function index() {} * @OA\Response( * response=500, * description="Error creating the tag.", + * * @OA\JsonContent( + * * @OA\Property(property="message", type="string", example="Error creating the tag. Please try again."), * ), * ), @@ -103,11 +110,13 @@ public function store() {} * description="Retrieve details of a specific tag based on the provided ID. Admin Authentication is required.", * * security={{"bearer": {}}}, + * * @OA\Parameter( * name="id", * in="path", * required=true, * description="Tag ID", + * * @OA\Schema(type="integer", format="int64"), * ), * @@ -133,7 +142,9 @@ public function store() {} * @OA\Response( * response=404, * description="Tag not found.", + * * @OA\JsonContent( + * * @OA\Property(property="message", type="string", example="Tag not found."), * ), * ), @@ -149,19 +160,23 @@ public function show() {} * summary="Update details of a specific tag.", * description="Updates details of a specific tag based on the provided ID. Admin Authentication is required.", * security={{"bearer": {}}}, + * * @OA\Parameter( * name="id", * in="path", * required=true, * description="ID of the tag to be updated", + * * @OA\Schema(type="integer", format="int64"), * ), * * @OA\RequestBody( * required=true, + * * @OA\JsonContent( * type="object", + * * @OA\Property(property="tag_name", type="string", example="Updated Tag"), * ), * ), @@ -188,7 +203,9 @@ public function show() {} * @OA\Response( * response=404, * description="Tag not found.", + * * @OA\JsonContent( + * * @OA\Property(property="message", type="string", example="Tag not found."), * ), * ), @@ -204,18 +221,22 @@ public function update() {} * summary="Delete a specific tag.", * description="Deletes a specific tag based on the provided ID. Admin Authentication is required.", * security={{"bearer": {}}}, + * * @OA\Parameter( * name="id", * in="path", * required=true, * description="ID of the tag to be deleted", + * * @OA\Schema(type="integer", format="int64"), * ), * * @OA\Response( * response=200, * description="Tag deleted successfully.", + * * @OA\JsonContent( + * * @OA\Property(property="message", type="string", example="Tag deleted successfully."), * ), * ), @@ -223,7 +244,9 @@ public function update() {} * @OA\Response( * response=404, * description="Tag not found.", + * * @OA\JsonContent( + * * @OA\Property(property="message", type="string", example="Tag not found."), * ), * ), diff --git a/app/Exceptions/UserNotAuthenticatedException.php b/app/Exceptions/UserNotAuthenticatedException.php index 0551d9b0..6d76b542 100644 --- a/app/Exceptions/UserNotAuthenticatedException.php +++ b/app/Exceptions/UserNotAuthenticatedException.php @@ -2,26 +2,21 @@ namespace App\Exceptions; -use Illuminate\Http\Response; - use Exception; +use Illuminate\Http\Response; class UserNotAuthenticatedException extends Exception { protected $message; - - public function __construct($message = null) { parent::__construct($message ?: 'No autoritzat.'); // Si no pasa mensaje en la exepcion, lanzara este por defecto - } public function getHttpCode() { return Response::HTTP_UNAUTHORIZED; // Código HTTP 401 } - } diff --git a/app/Http/Controllers/api/AuthController.php b/app/Http/Controllers/api/AuthController.php index 035d26d9..d84a858d 100644 --- a/app/Http/Controllers/api/AuthController.php +++ b/app/Http/Controllers/api/AuthController.php @@ -21,7 +21,7 @@ public function login(LoginRequest $request) return response()->json([ 'message' => __('Autenticació amb èxit. Benvingut'), 'name' => ucwords($user->name), - 'token' => $token + 'token' => $token, ], 200); } catch (Exception $validationException) { @@ -35,15 +35,13 @@ public function login(LoginRequest $request) private function verifyUser(array $credentials) { - if (!Auth::attempt($credentials)) { + if (! Auth::attempt($credentials)) { throw new Exception(__('Credencials invàlides, comprova-les i torneu a iniciar sessió'), 401); - } + return Auth::user(); } - - public function logout() { $user = Auth::user(); diff --git a/app/Http/Controllers/api/RecruiterController.php b/app/Http/Controllers/api/RecruiterController.php index 1d53aa5c..9f3baa14 100644 --- a/app/Http/Controllers/api/RecruiterController.php +++ b/app/Http/Controllers/api/RecruiterController.php @@ -26,13 +26,12 @@ public function index() if ($recruitersList->isEmpty()) { throw new ModelNotFoundException(__('No hi ha reclutadors a la base de dades.'), 404); - } return response()->json([ 'data' => RecruiterListResource::collection($recruitersList)], 200); - } catch(ModelNotFoundException $modelNotFoundException) { + } catch (ModelNotFoundException $modelNotFoundException) { return response()->json(['message' => $modelNotFoundException->getMessage()], $modelNotFoundException->getCode()); } @@ -63,7 +62,7 @@ public function store(UserRequest $request) }); - if (!$recruiter) { + if (! $recruiter) { throw new HttpResponseException(response()->json([ 'message' => __( 'Registre no efectuat. Si us plau, torna-ho a provar.' @@ -81,14 +80,14 @@ public function show($id) try { $recruiter = Recruiter::where('id', $id)->first(); - if (!$recruiter) { + if (! $recruiter) { throw new ModelNotFoundException(__('Usuari no trobat.'), 404); } return response()->json([ 'data' => RecruiterResource::make($recruiter)], 200); - } catch(ModelNotFoundException $recruiterNotFoundExep) { + } catch (ModelNotFoundException $recruiterNotFoundExep) { return response()->json(['message' => $recruiterNotFoundExep->getMessage()], $recruiterNotFoundExep->getCode()); } } @@ -103,7 +102,6 @@ public function update(UpdateRecruiterRequest $request, $id) if ($recruiterId != $id) { throw new UserNotAuthenticatedException(__('Usuari no autenticat')); - } $updatedRecruiter = DB::transaction(function () use ($request, $id) { @@ -120,7 +118,7 @@ public function update(UpdateRecruiterRequest $request, $id) return $recruiter; }); - if (!$updatedRecruiter) { + if (! $updatedRecruiter) { throw new HttpResponseException(response()->json(['message' => __('Alguna cosa ha anat malament. Torna-ho a intentar més tard.')], 404)); } @@ -130,13 +128,12 @@ public function update(UpdateRecruiterRequest $request, $id) 'data' => RecruiterResource::make($updatedRecruiter)], 200 ); - } catch(UserNotAuthenticatedException $userNotAuth) { + } catch (UserNotAuthenticatedException $userNotAuth) { return response()->json(['message' => $userNotAuth->getMessage()], $userNotAuth->getHttpCode()); } - } public function destroy($id) @@ -149,7 +146,6 @@ public function destroy($id) if ($recruiterId != $id) { throw new UserNotAuthenticatedException(__('Usuari no autenticat')); - } $deletedRecruiter = DB::transaction(function () use ($id) { @@ -161,7 +157,7 @@ public function destroy($id) return true; }); - if (!$deletedRecruiter) { + if (! $deletedRecruiter) { throw new HttpResponseException(response()->json([ 'message' => __( 'Alguna cosa ha anat malament. Torna-ho a intenar més tard.' @@ -172,14 +168,10 @@ public function destroy($id) 'message' => __( "T'has donat de baixa com a reclutador d'It Profiles." )], 200); - } catch(UserNotAuthenticatedException $authException) { + } catch (UserNotAuthenticatedException $authException) { return response()->json(['message' => $authException->getMessage()], $authException->getHttpCode()); } - - } - - } diff --git a/app/Http/Controllers/api/TagController.php b/app/Http/Controllers/api/TagController.php index 6563cab4..4bb8e1ee 100644 --- a/app/Http/Controllers/api/TagController.php +++ b/app/Http/Controllers/api/TagController.php @@ -6,8 +6,8 @@ use App\Http\Requests\TagRequest; use App\Http\Resources\TagResource; use App\Models\Tag; -use Illuminate\Http\Exceptions\HttpResponseException; use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Http\Exceptions\HttpResponseException; class TagController extends Controller { diff --git a/app/Http/Requests/LoginRequest.php b/app/Http/Requests/LoginRequest.php index 9440140e..54feb64b 100644 --- a/app/Http/Requests/LoginRequest.php +++ b/app/Http/Requests/LoginRequest.php @@ -25,7 +25,7 @@ public function authorize(): bool public function rules(): array { return [ - 'dni' => ['required','string', new DniNieRule()], + 'dni' => ['required', 'string', new DniNieRule()], 'password' => 'required|min:8|string', ]; } diff --git a/database/data/students.json b/database/data/students.json new file mode 100644 index 00000000..6e2f2e2c --- /dev/null +++ b/database/data/students.json @@ -0,0 +1,73 @@ +[ + { + "nombreCompleto": "Juan Pérez", + "profesion": "Desarrollador Frontend", + "foto": "img/stud_2.png", + "lenguajes": ["JavaScript", "React", "HTML", "CSS"], + "id": 1 + }, + { + "nombreCompleto": "María García", + "profesion": "Diseñadora UX/UI", + "foto": "img/stud_1.png", + "lenguajes": ["CSS", "Sketch", "InVision"], + "id": 2 + }, + { + "nombreCompleto": "Carlos Rodríguez", + "profesion": "Ingeniero de Software", + "foto": "img/stud_3.png", + "lenguajes": ["Java", "PHP", "JavaScript", "React"], + "id": 3 + }, + { + "nombreCompleto": "Laura Martínez", + "profesion": "Desarrolladora Full Stack", + "foto": "img/stud_1.png", + "lenguajes": ["JavaScript", "Node.js", "Express", "SQL"], + "id": 4 + }, + { + "nombreCompleto": "Elena López", + "profesion": "Frontend React", + "foto": "img/stud_2.png", + "lenguajes": ["CSS", "React", "Figma"], + "id": 5 + }, + { + "nombreCompleto": "Alejandro Ruiz", + "profesion": "Desarrollador Frontend", + "foto": "img/stud_3.png", + "lenguajes": ["JavaScript", "Vue.js", "HTML", "CSS"], + "id": 6 + }, + { + "nombreCompleto": "Sofía Hernández", + "profesion": "Diseñadora Gráfica", + "foto": "img/stud_1.png", + "lenguajes": ["Illustrator", "Photoshop", "InDesign"], + "id": 7 + }, + { + "nombreCompleto": "Martín González", + "profesion": "Ingeniero de Software", + "foto": "img/stud_2.png", + "lenguajes": ["Java", "PHP", "JavaScript", "React"], + "id": 8 + }, + { + "nombreCompleto": "Ana Castro", + "profesion": "Desarrolladora Full Stack", + "foto": "img/stud_3.png", + "lenguajes": ["JavaScript", "Node.js", "Express", "SQL"], + "id": 9 + }, + { + "nombreCompleto": "Javier Díaz", + "profesion": "Analista de Datos", + "foto": "img/stud_1.png", + "lenguajes": ["Python", "Pandas", "SQL"], + "id": 10 + } + +] \ No newline at end of file diff --git a/public/img/stud_1.png b/public/img/stud_1.png new file mode 100644 index 00000000..c0e389e4 Binary files /dev/null and b/public/img/stud_1.png differ diff --git a/public/img/stud_2.png b/public/img/stud_2.png new file mode 100644 index 00000000..0e60839c Binary files /dev/null and b/public/img/stud_2.png differ diff --git a/public/img/stud_3.png b/public/img/stud_3.png new file mode 100644 index 00000000..81f33b9b Binary files /dev/null and b/public/img/stud_3.png differ diff --git a/routes/api/v1.php b/routes/api/v1.php index 1dd47c1f..6f032c06 100644 --- a/routes/api/v1.php +++ b/routes/api/v1.php @@ -28,6 +28,13 @@ Route::get('/recruiters', [RecruiterController::class, 'index'])->name('recruiter.list'); Route::get('/recruiters/{id}', [RecruiterController::class, 'show'])->name('recruiter.show'); +//! ENDPOINT FALSO +Route::get('/fake-students', function () { + $data = file_get_contents(base_path('database/data/students.json')); + + return response()->json(json_decode($data, true)); +}); + //Admins Route Route::post('/admins', [AdminController::class, 'store'])->name('admins.create'); //Passport Auth with token diff --git a/tests/Feature/Recruiter/RecruiterDeleteTest.php b/tests/Feature/Recruiter/RecruiterDeleteTest.php index 1715d29f..9455bd47 100644 --- a/tests/Feature/Recruiter/RecruiterDeleteTest.php +++ b/tests/Feature/Recruiter/RecruiterDeleteTest.php @@ -10,9 +10,10 @@ class RecruiterDeleteTest extends TestCase { use DatabaseTransactions; + private function verifyOrCreateRole() { - if (!Role::where('name', 'recruiter')->exists()) { + if (! Role::where('name', 'recruiter')->exists()) { Role::create(['name' => 'recruiter']); } } @@ -36,7 +37,7 @@ public function test_delete_specifc_recruiter() $response = $this->deleteJson(route('recruiter.delete', ['id' => $recruiter->id])); $response->assertHeader('Content-Type', 'application/json'); - $response->assertJson(['message' => "T'has donat de baixa com a reclutador d'It Profiles." ]); + $response->assertJson(['message' => "T'has donat de baixa com a reclutador d'It Profiles."]); $response->assertStatus(200); } @@ -62,7 +63,7 @@ public function test_cannot_delete_specifc_recruiter() $response = $this->deleteJson(route('recruiter.delete', ['id' => $fakeId])); $response->assertHeader('Content-Type', 'application/json'); - $response->assertJson(['message' => "Usuari no autenticat" ]); + $response->assertJson(['message' => 'Usuari no autenticat']); $response->assertStatus(401); } diff --git a/tests/Feature/Recruiter/RecruiterListTest.php b/tests/Feature/Recruiter/RecruiterListTest.php index 16e65f02..ec9b5f97 100644 --- a/tests/Feature/Recruiter/RecruiterListTest.php +++ b/tests/Feature/Recruiter/RecruiterListTest.php @@ -10,7 +10,6 @@ class RecruiterListTest extends TestCase { use DatabaseTransactions; - public function test_it_returns_a_list_of_recruiters() { diff --git a/tests/Feature/Recruiter/RecruiterRegisterTest.php b/tests/Feature/Recruiter/RecruiterRegisterTest.php index 07e7cde6..6d4e4d92 100644 --- a/tests/Feature/Recruiter/RecruiterRegisterTest.php +++ b/tests/Feature/Recruiter/RecruiterRegisterTest.php @@ -11,7 +11,6 @@ class RecruiterRegisterTest extends TestCase { use DatabaseTransactions; - public function setUp(): void { parent::setUp(); @@ -22,7 +21,7 @@ public function setUp(): void public function verifyOrCreateRole() { - if (!Role::where('name', 'recruiter')->exists()) { + if (! Role::where('name', 'recruiter')->exists()) { Role::create(['name' => 'recruier']); } diff --git a/tests/Feature/Recruiter/RecruiterShowTest.php b/tests/Feature/Recruiter/RecruiterShowTest.php index d0107e8b..81892243 100644 --- a/tests/Feature/Recruiter/RecruiterShowTest.php +++ b/tests/Feature/Recruiter/RecruiterShowTest.php @@ -10,11 +10,9 @@ class RecruiterShowTest extends TestCase { use DatabaseTransactions; - public function test_show_specific_recruiter() { - $user = User::factory()->create(); $recruiter = $user->recruiter()->create([ 'company' => 'Apple', @@ -30,7 +28,6 @@ public function test_show_specific_recruiter() ], ]); - } public function test_search_recruiter_not_found() @@ -44,8 +41,4 @@ public function test_search_recruiter_not_found() ]); } - - - - } diff --git a/tests/Feature/Recruiter/RecruiterUpdateTest.php b/tests/Feature/Recruiter/RecruiterUpdateTest.php index cc3824df..07ed7562 100644 --- a/tests/Feature/Recruiter/RecruiterUpdateTest.php +++ b/tests/Feature/Recruiter/RecruiterUpdateTest.php @@ -10,6 +10,7 @@ class RecruiterUpdateTest extends TestCase { use DatabaseTransactions; + public function setUp(): void { parent::setUp(); @@ -19,7 +20,7 @@ public function setUp(): void public function verifyOrCreateRole() { - if (!Role::where('name', 'recruiter')->exists()) { + if (! Role::where('name', 'recruiter')->exists()) { Role::create(['name' => 'recruiter']); } @@ -55,14 +56,13 @@ public function test_update_specific_recruiter() $this->assertEquals(ucfirst($user->recruiter->sector), $data['sector']); $response->assertJson([ - 'data' => [ - 'name' => ucwords($user->name), - 'surname' => ucwords($user->surname), - 'company' => ucwords($user->recruiter->company), - 'sector' => ucwords($user->recruiter->sector)] + 'data' => [ + 'name' => ucwords($user->name), + 'surname' => ucwords($user->surname), + 'company' => ucwords($user->recruiter->company), + 'sector' => ucwords($user->recruiter->sector)], ]); - $response->assertHeader('Content-Type', 'application/json'); $response->assertStatus(200); diff --git a/tests/Feature/TagControllerTest.php b/tests/Feature/TagControllerTest.php index b499c407..408bf709 100644 --- a/tests/Feature/TagControllerTest.php +++ b/tests/Feature/TagControllerTest.php @@ -20,7 +20,7 @@ protected function setUp(): void $user = User::factory()->create(); $adminRole = Role::where('name', 'admin')->first(); - if (!$adminRole) { + if (! $adminRole) { // If the "admin" role does not exist, create it $adminRole = Role::create(['name' => 'admin']); } @@ -83,8 +83,8 @@ public function testStoreFailsWhenTagNameIsMissing() $response->assertJsonStructure([ 'message', 'errors' => [ - 'tag_name' - ] + 'tag_name', + ], ]); $response->assertJsonFragment([