308 lines
8.4 KiB
YAML
308 lines
8.4 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: WalkGuide API
|
|
version: 1.0.0
|
|
description: Design contract for WalkGuide Flutter and Spring Boot integration.
|
|
servers:
|
|
- url: https://api.walkguide.example/api/v1
|
|
description: Production deployment URL placeholder
|
|
security:
|
|
- bearerAuth: []
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
schemas:
|
|
ApiResponse:
|
|
type: object
|
|
properties:
|
|
success: { type: boolean }
|
|
data: { nullable: true }
|
|
message: { type: string }
|
|
timestamp: { type: string, format: date-time }
|
|
LoginRequest:
|
|
type: object
|
|
required: [email, password]
|
|
properties:
|
|
email: { type: string, format: email }
|
|
password: { type: string }
|
|
RegisterRequest:
|
|
type: object
|
|
required: [email, password, displayName, role]
|
|
properties:
|
|
email: { type: string, format: email }
|
|
password: { type: string, minLength: 6 }
|
|
displayName: { type: string }
|
|
role: { type: string, enum: [USER, GUARDIAN] }
|
|
PairingInviteRequest:
|
|
type: object
|
|
required: [pairingCode]
|
|
properties:
|
|
pairingCode: { type: string, minLength: 8, maxLength: 8, description: "Temporary code generated by the User app; expires automatically." }
|
|
uniqueUserId: { type: string, minLength: 12, maxLength: 12, deprecated: true }
|
|
PairingCodeResponse:
|
|
type: object
|
|
properties:
|
|
pairingCode: { type: string }
|
|
expiresAt: { type: string, format: date-time }
|
|
expiresInSeconds: { type: integer, format: int64 }
|
|
PairingRespondRequest:
|
|
type: object
|
|
required: [pairingId, accept]
|
|
properties:
|
|
pairingId: { type: integer, format: int64 }
|
|
accept: { type: boolean }
|
|
LocationUpdateRequest:
|
|
type: object
|
|
properties:
|
|
lat: { type: number, format: double }
|
|
lng: { type: number, format: double }
|
|
accuracy: { type: number, format: double }
|
|
speed: { type: number, format: double }
|
|
heading: { type: number, format: double }
|
|
CallTokenRequest:
|
|
type: object
|
|
required: [receiverId]
|
|
properties:
|
|
receiverId: { type: integer, format: int64 }
|
|
paths:
|
|
/auth/ping:
|
|
get:
|
|
security: []
|
|
responses:
|
|
"200": { description: Server health, content: { application/json: { schema: { $ref: "#/components/schemas/ApiResponse" } } } }
|
|
/auth/register:
|
|
post:
|
|
security: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/RegisterRequest" }
|
|
responses:
|
|
"200": { description: Registered }
|
|
/auth/login:
|
|
post:
|
|
security: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/LoginRequest" }
|
|
responses:
|
|
"200": { description: Logged in }
|
|
/auth/refresh:
|
|
post:
|
|
security: []
|
|
responses:
|
|
"200": { description: Token refreshed }
|
|
/auth/logout:
|
|
post:
|
|
responses:
|
|
"200": { description: Logged out }
|
|
/auth/fcm-token:
|
|
put:
|
|
responses:
|
|
"200": { description: FCM token updated }
|
|
/shared/pairing/invite:
|
|
post:
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/PairingInviteRequest" }
|
|
responses:
|
|
"200": { description: Invite sent }
|
|
/shared/pairing/code:
|
|
get:
|
|
responses:
|
|
"200": { description: Active expiring pairing code }
|
|
/shared/pairing/code/regenerate:
|
|
post:
|
|
responses:
|
|
"200": { description: New expiring pairing code generated }
|
|
/shared/pairing/respond:
|
|
post:
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/PairingRespondRequest" }
|
|
responses:
|
|
"200": { description: Invite responded }
|
|
/shared/pairing/unpair:
|
|
delete:
|
|
responses:
|
|
"200": { description: Pairing removed }
|
|
/shared/pairing/status:
|
|
get:
|
|
responses:
|
|
"200": { description: Pairing status }
|
|
/shared/call/token:
|
|
post:
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/CallTokenRequest" }
|
|
responses:
|
|
"200": { description: Agora token generated }
|
|
/shared/call/notify:
|
|
post:
|
|
responses:
|
|
"200": { description: Incoming call notification sent }
|
|
/shared/call/end:
|
|
post:
|
|
responses:
|
|
"200": { description: Call end notification sent }
|
|
/user/profile:
|
|
get:
|
|
responses:
|
|
"200": { description: Current user profile }
|
|
/user/settings:
|
|
get:
|
|
responses:
|
|
"200": { description: User settings }
|
|
put:
|
|
responses:
|
|
"200": { description: User settings updated }
|
|
/user/voice-commands:
|
|
get:
|
|
responses:
|
|
"200": { description: Voice commands }
|
|
/user/shortcuts:
|
|
get:
|
|
responses:
|
|
"200": { description: Hardware shortcuts }
|
|
put:
|
|
responses:
|
|
"200": { description: Hardware shortcut updated }
|
|
/user/ai-config:
|
|
get:
|
|
responses:
|
|
"200": { description: AI config }
|
|
/user/location:
|
|
post:
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema: { $ref: "#/components/schemas/LocationUpdateRequest" }
|
|
responses:
|
|
"200": { description: Location stored }
|
|
/user/obstacle:
|
|
post:
|
|
responses:
|
|
"200": { description: Obstacle stored }
|
|
/user/sos:
|
|
post:
|
|
responses:
|
|
"200": { description: SOS triggered }
|
|
/user/sos-events:
|
|
get:
|
|
responses:
|
|
"200": { description: User SOS history }
|
|
/user/activity-logs:
|
|
get:
|
|
responses:
|
|
"200": { description: User activity logs }
|
|
/user/notifications:
|
|
get:
|
|
responses:
|
|
"200": { description: User notifications }
|
|
/user/notifications/unread-count:
|
|
get:
|
|
responses:
|
|
"200": { description: Unread notification count }
|
|
/user/notifications/mark-all-read:
|
|
put:
|
|
responses:
|
|
"200": { description: All notifications marked read }
|
|
/user/notifications/{id}/read:
|
|
put:
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
"200": { description: One notification marked read }
|
|
/user/walkguide/start:
|
|
post:
|
|
responses:
|
|
"200": { description: WalkGuide start logged }
|
|
/user/walkguide/stop:
|
|
post:
|
|
responses:
|
|
"200": { description: WalkGuide stop logged }
|
|
/guardian/dashboard:
|
|
get:
|
|
responses:
|
|
"200": { description: Guardian dashboard }
|
|
/guardian/user-location:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user latest location }
|
|
/guardian/location-history:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user location history }
|
|
/guardian/activity-logs:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user activity logs }
|
|
/guardian/obstacle-logs:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user obstacle logs }
|
|
/guardian/notifications/send:
|
|
post:
|
|
responses:
|
|
"200": { description: Notification sent to paired user }
|
|
/guardian/sos-events:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user SOS events }
|
|
/guardian/sos/{id}/acknowledge:
|
|
put:
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
"200": { description: SOS acknowledged }
|
|
/guardian/ai-config:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user AI config }
|
|
put:
|
|
responses:
|
|
"200": { description: Paired user AI config updated }
|
|
/guardian/voice-commands:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user voice commands }
|
|
put:
|
|
responses:
|
|
"200": { description: Paired user voice command updated }
|
|
/guardian/shortcuts:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user shortcuts }
|
|
/guardian/geofence:
|
|
get:
|
|
responses:
|
|
"200": { description: Geofence config }
|
|
put:
|
|
responses:
|
|
"200": { description: Geofence config updated }
|
|
/guardian/user-settings:
|
|
get:
|
|
responses:
|
|
"200": { description: Paired user settings }
|
|
put:
|
|
responses:
|
|
"200": { description: Paired user settings updated }
|