openapi: 3.0.3 info: title: 'Pet Management API' description: 'API para la gestión de mascotas con sus dueños(En este caso Gatos). Esta es una API RESTful robusta, desarrollada conLaravel 8.x+ y PHP, cuyo objetivo es gestionar personas y sus mascotas. La API utiliza JWT (JSON Web Tokens) para la autenticación de usuarios, garantizando la seguridad de las rutas privadas. El proyecto sigue una arquitectura sugerida que incluye el uso de controladores, servicios, repositorios, recursos y validadores (Form Requests) para mantener una estructura de código limpia y escalable.' version: 1.0.0 servers: - url: 'https://pet-management-api.lorenzorojo.com' tags: - name: Auth description: 'Autenticación de un usuario en el API' - name: Person description: 'Person owner pets management' - name: Pet description: 'Pet Management' - name: Reports description: 'API Reports' components: securitySchemes: default: type: http scheme: bearer description: 'You can retrieve your token by visiting your dashboard and clicking Generate API token.' security: - default: [] paths: /api/v1/auth/login: post: summary: 'Get a JWT via given credentials.' operationId: getAJWTViaGivenCredentials description: '' parameters: [] responses: { } tags: - Auth requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: qkunze@example.com nullable: false password: type: string description: 'Must be at least 6 characters.' example: 'Z5ij-e/dl4m{o,' nullable: false required: - email - password security: [] /api/v1/auth/logout: post: summary: 'Log the user out (Invalidate the token).' operationId: logTheUserOutInvalidateTheToken description: '' parameters: [] responses: { } tags: - Auth /api/v1/auth/me: get: summary: 'Get the authenticated User.' operationId: getTheAuthenticatedUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Auth /api/v1/auth/refresh: post: summary: 'Refresh a token.' operationId: refreshAToken description: '' parameters: [] responses: { } tags: - Auth /api/v1/auth/register: post: summary: 'Store new User' operationId: storeNewUser description: '' parameters: [] responses: { } tags: - Auth requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false password: type: string description: 'Must be at least 6 characters.' example: '4[*UyPJ"}6' nullable: false required: - name - email - password security: [] /api/v1/person: get: summary: 'Display a listing of the resource.' operationId: displayAListingOfTheResource description: '' parameters: - in: query name: page description: 'Must be at least 1.' example: 73 required: true schema: type: integer description: 'Must be at least 1.' example: 73 nullable: false - in: query name: perPage description: 'Must be at least 1. Must not be greater than 100.' example: 13 required: true schema: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 13 nullable: false responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Person post: summary: 'Store a newly created resource in storage.' operationId: storeANewlyCreatedResourceInStorage description: '' parameters: [] responses: { } tags: - Person requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false birthdate: type: string description: 'Must be a valid date in the format Y-m-d.' example: '2025-08-19' nullable: false required: - name - email - birthdate '/api/v1/person/{id}': get: summary: 'Display the specified resource.' operationId: displayTheSpecifiedResource description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Person put: summary: 'Update the specified resource in storage.' operationId: updateTheSpecifiedResourceInStorage description: '' parameters: [] responses: { } tags: - Person requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: vmqeopfuudtdsufvyvddq nullable: false email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: kunde.eloisa@example.com nullable: false birthdate: type: string description: 'Must be a valid date in the format Y-m-d.' example: '2025-08-19' nullable: false delete: summary: 'Remove the specified resource from storage.' operationId: removeTheSpecifiedResourceFromStorage description: '' parameters: [] responses: { } tags: - Person parameters: - in: path name: id description: 'The ID of the person.' example: 1 required: true schema: type: integer /api/v1/pet: get: summary: 'Display a listing of the resource.' operationId: displayAListingOfTheResource description: '' parameters: - in: query name: page description: 'Must be at least 1.' example: 73 required: true schema: type: integer description: 'Must be at least 1.' example: 73 nullable: false - in: query name: perPage description: 'Must be at least 1. Must not be greater than 100.' example: 13 required: true schema: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 13 nullable: false responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Pet post: summary: 'Store a newly created resource in storage.' operationId: storeANewlyCreatedResourceInStorage description: '' parameters: [] responses: { } tags: - Pet requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 60 characters.' example: vmqeopfuudtdsufvyvddq nullable: false species: type: string description: 'Must not be greater than 60 characters.' example: amniihfqcoynlazghdtqt nullable: false breed: type: string description: 'Must not be greater than 60 characters.' example: qxbajwbpilpmufinllwlo nullable: false age: type: integer description: '' example: 17 nullable: false person_id: type: integer description: 'The id of an existing record in the people table.' example: 17 nullable: false required: - name - species - breed - age - person_id '/api/v1/pet/{id}': get: summary: 'Display the specified resource.' operationId: displayTheSpecifiedResource description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Pet put: summary: 'Update the specified resource in storage.' operationId: updateTheSpecifiedResourceInStorage description: '' parameters: [] responses: { } tags: - Pet requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 60 characters.' example: vmqeopfuudtdsufvyvddq nullable: false species: type: string description: 'Must not be greater than 60 characters.' example: amniihfqcoynlazghdtqt nullable: false breed: type: string description: 'Must not be greater than 60 characters.' example: qxbajwbpilpmufinllwlo nullable: false age: type: integer description: '' example: 17 nullable: false person_id: type: integer description: 'The id of an existing record in the people table.' example: 17 nullable: false required: - name - species - breed - age - person_id delete: summary: 'Remove the specified resource from storage.' operationId: removeTheSpecifiedResourceFromStorage description: '' parameters: [] responses: { } tags: - Pet parameters: - in: path name: id description: 'The ID of the pet.' example: 1 required: true schema: type: integer /api/v1/pet/cat/breeds: get: summary: "Get available breeds 'The CAT API'" operationId: getAvailableBreedsTheCATAPI description: '' parameters: - in: query name: page description: 'Current page number.' example: 0 required: true schema: type: integer description: 'Current page number.' example: 0 nullable: false - in: query name: perPage description: 'Registers by page.' example: 10 required: true schema: type: integer description: 'Registers by page.' example: 10 nullable: false responses: 401: description: '' content: application/json: schema: type: object example: error: 'Invalid tokenWrong number of segments' properties: error: type: string example: 'Invalid tokenWrong number of segments' tags: - Pet '/api/v1/person/{person_id}/with-pets': get: summary: 'Devuelve una persona con sus mascotas' operationId: devuelveUnaPersonaConSusMascotas description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: id: 111 name: Pepito email: pepito123@gmail.com birthdate: 13-08-1995 pets: - id: 11 name: Michilina species: cat breed: angora age: '10.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 12 name: Minina species: cat breed: Criolla age: '8.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 13 name: Minina species: cat breed: Criolla age: '8.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 14 name: 'Minina Acur' species: cat breed: Abyssinian age: '8.00' image_url: 'https://cdn2.thecatapi.com/images/0XYvRd7oD.jpg' life_span: '14 - 15' adaptability: 5 reference_image_id: 0XYvRd7oD created_at: '2025-05-18' - id: 15 name: 'Minina Acur sdsdsdsd' species: Gato breed: Abyssinian age: '5.00' image_url: 'https://cdn2.thecatapi.com/images/0XYvRd7oD.jpg' life_span: '14 - 15' adaptability: 5 reference_image_id: 0XYvRd7oD created_at: '2025-05-18' properties: id: type: integer example: 111 name: type: string example: Pepito email: type: string example: pepito123@gmail.com birthdate: type: string example: 13-08-1995 pets: type: array example: - id: 11 name: Michilina species: cat breed: angora age: '10.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 12 name: Minina species: cat breed: Criolla age: '8.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 13 name: Minina species: cat breed: Criolla age: '8.00' image_url: null life_span: null adaptability: null reference_image_id: null created_at: '2025-05-18' - id: 14 name: 'Minina Acur' species: cat breed: Abyssinian age: '8.00' image_url: 'https://cdn2.thecatapi.com/images/0XYvRd7oD.jpg' life_span: '14 - 15' adaptability: 5 reference_image_id: 0XYvRd7oD created_at: '2025-05-18' - id: 15 name: 'Minina Acur sdsdsdsd' species: Gato breed: Abyssinian age: '5.00' image_url: 'https://cdn2.thecatapi.com/images/0XYvRd7oD.jpg' life_span: '14 - 15' adaptability: 5 reference_image_id: 0XYvRd7oD created_at: '2025-05-18' items: type: object properties: id: type: integer example: 11 name: type: string example: Michilina species: type: string example: cat breed: type: string example: angora age: type: string example: '10.00' image_url: type: string example: null life_span: type: string example: null adaptability: type: string example: null reference_image_id: type: string example: null created_at: type: string example: '2025-05-18' tags: - Reports parameters: - in: path name: person_id description: 'The ID of the person.' example: 1 required: true schema: type: integer