feat: add storage structure and gitignore placeholders
This commit is contained in:
Executable
+773
@@ -0,0 +1,773 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user