Files

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"
}
]
}