@redonvn/redai-openapi-user 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -0
- package/dist/index.cjs +7137 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6867 -0
- package/dist/index.d.ts +6867 -0
- package/dist/index.js +7111 -0
- package/dist/index.js.map +1 -0
- package/openclaw.plugin.json +84 -0
- package/package.json +52 -0
- package/tool-catalog.json +1839 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../index.ts","../../redai-agent-sdk/src/client.ts","../tool-catalog.json","../user.json"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport {\n RedaiAgentClient,\n RedaiAgentError,\n type ToolExecutionInput\n} from \"@redonvn/redai-agent-sdk\";\nimport catalog from \"./tool-catalog.json\";\nimport spec from \"./user.json\";\n\nexport { catalog, spec };\n\nconst DEFAULT_AUTH_STORE_PATH =\n \"C:\\\\Users\\\\Acer\\\\.openclaw\\\\workspace-nhan-vien-redai\\\\auth\\\\redai-auth.json\";\n\ntype PluginRuntimeConfig = {\n baseUrl?: string;\n bearerToken?: string;\n apiKey?: string;\n apiKeyHeader?: string;\n defaultHeaders?: Record<string, string>;\n timeoutMs?: number;\n workspaceId?: string;\n baseId?: string;\n authStorePath?: string;\n};\n\ntype ToolResult = { content: Array<{ type: \"text\"; text: string }> };\n\ntype CatalogTool = {\n name: string;\n description: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n parameters: unknown;\n};\n\ntype OpenClawApiLike = {\n config?: {\n plugins?: {\n entries?: Record<string, { config?: PluginRuntimeConfig }>;\n };\n };\n registerTool: (\n definition: {\n name: string;\n description: string;\n parameters: unknown;\n execute: (id: string, params: unknown) => Promise<ToolResult>;\n },\n options?: { optional?: boolean }\n ) => void;\n};\n\ntype RedaiAuthEntry = {\n telegramUserId: string;\n bearerToken: string;\n workspaceId: string;\n baseId?: string | null;\n savedAt: string;\n lastValidatedAt: string | null;\n status: \"active\" | \"invalid\";\n};\n\ntype RedaiAuthStore = {\n version: 1;\n users: Record<string, RedaiAuthEntry>;\n};\n\nconst typedCatalog = catalog as {\n pluginId: string;\n optional?: boolean;\n serverUrl?: string;\n tools: CatalogTool[];\n};\n\nconst formatToolResult = (payload: unknown): ToolResult => ({\n content: [\n {\n type: \"text\",\n text: typeof payload === \"string\" ? payload : JSON.stringify(payload, null, 2)\n }\n ]\n});\n\nconst resolvePluginConfig = (api: OpenClawApiLike): PluginRuntimeConfig =>\n api.config?.plugins?.entries?.[typedCatalog.pluginId]?.config ?? {};\n\nconst cloneJson = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst removeHeadersFromSchema = (schema: unknown) => {\n const cloned = cloneJson((schema ?? { type: \"object\", properties: {} }) as Record<string, unknown>);\n const objectSchema = cloned as {\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n if (!objectSchema.properties) {\n objectSchema.properties = {};\n }\n delete objectSchema.properties.headers;\n if (Array.isArray(objectSchema.required)) {\n objectSchema.required = objectSchema.required.filter((item) => item !== \"headers\");\n }\n objectSchema.additionalProperties = false;\n return objectSchema;\n};\n\nconst buildAuthWrappedParameters = (tool: CatalogTool) => {\n const baseSchema = removeHeadersFromSchema(tool.parameters);\n return {\n ...baseSchema,\n description: `${tool.description} Uses the logged-in RedAI auth for the current Telegram DM user.`,\n properties: {\n telegramUserId: {\n type: \"string\",\n description:\n \"Telegram sender ID from DM metadata. The agent must derive this automatically from the current message.\"\n },\n ...(baseSchema.properties ?? {})\n },\n required: [\n \"telegramUserId\",\n ...((baseSchema.required ?? []).filter((item: string) => item !== \"telegramUserId\"))\n ]\n };\n};\n\nconst buildAuthToolName = (toolName: string): string =>\n toolName.startsWith(\"redai_openapi_user_\")\n ? toolName.replace(/^redai_openapi_user_/, \"redai_openapi_user_auth_\")\n : \"redai_openapi_user_auth_${toolName}\";\n\nconst getAuthStorePath = (runtimeConfig: PluginRuntimeConfig) =>\n runtimeConfig.authStorePath?.trim() || DEFAULT_AUTH_STORE_PATH;\n\nconst ensureStoreDirectory = async (storePath: string) => {\n await mkdir(dirname(storePath), { recursive: true });\n};\n\nconst loadAuthStore = async (runtimeConfig: PluginRuntimeConfig): Promise<RedaiAuthStore> => {\n const storePath = getAuthStorePath(runtimeConfig);\n try {\n const raw = await readFile(storePath, \"utf8\");\n const parsed = JSON.parse(raw) as RedaiAuthStore;\n return { version: 1, users: parsed?.users ?? {} };\n } catch (error: unknown) {\n const maybeNodeError = error as NodeJS.ErrnoException;\n if (maybeNodeError?.code === \"ENOENT\") {\n await ensureStoreDirectory(storePath);\n await writeFile(storePath, JSON.stringify({ version: 1, users: {} }, null, 2), \"utf8\");\n return { version: 1, users: {} };\n }\n throw error;\n }\n};\n\nconst getAuthStoreEntry = async (runtimeConfig: PluginRuntimeConfig, telegramUserId: string) => {\n const store = await loadAuthStore(runtimeConfig);\n return store.users[telegramUserId] ?? null;\n};\n\nconst withRedaiAuth = (\n runtimeConfig: PluginRuntimeConfig,\n auth: Pick<RedaiAuthEntry, \"bearerToken\" | \"workspaceId\" | \"baseId\">\n): PluginRuntimeConfig => {\n const defaultHeaders = {\n ...(runtimeConfig.defaultHeaders ?? {}),\n \"x-workspace-id\": auth.workspaceId\n } as Record<string, string>;\n\n if (auth.baseId) {\n defaultHeaders[\"x-base-id\"] = auth.baseId;\n } else {\n delete defaultHeaders[\"x-base-id\"];\n }\n\n return {\n ...runtimeConfig,\n bearerToken: auth.bearerToken,\n apiKey: undefined,\n apiKeyHeader: undefined,\n defaultHeaders,\n workspaceId: auth.workspaceId,\n baseId: auth.baseId ?? undefined\n };\n};\n\nconst resolveUserRuntimeConfig = async (api: OpenClawApiLike, telegramUserId: string) => {\n const runtimeConfig = resolvePluginConfig(api);\n const authEntry = await getAuthStoreEntry(runtimeConfig, telegramUserId);\n if (!authEntry || authEntry.status !== \"active\") {\n return null;\n }\n return {\n runtimeConfig,\n scopedConfig: withRedaiAuth(runtimeConfig, authEntry)\n };\n};\n\nconst authRequiredResult = (telegramUserId: string) =>\n formatToolResult({\n ok: false,\n status: 401,\n statusText: \"AUTH_REQUIRED\",\n data: {\n message:\n \"Ban chua dang nhap RedAI auth hop le. Hay dung /login <bearerToken> <workspaceId> [baseId] trong DM truoc khi thao tac nghiep vu.\",\n telegramUserId\n }\n });\n\nconst hasHeadersSection = (tool: CatalogTool): boolean => {\n const parameters = tool.parameters as { properties?: Record<string, unknown> } | undefined;\n return Boolean(parameters?.properties?.headers);\n};\n\nconst mergeTenantHeaders = (\n tool: CatalogTool,\n inputHeaders: Record<string, unknown> | undefined,\n runtimeConfig: PluginRuntimeConfig\n): Record<string, string> | undefined => {\n const entries = Object.entries(inputHeaders ?? {})\n .filter(([, value]) => value !== undefined && value !== null && value !== \"\")\n .map(([key, value]) => [key, String(value)] as const);\n\n if (hasHeadersSection(tool)) {\n if (runtimeConfig.workspaceId && !entries.some(([key]) => key.toLowerCase() === \"x-workspace-id\")) {\n entries.push([\"x-workspace-id\", runtimeConfig.workspaceId]);\n }\n if (runtimeConfig.baseId && !entries.some(([key]) => key.toLowerCase() === \"x-base-id\")) {\n entries.push([\"x-base-id\", runtimeConfig.baseId]);\n }\n }\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst executeCatalogTool = async (\n runtimeConfig: PluginRuntimeConfig,\n tool: CatalogTool,\n rawParams: unknown\n) => {\n const client = new RedaiAgentClient({\n ...runtimeConfig,\n baseUrl: runtimeConfig.baseUrl ?? typedCatalog.serverUrl\n });\n const params = (rawParams ?? {}) as ToolExecutionInput & {\n headers?: Record<string, unknown>;\n };\n\n return client.executeTool(tool, {\n path: params.path,\n query: params.query,\n body: params.body,\n headers: mergeTenantHeaders(tool, params.headers, runtimeConfig)\n });\n};\n\nconst registerAuthProxyTool = (api: OpenClawApiLike, tool: CatalogTool) => {\n api.registerTool(\n {\n name: buildAuthToolName(tool.name),\n description: `${tool.description} Uses the logged-in RedAI auth for the current Telegram DM user.`,\n parameters: buildAuthWrappedParameters(tool),\n execute: async (_id: string, rawParams: unknown) => {\n const params = (rawParams ?? {}) as Record<string, unknown>;\n const telegramUserId = String(params.telegramUserId ?? \"\");\n const resolved = await resolveUserRuntimeConfig(api, telegramUserId);\n if (!resolved) {\n return authRequiredResult(telegramUserId);\n }\n\n const forwardedParams = { ...params };\n delete forwardedParams.telegramUserId;\n\n try {\n const response = await executeCatalogTool(resolved.scopedConfig, tool, forwardedParams);\n return formatToolResult(response.data);\n } catch (error: unknown) {\n if (error instanceof RedaiAgentError) {\n return formatToolResult({\n ok: false,\n status: error.status ?? 500,\n statusText: error.message,\n data: error.body\n });\n }\n\n return formatToolResult({\n ok: false,\n status: 500,\n statusText: \"PLUGIN_EXECUTION_FAILED\",\n data: String(error)\n });\n }\n }\n },\n { optional: typedCatalog.optional ?? true }\n );\n};\n\nexport default function register(api: OpenClawApiLike): void {\n for (const tool of typedCatalog.tools) {\n api.registerTool(\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n execute: async (_id: string, rawParams: unknown) => {\n try {\n const response = await executeCatalogTool(resolvePluginConfig(api), tool, rawParams);\n return formatToolResult(response.data);\n } catch (error: unknown) {\n if (error instanceof RedaiAgentError) {\n return formatToolResult({\n ok: false,\n status: error.status ?? 500,\n statusText: error.message,\n data: error.body\n });\n }\n\n return formatToolResult({\n ok: false,\n status: 500,\n statusText: \"PLUGIN_EXECUTION_FAILED\",\n data: String(error)\n });\n }\n }\n },\n { optional: typedCatalog.optional ?? true }\n );\n }\n\n for (const tool of typedCatalog.tools) {\n registerAuthProxyTool(api, tool);\n }\n}\n","import type {\n ApiResponse,\n HeaderMap,\n HttpMethod,\n OperationRequest,\n PathParams,\n QueryParams,\n RedaiAgentClientOptions,\n TenantContext,\n ToolDescriptor,\n ToolExecutionInput\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.redai.vn/api/v1\";\n\nconst encodeQueryValue = (value: QueryParams[string]): string[] => {\n if (value === undefined) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map((item) => String(item));\n }\n return [String(value)];\n};\n\nconst headersToObject = (headers: Headers): Record<string, string> => {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n};\n\nconst applyPathParams = (pathTemplate: string, pathParams?: PathParams): string =>\n pathTemplate.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const raw = pathParams?.[key];\n if (raw === undefined || raw === null) {\n throw new RedaiAgentError(`Missing required path parameter: ${key}`);\n }\n return encodeURIComponent(String(raw));\n });\n\nconst buildUrl = (baseUrl: string, path: string, query?: QueryParams): URL => {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(/\\/+$/, \"\");\n const normalizedRequestPath = path.startsWith(\"/\") ? path : `/${path}`;\n url.pathname = `${normalizedBasePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\");\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n for (const item of encodeQueryValue(value)) {\n url.searchParams.append(key, item);\n }\n }\n }\n\n return url;\n};\n\nconst parseResponse = async (response: Response): Promise<unknown> => {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n return response.text();\n};\n\nexport class RedaiAgentError extends Error {\n status?: number;\n body?: unknown;\n\n constructor(message: string, options?: { status?: number; body?: unknown }) {\n super(message);\n this.name = \"RedaiAgentError\";\n this.status = options?.status;\n this.body = options?.body;\n }\n}\n\nexport class RedaiAgentClient {\n readonly baseUrl: string;\n\n private readonly bearerToken?: string;\n private readonly apiKey?: string;\n private readonly apiKeyHeader?: string;\n private readonly defaultHeaders?: Record<string, string>;\n private readonly timeoutMs?: number;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly tenantContext: TenantContext;\n\n constructor(options: RedaiAgentClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.bearerToken = options.bearerToken;\n this.apiKey = options.apiKey;\n this.apiKeyHeader = options.apiKeyHeader ?? \"x-api-key\";\n this.defaultHeaders = options.defaultHeaders;\n this.timeoutMs = options.timeoutMs;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.tenantContext = {\n workspaceId: options.workspaceId,\n baseId: options.baseId\n };\n }\n\n createTenantHeaders(overrides?: TenantContext): HeaderMap {\n const workspaceId = overrides?.workspaceId ?? this.tenantContext.workspaceId;\n const baseId = overrides?.baseId ?? this.tenantContext.baseId;\n\n return {\n \"x-workspace-id\": workspaceId,\n \"x-base-id\": baseId\n };\n }\n\n async executeTool<TData = unknown>(\n tool: ToolDescriptor,\n input: ToolExecutionInput = {}\n ): Promise<ApiResponse<TData>> {\n return this.request<TData>({\n method: tool.method,\n path: tool.path,\n pathParams: input.path as PathParams | undefined,\n query: input.query,\n headers: input.headers,\n body: input.body\n });\n }\n\n async request<TData = unknown, TBody = unknown>(\n request: OperationRequest<TBody>\n ): Promise<ApiResponse<TData>> {\n const url = buildUrl(this.baseUrl, applyPathParams(request.path, request.pathParams), request.query);\n const controller = new AbortController();\n const timeout = this.timeoutMs ? setTimeout(() => controller.abort(), this.timeoutMs) : undefined;\n const headers = this.buildHeaders(request.method, request.headers, request.body !== undefined);\n\n try {\n const response = await this.fetchImpl(url, {\n method: request.method,\n headers,\n body: request.body === undefined ? undefined : JSON.stringify(request.body),\n signal: controller.signal\n });\n const data = (await parseResponse(response)) as TData;\n const result: ApiResponse<TData> = {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n headers: headersToObject(response.headers),\n data\n };\n\n if (!response.ok) {\n throw new RedaiAgentError(`Request failed with status ${response.status}`, {\n status: response.status,\n body: data\n });\n }\n\n return result;\n } catch (error: unknown) {\n if (error instanceof RedaiAgentError) {\n throw error;\n }\n throw new RedaiAgentError(\"Request failed\", { body: error });\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n }\n\n private buildHeaders(method: HttpMethod, requestHeaders?: HeaderMap, hasBody?: boolean): Headers {\n const headers = new Headers();\n\n for (const [key, value] of Object.entries(this.defaultHeaders ?? {})) {\n headers.set(key, value);\n }\n\n for (const [key, value] of Object.entries(this.createTenantHeaders())) {\n if (value !== undefined && value !== null && value !== \"\") {\n headers.set(key, value);\n }\n }\n\n if (this.bearerToken) {\n headers.set(\"authorization\", `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n headers.set(this.apiKeyHeader ?? \"x-api-key\", this.apiKey);\n }\n\n for (const [key, value] of Object.entries(requestHeaders ?? {})) {\n if (value !== undefined && value !== null && value !== \"\") {\n headers.set(key, value);\n }\n }\n\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\");\n }\n\n if (hasBody && method !== \"GET\" && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return headers;\n }\n}\n","{\n \"pluginId\": \"redai-openapi-user\",\n \"pluginName\": \"RedAI User API Export - User\",\n \"version\": \"0.1.0\",\n \"description\": \"OpenAPI export cho nhóm API user đã chọn: User.\",\n \"serverUrl\": \"https://v2.redai.vn/api\",\n \"optional\": true,\n \"tools\": [\n {\n \"name\": \"redai_openapi_user_accountcontroller_createavataruploadurl_v1\",\n \"description\": \"POST /v1/user/account/avatar/upload-url\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/avatar/upload-url\",\n \"operationId\": \"accountcontroller_createavataruploadurl_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"imageType\": {\n \"type\": \"string\",\n \"description\": \"Loại hình ảnh\",\n \"enum\": [\n \"image/png\",\n \"image/jpeg\",\n \"image/webp\",\n \"image/gif\",\n \"image/svg+xml\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/avif\"\n ]\n },\n \"maxSize\": {\n \"type\": \"number\",\n \"description\": \"Kích thước tối đa của file (bytes)\"\n }\n },\n \"required\": [\n \"imageType\",\n \"maxSize\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"AccountController_createAvatarUploadUrl_v1 tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_createcoverimageuploadurl_v1\",\n \"description\": \"Tạo URL tạm thời để tải lên ảnh bìa. API này tạo URL tạm thời để user có thể upload ảnh bìa lên S3. Key sẽ được lưu vào database ngay lập tức.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/cover-image/upload-url\",\n \"operationId\": \"accountcontroller_createcoverimageuploadurl_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"imageType\": {\n \"type\": \"string\",\n \"description\": \"Loại hình ảnh\",\n \"enum\": [\n \"image/png\",\n \"image/jpeg\",\n \"image/webp\",\n \"image/gif\",\n \"image/svg+xml\",\n \"image/bmp\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/avif\"\n ]\n },\n \"maxSize\": {\n \"type\": \"number\",\n \"description\": \"Kích thước tối đa của file (bytes)\"\n }\n },\n \"required\": [\n \"imageType\",\n \"maxSize\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Tạo URL tạm thời để tải lên ảnh bìa tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_getbankinfo_v1\",\n \"description\": \"Lấy thông tin tài khoản ngân hàng của người dùng\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/account/bank-info\",\n \"operationId\": \"accountcontroller_getbankinfo_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy thông tin tài khoản ngân hàng của người dùng tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_getbusinessinfo_v1\",\n \"description\": \"Lấy thông tin doanh nghiệp của người dùng\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/account/business-info\",\n \"operationId\": \"accountcontroller_getbusinessinfo_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy thông tin doanh nghiệp của người dùng tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_getnotificationsettings_v1\",\n \"description\": \"Lấy thông tin cài đặt thông báo của user. API này cho phép user xem các cài đặt thông báo của họ\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/account/notification-settings\",\n \"operationId\": \"accountcontroller_getnotificationsettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy thông tin cài đặt thông báo của user tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_sendemailverificationotp_v1\",\n \"description\": \"Gửi OTP xác thực email. Gửi mã OTP 6 số đến email của người dùng để xác thực. Email phải chưa được sử dụng bởi tài khoản khác. Có cooldown 60 giây giữa các lần gửi.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/email/send-otp\",\n \"operationId\": \"accountcontroller_sendemailverificationotp_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"email\": {\n \"type\": \"string\",\n \"description\": \"Email cần xác thực\"\n }\n },\n \"required\": [\n \"email\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Gửi OTP xác thực email tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_sendphoneverificationotp_v1\",\n \"description\": \"Gửi OTP xác thực số điện thoại. API này gửi mã OTP 6 số đến số điện thoại để xác thực. Kiểm tra số điện thoại không trùng với tài khoản khác.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/phone/send-otp\",\n \"operationId\": \"accountcontroller_sendphoneverificationotp_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Số điện thoại cần xác thực\"\n }\n },\n \"required\": [\n \"phoneNumber\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Gửi OTP xác thực số điện thoại tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_updateavatar_v1\",\n \"description\": \"PUT /v1/user/account/avatar\",\n \"method\": \"PUT\",\n \"path\": \"/v1/user/account/avatar\",\n \"operationId\": \"accountcontroller_updateavatar_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"avatarKey\": {\n \"type\": \"string\",\n \"description\": \"Khóa S3 của avatar\"\n }\n },\n \"required\": [\n \"avatarKey\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"AccountController_updateAvatar_v1 tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_updatebankinfo_v1\",\n \"description\": \"Cập nhật thông tin tài khoản ngân hàng\",\n \"method\": \"PUT\",\n \"path\": \"/v1/user/account/bank-info\",\n \"operationId\": \"accountcontroller_updatebankinfo_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"bankCode\": {\n \"type\": \"string\",\n \"description\": \"Mã ngân hàng\"\n },\n \"accountNumber\": {\n \"type\": \"string\",\n \"description\": \"Số tài khoản\"\n },\n \"accountHolder\": {\n \"type\": \"string\",\n \"description\": \"Tên chủ tài khoản\"\n },\n \"bankBranch\": {\n \"type\": \"string\",\n \"description\": \"Chi nhánh ngân hàng\"\n }\n },\n \"required\": [\n \"bankCode\",\n \"accountNumber\",\n \"accountHolder\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật thông tin tài khoản ngân hàng tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_updatebusinessinfo_v1\",\n \"description\": \"Cập nhật thông tin doanh nghiệp của người dùng. API này cho phép người dùng cập nhật thông tin doanh nghiệp của họ. Nếu chưa có thông tin doanh nghiệp, hệ thống sẽ tạo mới.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/user/account/business-info\",\n \"operationId\": \"accountcontroller_updatebusinessinfo_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"businessName\": {\n \"type\": \"string\",\n \"description\": \"Tên doanh nghiệp\"\n },\n \"businessEmail\": {\n \"type\": \"string\",\n \"description\": \"Email doanh nghiệp\"\n },\n \"businessPhone\": {\n \"type\": \"string\",\n \"description\": \"Số điện thoại doanh nghiệp\"\n },\n \"taxCode\": {\n \"type\": \"string\",\n \"description\": \"Mã số thuế\"\n },\n \"representativeName\": {\n \"type\": \"string\",\n \"description\": \"Tên người đại diện\"\n },\n \"representativePosition\": {\n \"type\": \"string\",\n \"description\": \"Vị trí người đại diện\"\n },\n \"businessAddress\": {\n \"type\": \"string\",\n \"description\": \"Địa chỉ doanh nghiệp\"\n }\n },\n \"required\": [\n \"businessName\",\n \"businessEmail\",\n \"businessPhone\",\n \"taxCode\",\n \"representativeName\",\n \"representativePosition\",\n \"businessAddress\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật thông tin doanh nghiệp của người dùng tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_updatenotificationsettings_v1\",\n \"description\": \"Cập nhật thông tin cài đặt thông báo của user. API này cho phép user cập nhật các cài đặt thông báo của họ\",\n \"method\": \"PUT\",\n \"path\": \"/v1/user/account/notification-settings\",\n \"operationId\": \"accountcontroller_updatenotificationsettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"receiveAccountSystemEmails\": {\n \"type\": \"boolean\",\n \"description\": \"Nhận email thông báo hệ thống\"\n },\n \"receiveBillingEmails\": {\n \"type\": \"boolean\",\n \"description\": \"Nhận email thông báo thanh toán\"\n },\n \"receiveNewFeatureEmails\": {\n \"type\": \"boolean\",\n \"description\": \"Nhận email thông báo tính năng mới\"\n },\n \"receiveAffiliateEmails\": {\n \"type\": \"boolean\",\n \"description\": \"Nhận email thông báo tiếp thị liên kết\"\n },\n \"receiveDocumentationEmails\": {\n \"type\": [\n \"boolean\",\n \"null\"\n ],\n \"description\": \"Nhận email thông báo tài liệu\"\n },\n \"receivePromotionalEmails\": {\n \"type\": \"boolean\",\n \"description\": \"Nhận email quảng cáo\"\n }\n }\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật thông tin cài đặt thông báo của user tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_upgradetobusinessaccount_v1\",\n \"description\": \"Nâng cấp tài khoản cá nhân lên doanh nghiệp. API này cho phép nâng cấp tài khoản cá nhân (INDIVIDUAL) lên doanh nghiệp (BUSINESS). Khi nâng cấp, hệ thống sẽ cập nhật trường type thành BUSINESS, đặt isSignatureRuleContract = false, tạo/cập nhật thông tin doanh nghiệp, và nếu có AffiliateAccount thì cập nhật trạng thái thành DRAFT.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/upgrade-to-business\",\n \"operationId\": \"accountcontroller_upgradetobusinessaccount_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"businessName\": {\n \"type\": \"string\",\n \"description\": \"Tên doanh nghiệp\"\n },\n \"businessEmail\": {\n \"type\": \"string\",\n \"description\": \"Email doanh nghiệp\"\n },\n \"businessPhone\": {\n \"type\": \"string\",\n \"description\": \"Số điện thoại doanh nghiệp\"\n },\n \"taxCode\": {\n \"type\": \"string\",\n \"description\": \"Mã số thuế\"\n },\n \"representativeName\": {\n \"type\": \"string\",\n \"description\": \"Tên người đại diện\"\n },\n \"representativePosition\": {\n \"type\": \"string\",\n \"description\": \"Vị trí người đại diện\"\n },\n \"businessAddress\": {\n \"type\": \"string\",\n \"description\": \"Địa chỉ doanh nghiệp\"\n }\n },\n \"required\": [\n \"businessName\",\n \"businessEmail\",\n \"businessPhone\",\n \"taxCode\",\n \"representativeName\",\n \"representativePosition\",\n \"businessAddress\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Nâng cấp tài khoản cá nhân lên doanh nghiệp tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_verifyemailotp_v1\",\n \"description\": \"Xác thực OTP email. Xác thực mã OTP và verificationKey để cập nhật email cho người dùng. Sau khi xác thực thành công, email sẽ được lưu và đánh dấu đã xác thực.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/email/verify-otp\",\n \"operationId\": \"accountcontroller_verifyemailotp_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"otp\": {\n \"type\": \"string\",\n \"description\": \"Mã OTP 6 số\"\n },\n \"verificationKey\": {\n \"type\": \"string\",\n \"description\": \"Key mã hóa trả về từ API gửi OTP\"\n }\n },\n \"required\": [\n \"otp\",\n \"verificationKey\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xác thực OTP email tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_accountcontroller_verifyphoneotp_v1\",\n \"description\": \"Xác thực OTP số điện thoại. API này xác thực mã OTP và cập nhật trạng thái isVerifyPhone=true cho user.\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/account/phone/verify-otp\",\n \"operationId\": \"accountcontroller_verifyphoneotp_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Số điện thoại đã gửi OTP\"\n },\n \"otp\": {\n \"type\": \"string\",\n \"description\": \"Mã OTP 6 số\"\n }\n },\n \"required\": [\n \"phoneNumber\",\n \"otp\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xác thực OTP số điện thoại tool arguments\"\n },\n \"tags\": [\n \"User - Account\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_activateapikey_v1\",\n \"description\": \"Kích hoạt API key. Kích hoạt một API key đã bị vô hiệu hóa\",\n \"method\": \"PUT\",\n \"path\": \"/v1/api-keys/{id}/activate\",\n \"operationId\": \"apikeycontroller_activateapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Kích hoạt API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_createapikey_v1\",\n \"description\": \"Tạo API key mới. Tạo API key mới với mã hóa bảo mật. API key chỉ hiển thị 1 lần khi tạo.\",\n \"method\": \"POST\",\n \"path\": \"/v1/api-keys\",\n \"operationId\": \"apikeycontroller_createapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Tên mô tả cho API key\"\n },\n \"permissions\": {\n \"type\": \"array\",\n \"description\": \"Danh sách quyền của API key\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"module_workflow\",\n \"module_agent\",\n \"module_marketing\",\n \"module_business\",\n \"module_dashboard\",\n \"module_calendar\",\n \"module_training\",\n \"module_integration\",\n \"module_tool\",\n \"module_marketplace\",\n \"module_multichannel_chat\",\n \"module_blog\",\n \"module_affiliate\",\n \"module_cloud_storage\"\n ]\n }\n },\n \"expiresAt\": {\n \"type\": \"number\",\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\"\n },\n \"usageLimit\": {\n \"type\": \"number\",\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\"\n }\n },\n \"required\": [\n \"name\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Tạo API key mới tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_deactivateapikey_v1\",\n \"description\": \"Vô hiệu hóa API key. Vô hiệu hóa một API key để ngừng sử dụng tạm thời\",\n \"method\": \"PUT\",\n \"path\": \"/v1/api-keys/{id}/deactivate\",\n \"operationId\": \"apikeycontroller_deactivateapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Vô hiệu hóa API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_deleteapikey_v1\",\n \"description\": \"Xóa API key. Xóa vĩnh viễn một API key. Hành động này không thể hoàn tác.\",\n \"method\": \"DELETE\",\n \"path\": \"/v1/api-keys/{id}\",\n \"operationId\": \"apikeycontroller_deleteapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xóa API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_getapikey_v1\",\n \"description\": \"Lấy thông tin API key. Lấy thông tin chi tiết của một API key theo ID\",\n \"method\": \"GET\",\n \"path\": \"/v1/api-keys/{id}\",\n \"operationId\": \"apikeycontroller_getapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy thông tin API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_getapikeys_v1\",\n \"description\": \"Lấy danh sách API keys. Lấy danh sách tất cả API keys của người dùng hiện tại với phân trang\",\n \"method\": \"GET\",\n \"path\": \"/v1/api-keys\",\n \"operationId\": \"apikeycontroller_getapikeys_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"includeInactive\": {\n \"type\": \"boolean\",\n \"default\": false,\n \"description\": \"Có bao gồm API keys không active không\"\n },\n \"page\": {\n \"type\": \"number\",\n \"default\": 1,\n \"description\": \"Số trang (bắt đầu từ 1)\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"default\": 10,\n \"description\": \"Số lượng bản ghi trên mỗi trang\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách API keys tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_revealapikey_v1\",\n \"description\": \"Hiển thị API key đầy đủ. Hiển thị API key đầy đủ để người dùng copy.\",\n \"method\": \"POST\",\n \"path\": \"/v1/api-keys/{id}/reveal\",\n \"operationId\": \"apikeycontroller_revealapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Hiển thị API key đầy đủ tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_updateapikey_v1\",\n \"description\": \"Cập nhật API key. Cập nhật thông tin của một API key (tên, quyền, thời gian hết hạn, giới hạn sử dụng)\",\n \"method\": \"PUT\",\n \"path\": \"/v1/api-keys/{id}\",\n \"operationId\": \"apikeycontroller_updateapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của API key\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n },\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Tên mô tả cho API key\"\n },\n \"permissions\": {\n \"type\": \"array\",\n \"description\": \"Danh sách quyền của API key\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"module_workflow\",\n \"module_agent\",\n \"module_marketing\",\n \"module_business\",\n \"module_dashboard\",\n \"module_calendar\",\n \"module_training\",\n \"module_integration\",\n \"module_tool\",\n \"module_marketplace\",\n \"module_multichannel_chat\",\n \"module_blog\",\n \"module_affiliate\",\n \"module_cloud_storage\"\n ]\n }\n },\n \"expiresAt\": {\n \"type\": \"number\",\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\"\n },\n \"usageLimit\": {\n \"type\": \"number\",\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\"\n }\n }\n }\n },\n \"required\": [\n \"path\",\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_apikeycontroller_validateapikey_v1\",\n \"description\": \"Xác thực API key. Xác thực tính hợp lệ của một API key. Endpoint này dành cho hệ thống nội bộ.\",\n \"method\": \"POST\",\n \"path\": \"/v1/api-keys/validate\",\n \"operationId\": \"apikeycontroller_validateapikey_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"apiKey\": {\n \"type\": \"string\",\n \"description\": \"API key cần xác thực\"\n }\n },\n \"required\": [\n \"apiKey\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xác thực API key tool arguments\"\n },\n \"tags\": [\n \"API Keys\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_authverificationlogcontroller_getauthverificationlogbyid_v1\",\n \"description\": \"Lấy chi tiết log xác thực theo ID. API này cho phép người dùng xem chi tiết một log xác thực cụ thể\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/auth-verification-logs/detail/{id}\",\n \"operationId\": \"authverificationlogcontroller_getauthverificationlogbyid_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\",\n \"description\": \"ID của log xác thực\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy chi tiết log xác thực theo ID tool arguments\"\n },\n \"tags\": [\n \"User - Auth Verification Log\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_authverificationlogcontroller_getauthverificationlogs_v1\",\n \"description\": \"Lấy danh sách log xác thực của người dùng hiện tại. API này cho phép người dùng xem lịch sử xác thực của mình với các bộ lọc, tìm kiếm và phân trang. Hỗ trợ tìm kiếm theo ipAddress, userAgent, authMethod, status.\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/auth-verification-logs\",\n \"operationId\": \"authverificationlogcontroller_getauthverificationlogs_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"page\": {\n \"type\": \"number\",\n \"default\": 1,\n \"description\": \"Số trang hiện tại (bắt đầu từ 1)\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"default\": 10,\n \"description\": \"Số lượng bản ghi trên mỗi trang\"\n },\n \"search\": {\n \"type\": \"string\",\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\"\n },\n \"searchBy\": {\n \"type\": \"string\",\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\"\n },\n \"sortBy\": {\n \"type\": \"string\",\n \"description\": \"Trường cần sắp xếp\"\n },\n \"sortDirection\": {\n \"type\": \"string\",\n \"default\": \"DESC\",\n \"enum\": [\n \"ASC\",\n \"DESC\"\n ],\n \"description\": \"Hướng sắp xếp\"\n },\n \"authMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"EMAIL\",\n \"SMS\",\n \"GOOGLE\",\n \"FACEBOOK\",\n \"ZALO\"\n ],\n \"description\": \"Phương thức xác thực\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"PENDING\",\n \"SUCCESS\",\n \"FAILED\",\n \"EXPIRED\"\n ],\n \"description\": \"Trạng thái xác thực\"\n },\n \"ipAddress\": {\n \"type\": \"string\",\n \"description\": \"Địa chỉ IP\"\n },\n \"fromDate\": {\n \"type\": \"number\",\n \"description\": \"Từ ngày (timestamp)\"\n },\n \"toDate\": {\n \"type\": \"number\",\n \"description\": \"Đến ngày (timestamp)\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách log xác thực của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"User - Auth Verification Log\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_authverificationlogcontroller_getauthverificationstats_v1\",\n \"description\": \"Lấy thống kê log xác thực của người dùng hiện tại. API này cung cấp thống kê tổng quan về các lần xác thực của người dùng\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/auth-verification-logs/stats\",\n \"operationId\": \"authverificationlogcontroller_getauthverificationstats_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"fromDate\": {\n \"type\": \"number\"\n },\n \"toDate\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"fromDate\",\n \"toDate\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"query\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy thống kê log xác thực của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"User - Auth Verification Log\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_deviceinfocontroller_deletedevice_v1\",\n \"description\": \"Xóa thiết bị. Xóa thiết bị khỏi danh sách thiết bị đáng tin cậy. Thiết bị sẽ cần xác thực lại khi đăng nhập.\",\n \"method\": \"DELETE\",\n \"path\": \"/v1/user/device-info/{deviceId}\",\n \"operationId\": \"deviceinfocontroller_deletedevice_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"deviceId\": {\n \"type\": \"string\",\n \"description\": \"ID của thiết bị\"\n }\n },\n \"required\": [\n \"deviceId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xóa thiết bị tool arguments\"\n },\n \"tags\": [\n \"User - Device Info\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_deviceinfocontroller_getdeviceinfobyid_v1\",\n \"description\": \"Lấy chi tiết thiết bị. Lấy thông tin chi tiết của một thiết bị cụ thể\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/device-info/{deviceId}\",\n \"operationId\": \"deviceinfocontroller_getdeviceinfobyid_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"deviceId\": {\n \"type\": \"string\",\n \"description\": \"ID của thiết bị\"\n }\n },\n \"required\": [\n \"deviceId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy chi tiết thiết bị tool arguments\"\n },\n \"tags\": [\n \"User - Device Info\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_deviceinfocontroller_getdeviceinfos_v1\",\n \"description\": \"Lấy danh sách thiết bị. Lấy danh sách tất cả thiết bị đã đăng nhập của người dùng hiện tại với các bộ lọc và phân trang\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/device-info\",\n \"operationId\": \"deviceinfocontroller_getdeviceinfos_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"page\": {\n \"type\": \"number\",\n \"default\": 1,\n \"description\": \"Số trang (bắt đầu từ 1)\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"default\": 10,\n \"description\": \"Số lượng item trên mỗi trang\"\n },\n \"search\": {\n \"type\": \"string\",\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\"\n },\n \"searchBy\": {\n \"type\": \"string\",\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\"\n },\n \"sortBy\": {\n \"type\": \"string\",\n \"description\": \"Trường cần sắp xếp\"\n },\n \"sortDirection\": {\n \"type\": \"string\",\n \"default\": \"DESC\",\n \"enum\": [\n \"ASC\",\n \"DESC\"\n ],\n \"description\": \"Hướng sắp xếp\"\n },\n \"browser\": {\n \"type\": \"string\",\n \"description\": \"Lọc theo trình duyệt\"\n },\n \"operatingSystem\": {\n \"type\": \"string\",\n \"description\": \"Lọc theo hệ điều hành\"\n },\n \"isTrusted\": {\n \"type\": \"boolean\",\n \"description\": \"Lọc theo trạng thái tin cậy\"\n },\n \"ipAddress\": {\n \"type\": \"string\",\n \"description\": \"Lọc theo địa chỉ IP\"\n },\n \"fromDate\": {\n \"type\": \"number\",\n \"description\": \"Từ ngày (timestamp)\"\n },\n \"toDate\": {\n \"type\": \"number\",\n \"description\": \"Đến ngày (timestamp)\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách thiết bị tool arguments\"\n },\n \"tags\": [\n \"User - Device Info\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_deviceinfocontroller_getdevicestats_v1\",\n \"description\": \"Lấy thống kê thiết bị. Lấy thống kê tổng quan về các thiết bị của người dùng bao gồm số lượng, trình duyệt, hệ điều hành\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/device-info/stats/overview\",\n \"operationId\": \"deviceinfocontroller_getdevicestats_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy thống kê thiết bị tool arguments\"\n },\n \"tags\": [\n \"User - Device Info\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_deviceinfocontroller_updatedevicetrust_v1\",\n \"description\": \"Cập nhật trạng thái tin cậy thiết bị. Đánh dấu thiết bị là đáng tin cậy hoặc không đáng tin cậy\",\n \"method\": \"PUT\",\n \"path\": \"/v1/user/device-info/{deviceId}/trust\",\n \"operationId\": \"deviceinfocontroller_updatedevicetrust_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"deviceId\": {\n \"type\": \"string\",\n \"description\": \"ID của thiết bị\"\n }\n },\n \"required\": [\n \"deviceId\"\n ],\n \"additionalProperties\": false\n },\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"isTrusted\": {\n \"type\": \"boolean\",\n \"description\": \"Thiết bị đáng tin cậy\"\n }\n },\n \"required\": [\n \"isTrusted\"\n ]\n }\n },\n \"required\": [\n \"path\",\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật trạng thái tin cậy thiết bị tool arguments\"\n },\n \"tags\": [\n \"User - Device Info\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userbankcontroller_findall_v1\",\n \"description\": \"Lấy danh sách ngân hàng với phân trang và filter\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/banks\",\n \"operationId\": \"userbankcontroller_findall_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"page\": {\n \"type\": \"number\",\n \"default\": 1,\n \"description\": \"Số trang hiện tại (bắt đầu từ 1)\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"default\": 10,\n \"description\": \"Số lượng bản ghi trên mỗi trang\"\n },\n \"search\": {\n \"type\": \"string\",\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\"\n },\n \"searchBy\": {\n \"type\": \"string\",\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\"\n },\n \"sortBy\": {\n \"type\": \"string\",\n \"default\": \"bankName\",\n \"enum\": [\n \"bankCode\",\n \"bankName\"\n ],\n \"description\": \"Sắp xếp theo trường\"\n },\n \"sortDirection\": {\n \"type\": \"string\",\n \"default\": \"DESC\",\n \"enum\": [\n \"ASC\",\n \"DESC\"\n ],\n \"description\": \"Hướng sắp xếp\"\n },\n \"bankName\": {\n \"type\": \"string\",\n \"description\": \"Tìm kiếm theo tên ngân hàng\"\n },\n \"bankCode\": {\n \"type\": \"string\",\n \"description\": \"Tìm kiếm theo mã ngân hàng\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách ngân hàng với phân trang và filter tool arguments\"\n },\n \"tags\": [\n \"User Banks\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userbankcontroller_findallbanks_v1\",\n \"description\": \"Lấy tất cả ngân hàng (không phân trang). Lấy tất cả ngân hàng với khả năng tìm kiếm (tìm trong tên, mã, tên đầy đủ, BIN) và sắp xếp\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/banks/all\",\n \"operationId\": \"userbankcontroller_findallbanks_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"search\": {\n \"type\": \"string\",\n \"description\": \"Tìm kiếm ngân hàng (tìm trong tên ngân hàng, mã ngân hàng, tên đầy đủ, BIN - hỗ trợ tìm kiếm gần đúng)\"\n },\n \"sortBy\": {\n \"type\": \"string\",\n \"default\": \"bankName\",\n \"enum\": [\n \"bankCode\",\n \"bankName\"\n ],\n \"description\": \"Sắp xếp theo trường\"\n },\n \"sortDirection\": {\n \"type\": \"string\",\n \"default\": \"ASC\",\n \"enum\": [\n \"ASC\",\n \"DESC\"\n ],\n \"description\": \"Hướng sắp xếp\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy tất cả ngân hàng (không phân trang) tool arguments\"\n },\n \"tags\": [\n \"User Banks\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userbankcontroller_findbycode_v1\",\n \"description\": \"Lấy ngân hàng theo mã\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/banks/{bankCode}\",\n \"operationId\": \"userbankcontroller_findbycode_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"bankCode\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"bankCode\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy ngân hàng theo mã tool arguments\"\n },\n \"tags\": [\n \"User Banks\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userresourcecontroller_deleteuserresource_v1\",\n \"description\": \"Xóa tài nguyên. Xóa tài nguyên khỏi hệ thống (bao gồm cả file trên S3)\",\n \"method\": \"DELETE\",\n \"path\": \"/v1/user/resources/{resourceId}\",\n \"operationId\": \"userresourcecontroller_deleteuserresource_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID của tài nguyên\"\n }\n },\n \"required\": [\n \"resourceId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Xóa tài nguyên tool arguments\"\n },\n \"tags\": [\n \"User Resources\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userresourcecontroller_getuserresource_v1\",\n \"description\": \"Lấy thông tin chi tiết tài nguyên. Lấy thông tin chi tiết của một tài nguyên cụ thể\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/resources/{resourceId}\",\n \"operationId\": \"userresourcecontroller_getuserresource_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID của tài nguyên\"\n }\n },\n \"required\": [\n \"resourceId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Lấy thông tin chi tiết tài nguyên tool arguments\"\n },\n \"tags\": [\n \"User Resources\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userresourcecontroller_getuserresources_v1\",\n \"description\": \"Lấy danh sách tài nguyên người dùng. Lấy danh sách tất cả tài nguyên của người dùng với phân trang và filter\",\n \"method\": \"GET\",\n \"path\": \"/v1/user/resources\",\n \"operationId\": \"userresourcecontroller_getuserresources_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceType\": {\n \"type\": \"string\",\n \"enum\": [\n \"ZALO_CONVERSATION\",\n \"DOCUMENT\",\n \"IMAGE\",\n \"VIDEO\",\n \"AUDIO\",\n \"OTHER\"\n ],\n \"description\": \"Lọc theo loại tài nguyên\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"PENDING\",\n \"PROCESSING\",\n \"COMPLETED\",\n \"FAILED\"\n ],\n \"description\": \"Lọc theo trạng thái\"\n },\n \"page\": {\n \"type\": \"number\",\n \"default\": 1,\n \"description\": \"Số trang (bắt đầu từ 1)\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"default\": 20,\n \"description\": \"Số lượng item trên mỗi trang\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách tài nguyên người dùng tool arguments\"\n },\n \"tags\": [\n \"User Resources\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_userresourcecontroller_refreshaccessurl_v1\",\n \"description\": \"Làm mới URL truy cập tài nguyên. Tạo presigned URL mới để truy cập tài nguyên\",\n \"method\": \"POST\",\n \"path\": \"/v1/user/resources/{resourceId}/refresh-url\",\n \"operationId\": \"userresourcecontroller_refreshaccessurl_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"path\": {\n \"type\": \"object\",\n \"properties\": {\n \"resourceId\": {\n \"type\": \"string\",\n \"description\": \"ID của tài nguyên\"\n }\n },\n \"required\": [\n \"resourceId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Làm mới URL truy cập tài nguyên tool arguments\"\n },\n \"tags\": [\n \"User Resources\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_deleteusersettings_v1\",\n \"description\": \"Xóa user settings của người dùng hiện tại (reset về mặc định)\",\n \"method\": \"DELETE\",\n \"path\": \"/v1/users/settings\",\n \"operationId\": \"usersettingscontroller_deleteusersettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Xóa user settings của người dùng hiện tại (reset về mặc định) tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_getusersettings_v1\",\n \"description\": \"Lấy user settings của người dùng hiện tại\",\n \"method\": \"GET\",\n \"path\": \"/v1/users/settings\",\n \"operationId\": \"usersettingscontroller_getusersettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy user settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_getusersettingsoptions_v1\",\n \"description\": \"Lấy danh sách options cho user settings\",\n \"method\": \"GET\",\n \"path\": \"/v1/users/settings/options\",\n \"operationId\": \"usersettingscontroller_getusersettingsoptions_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Lấy danh sách options cho user settings tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updatecurrencysettings_v1\",\n \"description\": \"Cập nhật currency settings của người dùng hiện tại. Cập nhật đơn vị tiền tệ của người dùng. Hỗ trợ các loại tiền tệ phổ biến như USD, VND, EUR, etc.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings/currency\",\n \"operationId\": \"usersettingscontroller_updatecurrencysettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"currency\": {\n \"type\": \"string\",\n \"description\": \"Đơn vị tiền tệ được chọn bởi người dùng (ví dụ: USD, VND, EUR)\"\n }\n },\n \"required\": [\n \"currency\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật currency settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updatefallbacksystemkeysettings_v1\",\n \"description\": \"Cập nhật fallback system key settings của người dùng hiện tại. Cập nhật cài đặt fallback system key của người dùng.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings/fallback-system-key\",\n \"operationId\": \"usersettingscontroller_updatefallbacksystemkeysettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"fallbackSystemKey\": {\n \"type\": \"boolean\",\n \"description\": \"Cài đặt fallback system key cho người dùng\"\n }\n },\n \"required\": [\n \"fallbackSystemKey\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật fallback system key settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updatethemesettings_v1\",\n \"description\": \"Cập nhật theme settings của người dùng hiện tại. Cập nhật cài đặt giao diện (theme) của người dùng. Hỗ trợ 2 chế độ: light, dark.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings/theme\",\n \"operationId\": \"usersettingscontroller_updatethemesettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"theme\": {\n \"type\": \"object\",\n \"description\": \"Cài đặt giao diện người dùng dạng JSON. 2 options: light, dark\"\n }\n },\n \"required\": [\n \"theme\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật theme settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updatetimezonesettings_v1\",\n \"description\": \"Cập nhật timezone settings của người dùng hiện tại. Cập nhật múi giờ của người dùng. Hỗ trợ tất cả múi giờ theo chuẩn IANA timezone.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings/timezone\",\n \"operationId\": \"usersettingscontroller_updatetimezonesettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"timezone\": {\n \"type\": \"string\",\n \"description\": \"Múi giờ được chọn bởi người dùng (ví dụ: UTC, Asia/Ho_Chi_Minh)\"\n }\n },\n \"required\": [\n \"timezone\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật timezone settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updateusersettings_v1\",\n \"description\": \"Cập nhật user settings của người dùng hiện tại (Legacy - deprecated). API này đã deprecated. Khuyến khích sử dụng các API riêng biệt: PUT /theme, PUT /timezone, PUT /currency\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings\",\n \"operationId\": \"usersettingscontroller_updateusersettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"theme\": {\n \"type\": \"object\",\n \"description\": \"Cài đặt giao diện người dùng dạng JSON. 3 options: light, dark, custom với mã màu\"\n },\n \"timezone\": {\n \"type\": \"string\",\n \"description\": \"Múi giờ được chọn bởi người dùng (ví dụ: UTC, Asia/Ho_Chi_Minh)\"\n },\n \"currency\": {\n \"type\": \"string\",\n \"description\": \"Đơn vị tiền tệ được chọn bởi người dùng (ví dụ: USD, VND, EUR)\"\n }\n }\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật user settings của người dùng hiện tại (Legacy - deprecated) tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usersettingscontroller_updateuseuserapikeysettings_v1\",\n \"description\": \"Cập nhật use user api key settings của người dùng hiện tại. Cập nhật cài đặt sử dụng API key của người dùng.\",\n \"method\": \"PUT\",\n \"path\": \"/v1/users/settings/use-user-api-key\",\n \"operationId\": \"usersettingscontroller_updateuseuserapikeysettings_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"body\": {\n \"type\": \"object\",\n \"properties\": {\n \"useUserApiKey\": {\n \"type\": \"boolean\",\n \"description\": \"Cài đặt sử dụng API key của người dùng\"\n }\n },\n \"required\": [\n \"useUserApiKey\"\n ]\n }\n },\n \"required\": [\n \"body\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Cập nhật use user api key settings của người dùng hiện tại tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n },\n {\n \"name\": \"redai_openapi_user_usertopupcontroller_gettopupoverview_v1\",\n \"description\": \"Tổng hợp số tiền người dùng đã nạp (subscription & point)\",\n \"method\": \"GET\",\n \"path\": \"/v1/users/topup/overview\",\n \"operationId\": \"usertopupcontroller_gettopupoverview_v1\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false,\n \"description\": \"Tổng hợp số tiền người dùng đã nạp (subscription & point) tool arguments\"\n },\n \"tags\": [\n \"Users\"\n ]\n }\n ]\n}\n","{\r\n \"openapi\": \"3.0.0\",\r\n \"paths\": {\r\n \"/v1/user/banks\": {\r\n \"get\": {\r\n \"operationId\": \"UserBankController_findAll_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"page\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số trang hiện tại (bắt đầu từ 1)\",\r\n \"schema\": {\r\n \"default\": 1,\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"limit\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số lượng bản ghi trên mỗi trang\",\r\n \"schema\": {\r\n \"default\": 10,\r\n \"example\": 10,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"search\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\",\r\n \"schema\": {\r\n \"example\": \"sơn\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"searchBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\",\r\n \"schema\": {\r\n \"example\": \"name,email\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Sắp xếp theo trường\",\r\n \"schema\": {\r\n \"default\": \"bankName\",\r\n \"example\": \"bankName\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"bankCode\",\r\n \"bankName\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"sortDirection\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Hướng sắp xếp\",\r\n \"schema\": {\r\n \"default\": \"DESC\",\r\n \"example\": \"DESC\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"ASC\",\r\n \"DESC\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"bankName\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Tìm kiếm theo tên ngân hàng\",\r\n \"schema\": {\r\n \"example\": \"Vietcombank\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"bankCode\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Tìm kiếm theo mã ngân hàng\",\r\n \"schema\": {\r\n \"example\": \"VCB\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Danh sách ngân hàng với phân trang\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/PaginatedResult\"\r\n },\r\n {\r\n \"properties\": {\r\n \"items\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/BankResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách ngân hàng với phân trang và filter\",\r\n \"tags\": [\r\n \"User Banks\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/banks/all\": {\r\n \"get\": {\r\n \"description\": \"Lấy tất cả ngân hàng với khả năng tìm kiếm (tìm trong tên, mã, tên đầy đủ, BIN) và sắp xếp\",\r\n \"operationId\": \"UserBankController_findAllBanks_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"search\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Tìm kiếm ngân hàng (tìm trong tên ngân hàng, mã ngân hàng, tên đầy đủ, BIN - hỗ trợ tìm kiếm gần đúng)\",\r\n \"schema\": {\r\n \"example\": \"Vietcombank\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Sắp xếp theo trường\",\r\n \"schema\": {\r\n \"default\": \"bankName\",\r\n \"example\": \"bankName\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"bankCode\",\r\n \"bankName\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"sortDirection\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Hướng sắp xếp\",\r\n \"schema\": {\r\n \"default\": \"ASC\",\r\n \"example\": \"ASC\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"ASC\",\r\n \"DESC\"\r\n ]\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Danh sách tất cả ngân hàng\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/BankResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy tất cả ngân hàng (không phân trang)\",\r\n \"tags\": [\r\n \"User Banks\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/banks/{bankCode}\": {\r\n \"get\": {\r\n \"operationId\": \"UserBankController_findByCode_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"bankCode\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Thông tin ngân hàng\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/BankResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy ngân hàng\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy ngân hàng theo mã\",\r\n \"tags\": [\r\n \"User Banks\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/bank-info\": {\r\n \"put\": {\r\n \"operationId\": \"AccountController_updateBankInfo_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin tài khoản ngân hàng cần cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateBankInfoDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật thông tin tài khoản ngân hàng thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy người dùng\"\r\n },\r\n \"default\": {\r\n \"description\": \"Thông tin tài khoản ngân hàng đã cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật thông tin tài khoản ngân hàng\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n },\r\n \"get\": {\r\n \"operationId\": \"AccountController_getBankInfo_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy thông tin tài khoản ngân hàng thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy người dùng\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thông tin tài khoản ngân hàng của người dùng\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/business-info\": {\r\n \"get\": {\r\n \"operationId\": \"AccountController_getBusinessInfo_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy thông tin doanh nghiệp thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thông tin doanh nghiệp của người dùng\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n },\r\n \"put\": {\r\n \"description\": \"API này cho phép người dùng cập nhật thông tin doanh nghiệp của họ. Nếu chưa có thông tin doanh nghiệp, hệ thống sẽ tạo mới.\",\r\n \"operationId\": \"AccountController_updateBusinessInfo_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin doanh nghiệp cần cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateBusinessInfoDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật thông tin doanh nghiệp thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"success\": {\r\n \"type\": \"boolean\",\r\n \"example\": true,\r\n \"description\": \"Trạng thái thành công của request\"\r\n },\r\n \"data\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"example\": 1,\r\n \"description\": \"ID của thông tin doanh nghiệp\"\r\n },\r\n \"businessName\": {\r\n \"type\": \"string\",\r\n \"example\": \"Công ty TNHH ABC\",\r\n \"description\": \"Tên doanh nghiệp\"\r\n },\r\n \"businessEmail\": {\r\n \"type\": \"string\",\r\n \"example\": \"contact@abc.com\",\r\n \"description\": \"Email doanh nghiệp\"\r\n },\r\n \"businessPhone\": {\r\n \"type\": \"string\",\r\n \"example\": \"0987654321\",\r\n \"description\": \"Số điện thoại doanh nghiệp\"\r\n },\r\n \"businessAddress\": {\r\n \"type\": \"string\",\r\n \"example\": \"123 Nguyễn Văn Cừ, Quận 5, Hồ Chí Minh\",\r\n \"description\": \"Địa chỉ doanh nghiệp\"\r\n },\r\n \"businessRegistrationCertificate\": {\r\n \"type\": \"string\",\r\n \"example\": \"https://example.com/certificate.pdf\",\r\n \"description\": \"URL giấy phép kinh doanh\"\r\n },\r\n \"taxCode\": {\r\n \"type\": \"string\",\r\n \"example\": \"0123456789\",\r\n \"description\": \"Mã số thuế\"\r\n },\r\n \"representativeName\": {\r\n \"type\": \"string\",\r\n \"example\": \"Nguyễn Văn A\",\r\n \"description\": \"Tên người đại diện\"\r\n },\r\n \"representativePosition\": {\r\n \"type\": \"string\",\r\n \"example\": \"Giám đốc\",\r\n \"description\": \"Vị trí người đại diện\"\r\n },\r\n \"status\": {\r\n \"type\": \"string\",\r\n \"example\": \"PENDING\",\r\n \"description\": \"Trạng thái xác thực\"\r\n }\r\n }\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Cập nhật thông tin doanh nghiệp thành công\",\r\n \"description\": \"Thông báo kết quả\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu không hợp lệ\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"success\": {\r\n \"type\": \"boolean\",\r\n \"example\": false\r\n },\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 400\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Dữ liệu không hợp lệ\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"success\": {\r\n \"type\": \"boolean\",\r\n \"example\": false\r\n },\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 401\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Unauthorized\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật thông tin doanh nghiệp của người dùng\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/avatar/upload-url\": {\r\n \"post\": {\r\n \"operationId\": \"AccountController_createAvatarUploadUrl_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AvatarUploadDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"URL tạm thời để tải lên avatar\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/AvatarUploadResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/avatar\": {\r\n \"put\": {\r\n \"operationId\": \"AccountController_updateAvatar_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateAvatarDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Thông tin avatar đã cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/cover-image/upload-url\": {\r\n \"post\": {\r\n \"description\": \"API này tạo URL tạm thời để user có thể upload ảnh bìa lên S3. Key sẽ được lưu vào database ngay lập tức.\",\r\n \"operationId\": \"AccountController_createCoverImageUploadUrl_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/CoverImageUploadDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"URL tạm thời để tải lên ảnh bìa\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/CoverImageUploadResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ\"\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy người dùng\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Tạo URL tạm thời để tải lên ảnh bìa\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/notification-settings\": {\r\n \"get\": {\r\n \"description\": \"API này cho phép user xem các cài đặt thông báo của họ\",\r\n \"operationId\": \"AccountController_getNotificationSettings_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy thông tin cài đặt thông báo thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thông tin cài đặt thông báo của user\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n },\r\n \"put\": {\r\n \"description\": \"API này cho phép user cập nhật các cài đặt thông báo của họ\",\r\n \"operationId\": \"AccountController_updateNotificationSettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin cài đặt thông báo cần cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateNotificationSettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật thông tin cài đặt thông báo thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật thông tin cài đặt thông báo của user\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/phone/send-otp\": {\r\n \"post\": {\r\n \"description\": \"API này gửi mã OTP 6 số đến số điện thoại để xác thực. Kiểm tra số điện thoại không trùng với tài khoản khác.\",\r\n \"operationId\": \"AccountController_sendPhoneVerificationOtp_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin số điện thoại cần xác thực\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/SendPhoneVerificationOtpDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Gửi OTP thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Gửi OTP xác thực số điện thoại thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/SendPhoneVerificationOtpResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Số điện thoại đã được sử dụng hoặc dữ liệu không hợp lệ\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 400\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Số điện thoại này đã được sử dụng bởi tài khoản khác\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"429\": {\r\n \"description\": \"Gửi OTP quá nhanh\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 429\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Vui lòng chờ 60 giây trước khi gửi lại OTP\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Gửi OTP xác thực số điện thoại\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/phone/verify-otp\": {\r\n \"post\": {\r\n \"description\": \"API này xác thực mã OTP và cập nhật trạng thái isVerifyPhone=true cho user.\",\r\n \"operationId\": \"AccountController_verifyPhoneOtp_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin OTP cần xác thực\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VerifyPhoneOtpDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Xác thực OTP thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Xác thực số điện thoại thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/VerifyPhoneOtpResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"OTP không chính xác hoặc đã hết hạn\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 400\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Mã OTP không chính xác\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xác thực OTP số điện thoại\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/upgrade-to-business\": {\r\n \"post\": {\r\n \"description\": \"API này cho phép nâng cấp tài khoản cá nhân (INDIVIDUAL) lên doanh nghiệp (BUSINESS). Khi nâng cấp, hệ thống sẽ cập nhật trường type thành BUSINESS, đặt isSignatureRuleContract = false, tạo/cập nhật thông tin doanh nghiệp, và nếu có AffiliateAccount thì cập nhật trạng thái thành DRAFT.\",\r\n \"operationId\": \"AccountController_upgradeToBusinessAccount_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Thông tin doanh nghiệp cần cập nhật khi nâng cấp tài khoản\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateBusinessInfoDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Nâng cấp tài khoản thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Nâng cấp tài khoản lên doanh nghiệp thành công\"\r\n },\r\n \"result\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"example\": 1\r\n },\r\n \"type\": {\r\n \"type\": \"string\",\r\n \"example\": \"BUSINESS\"\r\n },\r\n \"isSignatureRuleContract\": {\r\n \"type\": \"boolean\",\r\n \"example\": false\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Nâng cấp tài khoản lên doanh nghiệp thành công\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Tài khoản đã là loại doanh nghiệp hoặc dữ liệu không hợp lệ\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 400\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Tài khoản đã là loại doanh nghiệp\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy người dùng\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 404\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Không tìm thấy người dùng\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Nâng cấp tài khoản cá nhân lên doanh nghiệp\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/email/send-otp\": {\r\n \"post\": {\r\n \"description\": \"Gửi mã OTP 6 số đến email của người dùng để xác thực. Email phải chưa được sử dụng bởi tài khoản khác. Có cooldown 60 giây giữa các lần gửi.\",\r\n \"operationId\": \"AccountController_sendEmailVerificationOtp_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Email cần xác thực\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/SendEmailVerificationOtpDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Gửi OTP thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Đã gửi mã OTP đến email u***@example.com\"\r\n },\r\n \"result\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Đã gửi mã OTP đến email u***@example.com\"\r\n },\r\n \"maskedEmail\": {\r\n \"type\": \"string\",\r\n \"example\": \"u***@example.com\"\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"example\": 1640995500000\r\n },\r\n \"cooldownSeconds\": {\r\n \"type\": \"number\",\r\n \"example\": 60\r\n },\r\n \"verificationKey\": {\r\n \"type\": \"string\",\r\n \"example\": \"publicKey.encryptedData\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Email đã được sử dụng hoặc đang trong thời gian cooldown\"\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Gửi OTP xác thực email\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/account/email/verify-otp\": {\r\n \"post\": {\r\n \"description\": \"Xác thực mã OTP và verificationKey để cập nhật email cho người dùng. Sau khi xác thực thành công, email sẽ được lưu và đánh dấu đã xác thực.\",\r\n \"operationId\": \"AccountController_verifyEmailOtp_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"description\": \"Mã OTP và verificationKey\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/VerifyEmailOtpDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Xác thực email thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Xác thực email thành công\"\r\n },\r\n \"result\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Xác thực email thành công\"\r\n },\r\n \"isVerifyEmail\": {\r\n \"type\": \"boolean\",\r\n \"example\": true\r\n },\r\n \"email\": {\r\n \"type\": \"string\",\r\n \"example\": \"user@example.com\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"OTP không chính xác hoặc đã hết hạn\"\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xác thực OTP email\",\r\n \"tags\": [\r\n \"User - Account\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings\": {\r\n \"get\": {\r\n \"operationId\": \"UserSettingsController_getUserSettings_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy user settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy cài đặt (Code: 4083)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy user settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n },\r\n \"put\": {\r\n \"description\": \"API này đã deprecated. Khuyến khích sử dụng các API riêng biệt: PUT /theme, PUT /timezone, PUT /currency\",\r\n \"operationId\": \"UserSettingsController_updateUserSettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateUserSettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật user settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật user settings của người dùng hiện tại (Legacy - deprecated)\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n },\r\n \"delete\": {\r\n \"operationId\": \"UserSettingsController_deleteUserSettings_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Xóa user settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy cài đặt (Code: 4083)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Xóa cài đặt thất bại (Code: 4086)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xóa user settings của người dùng hiện tại (reset về mặc định)\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/theme\": {\r\n \"put\": {\r\n \"description\": \"Cập nhật cài đặt giao diện (theme) của người dùng. Hỗ trợ 2 chế độ: light, dark.\",\r\n \"operationId\": \"UserSettingsController_updateThemeSettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateThemeSettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật theme settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật theme settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/timezone\": {\r\n \"put\": {\r\n \"description\": \"Cập nhật múi giờ của người dùng. Hỗ trợ tất cả múi giờ theo chuẩn IANA timezone.\",\r\n \"operationId\": \"UserSettingsController_updateTimezoneSettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateTimezoneSettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật timezone settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật timezone settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/currency\": {\r\n \"put\": {\r\n \"description\": \"Cập nhật đơn vị tiền tệ của người dùng. Hỗ trợ các loại tiền tệ phổ biến như USD, VND, EUR, etc.\",\r\n \"operationId\": \"UserSettingsController_updateCurrencySettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateCurrencySettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật currency settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật currency settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/use-user-api-key\": {\r\n \"put\": {\r\n \"description\": \"Cập nhật cài đặt sử dụng API key của người dùng.\",\r\n \"operationId\": \"UserSettingsController_updateUseUserApiKeySettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateUseUserApiKeySettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật use user api key settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật use user api key settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/fallback-system-key\": {\r\n \"put\": {\r\n \"description\": \"Cập nhật cài đặt fallback system key của người dùng.\",\r\n \"operationId\": \"UserSettingsController_updateFallbackSystemKeySettings_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateFallbackSystemKeySettingsDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật fallback system key settings thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ (Code: 4080)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"500\": {\r\n \"description\": \"Tạo cài đặt thất bại (Code: 4085)\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ApiErrorResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật fallback system key settings của người dùng hiện tại\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/settings/options\": {\r\n \"get\": {\r\n \"operationId\": \"UserSettingsController_getUserSettingsOptions_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy danh sách options thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserSettingsOptionsResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách options cho user settings\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/users/topup/overview\": {\r\n \"get\": {\r\n \"operationId\": \"UserTopupController_getTopupOverview_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy tổng tiền nạp thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/UserTopupOverviewDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Tổng hợp số tiền người dùng đã nạp (subscription \\u0026 point)\",\r\n \"tags\": [\r\n \"Users\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/auth-verification-logs\": {\r\n \"get\": {\r\n \"description\": \"API này cho phép người dùng xem lịch sử xác thực của mình với các bộ lọc, tìm kiếm và phân trang. Hỗ trợ tìm kiếm theo ipAddress, userAgent, authMethod, status.\",\r\n \"operationId\": \"AuthVerificationLogController_getAuthVerificationLogs_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"page\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số trang hiện tại (bắt đầu từ 1)\",\r\n \"schema\": {\r\n \"default\": 1,\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"limit\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số lượng bản ghi trên mỗi trang\",\r\n \"schema\": {\r\n \"default\": 10,\r\n \"example\": 10,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"search\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\",\r\n \"schema\": {\r\n \"example\": \"sơn\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"searchBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\",\r\n \"schema\": {\r\n \"example\": \"name,email\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trường cần sắp xếp\",\r\n \"schema\": {\r\n \"example\": \"createdAt\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortDirection\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Hướng sắp xếp\",\r\n \"schema\": {\r\n \"default\": \"DESC\",\r\n \"example\": \"DESC\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"ASC\",\r\n \"DESC\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"authMethod\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Phương thức xác thực\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"EMAIL\",\r\n \"SMS\",\r\n \"GOOGLE\",\r\n \"FACEBOOK\",\r\n \"ZALO\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trạng thái xác thực\",\r\n \"schema\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"PENDING\",\r\n \"SUCCESS\",\r\n \"FAILED\",\r\n \"EXPIRED\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"ipAddress\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Địa chỉ IP\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"fromDate\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Từ ngày (timestamp)\",\r\n \"schema\": {\r\n \"example\": 1640995200000,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"toDate\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Đến ngày (timestamp)\",\r\n \"schema\": {\r\n \"example\": 1640995200000,\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy danh sách log xác thực thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy danh sách log xác thực thành công\"\r\n },\r\n \"result\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/PaginatedResult\"\r\n },\r\n {\r\n \"properties\": {\r\n \"items\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/AuthVerificationLogResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách log xác thực của người dùng hiện tại\",\r\n \"tags\": [\r\n \"User - Auth Verification Log\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/auth-verification-logs/stats\": {\r\n \"get\": {\r\n \"description\": \"API này cung cấp thống kê tổng quan về các lần xác thực của người dùng\",\r\n \"operationId\": \"AuthVerificationLogController_getAuthVerificationStats_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"fromDate\",\r\n \"required\": true,\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"toDate\",\r\n \"required\": true,\r\n \"in\": \"query\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy thống kê log xác thực thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy thống kê log xác thực thành công\"\r\n },\r\n \"result\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"totalAttempts\": {\r\n \"type\": \"number\",\r\n \"example\": 100,\r\n \"description\": \"Tổng số lần thử xác thực\"\r\n },\r\n \"successfulAttempts\": {\r\n \"type\": \"number\",\r\n \"example\": 95,\r\n \"description\": \"Số lần xác thực thành công\"\r\n },\r\n \"failedAttempts\": {\r\n \"type\": \"number\",\r\n \"example\": 5,\r\n \"description\": \"Số lần xác thực thất bại\"\r\n },\r\n \"successRate\": {\r\n \"type\": \"number\",\r\n \"example\": 95,\r\n \"description\": \"Tỷ lệ thành công (%)\"\r\n },\r\n \"methodStats\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"method\": {\r\n \"type\": \"string\",\r\n \"example\": \"EMAIL\",\r\n \"description\": \"Phương thức xác thực\"\r\n },\r\n \"count\": {\r\n \"type\": \"number\",\r\n \"example\": 50,\r\n \"description\": \"Số lần sử dụng\"\r\n },\r\n \"successCount\": {\r\n \"type\": \"number\",\r\n \"example\": 48,\r\n \"description\": \"Số lần thành công\"\r\n }\r\n }\r\n },\r\n \"description\": \"Thống kê theo phương thức xác thực\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thống kê log xác thực của người dùng hiện tại\",\r\n \"tags\": [\r\n \"User - Auth Verification Log\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/auth-verification-logs/detail/{id}\": {\r\n \"get\": {\r\n \"description\": \"API này cho phép người dùng xem chi tiết một log xác thực cụ thể\",\r\n \"operationId\": \"AuthVerificationLogController_getAuthVerificationLogById_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của log xác thực\",\r\n \"schema\": {\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy chi tiết log xác thực thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy chi tiết log xác thực thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/AuthVerificationLogResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy log xác thực\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy chi tiết log xác thực theo ID\",\r\n \"tags\": [\r\n \"User - Auth Verification Log\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/device-info\": {\r\n \"get\": {\r\n \"description\": \"Lấy danh sách tất cả thiết bị đã đăng nhập của người dùng hiện tại với các bộ lọc và phân trang\",\r\n \"operationId\": \"DeviceInfoController_getDeviceInfos_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"page\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số trang (bắt đầu từ 1)\",\r\n \"schema\": {\r\n \"default\": 1,\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"limit\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số lượng item trên mỗi trang\",\r\n \"schema\": {\r\n \"default\": 10,\r\n \"example\": 10,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"search\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Từ khóa tìm kiếm (tìm kiếm theo họ tên, email, hoặc số điện thoại - không phân biệt chữ hoa/thường)\",\r\n \"schema\": {\r\n \"example\": \"sơn\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"searchBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trường cần tìm kiếm (có thể chỉ định một hoặc nhiều trường, phân cách bằng dấu phẩy)\",\r\n \"schema\": {\r\n \"example\": \"name,email\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortBy\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Trường cần sắp xếp\",\r\n \"schema\": {\r\n \"example\": \"createdAt\",\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"sortDirection\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Hướng sắp xếp\",\r\n \"schema\": {\r\n \"default\": \"DESC\",\r\n \"example\": \"DESC\",\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"ASC\",\r\n \"DESC\"\r\n ]\r\n }\r\n },\r\n {\r\n \"name\": \"browser\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo trình duyệt\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"operatingSystem\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo hệ điều hành\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"isTrusted\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo trạng thái tin cậy\",\r\n \"schema\": {\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n {\r\n \"name\": \"ipAddress\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo địa chỉ IP\",\r\n \"schema\": {\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"fromDate\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Từ ngày (timestamp)\",\r\n \"schema\": {\r\n \"example\": 1640995200000,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"toDate\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Đến ngày (timestamp)\",\r\n \"schema\": {\r\n \"example\": 1640995200000,\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Danh sách thiết bị với phân trang\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy danh sách thiết bị thành công\"\r\n },\r\n \"result\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"items\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/DeviceInfoResponseDto\"\r\n }\r\n },\r\n \"meta\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"totalItems\": {\r\n \"type\": \"number\",\r\n \"example\": 100\r\n },\r\n \"itemCount\": {\r\n \"type\": \"number\",\r\n \"example\": 10\r\n },\r\n \"itemsPerPage\": {\r\n \"type\": \"number\",\r\n \"example\": 10\r\n },\r\n \"totalPages\": {\r\n \"type\": \"number\",\r\n \"example\": 10\r\n },\r\n \"currentPage\": {\r\n \"type\": \"number\",\r\n \"example\": 1\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách thiết bị\",\r\n \"tags\": [\r\n \"User - Device Info\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/device-info/{deviceId}\": {\r\n \"get\": {\r\n \"description\": \"Lấy thông tin chi tiết của một thiết bị cụ thể\",\r\n \"operationId\": \"DeviceInfoController_getDeviceInfoById_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"deviceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của thiết bị\",\r\n \"schema\": {\r\n \"example\": \"uuid-string\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Chi tiết thiết bị\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy chi tiết thiết bị thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/DeviceInfoResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy thiết bị\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy chi tiết thiết bị\",\r\n \"tags\": [\r\n \"User - Device Info\"\r\n ]\r\n },\r\n \"delete\": {\r\n \"description\": \"Xóa thiết bị khỏi danh sách thiết bị đáng tin cậy. Thiết bị sẽ cần xác thực lại khi đăng nhập.\",\r\n \"operationId\": \"DeviceInfoController_deleteDevice_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"deviceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của thiết bị\",\r\n \"schema\": {\r\n \"example\": \"uuid-string\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Xóa thiết bị thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Xóa thiết bị thành công\"\r\n },\r\n \"result\": {\r\n \"type\": \"null\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy thiết bị\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xóa thiết bị\",\r\n \"tags\": [\r\n \"User - Device Info\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/device-info/{deviceId}/trust\": {\r\n \"put\": {\r\n \"description\": \"Đánh dấu thiết bị là đáng tin cậy hoặc không đáng tin cậy\",\r\n \"operationId\": \"DeviceInfoController_updateDeviceTrust_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"deviceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của thiết bị\",\r\n \"schema\": {\r\n \"example\": \"uuid-string\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateDeviceTrustDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Cập nhật trạng thái tin cậy thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Cập nhật trạng thái tin cậy thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/DeviceInfoResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy thiết bị\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật trạng thái tin cậy thiết bị\",\r\n \"tags\": [\r\n \"User - Device Info\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/device-info/stats/overview\": {\r\n \"get\": {\r\n \"description\": \"Lấy thống kê tổng quan về các thiết bị của người dùng bao gồm số lượng, trình duyệt, hệ điều hành\",\r\n \"operationId\": \"DeviceInfoController_getDeviceStats_v1\",\r\n \"parameters\": [],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Thống kê thiết bị\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"example\": 200\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"example\": \"Lấy thống kê thiết bị thành công\"\r\n },\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/DeviceStatsResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Chưa đăng nhập\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thống kê thiết bị\",\r\n \"tags\": [\r\n \"User - Device Info\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/resources\": {\r\n \"get\": {\r\n \"description\": \"Lấy danh sách tất cả tài nguyên của người dùng với phân trang và filter\",\r\n \"operationId\": \"UserResourceController_getUserResources_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"resourceType\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo loại tài nguyên\",\r\n \"schema\": {\r\n \"enum\": [\r\n \"ZALO_CONVERSATION\",\r\n \"DOCUMENT\",\r\n \"IMAGE\",\r\n \"VIDEO\",\r\n \"AUDIO\",\r\n \"OTHER\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"status\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Lọc theo trạng thái\",\r\n \"schema\": {\r\n \"enum\": [\r\n \"PENDING\",\r\n \"PROCESSING\",\r\n \"COMPLETED\",\r\n \"FAILED\"\r\n ],\r\n \"type\": \"string\"\r\n }\r\n },\r\n {\r\n \"name\": \"page\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số trang (bắt đầu từ 1)\",\r\n \"schema\": {\r\n \"minimum\": 1,\r\n \"default\": 1,\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"limit\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số lượng item trên mỗi trang\",\r\n \"schema\": {\r\n \"minimum\": 1,\r\n \"maximum\": 100,\r\n \"default\": 20,\r\n \"example\": 20,\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy danh sách tài nguyên thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UserResourcesListResponseDto\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách tài nguyên người dùng\",\r\n \"tags\": [\r\n \"User Resources\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/resources/{resourceId}\": {\r\n \"get\": {\r\n \"description\": \"Lấy thông tin chi tiết của một tài nguyên cụ thể\",\r\n \"operationId\": \"UserResourceController_getUserResource_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"resourceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của tài nguyên\",\r\n \"schema\": {\r\n \"example\": \"123e4567-e89b-12d3-a456-426614174000\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Lấy thông tin tài nguyên thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UserResourceResponseDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy tài nguyên\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thông tin chi tiết tài nguyên\",\r\n \"tags\": [\r\n \"User Resources\"\r\n ]\r\n },\r\n \"delete\": {\r\n \"description\": \"Xóa tài nguyên khỏi hệ thống (bao gồm cả file trên S3)\",\r\n \"operationId\": \"UserResourceController_deleteUserResource_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"resourceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của tài nguyên\",\r\n \"schema\": {\r\n \"example\": \"123e4567-e89b-12d3-a456-426614174000\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Xóa tài nguyên thành công\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy tài nguyên\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xóa tài nguyên\",\r\n \"tags\": [\r\n \"User Resources\"\r\n ]\r\n }\r\n },\r\n \"/v1/user/resources/{resourceId}/refresh-url\": {\r\n \"post\": {\r\n \"description\": \"Tạo presigned URL mới để truy cập tài nguyên\",\r\n \"operationId\": \"UserResourceController_refreshAccessUrl_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"resourceId\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của tài nguyên\",\r\n \"schema\": {\r\n \"example\": \"123e4567-e89b-12d3-a456-426614174000\",\r\n \"type\": \"string\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Làm mới URL thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"accessUrl\": {\r\n \"type\": \"string\",\r\n \"description\": \"URL truy cập mới\",\r\n \"example\": \"https://s3.amazonaws.com/bucket/file.json?signature=...\"\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn (timestamp)\",\r\n \"example\": 1704153600000\r\n }\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Tài nguyên chưa hoàn thành\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy tài nguyên\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Làm mới URL truy cập tài nguyên\",\r\n \"tags\": [\r\n \"User Resources\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys\": {\r\n \"post\": {\r\n \"description\": \"Tạo API key mới với mã hóa bảo mật. API key chỉ hiển thị 1 lần khi tạo.\",\r\n \"operationId\": \"ApiKeyController_createApiKey_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/CreateApiKeyDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"201\": {\r\n \"description\": \"API key đã được tạo thành công\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/CreateApiKeyResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ\"\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Tạo API key mới\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n },\r\n \"get\": {\r\n \"description\": \"Lấy danh sách tất cả API keys của người dùng hiện tại với phân trang\",\r\n \"operationId\": \"ApiKeyController_getApiKeys_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"includeInactive\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Có bao gồm API keys không active không\",\r\n \"schema\": {\r\n \"default\": false,\r\n \"example\": false,\r\n \"type\": \"boolean\"\r\n }\r\n },\r\n {\r\n \"name\": \"page\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số trang (bắt đầu từ 1)\",\r\n \"schema\": {\r\n \"minimum\": 1,\r\n \"default\": 1,\r\n \"example\": 1,\r\n \"type\": \"number\"\r\n }\r\n },\r\n {\r\n \"name\": \"limit\",\r\n \"required\": false,\r\n \"in\": \"query\",\r\n \"description\": \"Số lượng bản ghi trên mỗi trang\",\r\n \"schema\": {\r\n \"minimum\": 1,\r\n \"maximum\": 100,\r\n \"default\": 10,\r\n \"example\": 10,\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Danh sách API keys với phân trang\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/PaginatedResult\"\r\n },\r\n {\r\n \"properties\": {\r\n \"items\": {\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/ApiKeyResponseDto\"\r\n }\r\n },\r\n \"meta\": {\r\n \"$ref\": \"#/components/schemas/PaginationMeta\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy danh sách API keys\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys/{id}\": {\r\n \"get\": {\r\n \"description\": \"Lấy thông tin chi tiết của một API key theo ID\",\r\n \"operationId\": \"ApiKeyController_getApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Thông tin API key\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/ApiKeyResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Lấy thông tin API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n },\r\n \"put\": {\r\n \"description\": \"Cập nhật thông tin của một API key (tên, quyền, thời gian hết hạn, giới hạn sử dụng)\",\r\n \"operationId\": \"ApiKeyController_updateApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/UpdateApiKeyDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"API key đã được cập nhật\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/ApiKeyResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ\"\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Cập nhật API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n },\r\n \"delete\": {\r\n \"description\": \"Xóa vĩnh viễn một API key. Hành động này không thể hoàn tác.\",\r\n \"operationId\": \"ApiKeyController_deleteApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"API key đã được xóa\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"type\": \"null\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xóa API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys/{id}/activate\": {\r\n \"put\": {\r\n \"description\": \"Kích hoạt một API key đã bị vô hiệu hóa\",\r\n \"operationId\": \"ApiKeyController_activateApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"API key đã được kích hoạt\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"type\": \"null\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Kích hoạt API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys/{id}/deactivate\": {\r\n \"put\": {\r\n \"description\": \"Vô hiệu hóa một API key để ngừng sử dụng tạm thời\",\r\n \"operationId\": \"ApiKeyController_deactivateApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"API key đã được vô hiệu hóa\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"type\": \"null\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Vô hiệu hóa API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys/{id}/reveal\": {\r\n \"post\": {\r\n \"description\": \"Hiển thị API key đầy đủ để người dùng copy.\",\r\n \"operationId\": \"ApiKeyController_revealApiKey_v1\",\r\n \"parameters\": [\r\n {\r\n \"name\": \"id\",\r\n \"required\": true,\r\n \"in\": \"path\",\r\n \"description\": \"ID của API key\",\r\n \"schema\": {\r\n \"type\": \"number\"\r\n }\r\n }\r\n ],\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"API key đã được hiển thị\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/RevealApiKeyResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"401\": {\r\n \"description\": \"Không có quyền truy cập\"\r\n },\r\n \"404\": {\r\n \"description\": \"Không tìm thấy API key\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Hiển thị API key đầy đủ\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n },\r\n \"/v1/api-keys/validate\": {\r\n \"post\": {\r\n \"description\": \"Xác thực tính hợp lệ của một API key. Endpoint này dành cho hệ thống nội bộ.\",\r\n \"operationId\": \"ApiKeyController_validateApiKey_v1\",\r\n \"parameters\": [],\r\n \"requestBody\": {\r\n \"required\": true,\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"$ref\": \"#/components/schemas/ValidateApiKeyDto\"\r\n }\r\n }\r\n }\r\n },\r\n \"responses\": {\r\n \"200\": {\r\n \"description\": \"Kết quả xác thực API key\",\r\n \"content\": {\r\n \"application/json\": {\r\n \"schema\": {\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/ApiResponseDto\"\r\n },\r\n {\r\n \"properties\": {\r\n \"result\": {\r\n \"$ref\": \"#/components/schemas/ValidateApiKeyResponseDto\"\r\n }\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n },\r\n \"400\": {\r\n \"description\": \"Dữ liệu đầu vào không hợp lệ\"\r\n },\r\n \"500\": {\r\n \"description\": \"Lỗi hệ thống\"\r\n }\r\n },\r\n \"security\": [\r\n {\r\n \"JWT-auth\": []\r\n }\r\n ],\r\n \"summary\": \"Xác thực API key\",\r\n \"tags\": [\r\n \"API Keys\"\r\n ]\r\n }\r\n }\r\n },\r\n \"info\": {\r\n \"title\": \"RedAI User API Export - User\",\r\n \"description\": \"OpenAPI export cho nhóm API user đã chọn: User.\",\r\n \"version\": \"1.0\",\r\n \"contact\": {\r\n \"name\": \"RedAI Support\",\r\n \"url\": \"https://redai.com/support\",\r\n \"email\": \"support@redai.com\"\r\n },\r\n \"license\": {\r\n \"name\": \"MIT\",\r\n \"url\": \"https://opensource.org/licenses/MIT\"\r\n }\r\n },\r\n \"tags\": [\r\n {\r\n \"name\": \"Users\",\r\n \"description\": \"User endpoints\"\r\n },\r\n {\r\n \"name\": \"User Banks\",\r\n \"description\": \"User bank management endpoints\"\r\n },\r\n {\r\n \"name\": \"User - Device Info\",\r\n \"description\": \"Admin blog management endpoints\"\r\n },\r\n {\r\n \"name\": \"User - Auth Verification Log\",\r\n \"description\": \"User auth verification log endpoints\"\r\n },\r\n {\r\n \"name\": \"User - Account\",\r\n \"description\": \"User account endpoints\"\r\n }\r\n ],\r\n \"servers\": [\r\n {\r\n \"url\": \"http://localhost:3000\",\r\n \"description\": \"Local Server\"\r\n },\r\n {\r\n \"url\": \"http://localhost:3003\",\r\n \"description\": \"Development Server\"\r\n },\r\n {\r\n \"url\": \"http://14.225.29.196:3003\",\r\n \"description\": \"Test Server\"\r\n },\r\n {\r\n \"url\": \"https://api-staging.redai.vn\",\r\n \"description\": \"Staging Server\"\r\n },\r\n {\r\n \"url\": \"https://v2.redai.vn/api\",\r\n \"description\": \"Production Server\"\r\n }\r\n ],\r\n \"components\": {\r\n \"schemas\": {\r\n \"ApiResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"description\": \"Mã trạng thái (0: Thành công, khác 0: Mã lỗi cụ thể)\",\r\n \"example\": 0\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"description\": \"Thông điệp mô tả kết quả\",\r\n \"example\": \"Success\"\r\n }\r\n },\r\n \"required\": [\r\n \"code\",\r\n \"message\"\r\n ]\r\n },\r\n \"PaginatedResult\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"items\": {\r\n \"description\": \"Danh sách các item\",\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"type\": \"array\"\r\n }\r\n },\r\n \"meta\": {\r\n \"description\": \"Thông tin phân trang\",\r\n \"allOf\": [\r\n {\r\n \"$ref\": \"#/components/schemas/PaginationMeta\"\r\n }\r\n ]\r\n }\r\n },\r\n \"required\": [\r\n \"items\",\r\n \"meta\"\r\n ]\r\n },\r\n \"BankResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"bankCode\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã ngân hàng\",\r\n \"example\": \"VCB\"\r\n },\r\n \"bankName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên ngân hàng\",\r\n \"example\": \"Vietcombank\"\r\n },\r\n \"logoPath\": {\r\n \"type\": \"string\",\r\n \"description\": \"Đường dẫn logo\",\r\n \"example\": \"/images/banks/vcb-logo.png\"\r\n },\r\n \"fullName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên đầy đủ của ngân hàng\",\r\n \"example\": \"Ngân hàng TMCP Ngoại thương Việt Nam\"\r\n },\r\n \"iconPath\": {\r\n \"type\": \"string\",\r\n \"description\": \"Đường dẫn icon\",\r\n \"example\": \"/images/banks/vcb-icon.png\"\r\n },\r\n \"bin\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã BIN của ngân hàng\",\r\n \"example\": \"970436\"\r\n }\r\n },\r\n \"required\": [\r\n \"bankCode\",\r\n \"bankName\",\r\n \"logoPath\",\r\n \"fullName\",\r\n \"iconPath\",\r\n \"bin\"\r\n ]\r\n },\r\n \"UpdateBankInfoDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"bankCode\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã ngân hàng\",\r\n \"example\": \"VIETCOMBANK\"\r\n },\r\n \"accountNumber\": {\r\n \"type\": \"string\",\r\n \"description\": \"Số tài khoản\",\r\n \"example\": \"1234567890\"\r\n },\r\n \"accountHolder\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên chủ tài khoản\",\r\n \"example\": \"NGUYEN VAN A\"\r\n },\r\n \"bankBranch\": {\r\n \"type\": \"string\",\r\n \"description\": \"Chi nhánh ngân hàng\",\r\n \"example\": \"Chi nhánh Hà Nội\"\r\n }\r\n },\r\n \"required\": [\r\n \"bankCode\",\r\n \"accountNumber\",\r\n \"accountHolder\"\r\n ]\r\n },\r\n \"UpdateBusinessInfoDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"businessName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên doanh nghiệp\",\r\n \"example\": \"Công ty TNHH ABC\"\r\n },\r\n \"businessEmail\": {\r\n \"type\": \"string\",\r\n \"description\": \"Email doanh nghiệp\",\r\n \"example\": \"contact@abc.com\"\r\n },\r\n \"businessPhone\": {\r\n \"type\": \"string\",\r\n \"description\": \"Số điện thoại doanh nghiệp\",\r\n \"example\": \"0793355880\"\r\n },\r\n \"taxCode\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã số thuế\",\r\n \"example\": \"0123456789\"\r\n },\r\n \"representativeName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên người đại diện\",\r\n \"example\": \"Nguyễn Văn A\"\r\n },\r\n \"representativePosition\": {\r\n \"type\": \"string\",\r\n \"description\": \"Vị trí người đại diện\",\r\n \"example\": \"Giám đốc\"\r\n },\r\n \"businessAddress\": {\r\n \"type\": \"string\",\r\n \"description\": \"Địa chỉ doanh nghiệp\",\r\n \"example\": \"123 Nguyễn Văn Cừ, Quận 5, Hồ Chí Minh\"\r\n }\r\n },\r\n \"required\": [\r\n \"businessName\",\r\n \"businessEmail\",\r\n \"businessPhone\",\r\n \"taxCode\",\r\n \"representativeName\",\r\n \"representativePosition\",\r\n \"businessAddress\"\r\n ]\r\n },\r\n \"AvatarUploadDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"imageType\": {\r\n \"type\": \"string\",\r\n \"description\": \"Loại hình ảnh\",\r\n \"enum\": [\r\n \"image/png\",\r\n \"image/jpeg\",\r\n \"image/webp\",\r\n \"image/gif\",\r\n \"image/svg+xml\",\r\n \"image/bmp\",\r\n \"image/tiff\",\r\n \"image/x-icon\",\r\n \"image/avif\"\r\n ],\r\n \"example\": \"image/jpeg\"\r\n },\r\n \"maxSize\": {\r\n \"type\": \"number\",\r\n \"description\": \"Kích thước tối đa của file (bytes)\",\r\n \"example\": 2097152\r\n }\r\n },\r\n \"required\": [\r\n \"imageType\",\r\n \"maxSize\"\r\n ]\r\n },\r\n \"AvatarUploadResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"uploadUrl\": {\r\n \"type\": \"string\",\r\n \"description\": \"URL tạm thời để tải lên avatar\",\r\n \"example\": \"https://example.com/presigned-url\"\r\n },\r\n \"avatarKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"Khóa S3 của avatar\",\r\n \"example\": \"avatars/user-123/avatar-1234567890.jpg\"\r\n },\r\n \"expiresIn\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn của URL (giây)\",\r\n \"example\": 300\r\n }\r\n },\r\n \"required\": [\r\n \"uploadUrl\",\r\n \"avatarKey\",\r\n \"expiresIn\"\r\n ]\r\n },\r\n \"UpdateAvatarDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"avatarKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"Khóa S3 của avatar\",\r\n \"example\": \"avatars/user-123/avatar-1234567890.jpg\"\r\n }\r\n },\r\n \"required\": [\r\n \"avatarKey\"\r\n ]\r\n },\r\n \"CoverImageUploadDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"imageType\": {\r\n \"type\": \"string\",\r\n \"description\": \"Loại hình ảnh\",\r\n \"enum\": [\r\n \"image/png\",\r\n \"image/jpeg\",\r\n \"image/webp\",\r\n \"image/gif\",\r\n \"image/svg+xml\",\r\n \"image/bmp\",\r\n \"image/tiff\",\r\n \"image/x-icon\",\r\n \"image/avif\"\r\n ],\r\n \"example\": \"image/jpeg\"\r\n },\r\n \"maxSize\": {\r\n \"type\": \"number\",\r\n \"description\": \"Kích thước tối đa của file (bytes)\",\r\n \"example\": 5242880\r\n }\r\n },\r\n \"required\": [\r\n \"imageType\",\r\n \"maxSize\"\r\n ]\r\n },\r\n \"CoverImageUploadResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"uploadUrl\": {\r\n \"type\": \"string\",\r\n \"description\": \"URL tạm thời để tải lên ảnh bìa\",\r\n \"example\": \"https://example.com/presigned-url\"\r\n },\r\n \"coverImageKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"Khóa S3 của ảnh bìa\",\r\n \"example\": \"cover-images/user-123/cover-1234567890.jpg\"\r\n },\r\n \"expiresIn\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn của URL (giây)\",\r\n \"example\": 300\r\n }\r\n },\r\n \"required\": [\r\n \"uploadUrl\",\r\n \"coverImageKey\",\r\n \"expiresIn\"\r\n ]\r\n },\r\n \"UpdateNotificationSettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"receiveAccountSystemEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email thông báo hệ thống\",\r\n \"example\": true\r\n },\r\n \"receiveBillingEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email thông báo thanh toán\",\r\n \"example\": true\r\n },\r\n \"receiveNewFeatureEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email thông báo tính năng mới\",\r\n \"example\": true\r\n },\r\n \"receiveAffiliateEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email thông báo tiếp thị liên kết\",\r\n \"example\": true\r\n },\r\n \"receiveDocumentationEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email thông báo tài liệu\",\r\n \"example\": true,\r\n \"nullable\": true\r\n },\r\n \"receivePromotionalEmails\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Nhận email quảng cáo\",\r\n \"example\": true\r\n }\r\n }\r\n },\r\n \"SendPhoneVerificationOtpDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"phoneNumber\": {\r\n \"type\": \"string\",\r\n \"description\": \"Số điện thoại cần xác thực\",\r\n \"example\": \"0987654321\"\r\n }\r\n },\r\n \"required\": [\r\n \"phoneNumber\"\r\n ]\r\n },\r\n \"VerifyPhoneOtpDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"phoneNumber\": {\r\n \"type\": \"string\",\r\n \"description\": \"Số điện thoại đã gửi OTP\",\r\n \"example\": \"0987654321\"\r\n },\r\n \"otp\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã OTP 6 số\",\r\n \"example\": \"123456\"\r\n }\r\n },\r\n \"required\": [\r\n \"phoneNumber\",\r\n \"otp\"\r\n ]\r\n },\r\n \"SendEmailVerificationOtpDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"email\": {\r\n \"type\": \"string\",\r\n \"description\": \"Email cần xác thực\",\r\n \"example\": \"user@example.com\"\r\n }\r\n },\r\n \"required\": [\r\n \"email\"\r\n ]\r\n },\r\n \"VerifyEmailOtpDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"otp\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã OTP 6 số\",\r\n \"example\": \"123456\"\r\n },\r\n \"verificationKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"Key mã hóa trả về từ API gửi OTP\"\r\n }\r\n },\r\n \"required\": [\r\n \"otp\",\r\n \"verificationKey\"\r\n ]\r\n },\r\n \"UserSettingsResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của bản ghi user settings\",\r\n \"example\": 1\r\n },\r\n \"userId\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của người dùng\",\r\n \"example\": 123\r\n },\r\n \"theme\": {\r\n \"type\": \"object\",\r\n \"description\": \"Cài đặt giao diện người dùng dạng JSON. 2 options: light, dark\",\r\n \"examples\": {\r\n \"light\": {\r\n \"summary\": \"Light theme\",\r\n \"value\": {\r\n \"mode\": \"light\"\r\n }\r\n },\r\n \"dark\": {\r\n \"summary\": \"Dark theme\",\r\n \"value\": {\r\n \"mode\": \"dark\"\r\n }\r\n }\r\n },\r\n \"example\": {\r\n \"mode\": \"light\"\r\n }\r\n },\r\n \"timezone\": {\r\n \"type\": \"string\",\r\n \"description\": \"Múi giờ được chọn bởi người dùng\",\r\n \"example\": \"UTC\"\r\n },\r\n \"currency\": {\r\n \"type\": \"string\",\r\n \"description\": \"Đơn vị tiền tệ được chọn bởi người dùng\",\r\n \"example\": \"USD\"\r\n },\r\n \"useUserApiKey\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Cài đặt sử dụng API key của người dùng\",\r\n \"example\": false\r\n },\r\n \"fallbackSystemKey\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Cài đặt fallback system key\",\r\n \"example\": true\r\n },\r\n \"createdAt\": {\r\n \"type\": \"string\",\r\n \"description\": \"Thời điểm tạo bản ghi (ISO string)\",\r\n \"example\": \"2024-06-22T10:30:00.000Z\"\r\n },\r\n \"updatedAt\": {\r\n \"type\": \"string\",\r\n \"description\": \"Thời điểm cập nhật bản ghi gần nhất (ISO string)\",\r\n \"example\": \"2024-06-22T10:30:00.000Z\"\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"userId\",\r\n \"theme\",\r\n \"timezone\",\r\n \"currency\",\r\n \"useUserApiKey\",\r\n \"fallbackSystemKey\",\r\n \"createdAt\",\r\n \"updatedAt\"\r\n ]\r\n },\r\n \"ApiErrorResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"code\": {\r\n \"type\": \"number\",\r\n \"description\": \"Mã lỗi cụ thể\",\r\n \"example\": 11000,\r\n \"examples\": [\r\n 11000,\r\n 11001,\r\n 11002\r\n ]\r\n },\r\n \"message\": {\r\n \"type\": \"string\",\r\n \"description\": \"Thông báo lỗi\",\r\n \"example\": \"Không thể gửi email, vui lòng thử lại sau\"\r\n },\r\n \"statusCode\": {\r\n \"type\": \"number\",\r\n \"description\": \"Mã HTTP status\",\r\n \"example\": 400,\r\n \"examples\": [\r\n 400,\r\n 401,\r\n 403,\r\n 404,\r\n 500\r\n ]\r\n },\r\n \"timestamp\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian phát sinh lỗi (timestamp)\",\r\n \"example\": 1682584291000\r\n },\r\n \"path\": {\r\n \"type\": \"string\",\r\n \"description\": \"Path của API gặp lỗi\",\r\n \"example\": \"/api/v1/admin/system-email-test/send-email\"\r\n },\r\n \"method\": {\r\n \"type\": \"string\",\r\n \"description\": \"Phương thức HTTP\",\r\n \"example\": \"POST\",\r\n \"examples\": [\r\n \"GET\",\r\n \"POST\",\r\n \"PUT\",\r\n \"PATCH\",\r\n \"DELETE\"\r\n ]\r\n },\r\n \"details\": {\r\n \"type\": \"object\",\r\n \"description\": \"Chi tiết lỗi bổ sung (tùy chọn)\",\r\n \"example\": {\r\n \"fieldErrors\": [\r\n {\r\n \"field\": \"email\",\r\n \"message\": \"Email không hợp lệ\"\r\n }\r\n ]\r\n }\r\n }\r\n },\r\n \"required\": [\r\n \"code\",\r\n \"message\",\r\n \"statusCode\",\r\n \"timestamp\",\r\n \"path\",\r\n \"method\"\r\n ]\r\n },\r\n \"UpdateUserSettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"theme\": {\r\n \"type\": \"object\",\r\n \"description\": \"Cài đặt giao diện người dùng dạng JSON. 3 options: light, dark, custom với mã màu\",\r\n \"examples\": {\r\n \"light\": {\r\n \"summary\": \"Light theme\",\r\n \"value\": {\r\n \"mode\": \"light\"\r\n }\r\n },\r\n \"dark\": {\r\n \"summary\": \"Dark theme\",\r\n \"value\": {\r\n \"mode\": \"dark\"\r\n }\r\n },\r\n \"custom\": {\r\n \"summary\": \"Custom theme với mã màu\",\r\n \"value\": {\r\n \"mode\": \"custom\",\r\n \"color\": \"#F12345\"\r\n }\r\n }\r\n },\r\n \"example\": {\r\n \"mode\": \"custom\",\r\n \"color\": \"#F12345\"\r\n }\r\n },\r\n \"timezone\": {\r\n \"type\": \"string\",\r\n \"description\": \"Múi giờ được chọn bởi người dùng (ví dụ: UTC, Asia/Ho_Chi_Minh)\",\r\n \"example\": \"Asia/Ho_Chi_Minh\"\r\n },\r\n \"currency\": {\r\n \"type\": \"string\",\r\n \"description\": \"Đơn vị tiền tệ được chọn bởi người dùng (ví dụ: USD, VND, EUR)\",\r\n \"example\": \"VND\"\r\n }\r\n }\r\n },\r\n \"UpdateThemeSettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"theme\": {\r\n \"type\": \"object\",\r\n \"description\": \"Cài đặt giao diện người dùng dạng JSON. 2 options: light, dark\",\r\n \"examples\": {\r\n \"light\": {\r\n \"summary\": \"Light theme\",\r\n \"value\": {\r\n \"mode\": \"light\"\r\n }\r\n },\r\n \"dark\": {\r\n \"summary\": \"Dark theme\",\r\n \"value\": {\r\n \"mode\": \"dark\"\r\n }\r\n }\r\n },\r\n \"example\": {\r\n \"mode\": \"light\"\r\n }\r\n }\r\n },\r\n \"required\": [\r\n \"theme\"\r\n ]\r\n },\r\n \"UpdateTimezoneSettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"timezone\": {\r\n \"type\": \"string\",\r\n \"description\": \"Múi giờ được chọn bởi người dùng (ví dụ: UTC, Asia/Ho_Chi_Minh)\",\r\n \"example\": \"Asia/Ho_Chi_Minh\"\r\n }\r\n },\r\n \"required\": [\r\n \"timezone\"\r\n ]\r\n },\r\n \"UpdateCurrencySettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"currency\": {\r\n \"type\": \"string\",\r\n \"description\": \"Đơn vị tiền tệ được chọn bởi người dùng (ví dụ: USD, VND, EUR)\",\r\n \"example\": \"VND\"\r\n }\r\n },\r\n \"required\": [\r\n \"currency\"\r\n ]\r\n },\r\n \"UpdateUseUserApiKeySettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"useUserApiKey\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Cài đặt sử dụng API key của người dùng\",\r\n \"example\": false\r\n }\r\n },\r\n \"required\": [\r\n \"useUserApiKey\"\r\n ]\r\n },\r\n \"UpdateFallbackSystemKeySettingsDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"fallbackSystemKey\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Cài đặt fallback system key cho người dùng\",\r\n \"example\": true\r\n }\r\n },\r\n \"required\": [\r\n \"fallbackSystemKey\"\r\n ]\r\n },\r\n \"UserSettingsOptionsResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"timezones\": {\r\n \"description\": \"Danh sách các timezone có sẵn\",\r\n \"example\": [\r\n {\r\n \"value\": \"Asia/Ho_Chi_Minh\",\r\n \"label\": \"Việt Nam (GMT+7)\",\r\n \"offset\": \"+07:00\"\r\n },\r\n {\r\n \"value\": \"UTC\",\r\n \"label\": \"UTC (GMT+0)\",\r\n \"offset\": \"+00:00\"\r\n }\r\n ],\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/TimezoneOptionDto\"\r\n }\r\n },\r\n \"currencies\": {\r\n \"description\": \"Danh sách các đơn vị tiền tệ có sẵn\",\r\n \"example\": [\r\n {\r\n \"value\": \"VND\",\r\n \"label\": \"Việt Nam Đồng\",\r\n \"symbol\": \"₫\"\r\n },\r\n {\r\n \"value\": \"USD\",\r\n \"label\": \"US Dollar\",\r\n \"symbol\": \"$\"\r\n }\r\n ],\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/CurrencyOptionDto\"\r\n }\r\n },\r\n \"themeModes\": {\r\n \"description\": \"Danh sách các theme mode có sẵn\",\r\n \"example\": [\r\n {\r\n \"value\": \"light\",\r\n \"label\": \"Sáng\"\r\n },\r\n {\r\n \"value\": \"dark\",\r\n \"label\": \"Tối\"\r\n }\r\n ],\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/ThemeModeOptionDto\"\r\n }\r\n }\r\n },\r\n \"required\": [\r\n \"timezones\",\r\n \"currencies\",\r\n \"themeModes\"\r\n ]\r\n },\r\n \"AuthVerificationLogResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của log\",\r\n \"example\": 1\r\n },\r\n \"userId\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của người dùng\",\r\n \"example\": 1\r\n },\r\n \"authMethod\": {\r\n \"type\": \"string\",\r\n \"description\": \"Phương thức xác thực\",\r\n \"enum\": [\r\n \"EMAIL\",\r\n \"SMS\",\r\n \"GOOGLE\",\r\n \"FACEBOOK\",\r\n \"ZALO\"\r\n ],\r\n \"example\": \"EMAIL\"\r\n },\r\n \"status\": {\r\n \"type\": \"string\",\r\n \"description\": \"Trạng thái xác thực\",\r\n \"enum\": [\r\n \"PENDING\",\r\n \"SUCCESS\",\r\n \"FAILED\",\r\n \"EXPIRED\"\r\n ],\r\n \"example\": \"SUCCESS\"\r\n },\r\n \"ipAddress\": {\r\n \"type\": \"string\",\r\n \"description\": \"Địa chỉ IP\",\r\n \"example\": \"192.168.1.1\"\r\n },\r\n \"userAgent\": {\r\n \"type\": \"string\",\r\n \"description\": \"User agent\",\r\n \"example\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\"\r\n },\r\n \"codeSentAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian gửi mã (timestamp)\",\r\n \"example\": 1640995200000\r\n },\r\n \"verifiedAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian xác thực (timestamp)\",\r\n \"example\": 1640995200000\r\n },\r\n \"attemptCount\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lần thử\",\r\n \"example\": 1\r\n },\r\n \"createdAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian tạo (timestamp)\",\r\n \"example\": 1640995200000\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"userId\",\r\n \"authMethod\",\r\n \"status\",\r\n \"ipAddress\",\r\n \"userAgent\",\r\n \"codeSentAt\",\r\n \"verifiedAt\",\r\n \"attemptCount\",\r\n \"createdAt\"\r\n ]\r\n },\r\n \"DeviceInfoResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"description\": \"ID thiết bị\"\r\n },\r\n \"userId\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID người dùng\"\r\n },\r\n \"userName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên người dùng\"\r\n },\r\n \"userEmail\": {\r\n \"type\": \"string\",\r\n \"description\": \"Email người dùng\"\r\n },\r\n \"fingerprint\": {\r\n \"type\": \"string\",\r\n \"description\": \"Fingerprint thiết bị\"\r\n },\r\n \"ipAddress\": {\r\n \"type\": \"string\",\r\n \"description\": \"Địa chỉ IP\"\r\n },\r\n \"userAgent\": {\r\n \"type\": \"string\",\r\n \"description\": \"User agent\"\r\n },\r\n \"browser\": {\r\n \"type\": \"string\",\r\n \"description\": \"Trình duyệt\"\r\n },\r\n \"operatingSystem\": {\r\n \"type\": \"string\",\r\n \"description\": \"Hệ điều hành\"\r\n },\r\n \"isTrusted\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Thiết bị đáng tin cậy\"\r\n },\r\n \"lastLogin\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian đăng nhập gần nhất\"\r\n },\r\n \"createdAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian tạo\"\r\n },\r\n \"updatedAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian cập nhật\"\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"userId\",\r\n \"userName\",\r\n \"userEmail\",\r\n \"fingerprint\",\r\n \"ipAddress\",\r\n \"userAgent\",\r\n \"browser\",\r\n \"operatingSystem\",\r\n \"isTrusted\",\r\n \"lastLogin\",\r\n \"createdAt\",\r\n \"updatedAt\"\r\n ]\r\n },\r\n \"UpdateDeviceTrustDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"isTrusted\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Thiết bị đáng tin cậy\",\r\n \"example\": true\r\n }\r\n },\r\n \"required\": [\r\n \"isTrusted\"\r\n ]\r\n },\r\n \"UserResourcesListResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"items\": {\r\n \"description\": \"Danh sách tài nguyên\",\r\n \"type\": \"array\",\r\n \"items\": {\r\n \"$ref\": \"#/components/schemas/UserResourceResponseDto\"\r\n }\r\n },\r\n \"total\": {\r\n \"type\": \"number\",\r\n \"description\": \"Tổng số tài nguyên\",\r\n \"example\": 100\r\n },\r\n \"page\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số trang hiện tại\",\r\n \"example\": 1\r\n },\r\n \"limit\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lượng item trên mỗi trang\",\r\n \"example\": 20\r\n },\r\n \"totalPages\": {\r\n \"type\": \"number\",\r\n \"description\": \"Tổng số trang\",\r\n \"example\": 5\r\n }\r\n },\r\n \"required\": [\r\n \"items\",\r\n \"total\",\r\n \"page\",\r\n \"limit\",\r\n \"totalPages\"\r\n ]\r\n },\r\n \"UserResourceResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"string\",\r\n \"description\": \"ID của tài nguyên\",\r\n \"example\": \"123e4567-e89b-12d3-a456-426614174000\"\r\n },\r\n \"resourceType\": {\r\n \"type\": \"string\",\r\n \"description\": \"Loại tài nguyên\",\r\n \"enum\": [\r\n \"ZALO_CONVERSATION\",\r\n \"DOCUMENT\",\r\n \"IMAGE\",\r\n \"VIDEO\",\r\n \"AUDIO\",\r\n \"OTHER\"\r\n ],\r\n \"example\": \"ZALO_CONVERSATION\"\r\n },\r\n \"resourceName\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên tài nguyên\",\r\n \"example\": \"Zalo Conversation Export - 1234567890\"\r\n },\r\n \"description\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mô tả tài nguyên\",\r\n \"example\": \"Export tin nhắn hội thoại với Zalo user 1234567890\"\r\n },\r\n \"s3Key\": {\r\n \"type\": \"string\",\r\n \"description\": \"S3 key của tài nguyên\",\r\n \"example\": \"zalo_conversation/2024/01/user_123/1704067200000-uuid.json\"\r\n },\r\n \"accessUrl\": {\r\n \"type\": \"string\",\r\n \"description\": \"URL để truy cập tài nguyên\",\r\n \"example\": \"https://s3.amazonaws.com/bucket/file.json?signature=...\"\r\n },\r\n \"fileSize\": {\r\n \"type\": \"number\",\r\n \"description\": \"Kích thước file (bytes)\",\r\n \"example\": 1024000\r\n },\r\n \"mimeType\": {\r\n \"type\": \"string\",\r\n \"description\": \"MIME type của file\",\r\n \"example\": \"application/json\"\r\n },\r\n \"status\": {\r\n \"type\": \"string\",\r\n \"description\": \"Trạng thái của tài nguyên\",\r\n \"enum\": [\r\n \"PENDING\",\r\n \"PROCESSING\",\r\n \"COMPLETED\",\r\n \"FAILED\"\r\n ],\r\n \"example\": \"COMPLETED\"\r\n },\r\n \"metadata\": {\r\n \"type\": \"object\",\r\n \"description\": \"Metadata bổ sung\",\r\n \"example\": {\r\n \"messageCount\": 150,\r\n \"exportFormat\": \"JSON\",\r\n \"zaloUserId\": \"1234567890\"\r\n }\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn của tài nguyên (timestamp)\",\r\n \"example\": 1704153600000\r\n },\r\n \"errorMessage\": {\r\n \"type\": \"string\",\r\n \"description\": \"Thông tin lỗi (nếu có)\",\r\n \"example\": \"Lỗi khi gọi Zalo API\"\r\n },\r\n \"createdAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian tạo (timestamp)\",\r\n \"example\": 1704067200000\r\n },\r\n \"updatedAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian cập nhật (timestamp)\",\r\n \"example\": 1704067200000\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"resourceType\",\r\n \"resourceName\",\r\n \"s3Key\",\r\n \"status\",\r\n \"createdAt\",\r\n \"updatedAt\"\r\n ]\r\n },\r\n \"CreateApiKeyDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên mô tả cho API key\",\r\n \"example\": \"My API Key for Mobile App\",\r\n \"minLength\": 1,\r\n \"maxLength\": 100\r\n },\r\n \"permissions\": {\r\n \"type\": \"array\",\r\n \"description\": \"Danh sách quyền của API key\",\r\n \"example\": [\r\n \"module_marketing\",\r\n \"module_workflow\"\r\n ],\r\n \"items\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"module_workflow\",\r\n \"module_agent\",\r\n \"module_marketing\",\r\n \"module_business\",\r\n \"module_dashboard\",\r\n \"module_calendar\",\r\n \"module_training\",\r\n \"module_integration\",\r\n \"module_tool\",\r\n \"module_marketplace\",\r\n \"module_multichannel_chat\",\r\n \"module_blog\",\r\n \"module_affiliate\",\r\n \"module_cloud_storage\"\r\n ]\r\n }\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\",\r\n \"example\": 1735689600000\r\n },\r\n \"usageLimit\": {\r\n \"type\": \"number\",\r\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\",\r\n \"example\": 10000\r\n }\r\n },\r\n \"required\": [\r\n \"name\"\r\n ]\r\n },\r\n \"CreateApiKeyResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của API key\",\r\n \"example\": 1\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên mô tả của API key\",\r\n \"example\": \"My API Key for Mobile App\"\r\n },\r\n \"keyPreview\": {\r\n \"type\": \"string\",\r\n \"description\": \"Preview của API key (8 ký tự đầu + ***)\",\r\n \"example\": \"rk_12345***\"\r\n },\r\n \"permissions\": {\r\n \"type\": \"array\",\r\n \"description\": \"Danh sách quyền của API key\",\r\n \"example\": [\r\n \"module_marketing\",\r\n \"module_workflow\"\r\n ],\r\n \"items\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"module_workflow\",\r\n \"module_agent\",\r\n \"module_marketing\",\r\n \"module_business\",\r\n \"module_dashboard\",\r\n \"module_calendar\",\r\n \"module_training\",\r\n \"module_integration\",\r\n \"module_tool\",\r\n \"module_marketplace\",\r\n \"module_multichannel_chat\",\r\n \"module_blog\",\r\n \"module_affiliate\",\r\n \"module_cloud_storage\"\r\n ]\r\n }\r\n },\r\n \"isActive\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Trạng thái hoạt động của API key\",\r\n \"example\": true\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\",\r\n \"example\": 1735689600000,\r\n \"nullable\": true\r\n },\r\n \"lastUsedAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian sử dụng lần cuối (Unix timestamp)\",\r\n \"example\": 1733414100000,\r\n \"nullable\": true\r\n },\r\n \"usageCount\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lần đã sử dụng API key\",\r\n \"example\": 150\r\n },\r\n \"usageLimit\": {\r\n \"type\": \"number\",\r\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\",\r\n \"example\": 10000,\r\n \"nullable\": true\r\n },\r\n \"createdAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian tạo API key (Unix timestamp)\",\r\n \"example\": 1733414100000\r\n },\r\n \"apiKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"API key gốc (chỉ hiển thị 1 lần khi tạo)\",\r\n \"example\": \"rk_123_1abc2def_3456789abcdef0123456789abcdef01\"\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"name\",\r\n \"keyPreview\",\r\n \"permissions\",\r\n \"isActive\",\r\n \"expiresAt\",\r\n \"lastUsedAt\",\r\n \"usageCount\",\r\n \"usageLimit\",\r\n \"createdAt\",\r\n \"apiKey\"\r\n ]\r\n },\r\n \"ApiKeyResponseDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"id\": {\r\n \"type\": \"number\",\r\n \"description\": \"ID của API key\",\r\n \"example\": 1\r\n },\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên mô tả của API key\",\r\n \"example\": \"My API Key for Mobile App\"\r\n },\r\n \"keyPreview\": {\r\n \"type\": \"string\",\r\n \"description\": \"Preview của API key (8 ký tự đầu + ***)\",\r\n \"example\": \"rk_12345***\"\r\n },\r\n \"permissions\": {\r\n \"type\": \"array\",\r\n \"description\": \"Danh sách quyền của API key\",\r\n \"example\": [\r\n \"module_marketing\",\r\n \"module_workflow\"\r\n ],\r\n \"items\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"module_workflow\",\r\n \"module_agent\",\r\n \"module_marketing\",\r\n \"module_business\",\r\n \"module_dashboard\",\r\n \"module_calendar\",\r\n \"module_training\",\r\n \"module_integration\",\r\n \"module_tool\",\r\n \"module_marketplace\",\r\n \"module_multichannel_chat\",\r\n \"module_blog\",\r\n \"module_affiliate\",\r\n \"module_cloud_storage\"\r\n ]\r\n }\r\n },\r\n \"isActive\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"Trạng thái hoạt động của API key\",\r\n \"example\": true\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\",\r\n \"example\": 1735689600000,\r\n \"nullable\": true\r\n },\r\n \"lastUsedAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian sử dụng lần cuối (Unix timestamp)\",\r\n \"example\": 1733414100000,\r\n \"nullable\": true\r\n },\r\n \"usageCount\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lần đã sử dụng API key\",\r\n \"example\": 150\r\n },\r\n \"usageLimit\": {\r\n \"type\": \"number\",\r\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\",\r\n \"example\": 10000,\r\n \"nullable\": true\r\n },\r\n \"createdAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian tạo API key (Unix timestamp)\",\r\n \"example\": 1733414100000\r\n }\r\n },\r\n \"required\": [\r\n \"id\",\r\n \"name\",\r\n \"keyPreview\",\r\n \"permissions\",\r\n \"isActive\",\r\n \"expiresAt\",\r\n \"lastUsedAt\",\r\n \"usageCount\",\r\n \"usageLimit\",\r\n \"createdAt\"\r\n ]\r\n },\r\n \"PaginationMeta\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"totalItems\": {\r\n \"type\": \"number\",\r\n \"description\": \"Tổng số bản ghi\",\r\n \"example\": 100\r\n },\r\n \"itemCount\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lượng bản ghi trên trang hiện tại\",\r\n \"example\": 10\r\n },\r\n \"itemsPerPage\": {\r\n \"type\": \"number\",\r\n \"description\": \"Số lượng bản ghi trên mỗi trang\",\r\n \"example\": 10\r\n },\r\n \"totalPages\": {\r\n \"type\": \"number\",\r\n \"description\": \"Tổng số trang\",\r\n \"example\": 10\r\n },\r\n \"currentPage\": {\r\n \"type\": \"number\",\r\n \"description\": \"Trang hiện tại\",\r\n \"example\": 1\r\n },\r\n \"hasItems\": {\r\n \"type\": \"boolean\",\r\n \"description\": \"có bản ghi nào không (bất kể search filter)\",\r\n \"example\": true\r\n }\r\n },\r\n \"required\": [\r\n \"totalItems\",\r\n \"itemCount\",\r\n \"itemsPerPage\",\r\n \"totalPages\",\r\n \"currentPage\",\r\n \"hasItems\"\r\n ]\r\n },\r\n \"UpdateApiKeyDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên mô tả cho API key\",\r\n \"example\": \"Updated API Key Name\",\r\n \"minLength\": 1,\r\n \"maxLength\": 100\r\n },\r\n \"permissions\": {\r\n \"type\": \"array\",\r\n \"description\": \"Danh sách quyền của API key\",\r\n \"example\": [\r\n \"module_marketing\",\r\n \"module_workflow\"\r\n ],\r\n \"items\": {\r\n \"type\": \"string\",\r\n \"enum\": [\r\n \"module_workflow\",\r\n \"module_agent\",\r\n \"module_marketing\",\r\n \"module_business\",\r\n \"module_dashboard\",\r\n \"module_calendar\",\r\n \"module_training\",\r\n \"module_integration\",\r\n \"module_tool\",\r\n \"module_marketplace\",\r\n \"module_multichannel_chat\",\r\n \"module_blog\",\r\n \"module_affiliate\",\r\n \"module_cloud_storage\"\r\n ]\r\n }\r\n },\r\n \"expiresAt\": {\r\n \"type\": \"number\",\r\n \"description\": \"Thời gian hết hạn (Unix timestamp). Null = không hết hạn\",\r\n \"example\": 1735689600000\r\n },\r\n \"usageLimit\": {\r\n \"type\": \"number\",\r\n \"description\": \"Giới hạn số lần sử dụng. Null = không giới hạn\",\r\n \"example\": 5000\r\n }\r\n }\r\n },\r\n \"ValidateApiKeyDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"apiKey\": {\r\n \"type\": \"string\",\r\n \"description\": \"API key cần xác thực\",\r\n \"example\": \"rk_123_1abc2def_3456789abcdef0123456789abcdef01\"\r\n }\r\n },\r\n \"required\": [\r\n \"apiKey\"\r\n ]\r\n },\r\n \"TimezoneOptionDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"value\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã timezone\",\r\n \"example\": \"Asia/Ho_Chi_Minh\"\r\n },\r\n \"label\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên hiển thị của timezone\",\r\n \"example\": \"Việt Nam (GMT+7)\"\r\n },\r\n \"offset\": {\r\n \"type\": \"string\",\r\n \"description\": \"GMT offset\",\r\n \"example\": \"+07:00\"\r\n }\r\n },\r\n \"required\": [\r\n \"value\",\r\n \"label\",\r\n \"offset\"\r\n ]\r\n },\r\n \"CurrencyOptionDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"value\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã đơn vị tiền tệ\",\r\n \"example\": \"VND\"\r\n },\r\n \"label\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên hiển thị của đơn vị tiền tệ\",\r\n \"example\": \"Việt Nam Đồng\"\r\n },\r\n \"symbol\": {\r\n \"type\": \"string\",\r\n \"description\": \"Ký hiệu của đơn vị tiền tệ\",\r\n \"example\": \"₫\"\r\n }\r\n },\r\n \"required\": [\r\n \"value\",\r\n \"label\",\r\n \"symbol\"\r\n ]\r\n },\r\n \"ThemeModeOptionDto\": {\r\n \"type\": \"object\",\r\n \"properties\": {\r\n \"value\": {\r\n \"type\": \"string\",\r\n \"description\": \"Mã theme mode\",\r\n \"example\": \"light\"\r\n },\r\n \"label\": {\r\n \"type\": \"string\",\r\n \"description\": \"Tên hiển thị của theme mode\",\r\n \"example\": \"Sáng\"\r\n }\r\n },\r\n \"required\": [\r\n \"value\",\r\n \"label\"\r\n ]\r\n }\r\n },\r\n \"securitySchemes\": {\r\n \"JWT-auth\": {\r\n \"scheme\": \"bearer\",\r\n \"bearerFormat\": \"JWT\",\r\n \"type\": \"http\",\r\n \"name\": \"JWT\",\r\n \"description\": \"Enter JWT token\",\r\n \"in\": \"header\"\r\n }\r\n }\r\n },\r\n \"externalDocs\": {\r\n \"description\": \"Additional Documentation\",\r\n \"url\": \"https://redai.com/docs\"\r\n },\r\n \"generatedAt\": \"2026-03-16T08:19:37.277Z\",\r\n \"x-redai-export-modules\": [\r\n \"user\"\r\n ],\r\n \"x-redai-export-scope\": \"user\"\r\n}\n"],"mappings":"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","names":[]}
|