2026-05-26 05:52:12 +07:00

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 }