d3ro-voice/apps/admin-swagger/openapi.json
Yun Chan 1af3cf75c7
Some checks are pending
deploy-site / deploy (push) Waiting to run
fix(release): stop shipping native modules built for the wrong runtime
The released installer could not start: it carried a better-sqlite3 build for the
host Node runtime instead of Electron, so the app died immediately with a module
version mismatch when it opened its database.

Packaging now proves the Electron build of every runtime-sensitive native module
before an installer or archive exists, and installers are produced only from that
verified tree, so the mistake cannot pass silently. The release pipelines run the
same check.

The default local model also pointed at a retired model: a *.gguf name that
Ollama cannot serve, while the settings, onboarding, and guide screens
recommended an older model. All of them now use the model the service code
already preferred.
2026-09-18 15:45:03 +09:00

782 lines
20 KiB
JSON

{
"openapi": "3.0.3",
"info": {
"title": "D3RO-VOICE Admin API",
"description": "Admin CRM Edge Functions for user management, subscription CRUD, payment history, and audit logs.",
"version": "1.3.3"
},
"servers": [
{
"url": "https://{supabaseRef}.supabase.co/functions/v1",
"description": "Production",
"variables": {
"supabaseRef": {
"default": "your-project-ref"
}
}
},
{
"url": "http://localhost:54321/functions/v1",
"description": "Local development"
}
],
"security": [
{
"BearerAuth": []
}
],
"components": {
"securitySchemes": {
"BearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT",
"description": "Supabase access_token (admin or super_admin role required)"
}
},
"schemas": {
"Profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string",
"nullable": true
},
"avatar_url": {
"type": "string",
"nullable": true
},
"locale": {
"type": "string"
},
"tier": {
"type": "string",
"enum": [
"free",
"pro",
"pro_plus"
]
},
"role": {
"type": "string",
"enum": [
"user",
"admin",
"super_admin"
]
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
}
}
},
"Subscription": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"user_id": {
"type": "string",
"format": "uuid"
},
"tier": {
"type": "string",
"enum": [
"free",
"pro",
"pro_plus"
]
},
"status": {
"type": "string",
"enum": [
"active",
"canceled",
"past_due",
"expired"
]
},
"payment_provider": {
"type": "string",
"enum": [
"none",
"stripe",
"payple"
]
},
"current_period_start": {
"type": "string",
"format": "date-time",
"nullable": true
},
"current_period_end": {
"type": "string",
"format": "date-time",
"nullable": true
},
"overage_credits": {
"type": "integer"
},
"admin_note": {
"type": "string",
"nullable": true
},
"renewal_failures": {
"type": "integer"
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
}
}
},
"AuditLog": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"admin_id": {
"type": "string",
"format": "uuid"
},
"admin_name": {
"type": "string"
},
"action": {
"type": "string"
},
"target_type": {
"type": "string"
},
"target_id": {
"type": "string",
"format": "uuid"
},
"before_data": {
"type": "object",
"nullable": true
},
"after_data": {
"type": "object",
"nullable": true
},
"memo": {
"type": "string"
},
"created_at": {
"type": "string",
"format": "date-time"
}
}
},
"Error": {
"type": "object",
"properties": {
"error": {
"type": "string"
}
}
}
}
},
"paths": {
"/admin-users": {
"get": {
"tags": [
"Users"
],
"summary": "List or get user details",
"description": "Admin+. Pass userId for single user detail, or omit for paginated list.",
"parameters": [
{
"name": "userId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
},
"description": "Specific user ID for detail view"
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"default": 1
}
},
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"default": 20
}
},
{
"name": "search",
"in": "query",
"schema": {
"type": "string"
},
"description": "Name search (ilike)"
},
{
"name": "role",
"in": "query",
"schema": {
"type": "string",
"enum": [
"user",
"admin",
"super_admin"
]
}
}
],
"responses": {
"200": {
"description": "User list or detail",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"profiles": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Profile"
}
},
"total": {
"type": "integer"
},
"page": {
"type": "integer"
},
"limit": {
"type": "integer"
}
}
},
{
"type": "object",
"properties": {
"profile": {
"$ref": "#/components/schemas/Profile"
},
"subscription": {
"$ref": "#/components/schemas/Subscription"
}
}
}
]
}
}
}
},
"403": {
"description": "Not admin",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"patch": {
"tags": [
"Users"
],
"summary": "Change user role",
"description": "Super admin only. Changes both auth.users.app_metadata.role and profiles.role.",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"userId",
"newRole",
"memo"
],
"properties": {
"userId": {
"type": "string",
"format": "uuid"
},
"newRole": {
"type": "string",
"enum": [
"user",
"admin",
"super_admin"
]
},
"memo": {
"type": "string",
"description": "Required reason for audit log"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Role changed successfully"
},
"403": {
"description": "Not super_admin"
}
}
}
},
"/admin-subscriptions": {
"get": {
"tags": [
"Subscriptions"
],
"summary": "List or get subscription details",
"parameters": [
{
"name": "userId",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"default": 1
}
},
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"default": 20
}
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"active",
"canceled",
"past_due",
"expired"
]
}
},
{
"name": "tier",
"in": "query",
"schema": {
"type": "string",
"enum": [
"free",
"pro",
"pro_plus"
]
}
}
],
"responses": {
"200": {
"description": "Subscription list or detail"
}
}
},
"post": {
"tags": [
"Subscriptions"
],
"summary": "Create subscription (VIP grant / record recovery)",
"description": "Super admin only.",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"userId",
"tier",
"memo"
],
"properties": {
"userId": {
"type": "string",
"format": "uuid"
},
"tier": {
"type": "string",
"enum": [
"free",
"pro",
"pro_plus"
]
},
"status": {
"type": "string",
"enum": [
"active",
"canceled",
"past_due",
"expired"
],
"default": "active"
},
"currentPeriodEnd": {
"type": "string",
"format": "date-time"
},
"adminNote": {
"type": "string"
},
"memo": {
"type": "string"
}
}
}
}
}
},
"responses": {
"201": {
"description": "Subscription created"
},
"409": {
"description": "Subscription already exists"
}
}
},
"patch": {
"tags": [
"Subscriptions"
],
"summary": "Update subscription",
"description": "Super admin only.",
"parameters": [
{
"name": "userId",
"in": "query",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"memo"
],
"properties": {
"tier": {
"type": "string",
"enum": [
"free",
"pro",
"pro_plus"
]
},
"status": {
"type": "string",
"enum": [
"active",
"canceled",
"past_due",
"expired"
]
},
"currentPeriodEnd": {
"type": "string",
"format": "date-time"
},
"overageCredits": {
"type": "integer"
},
"adminNote": {
"type": "string"
},
"memo": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Subscription updated"
}
}
},
"delete": {
"tags": [
"Subscriptions"
],
"summary": "Soft-delete subscription",
"description": "Super admin only. Sets status=expired, tier=free.",
"parameters": [
{
"name": "userId",
"in": "query",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"memo"
],
"properties": {
"memo": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Subscription soft-deleted"
}
}
}
},
"/admin-payments": {
"get": {
"tags": [
"Payments"
],
"summary": "Get payment history for a user",
"description": "Admin+. Returns DB subscription data + audit logs. Pass source=payple for Payple API history.",
"parameters": [
{
"name": "userId",
"in": "query",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "source",
"in": "query",
"schema": {
"type": "string",
"enum": [
"db",
"payple"
]
},
"description": "Add 'payple' to also fetch from Payple API"
}
],
"responses": {
"200": {
"description": "Payment history",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"subscription": {
"$ref": "#/components/schemas/Subscription"
},
"auditLogs": {
"type": "array",
"items": {
"$ref": "#/components/schemas/AuditLog"
}
},
"paypleHistory": {
"type": "object",
"description": "Payple API response (when source=payple)"
},
"paypleError": {
"type": "string",
"description": "Error message if Payple API call failed"
}
}
}
}
}
}
}
}
},
"/admin-audit-log": {
"get": {
"tags": [
"Audit Log"
],
"summary": "List or get audit log entries",
"description": "Admin+. Pass id for single entry detail.",
"parameters": [
{
"name": "id",
"in": "query",
"schema": {
"type": "integer"
},
"description": "Specific log entry ID"
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"default": 1
}
},
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"default": 20
}
},
{
"name": "target_type",
"in": "query",
"schema": {
"type": "string",
"enum": [
"subscription",
"profile"
]
}
},
{
"name": "admin_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "target_id",
"in": "query",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "from",
"in": "query",
"schema": {
"type": "string",
"format": "date"
},
"description": "Start date (YYYY-MM-DD)"
},
{
"name": "to",
"in": "query",
"schema": {
"type": "string",
"format": "date"
},
"description": "End date (YYYY-MM-DD)"
}
],
"responses": {
"200": {
"description": "Audit log list or detail",
"content": {
"application/json": {
"schema": {
"oneOf": [
{
"type": "object",
"properties": {
"logs": {
"type": "array",
"items": {
"$ref": "#/components/schemas/AuditLog"
}
},
"total": {
"type": "integer"
},
"page": {
"type": "integer"
},
"limit": {
"type": "integer"
}
}
},
{
"type": "object",
"properties": {
"log": {
"$ref": "#/components/schemas/AuditLog"
},
"admin": {
"$ref": "#/components/schemas/Profile"
}
}
}
]
}
}
}
}
}
}
}
}
}