{
  "openapi": "3.0.3",
  "info": {
    "title": "MR.D.I.Y. Barcode Digital System API",
    "description": "Dokumentasi Lengkap API MR.D.I.Y. Barcode Digital System (Golang Gin + PostgreSQL). Mendukung Autentikasi JWT, User Management CRUD & Suspend Status, Relasional RBAC, Timer Aktivasi Voucher 10 Menit, Analytics UTM, Multi-SMTP Rotation Manager (CRUD, Test Rotasi, Daily Usage Tracking & Auto Reset Limit Perhari), Dual Payload (JSON & Form-Data), serta Format Response Envelope Terstandarisasi.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "http://localhost:8080/api/v1",
      "description": "Local Development Server"
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "MetaEnvelope": {
        "type": "object",
        "properties": {
          "code": { "type": "integer", "example": 200 },
          "status": { "type": "string", "example": "success" },
          "message": { "type": "string", "example": "Operasi berhasil" }
        }
      },
      "PaginationEnvelope": {
        "type": "object",
        "properties": {
          "page": { "type": "integer", "example": 1 },
          "limit": { "type": "integer", "example": 10 },
          "total_records": { "type": "integer", "example": 45 },
          "total_pages": { "type": "integer", "example": 5 }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "example": 1 },
          "name": { "type": "string", "example": "Admin MR.D.I.Y." },
          "email": { "type": "string", "example": "admin@mrdiy.co.id" },
          "avatar_url": { "type": "string", "example": "http://localhost:8080/uploads/avatars/avatar_1_178607.png" },
          "role_id": { "type": "integer", "example": 1 },
          "role_code": { "type": "string", "example": "admin" },
          "role_name": { "type": "string", "example": "Super Admin" },
          "is_active": { "type": "boolean", "example": true },
          "permissions": {
            "type": "array",
            "items": { "type": "string" },
            "example": ["events.read", "events.write", "stores.read", "vouchers.read", "rbac.manage"]
          }
        }
      },
      "SMTPConfig": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "example": 1 },
          "provider": { "type": "string", "example": "SendGrid Primary" },
          "host": { "type": "string", "example": "smtp.sendgrid.net" },
          "port": { "type": "integer", "example": 587 },
          "username": { "type": "string", "example": "apikey_sendgrid" },
          "from_email": { "type": "string", "example": "promo@mrdiy.co.id" },
          "from_name": { "type": "string", "example": "MR.D.I.Y. Promo" },
          "use_tls": { "type": "boolean", "example": true },
          "is_active": { "type": "boolean", "example": true },
          "daily_limit": { "type": "integer", "example": 500 },
          "daily_usage": { "type": "integer", "example": 12 },
          "quota_remaining": { "type": "integer", "example": 488 },
          "last_reset_date": { "type": "string", "example": "2026-08-07" },
          "usage_count": { "type": "integer", "example": 150 }
        }
      }
    }
  },
  "paths": {
    "/auth/login": {
      "post": {
        "tags": ["Authentication"],
        "summary": "Login User & Get JWT Token",
        "description": "Mendukung JSON dan Form-Data payload.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["email", "password"],
                "properties": {
                  "email": { "type": "string", "example": "admin@mrdiy.co.id" },
                  "password": { "type": "string", "example": "admin123" }
                }
              }
            }
          }
        },
        "responses": { "200": { "description": "Login berhasil" } }
      }
    },
    "/auth/users": {
      "get": {
        "tags": ["User Management CRUD"],
        "summary": "List All Users (Paginated & Filtered)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [
          { "name": "role_id", "in": "query", "type": "integer" },
          { "name": "search", "in": "query", "type": "string" },
          { "name": "is_active", "in": "query", "type": "boolean" },
          { "name": "page", "in": "query", "type": "integer", "example": 1 },
          { "name": "limit", "in": "query", "type": "integer", "example": 10 }
        ],
        "responses": { "200": { "description": "Daftar user" } }
      },
      "post": {
        "tags": ["User Management CRUD"],
        "summary": "Create User Admin/Staff",
        "security": [{ "BearerAuth": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["name", "email", "password", "role_id"],
                "properties": {
                  "name": { "type": "string", "example": "Manager Operasional" },
                  "email": { "type": "string", "example": "manager.ops@mrdiy.co.id" },
                  "password": { "type": "string", "example": "securepassword123" },
                  "role_id": { "type": "integer", "example": 2 },
                  "is_active": { "type": "boolean", "example": true }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "User dibuat" } }
      }
    },
    "/auth/users/{id}": {
      "get": {
        "tags": ["User Management CRUD"],
        "summary": "Get User Detail by ID",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "Detail User" } }
      },
      "put": {
        "tags": ["User Management CRUD"],
        "summary": "Update User Info (Name, Email, Role)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "User diperbarui" } }
      },
      "delete": {
        "tags": ["User Management CRUD"],
        "summary": "Delete User (Soft Delete)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "User dihapus" } }
      }
    },
    "/auth/users/{id}/status": {
      "put": {
        "tags": ["User Management CRUD"],
        "summary": "Suspend / Activate User Status Toggle",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "Status aktif user diperbarui" } }
      }
    },
    "/smtp/configs": {
      "get": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "List SMTP Configurations & Daily Usage Stats",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Daftar SMTP" } }
      },
      "post": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Create SMTP Provider Config with Daily Limit",
        "security": [{ "BearerAuth": [] }],
        "responses": { "201": { "description": "SMTP Config dibuat" } }
      }
    },
    "/smtp/configs/{id}": {
      "get": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Get SMTP Configuration Detail by ID",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "Detail SMTP Config" } }
      },
      "put": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Update SMTP Provider Info & Daily Limit",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "SMTP Config diperbarui" } }
      },
      "delete": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Delete SMTP Config",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "SMTP Provider dihapus" } }
      }
    },
    "/smtp/configs/{id}/reset-usage": {
      "put": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Manual Reset Daily Usage Counter to 0 for 1 Provider",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "type": "integer" }],
        "responses": { "200": { "description": "Usage harian provider berhasil di-reset" } }
      }
    },
    "/smtp/reset-all-usage": {
      "post": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Reset Daily Usage Counter to 0 for All SMTP Providers",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Usage harian seluruh provider di-reset" } }
      }
    },
    "/smtp/test-rotation": {
      "post": {
        "tags": ["Multi-SMTP Manager"],
        "summary": "Test Email Dispatch & Rotator with Daily Usage Counter",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Test rotasi SMTP berhasil" } }
      }
    }
  }
}
