773 lines
27 KiB
JSON
Executable File
773 lines
27 KiB
JSON
Executable File
{
|
|
"openapi": "3.0.0",
|
|
"info": {
|
|
"title": "Premium Template API",
|
|
"description": "Unified API for Mobile and Web Integration. Authenticated endpoints require a Bearer token from POST /v1/login.",
|
|
"contact": {
|
|
"email": "admin@example.com"
|
|
},
|
|
"version": "1.1.0"
|
|
},
|
|
"servers": [
|
|
{
|
|
"url": "http://localhost:8000/api",
|
|
"description": "Local"
|
|
},
|
|
{
|
|
"url": "https://yourdomain.com/api",
|
|
"description": "Production"
|
|
}
|
|
],
|
|
"paths": {
|
|
"/v1/login": {
|
|
"post": {
|
|
"tags": [
|
|
"Auth"
|
|
],
|
|
"summary": "Authenticate a user",
|
|
"operationId": "login",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"email",
|
|
"password"
|
|
],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"example": "user@example.com"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"format": "password",
|
|
"example": "secret"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Login successful",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"example": "success"
|
|
},
|
|
"data": {
|
|
"properties": {
|
|
"user": {
|
|
"$ref": "#/components/schemas/User"
|
|
},
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Invalid credentials"
|
|
},
|
|
"403": {
|
|
"description": "Account inactive or role not permitted"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/register": {
|
|
"post": {
|
|
"tags": [
|
|
"Auth"
|
|
],
|
|
"summary": "Register a new user",
|
|
"operationId": "register",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"name",
|
|
"email",
|
|
"password"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"example": "John Doe"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Registration successful"
|
|
},
|
|
"422": {
|
|
"description": "Validation error"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/logout": {
|
|
"post": {
|
|
"tags": [
|
|
"Auth"
|
|
],
|
|
"summary": "Revoke current access token",
|
|
"operationId": "logout",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Logged out successfully"
|
|
},
|
|
"401": {
|
|
"description": "Unauthenticated"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/forgot-password": {
|
|
"post": {
|
|
"tags": [
|
|
"Auth"
|
|
],
|
|
"summary": "Send password reset link",
|
|
"operationId": "forgotPassword",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"email"
|
|
],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Reset link sent"
|
|
},
|
|
"422": {
|
|
"description": "Email not found or throttled"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/profile/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Profile"
|
|
],
|
|
"summary": "Update authenticated user profile",
|
|
"operationId": "updateProfile",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"name",
|
|
"email"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Profile updated"
|
|
},
|
|
"422": {
|
|
"description": "Validation error"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/profile/avatar": {
|
|
"post": {
|
|
"tags": [
|
|
"Profile"
|
|
],
|
|
"summary": "Upload user avatar",
|
|
"operationId": "updateAvatar",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"properties": {
|
|
"avatar": {
|
|
"type": "string",
|
|
"format": "binary"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Avatar updated"
|
|
},
|
|
"422": {
|
|
"description": "Validation error"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/dashboard": {
|
|
"get": {
|
|
"tags": [
|
|
"Dashboard"
|
|
],
|
|
"summary": "Get dashboard summary data",
|
|
"operationId": "getDashboard",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Dashboard data"
|
|
},
|
|
"401": {
|
|
"description": "Unauthenticated"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/profile/password": {
|
|
"post": {
|
|
"tags": [
|
|
"Profile"
|
|
],
|
|
"summary": "Change authenticated user password",
|
|
"operationId": "updatePassword",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"current_password",
|
|
"password",
|
|
"password_confirmation"
|
|
],
|
|
"properties": {
|
|
"current_password": {
|
|
"type": "string"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8
|
|
},
|
|
"password_confirmation": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Password updated"
|
|
},
|
|
"422": {
|
|
"description": "Current password incorrect"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/profile/delete": {
|
|
"delete": {
|
|
"tags": [
|
|
"Profile"
|
|
],
|
|
"summary": "Permanently delete authenticated user account",
|
|
"operationId": "deleteAccount",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Account deleted"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/user": {
|
|
"get": {
|
|
"tags": [
|
|
"Auth"
|
|
],
|
|
"summary": "Get authenticated user",
|
|
"operationId": "getUser",
|
|
"responses": {
|
|
"200": {
|
|
"description": "User object"
|
|
},
|
|
"401": {
|
|
"description": "Unauthenticated"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/app-config": {
|
|
"get": {
|
|
"tags": [
|
|
"Config"
|
|
],
|
|
"summary": "Get public app configuration (branding, taglines)",
|
|
"operationId": "getAppConfig",
|
|
"responses": {
|
|
"200": {
|
|
"description": "App config"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/devices/register": {
|
|
"post": {
|
|
"tags": [
|
|
"Push Notifications"
|
|
],
|
|
"summary": "Register a device token for push notifications",
|
|
"operationId": "registerDevice",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"token",
|
|
"platform"
|
|
],
|
|
"properties": {
|
|
"token": {
|
|
"description": "FCM device token",
|
|
"type": "string"
|
|
},
|
|
"platform": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ios",
|
|
"android",
|
|
"web"
|
|
]
|
|
},
|
|
"device_name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"app_version": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Device registered"
|
|
},
|
|
"422": {
|
|
"description": "Validation error"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/v1/devices/unregister": {
|
|
"delete": {
|
|
"tags": [
|
|
"Push Notifications"
|
|
],
|
|
"summary": "Remove a device token",
|
|
"operationId": "unregisterDevice",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"token"
|
|
],
|
|
"properties": {
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Device unregistered"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"sanctum": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/health": {
|
|
"get": {
|
|
"tags": [
|
|
"System"
|
|
],
|
|
"summary": "Application health check",
|
|
"description": "Returns status of database, Redis, storage, and queue. Returns 503 if any check fails.",
|
|
"operationId": "healthCheck",
|
|
"responses": {
|
|
"200": {
|
|
"description": "All systems healthy",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"example": "healthy"
|
|
},
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"checks": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "One or more checks degraded"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/mobile/sync": {
|
|
"get": {
|
|
"tags": [
|
|
"Mobile"
|
|
],
|
|
"summary": "Get mobile app configuration",
|
|
"description": "Returns cached mobile configuration including theme, flags, and assets.",
|
|
"operationId": "getMobileConfig",
|
|
"parameters": [
|
|
{
|
|
"name": "p",
|
|
"in": "query",
|
|
"description": "Platform (ios/android)",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "v",
|
|
"in": "query",
|
|
"description": "App Version",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Successful operation",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"example": "success"
|
|
},
|
|
"version": {
|
|
"type": "string",
|
|
"example": "1.1.0"
|
|
},
|
|
"data": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/otp/send": {
|
|
"post": {
|
|
"tags": [
|
|
"OTP"
|
|
],
|
|
"summary": "Send a 6-digit OTP to the given email",
|
|
"operationId": "otpSend",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"email"
|
|
],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "OTP sent"
|
|
},
|
|
"500": {
|
|
"description": "Mail delivery failed"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/v1/otp/verify": {
|
|
"post": {
|
|
"tags": [
|
|
"OTP"
|
|
],
|
|
"summary": "Verify an OTP code",
|
|
"operationId": "otpVerify",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"required": [
|
|
"email",
|
|
"code"
|
|
],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"code": {
|
|
"type": "string",
|
|
"example": "123456",
|
|
"maxLength": 6,
|
|
"minLength": 6
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "OTP verified"
|
|
},
|
|
"422": {
|
|
"description": "Invalid or expired OTP"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"User": {
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"is_active": {
|
|
"type": "boolean"
|
|
},
|
|
"created_at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"ApiSuccess": {
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"example": "success"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"ApiError": {
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"example": "error"
|
|
},
|
|
"message": {
|
|
"type": "string"
|
|
},
|
|
"errors": {
|
|
"type": "object",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"type": "object"
|
|
}
|
|
},
|
|
"securitySchemes": {
|
|
"sanctum": {
|
|
"type": "http",
|
|
"description": "Enter the token returned by POST /v1/login",
|
|
"bearerFormat": "Token",
|
|
"scheme": "bearer"
|
|
}
|
|
}
|
|
},
|
|
"tags": [
|
|
{
|
|
"name": "Auth",
|
|
"description": "Auth"
|
|
},
|
|
{
|
|
"name": "Profile",
|
|
"description": "Profile"
|
|
},
|
|
{
|
|
"name": "Dashboard",
|
|
"description": "Dashboard"
|
|
},
|
|
{
|
|
"name": "Config",
|
|
"description": "Config"
|
|
},
|
|
{
|
|
"name": "Push Notifications",
|
|
"description": "Push Notifications"
|
|
},
|
|
{
|
|
"name": "System",
|
|
"description": "System"
|
|
},
|
|
{
|
|
"name": "Mobile",
|
|
"description": "Mobile"
|
|
},
|
|
{
|
|
"name": "OTP",
|
|
"description": "OTP"
|
|
}
|
|
]
|
|
} |