chore: add spec-kit and standardize signatures
- Added GitHub spec-kit for development workflow - Standardized file signatures to Descomplicar® format - Updated development configuration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
544
specs/001-care-api-sistema/contracts/openapi.yaml
Normal file
544
specs/001-care-api-sistema/contracts/openapi.yaml
Normal file
@@ -0,0 +1,544 @@
|
||||
openapi: 3.0.3
|
||||
info:
|
||||
title: KiviCare API
|
||||
description: REST API for KiviCare healthcare management system
|
||||
version: 1.0.0
|
||||
contact:
|
||||
name: Descomplicar® Crescimento Digital
|
||||
url: https://descomplicar.pt
|
||||
|
||||
servers:
|
||||
- url: /wp-json/kivicare/v1
|
||||
description: WordPress REST API base
|
||||
|
||||
security:
|
||||
- BearerAuth: []
|
||||
|
||||
paths:
|
||||
# Authentication
|
||||
/auth/login:
|
||||
post:
|
||||
tags: [Authentication]
|
||||
summary: User login
|
||||
security: []
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
required: [username, password]
|
||||
properties:
|
||||
username: {type: string}
|
||||
password: {type: string, format: password}
|
||||
responses:
|
||||
200:
|
||||
description: Login successful
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
token: {type: string}
|
||||
user_id: {type: integer}
|
||||
role: {type: string, enum: [administrator, doctor, patient, receptionist]}
|
||||
expires_at: {type: string, format: date-time}
|
||||
401:
|
||||
$ref: '#/components/responses/UnauthorizedError'
|
||||
|
||||
# Clinics
|
||||
/clinics:
|
||||
get:
|
||||
tags: [Clinics]
|
||||
summary: List clinics
|
||||
parameters:
|
||||
- name: status
|
||||
in: query
|
||||
schema: {type: integer, enum: [0, 1]}
|
||||
responses:
|
||||
200:
|
||||
description: Clinics list
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Clinic'
|
||||
post:
|
||||
tags: [Clinics]
|
||||
summary: Create clinic
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ClinicInput'
|
||||
responses:
|
||||
201:
|
||||
description: Clinic created
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Clinic'
|
||||
400:
|
||||
$ref: '#/components/responses/ValidationError'
|
||||
|
||||
/clinics/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Clinics]
|
||||
summary: Get clinic by ID
|
||||
responses:
|
||||
200:
|
||||
description: Clinic details
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Clinic'
|
||||
404:
|
||||
$ref: '#/components/responses/NotFoundError'
|
||||
put:
|
||||
tags: [Clinics]
|
||||
summary: Update clinic
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ClinicInput'
|
||||
responses:
|
||||
200:
|
||||
description: Clinic updated
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Clinic'
|
||||
delete:
|
||||
tags: [Clinics]
|
||||
summary: Delete clinic
|
||||
responses:
|
||||
204:
|
||||
description: Clinic deleted
|
||||
409:
|
||||
description: Cannot delete clinic with active patients/doctors
|
||||
|
||||
# Patients
|
||||
/patients:
|
||||
get:
|
||||
tags: [Patients]
|
||||
summary: List patients
|
||||
parameters:
|
||||
- name: clinic_id
|
||||
in: query
|
||||
schema: {type: integer}
|
||||
- name: search
|
||||
in: query
|
||||
schema: {type: string}
|
||||
responses:
|
||||
200:
|
||||
description: Patients list
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Patient'
|
||||
post:
|
||||
tags: [Patients]
|
||||
summary: Create patient
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PatientInput'
|
||||
responses:
|
||||
201:
|
||||
description: Patient created
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Patient'
|
||||
|
||||
/patients/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Patients]
|
||||
summary: Get patient by ID
|
||||
responses:
|
||||
200:
|
||||
description: Patient details
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Patient'
|
||||
put:
|
||||
tags: [Patients]
|
||||
summary: Update patient
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PatientInput'
|
||||
responses:
|
||||
200:
|
||||
description: Patient updated
|
||||
|
||||
/patients/{id}/encounters:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Patients]
|
||||
summary: Get patient encounters
|
||||
responses:
|
||||
200:
|
||||
description: Patient encounters
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Encounter'
|
||||
|
||||
# Appointments
|
||||
/appointments:
|
||||
get:
|
||||
tags: [Appointments]
|
||||
summary: List appointments
|
||||
parameters:
|
||||
- name: doctor_id
|
||||
in: query
|
||||
schema: {type: integer}
|
||||
- name: patient_id
|
||||
in: query
|
||||
schema: {type: integer}
|
||||
- name: date
|
||||
in: query
|
||||
schema: {type: string, format: date}
|
||||
responses:
|
||||
200:
|
||||
description: Appointments list
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Appointment'
|
||||
post:
|
||||
tags: [Appointments]
|
||||
summary: Create appointment
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/AppointmentInput'
|
||||
responses:
|
||||
201:
|
||||
description: Appointment created
|
||||
|
||||
/appointments/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Appointments]
|
||||
summary: Get appointment by ID
|
||||
responses:
|
||||
200:
|
||||
description: Appointment details
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Appointment'
|
||||
put:
|
||||
tags: [Appointments]
|
||||
summary: Update appointment
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/AppointmentInput'
|
||||
responses:
|
||||
200:
|
||||
description: Appointment updated
|
||||
delete:
|
||||
tags: [Appointments]
|
||||
summary: Cancel appointment
|
||||
responses:
|
||||
200:
|
||||
description: Appointment cancelled
|
||||
|
||||
# Encounters
|
||||
/encounters:
|
||||
get:
|
||||
tags: [Encounters]
|
||||
summary: List encounters
|
||||
parameters:
|
||||
- name: patient_id
|
||||
in: query
|
||||
schema: {type: integer}
|
||||
- name: doctor_id
|
||||
in: query
|
||||
schema: {type: integer}
|
||||
responses:
|
||||
200:
|
||||
description: Encounters list
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Encounter'
|
||||
post:
|
||||
tags: [Encounters]
|
||||
summary: Create encounter
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/EncounterInput'
|
||||
responses:
|
||||
201:
|
||||
description: Encounter created
|
||||
|
||||
/encounters/{id}:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Encounters]
|
||||
summary: Get encounter by ID
|
||||
responses:
|
||||
200:
|
||||
description: Encounter details
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Encounter'
|
||||
put:
|
||||
tags: [Encounters]
|
||||
summary: Update encounter
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/EncounterInput'
|
||||
responses:
|
||||
200:
|
||||
description: Encounter updated
|
||||
|
||||
/encounters/{id}/prescriptions:
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema: {type: integer}
|
||||
get:
|
||||
tags: [Prescriptions]
|
||||
summary: Get encounter prescriptions
|
||||
responses:
|
||||
200:
|
||||
description: Prescriptions list
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/Prescription'
|
||||
post:
|
||||
tags: [Prescriptions]
|
||||
summary: Add prescription to encounter
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/PrescriptionInput'
|
||||
responses:
|
||||
201:
|
||||
description: Prescription added
|
||||
|
||||
components:
|
||||
securitySchemes:
|
||||
BearerAuth:
|
||||
type: http
|
||||
scheme: bearer
|
||||
bearerFormat: JWT
|
||||
|
||||
schemas:
|
||||
Clinic:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: integer}
|
||||
name: {type: string}
|
||||
email: {type: string, format: email}
|
||||
telephone_no: {type: string}
|
||||
address: {type: string}
|
||||
city: {type: string}
|
||||
state: {type: string}
|
||||
country: {type: string}
|
||||
postal_code: {type: string}
|
||||
status: {type: integer, enum: [0, 1]}
|
||||
created_at: {type: string, format: date-time}
|
||||
|
||||
ClinicInput:
|
||||
type: object
|
||||
required: [name, email, telephone_no]
|
||||
properties:
|
||||
name: {type: string, maxLength: 191}
|
||||
email: {type: string, format: email, maxLength: 191}
|
||||
telephone_no: {type: string, maxLength: 191}
|
||||
address: {type: string}
|
||||
city: {type: string, maxLength: 191}
|
||||
state: {type: string, maxLength: 191}
|
||||
country: {type: string, maxLength: 191}
|
||||
postal_code: {type: string, maxLength: 191}
|
||||
|
||||
Patient:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: integer}
|
||||
display_name: {type: string}
|
||||
user_email: {type: string, format: email}
|
||||
phone: {type: string}
|
||||
birth_date: {type: string, format: date}
|
||||
gender: {type: string, enum: [M, F, Other]}
|
||||
clinic_id: {type: integer}
|
||||
registration_date: {type: string, format: date-time}
|
||||
|
||||
PatientInput:
|
||||
type: object
|
||||
required: [display_name, user_email, clinic_id]
|
||||
properties:
|
||||
display_name: {type: string, maxLength: 250}
|
||||
user_email: {type: string, format: email, maxLength: 100}
|
||||
phone: {type: string}
|
||||
birth_date: {type: string, format: date}
|
||||
gender: {type: string, enum: [M, F, Other]}
|
||||
clinic_id: {type: integer}
|
||||
|
||||
Appointment:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: integer}
|
||||
appointment_start_date: {type: string, format: date}
|
||||
appointment_start_time: {type: string, format: time}
|
||||
appointment_end_date: {type: string, format: date}
|
||||
appointment_end_time: {type: string, format: time}
|
||||
visit_type: {type: string}
|
||||
clinic_id: {type: integer}
|
||||
doctor_id: {type: integer}
|
||||
patient_id: {type: integer}
|
||||
description: {type: string}
|
||||
status: {type: integer, enum: [0, 1, 2, 3]}
|
||||
created_at: {type: string, format: date-time}
|
||||
|
||||
AppointmentInput:
|
||||
type: object
|
||||
required: [appointment_start_date, appointment_start_time, doctor_id, patient_id, clinic_id]
|
||||
properties:
|
||||
appointment_start_date: {type: string, format: date}
|
||||
appointment_start_time: {type: string, format: time}
|
||||
appointment_end_date: {type: string, format: date}
|
||||
appointment_end_time: {type: string, format: time}
|
||||
visit_type: {type: string}
|
||||
doctor_id: {type: integer}
|
||||
patient_id: {type: integer}
|
||||
clinic_id: {type: integer}
|
||||
description: {type: string}
|
||||
|
||||
Encounter:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: integer}
|
||||
encounter_date: {type: string, format: date}
|
||||
clinic_id: {type: integer}
|
||||
doctor_id: {type: integer}
|
||||
patient_id: {type: integer}
|
||||
appointment_id: {type: integer}
|
||||
description: {type: string}
|
||||
status: {type: integer, enum: [0, 1]}
|
||||
created_at: {type: string, format: date-time}
|
||||
|
||||
EncounterInput:
|
||||
type: object
|
||||
required: [appointment_id, description]
|
||||
properties:
|
||||
appointment_id: {type: integer}
|
||||
description: {type: string}
|
||||
status: {type: integer, enum: [0, 1]}
|
||||
|
||||
Prescription:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: integer}
|
||||
encounter_id: {type: integer}
|
||||
patient_id: {type: integer}
|
||||
name: {type: string}
|
||||
frequency: {type: string}
|
||||
duration: {type: string}
|
||||
instruction: {type: string}
|
||||
created_at: {type: string, format: date-time}
|
||||
|
||||
PrescriptionInput:
|
||||
type: object
|
||||
required: [name, frequency, duration]
|
||||
properties:
|
||||
name: {type: string}
|
||||
frequency: {type: string, maxLength: 199}
|
||||
duration: {type: string, maxLength: 199}
|
||||
instruction: {type: string}
|
||||
|
||||
responses:
|
||||
UnauthorizedError:
|
||||
description: Authentication required
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
code: {type: string, example: "rest_forbidden"}
|
||||
message: {type: string}
|
||||
data: {type: object, properties: {status: {type: integer}}}
|
||||
|
||||
ValidationError:
|
||||
description: Validation failed
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
code: {type: string, example: "rest_invalid_param"}
|
||||
message: {type: string}
|
||||
data: {type: object}
|
||||
|
||||
NotFoundError:
|
||||
description: Resource not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
code: {type: string, example: "rest_not_found"}
|
||||
message: {type: string}
|
||||
data: {type: object, properties: {status: {type: integer, example: 404}}}
|
||||
Reference in New Issue
Block a user