@winwinmbs/portal-api 1.0.0
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 +29 -0
- package/dist/_tsup-dts-rollup.d.mts +4113 -0
- package/dist/_tsup-dts-rollup.d.ts +4113 -0
- package/dist/index.d.mts +120 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +2144 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2085 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portal-api-client.ts","../src/api/health.api.ts","../src/utils/logger.ts","../src/api/system-config.api.ts","../src/api/files.api.ts","../src/api/event-log.api.ts","../src/api/line.api.ts","../src/api/todo.api.ts","../src/api/user.api.ts","../src/api/otp.api.ts","../src/api/email.api.ts","../src/api/workflow.api.ts","../src/api/organization.api.ts","../src/api/role.api.ts","../src/api/permission.api.ts","../src/api/permission-category.api.ts","../src/api/webhook.api.ts","../../../shared/src/enums/common.enums.ts","../../../shared/src/enums/event-log.enums.ts","../../../shared/src/enums/todo.enums.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\nimport {\n EmailAPI,\n EventLogApi,\n FilesAPI,\n HealthAPI,\n LineAPI,\n OrganizationAPI,\n OtpAPI,\n PermissionAPI,\n PermissionCategoryAPI,\n RoleAPI,\n SystemConfigAPI,\n TodoAPI,\n UserAPI,\n WebhookAPI,\n WorkflowAPI,\n} from './api';\n\nexport interface PortalApiConfig {\n apiUrl: string;\n getToken: () => string | null;\n apiKey?: string;\n timeout?: number;\n}\n\nexport class PortalApiClient {\n private readonly axios: AxiosInstance;\n\n public readonly email: EmailAPI;\n public readonly eventLog: EventLogApi;\n public readonly files: FilesAPI;\n public readonly health: HealthAPI;\n public readonly line: LineAPI;\n public readonly organization: OrganizationAPI;\n public readonly otp: OtpAPI;\n public readonly permission: PermissionAPI;\n public readonly permissionCategory: PermissionCategoryAPI;\n public readonly role: RoleAPI;\n public readonly systemConfig: SystemConfigAPI;\n public readonly todo: TodoAPI;\n public readonly user: UserAPI;\n public readonly webhook: WebhookAPI;\n public readonly workflow: WorkflowAPI;\n\n constructor(config: PortalApiConfig) {\n this.axios = axios.create({\n baseURL: config.apiUrl,\n timeout: config.timeout ?? 30_000,\n withCredentials: true,\n });\n\n this.axios.interceptors.request.use((cfg) => {\n const token = config.getToken();\n if (token) cfg.headers.Authorization = `Bearer ${token}`;\n if (config.apiKey) cfg.headers['X-API-Key'] = config.apiKey;\n return cfg;\n });\n\n this.email = new EmailAPI(this.axios);\n this.eventLog = new EventLogApi(this.axios);\n this.files = new FilesAPI(this.axios);\n this.health = new HealthAPI(this.axios);\n this.line = new LineAPI(this.axios);\n this.organization = new OrganizationAPI(this.axios);\n this.otp = new OtpAPI(this.axios);\n this.permission = new PermissionAPI(this.axios);\n this.permissionCategory = new PermissionCategoryAPI(this.axios);\n this.role = new RoleAPI(this.axios);\n this.systemConfig = new SystemConfigAPI(this.axios);\n this.todo = new TodoAPI(this.axios);\n this.user = new UserAPI(this.axios);\n this.webhook = new WebhookAPI(this.axios);\n this.workflow = new WorkflowAPI(this.axios);\n }\n\n get<T = any>(url: string, config?: AxiosRequestConfig) {\n return this.axios.get<T>(url, config);\n }\n post<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\n return this.axios.post<T>(url, data, config);\n }\n put<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\n return this.axios.put<T>(url, data, config);\n }\n patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\n return this.axios.patch<T>(url, data, config);\n }\n delete<T = any>(url: string, config?: AxiosRequestConfig) {\n return this.axios.delete<T>(url, config);\n }\n}\n","/**\n * Health & Validation API\n *\n * Handles health check and API key validation:\n * - Health check\n * - API key validation\n */\n\nimport type { AxiosInstance } from 'axios';\n\nexport class HealthAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Check API health\n */\n async check() {\n const response = await this.axios.get('/health');\n return response.data;\n }\n\n /**\n * Validate if API key is still active\n */\n async validateApiKey() {\n try {\n await this.check();\n return true;\n } catch (error) {\n return false;\n }\n }\n}\n","/**\n * Logger Utility\n *\n * @description Centralized logging utility for Auth SDK\n * Supports different log levels and enable/disable via config\n *\n * @example\n * ```typescript\n * // ปิด log ทั้งหมด\n * const client = new AuthClient({ apiKey: '...', logging: false });\n *\n * // เปิด log เฉพาะ warn ขึ้นไป\n * const client = new AuthClient({ apiKey: '...', logging: { enabled: true, level: 'warn' } });\n *\n * // เปลี่ยน config ตอน runtime\n * import { logger } from '@win-portal/auth-sdk';\n * logger.setConfig({ enabled: false });\n * ```\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LoggerConfig {\n enabled: boolean;\n logLevel: LogLevel;\n}\n\nclass Logger {\n private config: LoggerConfig = {\n enabled: true,\n logLevel: typeof process !== 'undefined' && process.env?.NODE_ENV === 'production' ? 'warn' : 'debug',\n };\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.config.enabled) return false;\n\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const currentLevelIndex = levels.indexOf(this.config.logLevel);\n const messageLevelIndex = levels.indexOf(level);\n\n return messageLevelIndex >= currentLevelIndex;\n }\n\n debug(...args: any[]): void {\n if (this.shouldLog('debug')) {\n console.log('[AuthClient]', ...args);\n }\n }\n\n info(...args: any[]): void {\n if (this.shouldLog('info')) {\n console.log('[AuthClient]', ...args);\n }\n }\n\n warn(...args: any[]): void {\n if (this.shouldLog('warn')) {\n console.warn('[AuthClient]', ...args);\n }\n }\n\n error(...args: any[]): void {\n if (this.shouldLog('error')) {\n console.error('[AuthClient]', ...args);\n }\n }\n\n /**\n * อัพเดท logging config\n *\n * @param config - Partial config เพื่อ merge กับ config ปัจจุบัน\n */\n setConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * ตรวจสอบว่า logging เปิดอยู่หรือไม่\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * ดู log level ปัจจุบัน\n */\n getLogLevel(): LogLevel {\n return this.config.logLevel;\n }\n}\n\nexport const logger = new Logger();\n","import {\n ApiResponse,\n SecurityJwtConfig,\n SessionManagementConfig,\n SystemConfig,\n SystemConfigByCategory\n} from '../types';\nimport { logger } from '../utils/logger';\nimport type { AxiosInstance } from 'axios';\n\n/**\n * System Config API\n * Methods for retrieving system configurations\n * Based on: apps/api/src/modules/shared/core/controllers/system-config.controller.ts\n */\nexport class SystemConfigAPI {\n constructor(private readonly axios: AxiosInstance) { }\n\n /**\n * GET /system-configs/categories/:category\n * ดึง configs ตาม category - ส่ง object ที่รวมทุก key เป็น { key1: value1, key2: value2 }\n */\n private async getByCategory(category: string): Promise<SystemConfigByCategory> {\n const response = await this.axios.get<ApiResponse<SystemConfigByCategory>>(\n `/system-configs/categories/${category}`,\n );\n logger.debug('SystemConfigAPI getByCategory response:', response.data.data);\n return response.data.data!;\n }\n\n /**\n * GET /system-configs/categories/:category/:key\n * ดึง config value ตรงๆ (API returns config.value directly, NOT the full SystemConfig row)\n */\n private async getByCategoryAndKey<T = any>(category: string, key: string): Promise<T> {\n const response = await this.axios.get<ApiResponse<T>>(`/system-configs/categories/${category}/${key}`);\n logger.debug('SystemConfigAPI getByCategoryAndKey response:', response.data.data);\n return response.data.data!;\n }\n\n /**\n * Get config by category (returns all keys), or by category+key (returns value directly)\n */\n async get(category: string): Promise<SystemConfigByCategory>;\n async get<T = any>(category: string, key: string): Promise<T>;\n async get<T = any>(category: string, key?: string): Promise<T | SystemConfigByCategory> {\n if (key) {\n return await this.getByCategoryAndKey<T>(category, key);\n }\n return await this.getByCategory(category);\n }\n\n /**\n * GET /system-configs/categories/security/session_management\n * ดึง Session Management configuration (convenience method)\n */\n async getSessionManagement(): Promise<SessionManagementConfig> {\n return this.get<SessionManagementConfig>('security', 'session_management');\n }\n\n /**\n * GET /system-configs/categories/security/jwt\n * ดึง Security JWT configuration (convenience method)\n */\n async getSecurityJwt(): Promise<SecurityJwtConfig> {\n return this.get<SecurityJwtConfig>('security', 'jwt');\n }\n}\n","import type { AxiosInstance } from 'axios';\nimport { AxiosResponse } from 'axios';\nimport { File, FileUpdateData, FileSearchParams, ApiResponse } from '../types';\n\n/**\n * Files API\n * Methods for file management operations\n * Based on: apps/api/src/modules/features/files/controllers/files.controller.ts\n */\nexport class FilesAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * POST /files - อัปโหลดไฟล์ใหม่\n * Supports both authenticated and anonymous uploads\n */\n async upload(formData: FormData): Promise<File> {\n const response = await this.axios.post<ApiResponse<File>>('/files', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n });\n return response.data.data!;\n }\n\n /**\n * GET /files/:id - ดูข้อมูลไฟล์\n * Public access (supports both authenticated and anonymous)\n */\n async getById(id: string): Promise<File> {\n const response = await this.axios.get<ApiResponse<File>>(`/files/${id}`);\n return response.data.data!;\n }\n\n /**\n * GET /files/:id/content - ดึง file content (รูปภาพ, เอกสาร)\n * Returns the actual file content or redirects to cloud storage URL\n * Public access based on file.is_public flag\n */\n getContentUrl(id: string): string {\n const baseURL = this.axios.defaults.baseURL || '';\n return `${baseURL}/files/${id}/content`;\n }\n\n /**\n * PUT /files/:id - อัปเดตข้อมูลไฟล์\n * Requires authentication\n */\n async update(id: string, updateData: FileUpdateData): Promise<File> {\n const response = await this.axios.put<ApiResponse<File>>(`/files/${id}`, updateData);\n return response.data.data!;\n }\n\n /**\n * DELETE /files/:id - ลบไฟล์\n * Requires authentication\n */\n async delete(id: string): Promise<{ message: string }> {\n const response = await this.axios.delete<ApiResponse<{ message: string }>>(`/files/${id}`);\n return response.data.data!;\n }\n\n /**\n * POST /files/search - ค้นหาไฟล์แบบ advanced\n * Public access (supports both authenticated and anonymous)\n */\n async search(searchParams?: FileSearchParams): Promise<{\n data: File[];\n total: number;\n page: number;\n page_size: number;\n }> {\n const response = await this.axios.post<\n ApiResponse<{\n data: File[];\n total: number;\n page: number;\n page_size: number;\n }>\n >('/files/search', searchParams || {});\n return response.data.data!;\n }\n\n /**\n * DELETE /files/bulk - ลบไฟล์หลายไฟล์\n * Requires authentication\n */\n async bulkDelete(ids: string[]): Promise<{ message: string; deleted_count: number }> {\n const response = await this.axios.delete<ApiResponse<{ message: string; deleted_count: number }>>('/files/bulk', {\n data: { ids },\n });\n return response.data.data!;\n }\n}\n","import type { AxiosInstance } from 'axios';\nimport { CreateEventLogRequestDto, EventLogResponseDto, ApiResponse } from '../types';\n\n/**\n * Event Log API Client\n *\n * Centralized event logging client for microservices\n * Sends all event logs to main API for centralized storage\n */\nexport class EventLogApi {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Log event to centralized event log system\n */\n async logEvent(eventData: CreateEventLogRequestDto): Promise<EventLogResponseDto> {\n const response = await this.axios.post<ApiResponse<EventLogResponseDto>>('/event-logs', eventData);\n return response.data.data!;\n }\n\n /**\n * Batch log multiple events (for performance)\n */\n async logEvents(events: CreateEventLogRequestDto[]): Promise<{ success: number; failed: number }> {\n const response = await this.axios.post<ApiResponse<{ success: number; failed: number }>>('/event-logs/batch', {\n events,\n });\n return response.data.data!;\n }\n}\n","/**\n * LINE Messaging API\n *\n * ส่ง LINE messages ไปยัง users ผ่าน backend API\n */\n\nimport type { AxiosInstance } from 'axios';\n\nexport interface SendTextMessageRequest {\n userId: string;\n message: string;\n}\n\nexport interface SendStickerRequest {\n userId: string;\n packageId: string;\n stickerId: string;\n}\n\nexport interface SendImageRequest {\n userId: string;\n originalContentUrl: string;\n previewImageUrl: string;\n}\n\nexport interface LineMessagePayload {\n type: 'text' | 'image' | 'video' | 'audio' | 'file' | 'location' | 'sticker';\n text?: string;\n originalContentUrl?: string;\n previewImageUrl?: string;\n title?: string;\n address?: string;\n latitude?: number;\n longitude?: number;\n packageId?: string;\n stickerId?: string;\n}\n\nexport interface SendMessagesRequest {\n userId: string;\n messages: LineMessagePayload[];\n}\n\nexport interface SendNotificationRequest {\n userId: string;\n title: string;\n message: string;\n type?: 'info' | 'success' | 'warning' | 'error';\n action_url?: string;\n priority?: 'low' | 'normal' | 'high';\n}\n\nexport interface LineMessageResponse {\n success: boolean;\n data?: {\n messageSent: boolean;\n };\n message?: string;\n errors?: string[];\n timestamp: string;\n}\n\nexport interface LineMessagingAvailabilityResponse {\n success: boolean;\n data?: {\n canReceiveMessages: boolean;\n lineUserId?: string;\n };\n message?: string;\n errors?: string[];\n timestamp: string;\n}\n\nexport class LineAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * ส่งข้อความ text ไปยัง user\n *\n * @example\n * ```typescript\n * const result = await authClient.line.sendTextMessage({\n * userId: 'user-123',\n * message: 'สวัสดีครับ! ยินดีต้อนรับ'\n * });\n * ```\n */\n async sendTextMessage(request: SendTextMessageRequest): Promise<LineMessageResponse> {\n const response = await this.axios.post<LineMessageResponse>('/line/send-text', request);\n return response.data;\n }\n\n /**\n * ส่ง sticker ไปยัง user\n *\n * @example\n * ```typescript\n * const result = await authClient.line.sendSticker({\n * userId: 'user-123',\n * packageId: '11537',\n * stickerId: '52002734'\n * });\n * ```\n */\n async sendSticker(request: SendStickerRequest): Promise<LineMessageResponse> {\n const response = await this.axios.post<LineMessageResponse>('/line/send-sticker', request);\n return response.data;\n }\n\n /**\n * ส่งรูปภาพไปยัง user\n *\n * @example\n * ```typescript\n * const result = await authClient.line.sendImage({\n * userId: 'user-123',\n * originalContentUrl: 'https://example.com/image.jpg',\n * previewImageUrl: 'https://example.com/preview.jpg'\n * });\n * ```\n */\n async sendImage(request: SendImageRequest): Promise<LineMessageResponse> {\n const response = await this.axios.post<LineMessageResponse>('/line/send-image', request);\n return response.data;\n }\n\n /**\n * ส่งหลายข้อความพร้อมกัน (สูงสุด 5 ข้อความ)\n *\n * @example\n * ```typescript\n * const result = await authClient.line.sendMessages({\n * userId: 'user-123',\n * messages: [\n * { type: 'text', text: 'ข้อความแรก' },\n * { type: 'sticker', packageId: '11537', stickerId: '52002734' },\n * { type: 'text', text: 'ข้อความสุดท้าย' }\n * ]\n * });\n * ```\n */\n async sendMessages(request: SendMessagesRequest): Promise<LineMessageResponse> {\n const response = await this.axios.post<LineMessageResponse>('/line/send-messages', request);\n return response.data;\n }\n\n /**\n * ส่ง notification แบบ high-level (มี title, icon และ action URL)\n *\n * @example\n * ```typescript\n * const result = await authClient.line.sendNotification({\n * userId: 'user-123',\n * title: 'งานใหม่ได้รับมอบหมาย',\n * message: 'คุณได้รับมอบหมายงาน: ทำรายงานประจำเดือน',\n * type: 'info',\n * action_url: 'https://app.example.com/tasks/123',\n * priority: 'high'\n * });\n * ```\n */\n async sendNotification(request: SendNotificationRequest): Promise<LineMessageResponse> {\n const response = await this.axios.post<LineMessageResponse>('/line/send-notification', request);\n return response.data;\n }\n\n /**\n * ตรวจสอบว่า user สามารถรับข้อความ LINE ได้หรือไม่\n *\n * @example\n * ```typescript\n * const result = await authClient.line.checkMessagingAvailability('user-123');\n * if (result.data?.canReceiveMessages) {\n * console.log('User can receive LINE messages');\n * }\n * ```\n */\n async checkMessagingAvailability(userId: string): Promise<LineMessagingAvailabilityResponse> {\n const response = await this.axios.get<LineMessagingAvailabilityResponse>(`/line/messaging-availability/${userId}`);\n return response.data;\n }\n}\n","/**\n * Todo API Client\n *\n * Handles todo operations:\n * - Create todo\n */\n\nimport type { AxiosInstance } from 'axios';\nimport { CreateTodoRequest, Todo, ApiResponse } from '../types';\n\nexport class TodoAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Create a new todo\n *\n * @example\n * ```typescript\n * const todo = await authClient.todo.create({\n * title: \"ซื้อของใช้ในบ้าน\",\n * priority: TodoPriority.NORMAL,\n * user_id: \"user123e4567-e89b-12d3-a456-426614174000\",\n * description: \"ซื้อน้ำยาล้างจาน, กระดาษทิชชู่, แชมพู\",\n * due_date: new Date(\"2024-01-20T17:00:00Z\"),\n * category: \"shopping\",\n * labels: [\"บ้าน\", \"จำเป็น\"],\n * is_send_notification: true\n * });\n * ```\n */\n async create(todoData: CreateTodoRequest): Promise<Todo> {\n const response = await this.axios.post<ApiResponse<Todo>>('/todos', todoData);\n return response.data.data!;\n }\n}\n","/**\n * User API Client\n *\n * Handles user CRUD and assignment operations:\n * - Search users\n * - Get user by ID\n * - Create user\n * - Update user\n * - Delete user\n * - Position assignment (get/assign/unassign)\n * - Role assignment (get/assign/unassign)\n * - Sync users for external applications\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n User,\n CreateUserRequest,\n UpdateUserRequest,\n UserSearchParams,\n UserSyncResponse,\n UserSyncParams,\n AssignPositionsRequest,\n AssignmentResponse,\n ApiPaginatedResponse,\n ApiResponse,\n Role,\n} from '../types';\n\nexport class UserAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Search users with pagination and filters\n *\n * @example\n * ```typescript\n * const result = await authClient.user.search({\n * search: \"สมชาย\",\n * page: 1,\n * limit: 20,\n * sort_by: \"created_at\",\n * sort_order: \"desc\",\n * advanced: {\n * status: \"active\",\n * department_id: \"dept-123\"\n * }\n * });\n *\n * // Access paginated data\n * console.log(result.data); // User[]\n * console.log(result.pagination.total); // Total count\n * console.log(result.pagination.has_next); // Has next page\n * ```\n */\n async search(params?: UserSearchParams): Promise<ApiPaginatedResponse<User>> {\n const response = await this.axios.post<ApiPaginatedResponse<User>>('/users/search', params || {});\n return response.data;\n }\n\n /**\n * Get user by ID\n *\n * @example\n * ```typescript\n * const user = await authClient.user.get(\"user-123\");\n * ```\n */\n async get(userId: string): Promise<User> {\n const response = await this.axios.get<ApiResponse<User>>(`/users/${userId}`);\n return response.data.data!;\n }\n\n /**\n * Create a new user\n *\n * @description ถ้าไม่ระบุ password ระบบจะ auto generate และส่ง reset password link ไปทางอีเมล\n * ถ้าระบุ password ระบบจะใช้ password ที่ส่งมาและส่ง welcome email พร้อม login link\n *\n * @example\n * ```typescript\n * // กรณีที่มี password - ระบบจะส่ง welcome email พร้อม login link\n * const newUser = await authClient.user.create({\n * email: \"user@example.com\",\n * first_name: \"สมชาย\",\n * last_name: \"ใจดี\",\n * password: \"SecurePassword123!\",\n * code: \"USR-2024-001\",\n * role_ids: [\"role-123\", \"role-456\"] // Optional: assign roles immediately\n * });\n * ```\n *\n * @example\n * ```typescript\n * // กรณีที่ไม่มี password - ระบบจะ auto generate และส่ง welcome email พร้อม reset password link\n * const newUser = await authClient.user.create({\n * email: \"user@example.com\",\n * first_name: \"สมชาย\",\n * last_name: \"ใจดี\",\n * code: \"USR-2024-002\"\n * });\n * ```\n */\n async create(userData: CreateUserRequest): Promise<User> {\n const response = await this.axios.post<ApiResponse<User>>('/users', userData);\n return response.data.data!;\n }\n\n /**\n * Update user\n *\n * @example\n * ```typescript\n * const updatedUser = await authClient.user.update(\"user-123\", {\n * first_name: \"สมชาย\",\n * last_name: \"ใจดีมาก\",\n * phone_number: \"+66812345678\",\n * role_ids: [\"role-123\", \"role-456\"] // Optional: replace all roles\n * });\n * ```\n */\n async update(userId: string, userData: UpdateUserRequest): Promise<User> {\n const response = await this.axios.put<ApiResponse<User>>(`/users/${userId}`, userData);\n return response.data.data!;\n }\n\n /**\n * Delete user\n *\n * @example\n * ```typescript\n * await authClient.user.delete(\"user-123\");\n * ```\n */\n async delete(userId: string): Promise<void> {\n await this.axios.delete<ApiResponse<void>>(`/users/${userId}`);\n }\n\n // ==========================================================================\n // Position Assignment\n // ==========================================================================\n\n /**\n * Get user positions\n *\n * @description ดึงรายการตำแหน่งทั้งหมดของผู้ใช้\n *\n * @example\n * ```typescript\n * const positions = await authClient.user.getPositions(\"user-123\");\n * const primaryPosition = positions.find(p => p.is_primary);\n * ```\n */\n async getPositions(userId: string): Promise<User['positions']> {\n const response = await this.axios.get<ApiResponse<User['positions']>>(`/users/${userId}/positions`);\n return response.data.data || [];\n }\n\n /**\n * Assign positions to user\n *\n * @description มอบหมายตำแหน่งให้ผู้ใช้ รองรับการมอบหมายหลายตำแหน่งพร้อมกัน\n *\n * @example\n * ```typescript\n * // Replace mode (default) - ทับตำแหน่งเดิมทั้งหมด\n * const result = await authClient.user.assignPositions(\"user-123\", {\n * positions: [\n * { position_id: \"pos-001\", is_primary: true },\n * { position_id: \"pos-002\", is_primary: false }\n * ],\n * mode: \"replace\"\n * });\n *\n * // Add mode - เพิ่มตำแหน่งใหม่โดยไม่ลบของเดิม\n * const result = await authClient.user.assignPositions(\"user-123\", {\n * positions: [\n * { position_id: \"pos-003\", is_primary: false }\n * ],\n * mode: \"add\"\n * });\n * ```\n */\n async assignPositions(userId: string, data: AssignPositionsRequest): Promise<AssignmentResponse> {\n const response = await this.axios.post<ApiResponse<AssignmentResponse>>(`/users/${userId}/positions`, data);\n return response.data.data!;\n }\n\n /**\n * Unassign positions from user\n *\n * @description ยกเลิกตำแหน่งจากผู้ใช้\n *\n * @example\n * ```typescript\n * const result = await authClient.user.unassignPositions(\"user-123\", [\"pos-001\", \"pos-002\"]);\n * ```\n */\n async unassignPositions(userId: string, positionIds: string[]): Promise<AssignmentResponse> {\n const response = await this.axios.delete<ApiResponse<AssignmentResponse>>(`/users/${userId}/positions`, {\n data: { ids: positionIds },\n });\n return response.data.data!;\n }\n\n // ==========================================================================\n // Role Assignment\n // ==========================================================================\n\n /**\n * Get user roles\n *\n * @description ดึงรายการบทบาททั้งหมดของผู้ใช้\n *\n * @example\n * ```typescript\n * const roles = await authClient.user.getRoles(\"user-123\");\n * console.log(roles.map(r => r.name)); // [\"Admin\", \"Manager\"]\n * ```\n */\n async getRoles(userId: string): Promise<Role[]> {\n const response = await this.axios.get<ApiResponse<Role[]>>(`/users/${userId}/roles`);\n return response.data.data || [];\n }\n\n /**\n * Assign roles to user\n *\n * @description มอบหมายบทบาทให้ผู้ใช้ (แทนที่บทบาทเดิมทั้งหมด)\n *\n * @example\n * ```typescript\n * const result = await authClient.user.assignRoles(\"user-123\", [\"role-001\", \"role-002\"]);\n * ```\n */\n async assignRoles(userId: string, roleIds: string[]): Promise<AssignmentResponse> {\n const response = await this.axios.post<ApiResponse<AssignmentResponse>>(`/users/${userId}/roles`, {\n ids: roleIds,\n });\n return response.data.data!;\n }\n\n /**\n * Unassign roles from user\n *\n * @description ยกเลิกบทบาทจากผู้ใช้\n *\n * @example\n * ```typescript\n * const result = await authClient.user.unassignRoles(\"user-123\", [\"role-001\"]);\n * ```\n */\n async unassignRoles(userId: string, roleIds: string[]): Promise<AssignmentResponse> {\n const response = await this.axios.delete<ApiResponse<AssignmentResponse>>(`/users/${userId}/roles`, {\n data: { ids: roleIds },\n });\n return response.data.data!;\n }\n\n // ==========================================================================\n // Sync Operations\n // ==========================================================================\n\n /**\n * Sync users for external applications\n *\n * @description ดึงข้อมูลผู้ใช้แบบ paginated สำหรับ sync operations\n * ใช้สำหรับ external applications ที่ต้องการ sync user data\n * ต้องใช้ API Key authentication\n *\n * @example\n * ```typescript\n * // Sync all users (first page)\n * const result = await authClient.user.sync({\n * page: 1,\n * page_size: 100\n * });\n *\n * // Sync users updated after specific date\n * const updatedUsers = await authClient.user.sync({\n * page: 1,\n * page_size: 100,\n * updated_after: new Date('2024-01-01')\n * });\n *\n * // Access paginated data\n * console.log(result.data); // UserSyncResponse[]\n * console.log(result.pagination.total); // Total count\n * console.log(result.pagination.has_next); // Has next page\n * ```\n */\n async sync(params?: UserSyncParams): Promise<ApiPaginatedResponse<UserSyncResponse>> {\n const queryParams: Record<string, string> = {};\n\n if (params?.page !== undefined) {\n queryParams.page = params.page.toString();\n }\n\n if (params?.page_size !== undefined) {\n queryParams.page_size = params.page_size.toString();\n }\n\n if (params?.updated_after) {\n const updatedAfter =\n params.updated_after instanceof Date ? params.updated_after.toISOString() : params.updated_after;\n queryParams.updated_after = updatedAfter;\n }\n\n const queryString = new URLSearchParams(queryParams).toString();\n const url = `/users/sync${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.axios.get<ApiPaginatedResponse<UserSyncResponse>>(url);\n return response.data;\n }\n}\n","/**\n * OTP Service API\n *\n * Handles OTP operations for external applications:\n * - Send OTP via SMS or Email\n * - Verify OTP code\n *\n * @requires API Key authentication\n */\n\nimport type { AxiosInstance } from 'axios';\nimport { ApiResponse } from '../types';\n\n/**\n * Send OTP Request\n */\nexport interface SendOTPRequest {\n method: 'sms' | 'email';\n recipient: string;\n context?: string;\n metadata?: string;\n}\n\n/**\n * Send OTP Response\n */\nexport interface SendOTPResponse {\n otp_id: string;\n ref_code: string;\n expires_at: Date;\n masked_recipient: string;\n}\n\n/**\n * Verify OTP Request\n */\nexport interface VerifyOTPRequest {\n otp_id: string;\n code: string;\n}\n\n/**\n * Verify OTP Response\n */\nexport interface VerifyOTPResponse {\n verified: boolean;\n}\n\nexport class OtpAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Send OTP to recipient (SMS or Email)\n *\n * @example\n * ```typescript\n * // Send SMS OTP\n * const result = await authClient.otp.sendOTP({\n * method: 'sms',\n * recipient: '0812345678',\n * context: 'login'\n * });\n *\n * console.log('OTP ID:', result.otp_id); // UUID\n * console.log('Ref Code:', result.ref_code); // OTP-XXXXXX (for tracking)\n * console.log('Expires at:', result.expires_at);\n *\n * // Send Email OTP\n * const result = await authClient.otp.sendOTP({\n * method: 'email',\n * recipient: 'user@example.com',\n * context: 'verification'\n * });\n * ```\n */\n async sendOTP(request: SendOTPRequest): Promise<SendOTPResponse> {\n const response = await this.axios.post<ApiResponse<SendOTPResponse>>('/otp/send', request);\n return response.data.data!;\n }\n\n /**\n * Verify OTP code\n *\n * @example\n * ```typescript\n * const result = await authClient.otp.verifyOTP({\n * otp_id: '123e4567-e89b-12d3-a456-426614174000',\n * code: '123456'\n * });\n *\n * if (result.verified) {\n * console.log('OTP verified successfully');\n * }\n * ```\n */\n async verifyOTP(request: VerifyOTPRequest): Promise<VerifyOTPResponse> {\n const response = await this.axios.post<ApiResponse<VerifyOTPResponse>>('/otp/verify', request);\n return response.data.data!;\n }\n}\n","/**\n * Email Service API\n *\n * Handles email operations for external applications:\n * - Send email with template (Template Mode)\n * - Send email with raw HTML (Raw HTML Mode)\n * - Support CC, BCC, and attachments\n *\n * @requires API Key authentication\n */\n\nimport type { AxiosInstance } from 'axios';\nimport { ApiResponse, SendEmailRequest, SendEmailResponse } from '../types';\n\n/**\n * Email API\n *\n * @example\n * ```typescript\n * // Template Mode\n * const result = await authClient.email.sendEmail({\n * template_code: 'welcome_email',\n * template_data: {\n * userName: 'สมชาย ใจดี',\n * activationLink: 'https://app.com/activate?token=xxx'\n * },\n * recipient_email: 'user@example.com',\n * recipient_name: 'สมชาย ใจดี',\n * language: 'th',\n * cc: ['manager@example.com'],\n * attachments: [\n * {\n * filename: 'welcome.pdf',\n * href: 'https://api.example.com/files/123e4567-e89b-12d3-a456-426614174000/content' // URL จาก File API\n * }\n * ]\n * });\n *\n * // Raw HTML Mode\n * const result = await authClient.email.sendEmail({\n * html_body: '<h1>ยินดีต้อนรับ</h1><p>ขอบคุณที่สมัครสมาชิก</p>',\n * subject: 'ยินดีต้อนรับสู่ระบบ',\n * recipient_email: 'user@example.com',\n * recipient_name: 'สมชาย ใจดี',\n * text_body: 'ยินดีต้อนรับ ขอบคุณที่สมัครสมาชิก',\n * cc: ['manager@example.com'],\n * bcc: ['archive@example.com']\n * });\n * ```\n */\nexport class EmailAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Send email (auto-detect Template Mode or Raw HTML Mode)\n *\n * @param request - SendEmailRequest\n * @returns SendEmailResponse\n *\n * @example\n * ```typescript\n * // Template Mode\n * const result = await authClient.email.sendEmail({\n * template_code: 'welcome_email',\n * template_data: { userName: 'John' },\n * recipient_email: 'user@example.com'\n * });\n *\n * // Raw HTML Mode\n * const result = await authClient.email.sendEmail({\n * html_body: '<h1>Hello</h1>',\n * subject: 'Welcome',\n * recipient_email: 'user@example.com'\n * });\n * ```\n */\n async sendEmail(request: SendEmailRequest): Promise<SendEmailResponse> {\n const response = await this.axios.post<ApiResponse<SendEmailResponse>>('/send', request);\n return response.data.data!;\n }\n\n /**\n * Send email with template (Template Mode - convenience method)\n *\n * @param templateCode - Template code from database\n * @param templateData - Template data for rendering\n * @param recipient - Email address or user ID\n * @param options - Additional options (cc, bcc, attachments, etc.)\n * @returns SendEmailResponse\n *\n * @example\n * ```typescript\n * const result = await authClient.email.sendEmailWithTemplate(\n * 'welcome_email',\n * {\n * userName: 'สมชาย ใจดี',\n * activationLink: 'https://app.com/activate?token=xxx'\n * },\n * 'user@example.com',\n * {\n * recipient_name: 'สมชาย ใจดี',\n * language: 'th',\n * cc: ['manager@example.com'],\n * attachments: [\n * {\n * filename: 'welcome.pdf',\n * href: 'https://storage.azure.com/container/welcome.pdf' // URL จาก cloud storage\n * }\n * ]\n * }\n * );\n * ```\n */\n async sendEmailWithTemplate(\n templateCode: string,\n templateData: Record<string, any>,\n recipient: string,\n options?: {\n recipient_name?: string;\n recipient_id?: string;\n language?: 'th' | 'en';\n subject?: string;\n cc?: string | string[];\n bcc?: string | string[];\n attachments?: Array<{\n filename: string;\n href: string; // URL ของไฟล์ (required) - จาก File API, cloud storage, หรือ public URL\n content_type?: string; // MIME type (optional, auto-detect จาก filename หรือ URL)\n }>;\n priority?: 'low' | 'normal' | 'high' | 'urgent';\n scheduled_at?: Date | string;\n source?: string;\n related_entity_id?: string;\n related_entity_type?: string;\n },\n ): Promise<SendEmailResponse> {\n const request: SendEmailRequest = {\n template_code: templateCode,\n template_data: templateData,\n ...(options?.language && { language: options.language }),\n ...(options?.subject && { subject: options.subject }),\n ...(recipient.includes('@') ? { recipient_email: recipient } : { recipient_id: recipient }),\n ...(options?.recipient_name && { recipient_name: options.recipient_name }),\n ...(options?.cc && { cc: options.cc }),\n ...(options?.bcc && { bcc: options.bcc }),\n ...(options?.attachments && { attachments: options.attachments }),\n ...(options?.priority && { priority: options.priority }),\n ...(options?.scheduled_at && { scheduled_at: options.scheduled_at }),\n ...(options?.source && { source: options.source }),\n ...(options?.related_entity_id && { related_entity_id: options.related_entity_id }),\n ...(options?.related_entity_type && { related_entity_type: options.related_entity_type }),\n };\n\n return this.sendEmail(request);\n }\n\n /**\n * Send email with raw HTML (Raw HTML Mode - convenience method)\n *\n * @param htmlBody - HTML content\n * @param subject - Email subject\n * @param recipient - Email address or user ID\n * @param options - Additional options (text_body, cc, bcc, attachments, etc.)\n * @returns SendEmailResponse\n *\n * @example\n * ```typescript\n * const result = await authClient.email.sendRawEmail(\n * '<h1>ยินดีต้อนรับ</h1><p>ขอบคุณที่สมัครสมาชิก</p>',\n * 'ยินดีต้อนรับสู่ระบบ',\n * 'user@example.com',\n * {\n * recipient_name: 'สมชาย ใจดี',\n * text_body: 'ยินดีต้อนรับ ขอบคุณที่สมัครสมาชิก',\n * cc: ['manager@example.com'],\n * bcc: ['archive@example.com'],\n * attachments: [\n * {\n * filename: 'document.pdf',\n * href: 'https://api.example.com/files/123e4567-e89b-12d3-a456-426614174000/content' // URL จาก File API\n * }\n * ]\n * }\n * );\n * ```\n */\n async sendRawEmail(\n htmlBody: string,\n subject: string,\n recipient: string,\n options?: {\n recipient_name?: string;\n recipient_id?: string;\n text_body?: string;\n cc?: string | string[];\n bcc?: string | string[];\n attachments?: Array<{\n filename: string;\n href: string; // URL ของไฟล์ (required) - จาก File API, cloud storage, หรือ public URL\n content_type?: string; // MIME type (optional, auto-detect จาก filename หรือ URL)\n }>;\n priority?: 'low' | 'normal' | 'high' | 'urgent';\n scheduled_at?: Date | string;\n source?: string;\n related_entity_id?: string;\n related_entity_type?: string;\n },\n ): Promise<SendEmailResponse> {\n const request: SendEmailRequest = {\n html_body: htmlBody,\n subject,\n ...(recipient.includes('@') ? { recipient_email: recipient } : { recipient_id: recipient }),\n ...(options?.recipient_name && { recipient_name: options.recipient_name }),\n ...(options?.text_body && { text_body: options.text_body }),\n ...(options?.cc && { cc: options.cc }),\n ...(options?.bcc && { bcc: options.bcc }),\n ...(options?.attachments && { attachments: options.attachments }),\n ...(options?.priority && { priority: options.priority }),\n ...(options?.scheduled_at && { scheduled_at: options.scheduled_at }),\n ...(options?.source && { source: options.source }),\n ...(options?.related_entity_id && { related_entity_id: options.related_entity_id }),\n ...(options?.related_entity_type && { related_entity_type: options.related_entity_type }),\n };\n\n return this.sendEmail(request);\n }\n}\n","/**\n * Workflow API Client\n *\n * Handles workflow operations:\n * - Get workflow instance by ID\n * - Create workflow instance\n * - Update workflow instance\n * - Search workflow instances\n * - Get workflow tasks\n * - Perform task actions\n * - Get workflow definitions\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n WorkflowInstance,\n WorkflowTask,\n WorkflowDefinition,\n CreateWorkflowInstanceRequest,\n UpdateWorkflowInstanceRequest,\n TaskActionRequest,\n WorkflowInstanceSearchParams,\n WorkflowTaskSearchParams,\n ApiResponse,\n ApiPaginatedResponse,\n} from '../types';\n\nexport class WorkflowAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Get workflow instance by ID\n *\n * @example\n * ```typescript\n * const instance = await authClient.workflow.getInstance(\"wf-inst-123\");\n * ```\n */\n async getInstance(instanceId: string): Promise<WorkflowInstance> {\n const response = await this.axios.get<ApiResponse<WorkflowInstance>>(`/workflow-instances/${instanceId}`);\n return response.data.data!;\n }\n\n /**\n * Create a new workflow instance\n *\n * @example\n * ```typescript\n * const instance = await authClient.workflow.createInstance({\n * workflow_definition_id: \"wf-def-123\",\n * document_id: \"doc-123\",\n * document_type: \"purchase_request\",\n * document_title: \"ขอซื้อคอมพิวเตอร์\",\n * priority: \"high\",\n * position_id: \"pos-123\",\n * form_data: {\n * amount: 150000,\n * items: [\"Laptop\", \"Monitor\"]\n * },\n * user_id: \"user-123\"\n * });\n * ```\n */\n async createInstance(instanceData: CreateWorkflowInstanceRequest): Promise<WorkflowInstance> {\n const response = await this.axios.post<ApiResponse<WorkflowInstance>>('/workflow-instances', instanceData);\n return response.data.data!;\n }\n\n /**\n * Update workflow instance\n *\n * @example\n * ```typescript\n * const updatedInstance = await authClient.workflow.updateInstance(\"wf-inst-123\", {\n * document_title: \"ขอซื้อคอมพิวเตอร์ (แก้ไข)\",\n * priority: \"urgent\"\n * });\n * ```\n */\n async updateInstance(instanceId: string, instanceData: UpdateWorkflowInstanceRequest): Promise<WorkflowInstance> {\n const response = await this.axios.put<ApiResponse<WorkflowInstance>>(\n `/workflow-instances/${instanceId}`,\n instanceData,\n );\n return response.data.data!;\n }\n\n /**\n * Search workflow instances with pagination and filters\n *\n * @example\n * ```typescript\n * const result = await authClient.workflow.searchInstances({\n * search: \"ขอซื้อ\",\n * page: 1,\n * limit: 20,\n * sort_by: \"created_at\",\n * sort_order: \"desc\",\n * filters: {\n * status: [\"running\", \"pending\"],\n * priority: [\"high\", \"urgent\"]\n * }\n * });\n *\n * // Access paginated data\n * console.log(result.data); // WorkflowInstance[]\n * console.log(result.pagination.total); // Total count\n * console.log(result.pagination.has_next); // Has next page\n * ```\n */\n async searchInstances(params?: WorkflowInstanceSearchParams): Promise<ApiPaginatedResponse<WorkflowInstance>> {\n const response = await this.axios.post<ApiPaginatedResponse<WorkflowInstance>>(\n '/workflow-instances/search',\n params || {},\n );\n return response.data;\n }\n\n /**\n * Get workflow task by ID\n *\n * @example\n * ```typescript\n * const task = await authClient.workflow.getTask(\"task-123\");\n * ```\n */\n async getTask(taskId: string): Promise<WorkflowTask> {\n const response = await this.axios.get<ApiResponse<WorkflowTask>>(`/workflow-tasks/${taskId}`);\n return response.data.data!;\n }\n\n /**\n * Get user tasks with pagination and filters\n *\n * @example\n * ```typescript\n * const result = await authClient.workflow.getUserTasks({\n * status: [\"assigned\", \"in_progress\"],\n * priority: [\"high\"],\n * page: 1,\n * limit: 20\n * });\n *\n * // Access paginated data\n * console.log(result.data); // WorkflowTask[]\n * console.log(result.pagination.total); // Total count\n * ```\n */\n async getUserTasks(params?: WorkflowTaskSearchParams): Promise<ApiPaginatedResponse<WorkflowTask>> {\n const queryParams: Record<string, string> = {};\n\n if (params?.status) {\n queryParams.status = params.status.join(',');\n }\n if (params?.priority) {\n queryParams.priority = params.priority.join(',');\n }\n if (params?.workflow_instance_id) {\n queryParams.workflow_instance_id = params.workflow_instance_id;\n }\n if (params?.assigned_to) {\n queryParams.assigned_to = params.assigned_to;\n }\n if (params?.page !== undefined) {\n queryParams.page = params.page.toString();\n }\n if (params?.limit !== undefined) {\n queryParams.limit = params.limit.toString();\n }\n if (params?.sort_by) {\n queryParams.sort_by = params.sort_by;\n }\n if (params?.sort_order) {\n queryParams.sort_order = params.sort_order;\n }\n\n const queryString = new URLSearchParams(queryParams).toString();\n const url = `/workflow-tasks${queryString ? `?${queryString}` : ''}`;\n\n const response = await this.axios.get<ApiPaginatedResponse<WorkflowTask>>(url);\n return response.data;\n }\n\n /**\n * Perform action on workflow task (approve, reject, delegate, escalate, etc.)\n *\n * @example\n * ```typescript\n * // Approve task\n * const result = await authClient.workflow.performTaskAction(\"task-123\", {\n * action_key: \"approve\",\n * comments: \"อนุมัติตามขั้นตอน\"\n * });\n *\n * // Reject task\n * const result = await authClient.workflow.performTaskAction(\"task-123\", {\n * action_key: \"reject\",\n * comments: \"ไม่ผ่านตามเงื่อนไข\",\n * reason: \"งบประมาณไม่เพียงพอ\"\n * });\n *\n * // Delegate task\n * const result = await authClient.workflow.performTaskAction(\"task-123\", {\n * action_key: \"delegate\",\n * delegate_to_user_id: \"user-456\",\n * comments: \"มอบหมายให้ผู้จัดการพิจารณา\"\n * });\n * ```\n */\n async performTaskAction(taskId: string, actionData: TaskActionRequest): Promise<WorkflowTask> {\n const response = await this.axios.post<ApiResponse<WorkflowTask>>(`/workflow-tasks/${taskId}/actions`, actionData);\n return response.data.data!;\n }\n\n /**\n * Get workflow definition by ID\n *\n * @example\n * ```typescript\n * const definition = await authClient.workflow.getDefinition(\"wf-def-123\");\n * ```\n */\n async getDefinition(definitionId: string): Promise<WorkflowDefinition> {\n const response = await this.axios.get<ApiResponse<WorkflowDefinition>>(`/workflow-definitions/${definitionId}`);\n return response.data.data!;\n }\n\n /**\n * Search workflow definitions with pagination and filters\n *\n * @example\n * ```typescript\n * const result = await authClient.workflow.searchDefinitions({\n * search: \"อนุมัติ\",\n * page: 1,\n * limit: 20,\n * filters: {\n * status: [\"active\"]\n * }\n * });\n *\n * // Access paginated data\n * console.log(result.data); // WorkflowDefinition[]\n * console.log(result.pagination.total); // Total count\n * ```\n */\n async searchDefinitions(params?: {\n search?: string;\n page?: number;\n limit?: number;\n filters?: {\n status?: string[];\n organization_id?: string;\n document_type_id?: string;\n [key: string]: any;\n };\n }): Promise<ApiPaginatedResponse<WorkflowDefinition>> {\n const response = await this.axios.post<ApiPaginatedResponse<WorkflowDefinition>>(\n '/workflow-definitions/search',\n params || {},\n );\n return response.data;\n }\n}\n","/**\n * Organization API Client\n *\n * Handles organization data and hierarchy operations:\n * - Search organizations\n * - Get organization by ID\n * - Create/Update/Delete\n * - Hierarchy management (Ancestors, Descendants, Reporting Line)\n * - Tree structure (with departments and positions)\n * - Status management (activate/deactivate)\n * - Hierarchy operations (duplicate/move)\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n OrganizationSearchParams,\n MoveOrganizationRequest,\n OrganizationTreeResponse,\n BulkOperationResponse,\n BulkCreateOrganizationRequest,\n BulkCreateOrganizationResponse,\n ClearAllDataResponse,\n RebuildAllDataResponse,\n ApiPaginatedResponse,\n ApiResponse,\n ReportingLineResponse,\n OrganizationLevelResponse,\n User,\n} from '../types';\n\nexport class OrganizationAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Search organizations with pagination and filters\n */\n async search(params?: OrganizationSearchParams): Promise<ApiPaginatedResponse<Organization>> {\n const response = await this.axios.post<ApiPaginatedResponse<Organization>>('/organizations/search', params || {});\n return response.data;\n }\n\n /**\n * Get organization by ID\n */\n async get(id: string): Promise<Organization> {\n const response = await this.axios.get<ApiResponse<Organization>>(`/organizations/${id}`);\n return response.data.data!;\n }\n\n /**\n * Find organization by code\n *\n * @description ค้นหาองค์กรด้วย code ที่ unique\n *\n * @example\n * ```typescript\n * const org = await authClient.organization.findByCode(\"WIN-CORP\");\n * if (org) {\n * console.log(org.name); // \"บริษัท วิน คอร์ปอเรชั่น จำกัด\"\n * }\n * ```\n */\n async findByCode(code: string): Promise<Organization | null> {\n const response = await this.axios.get<ApiResponse<Organization | null>>(`/organizations/code/${code}`);\n return response.data.data || null;\n }\n\n /**\n * Create a new organization\n */\n async create(data: CreateOrganizationRequest): Promise<Organization> {\n const response = await this.axios.post<ApiResponse<Organization>>('/organizations', data);\n return response.data.data!;\n }\n\n /**\n * Bulk create organizations (เร็วกว่า loop create ทีละรายการ)\n *\n * @description สร้างองค์กรหลายรายการในครั้งเดียว ต้องเรียง parent ก่อน child\n * หรือระบุ id ให้ parent เพื่อให้ child อ้างอิง parent_id ได้\n *\n * @example\n * ```typescript\n * const result = await authClient.organization.bulkCreate({\n * organizations: [\n * { name: \"Group A\", code: \"GRP-A\", type: \"group\", id: \"uuid-1\" },\n * { name: \"Company 1\", code: \"CO-1\", type: \"company\", parent_id: \"uuid-1\", id: \"uuid-2\" },\n * { name: \"Dept IT\", code: \"IT\", type: \"department\", parent_id: \"uuid-2\" },\n * ],\n * });\n * console.log(result.created); // 3\n * ```\n */\n async bulkCreate(data: BulkCreateOrganizationRequest): Promise<BulkCreateOrganizationResponse> {\n const response = await this.axios.post<ApiResponse<BulkCreateOrganizationResponse>>(\n '/organizations/bulk-create',\n data,\n );\n return response.data.data!;\n }\n\n /**\n * Update organization\n */\n async update(id: string, data: UpdateOrganizationRequest): Promise<Organization> {\n const response = await this.axios.put<ApiResponse<Organization>>(`/organizations/${id}`, data);\n return response.data.data!;\n }\n\n /**\n * Delete organization\n */\n async delete(id: string): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<boolean>>(`/organizations/${id}`);\n return !!response.data.success;\n }\n\n /**\n * Get organization users\n * @param includeDescendants If true, returns users from all descendant organizations recursively\n */\n async getUsers(id: string, includeDescendants: boolean = false): Promise<User[]> {\n const params = includeDescendants ? { includeDescendants: 'true' } : {};\n const response = await this.axios.get<ApiResponse<User[]>>(`/organizations/${id}/users`, { params });\n return response.data.data || [];\n }\n\n /**\n * Get ancestors (parent organizations at all levels)\n */\n async getAncestors(id: string, includeRoot: boolean = true): Promise<Organization[]> {\n const params = { includeRoot: String(includeRoot) };\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/ancestors`, { params });\n return response.data.data || [];\n }\n\n /**\n * Get immediate supervisor/parent organization\n */\n async getDirectSupervisor(id: string): Promise<Organization | null> {\n const response = await this.axios.get<ApiResponse<Organization | null>>(`/organizations/${id}/supervisor`);\n return response.data.data || null;\n }\n\n /**\n * Get full path from root to organization\n */\n async getPath(id: string): Promise<Organization[]> {\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/path`);\n return response.data.data || [];\n }\n\n /**\n * Get reporting line (hierarchical and functional)\n */\n async getReportingLine(id: string): Promise<ReportingLineResponse> {\n const response = await this.axios.get<ApiResponse<ReportingLineResponse>>(`/organizations/${id}/reporting-line`);\n return response.data.data!;\n }\n\n /**\n * Get sibling organizations (same parent)\n */\n async getSiblings(id: string, includeSelf: boolean = false): Promise<Organization[]> {\n const params = { includeSelf: String(includeSelf) };\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/siblings`, { params });\n return response.data.data || [];\n }\n\n /**\n * Get organization level\n */\n async getLevel(id: string): Promise<OrganizationLevelResponse> {\n const response = await this.axios.get<ApiResponse<OrganizationLevelResponse>>(`/organizations/${id}/level`);\n return response.data.data!;\n }\n\n /**\n * Get lowest common ancestor of two organizations\n */\n async getCommonAncestor(orgA: string, orgB: string): Promise<Organization | null> {\n const params = { orgA, orgB };\n const response = await this.axios.get<ApiResponse<Organization | null>>('/organizations/common-ancestor', {\n params,\n });\n return response.data.data || null;\n }\n\n /**\n * Check if an organization is an ancestor of another\n */\n async isAncestorOf(ancestorId: string, descendantId: string): Promise<boolean> {\n const params = { ancestorId, descendantId };\n const response = await this.axios.get<ApiResponse<boolean>>('/organizations/check-ancestor', { params });\n return !!response.data.data;\n }\n\n // ==========================================================================\n // Hierarchy Tree\n // ==========================================================================\n\n /**\n * Get organization hierarchy\n *\n * @description ดึง hierarchy tree ขององค์กรทั้งหมด หรือเริ่มจาก root ที่ระบุ\n *\n * @param rootId - Optional root organization ID. ถ้าไม่ระบุจะดึง hierarchy ทั้งหมด\n *\n * @example\n * ```typescript\n * // ดึง hierarchy ทั้งหมด\n * const hierarchy = await authClient.organization.getHierarchy();\n *\n * // ดึง hierarchy จาก root ที่ระบุ\n * const hierarchy = await authClient.organization.getHierarchy(\"org-root-123\");\n * ```\n */\n async getHierarchy(rootId?: string): Promise<Organization[]> {\n const params = rootId ? { rootId } : {};\n const response = await this.axios.get<ApiResponse<Organization[]>>('/organizations/hierarchy', { params });\n return response.data.data || [];\n }\n\n /**\n * Get organization tree (with departments and positions)\n *\n * @description ดึงโครงสร้าง tree ขององค์กร รวม departments, positions และ user assignments\n *\n * @example\n * ```typescript\n * const tree = await authClient.organization.getTree(\"org-123\");\n * console.log(tree.children); // departments & positions\n * console.log(tree.total_users); // จำนวนผู้ใช้ทั้งหมด\n * ```\n */\n async getTree(id: string): Promise<OrganizationTreeResponse> {\n const response = await this.axios.get<ApiResponse<OrganizationTreeResponse>>(`/organizations/${id}/tree`);\n return response.data.data!;\n }\n\n /**\n * Get direct children of organization\n *\n * @description ดึงองค์กรลูกตรง (direct children) ขององค์กรที่ระบุ\n *\n * @example\n * ```typescript\n * const children = await authClient.organization.getChildren(\"org-123\");\n * ```\n */\n async getChildren(id: string): Promise<Organization[]> {\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/children`);\n return response.data.data || [];\n }\n\n /**\n * Get sub-organizations\n *\n * @description ดึง sub-organizations ขององค์กรที่ระบุ\n *\n * @example\n * ```typescript\n * const subOrgs = await authClient.organization.getSubOrganizations(\"org-123\");\n * ```\n */\n async getSubOrganizations(id: string): Promise<Organization[]> {\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/sub-organizations`);\n return response.data.data || [];\n }\n\n /**\n * Get positions under organization\n *\n * @description ดึงรายการตำแหน่ง (position nodes) ทั้งหมดภายใต้องค์กรที่ระบุ\n *\n * @example\n * ```typescript\n * const positions = await authClient.organization.getPositions(\"org-123\");\n * console.log(positions.map(p => p.name)); // [\"Senior Developer\", \"Team Lead\", ...]\n * ```\n */\n async getPositions(id: string): Promise<Organization[]> {\n const response = await this.axios.get<ApiResponse<Organization[]>>(`/organizations/${id}/positions`);\n return response.data.data || [];\n }\n\n // ==========================================================================\n // Status Management\n // ==========================================================================\n\n /**\n * Activate organization\n *\n * @description เปิดใช้งานองค์กร\n *\n * @example\n * ```typescript\n * await authClient.organization.activate(\"org-123\");\n * ```\n */\n async activate(id: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/organizations/${id}/activate`);\n return !!response.data.data;\n }\n\n /**\n * Deactivate organization\n *\n * @description ปิดใช้งานองค์กร\n *\n * @example\n * ```typescript\n * await authClient.organization.deactivate(\"org-123\");\n * ```\n */\n async deactivate(id: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/organizations/${id}/deactivate`);\n return !!response.data.data;\n }\n\n // ==========================================================================\n // Bulk Operations\n // ==========================================================================\n\n /**\n * Bulk activate organizations\n *\n * @description เปิดใช้งานหลายองค์กรพร้อมกัน\n *\n * @example\n * ```typescript\n * const result = await authClient.organization.bulkActivate([\"org-1\", \"org-2\", \"org-3\"]);\n * console.log(result.success_count); // 3\n * ```\n */\n async bulkActivate(ids: string[]): Promise<BulkOperationResponse> {\n const response = await this.axios.post<ApiResponse<BulkOperationResponse>>('/organizations/bulk-activate', {\n ids,\n });\n return response.data.data!;\n }\n\n /**\n * Bulk deactivate organizations\n *\n * @description ปิดใช้งานหลายองค์กรพร้อมกัน\n *\n * @example\n * ```typescript\n * const result = await authClient.organization.bulkDeactivate([\"org-1\", \"org-2\"]);\n * console.log(result.success_count); // 2\n * ```\n */\n async bulkDeactivate(ids: string[]): Promise<BulkOperationResponse> {\n const response = await this.axios.post<ApiResponse<BulkOperationResponse>>('/organizations/bulk-deactivate', {\n ids,\n });\n return response.data.data!;\n }\n\n /**\n * Bulk delete organizations\n *\n * @description ลบหลายองค์กรพร้อมกัน\n *\n * @example\n * ```typescript\n * const result = await authClient.organization.bulkDelete([\"org-1\", \"org-2\"]);\n * console.log(result.success_count); // 2\n * ```\n */\n async bulkDelete(ids: string[]): Promise<BulkOperationResponse> {\n const response = await this.axios.post<ApiResponse<BulkOperationResponse>>('/organizations/bulk-delete', {\n ids,\n });\n return response.data.data!;\n }\n\n /**\n * Clear all organization data\n *\n * @description ลบข้อมูลองค์กรทั้งหมด รวมถึง:\n * - user_position_assignment (เอาข้อมูล position ออกจาก user)\n * - organization_closure\n * - organization (company, department, position)\n * - Nullify organization/position references ใน workflow และ document tables\n *\n * รองรับทั้ง JWT และ API Key authentication (สำหรับเรียกจากระบบอื่น)\n *\n * @example\n * ```typescript\n * const result = await authClient.organization.clearAll();\n * console.log(result.organizations_deleted); // จำนวนองค์กรที่ลบ\n * console.log(result.user_position_assignments_deleted); // จำนวน position assignment ที่ลบ\n * ```\n */\n async clearAll(): Promise<ClearAllDataResponse> {\n const response = await this.axios.post<ApiResponse<ClearAllDataResponse>>('/organizations/clear-all');\n return response.data.data!;\n }\n\n /**\n * Rebuild all organization data (รวมทุก fix ในครั้งเดียว)\n *\n * @description ใช้หลัง clear-all + create เพื่อให้ข้อมูลครบถ้วน:\n * 1. fix organization_id ตาม hierarchy\n * 2. reload organization_closure สำหรับทุก company\n * 3. reload report_to_position\n *\n * @example\n * ```typescript\n * await authClient.organization.clearAll();\n * // ... create organizations ...\n * const result = await authClient.organization.rebuildAll();\n * console.log(result.organization_ids_fixed, result.closure_companies_processed);\n * ```\n */\n async rebuildAll(): Promise<RebuildAllDataResponse> {\n const response = await this.axios.post<ApiResponse<RebuildAllDataResponse>>('/organizations/rebuild-all');\n return response.data.data!;\n }\n\n // ==========================================================================\n // Hierarchy Operations\n // ==========================================================================\n\n /**\n * Duplicate organization (copy)\n *\n * @description คัดลอกองค์กรและ children ทั้งหมด สร้าง organization ใหม่พร้อม hierarchy fields และ closure records\n *\n * @example\n * ```typescript\n * const duplicated = await authClient.organization.duplicate(\"org-123\");\n * console.log(duplicated.id); // new organization ID\n * ```\n */\n async duplicate(id: string): Promise<Organization> {\n const response = await this.axios.post<ApiResponse<Organization>>(`/organizations/${id}/duplicate`);\n return response.data.data!;\n }\n\n /**\n * Move organization to new parent\n *\n * @description ย้ายองค์กรไปอยู่ภายใต้ parent ใหม่ อัพเดท hierarchy fields และ closure table อัตโนมัติ\n * ส่ง `null` เพื่อย้ายไปเป็น root level\n *\n * @example\n * ```typescript\n * // ย้ายไปอยู่ภายใต้ parent ใหม่\n * await authClient.organization.move(\"org-123\", { new_parent_id: \"org-456\" });\n *\n * // ย้ายไปเป็น root level\n * await authClient.organization.move(\"org-123\", { new_parent_id: null });\n * ```\n */\n async move(id: string, data: MoveOrganizationRequest): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/organizations/${id}/move`, data);\n return !!response.data.success;\n }\n}\n","/**\n * Role API Client\n *\n * Handles role CRUD and assignment operations:\n * - Search roles\n * - Get role by ID\n * - Create role\n * - Update role\n * - Delete role\n * - User assignment (get/assign/unassign)\n * - Permission assignment (get/assign/unassign)\n * - Activate/Deactivate\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n Role,\n RoleSearchParams,\n CreateRoleRequest,\n UpdateRoleRequest,\n RoleClearResponse,\n User,\n ApiPaginatedResponse,\n ApiResponse,\n} from '../types';\n\nexport class RoleAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n // ==========================================================================\n // CRUD Operations\n // ==========================================================================\n\n /**\n * Search roles with pagination and filters\n *\n * @example\n * ```typescript\n * const result = await authClient.role.search({\n * search: \"Admin\",\n * page: 1,\n * limit: 20,\n * sort_by: \"created_at\",\n * sort_order: \"desc\"\n * });\n * ```\n */\n async search(params?: RoleSearchParams): Promise<ApiPaginatedResponse<Role>> {\n const response = await this.axios.post<ApiPaginatedResponse<Role>>('/roles/search', params || {});\n return response.data;\n }\n\n /**\n * Get role by ID\n *\n * @example\n * ```typescript\n * const role = await authClient.role.get(\"role-123\");\n * ```\n */\n async get(roleId: string): Promise<Role> {\n const response = await this.axios.get<ApiResponse<Role>>(`/roles/${roleId}`);\n return response.data.data!;\n }\n\n /**\n * Create a new role\n *\n * @example\n * ```typescript\n * const newRole = await authClient.role.create({\n * name: \"ผู้ดูแลระบบ\",\n * code: \"ADMIN\",\n * description: \"บทบาทสำหรับผู้ดูแลระบบ\"\n * });\n * ```\n */\n async create(data: CreateRoleRequest): Promise<Role> {\n const response = await this.axios.post<ApiResponse<Role>>('/roles', data);\n return response.data.data!;\n }\n\n /**\n * Update role\n *\n * @example\n * ```typescript\n * const updatedRole = await authClient.role.update(\"role-123\", {\n * name: \"ผู้ดูแลระบบหลัก\",\n * description: \"บทบาทสำหรับผู้ดูแลระบบหลัก\"\n * });\n * ```\n */\n async update(roleId: string, data: UpdateRoleRequest): Promise<Role> {\n const response = await this.axios.put<ApiResponse<Role>>(`/roles/${roleId}`, data);\n return response.data.data!;\n }\n\n /**\n * Clear all roles for current application (hard delete)\n *\n * @description ลบบทบาททั้งหมดตาม application_id จาก RequestContext (API key/context)\n * ใช้สำหรับ migrate - ไม่ใช้ DTO, ดึง application_id จาก context อัตโนมัติ\n *\n * @example\n * ```typescript\n * const result = await authClient.role.clear();\n * console.log(result.roles_deleted, result.role_permissions_deleted);\n * ```\n */\n async clear(): Promise<RoleClearResponse> {\n const response = await this.axios.post<ApiResponse<RoleClearResponse>>('/roles/clear');\n return response.data.data!;\n }\n\n /**\n * Delete role\n *\n * @example\n * ```typescript\n * await authClient.role.delete(\"role-123\");\n * ```\n */\n async delete(roleId: string): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<boolean>>(`/roles/${roleId}`);\n return !!response.data.success;\n }\n\n // ==========================================================================\n // Status Management\n // ==========================================================================\n\n /**\n * Activate role\n *\n * @example\n * ```typescript\n * await authClient.role.activate(\"role-123\");\n * ```\n */\n async activate(roleId: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/roles/${roleId}/activate`);\n return !!response.data.data;\n }\n\n /**\n * Deactivate role\n *\n * @example\n * ```typescript\n * await authClient.role.deactivate(\"role-123\");\n * ```\n */\n async deactivate(roleId: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/roles/${roleId}/deactivate`);\n return !!response.data.data;\n }\n\n // ==========================================================================\n // User Assignment\n // ==========================================================================\n\n /**\n * Get role users\n *\n * @description ดึงรายการผู้ใช้ทั้งหมดที่มีบทบาทนี้\n *\n * @example\n * ```typescript\n * const users = await authClient.role.getUsers(\"role-123\");\n * console.log(users.map(u => u.email));\n * ```\n */\n async getUsers(roleId: string): Promise<User[]> {\n const response = await this.axios.get<ApiResponse<User[]>>(`/roles/${roleId}/users`);\n return response.data.data || [];\n }\n\n /**\n * Assign users to role\n *\n * @description มอบหมายผู้ใช้ให้บทบาท (เพิ่มเข้าไป ไม่ลบของเดิม)\n *\n * @example\n * ```typescript\n * await authClient.role.assignUsers(\"role-123\", [\"user-001\", \"user-002\"]);\n * ```\n */\n async assignUsers(roleId: string, userIds: string[]): Promise<boolean> {\n const response = await this.axios.post<ApiResponse<boolean>>(`/roles/${roleId}/users`, {\n ids: userIds,\n });\n return !!response.data.success;\n }\n\n /**\n * Unassign users from role\n *\n * @description ยกเลิกผู้ใช้จากบทบาท\n *\n * @example\n * ```typescript\n * await authClient.role.unassignUsers(\"role-123\", [\"user-001\"]);\n * ```\n */\n async unassignUsers(roleId: string, userIds: string[]): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<boolean>>(`/roles/${roleId}/users`, {\n data: { ids: userIds },\n });\n return !!response.data.success;\n }\n\n // ==========================================================================\n // Permission Assignment\n // ==========================================================================\n\n /**\n * Get role permissions\n *\n * @description ดึงรายการสิทธิ์ทั้งหมดของบทบาท\n *\n * @example\n * ```typescript\n * const permissions = await authClient.role.getPermissions(\"role-123\");\n * ```\n */\n async getPermissions(roleId: string): Promise<Array<{ id: string; name: string; code: string; description?: string }>> {\n const response = await this.axios.get<ApiResponse<Array<{ id: string; name: string; code: string; description?: string }>>>(`/roles/${roleId}/permissions`);\n return response.data.data || [];\n }\n\n /**\n * Assign permissions to role\n *\n * @description มอบหมายสิทธิ์ให้บทบาท\n *\n * @example\n * ```typescript\n * await authClient.role.assignPermissions(\"role-123\", [\"perm-001\", \"perm-002\"]);\n * ```\n */\n async assignPermissions(roleId: string, permissionIds: string[]): Promise<boolean> {\n const response = await this.axios.post<ApiResponse<boolean>>(`/roles/${roleId}/permissions`, {\n ids: permissionIds,\n });\n return !!response.data.success;\n }\n\n /**\n * Unassign permissions from role\n *\n * @description ยกเลิกสิทธิ์จากบทบาท\n *\n * @example\n * ```typescript\n * await authClient.role.unassignPermissions(\"role-123\", [\"perm-001\"]);\n * ```\n */\n async unassignPermissions(roleId: string, permissionIds: string[]): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<boolean>>(`/roles/${roleId}/permissions`, {\n data: { ids: permissionIds },\n });\n return !!response.data.success;\n }\n}\n","/**\n * Permission API Client\n *\n * Handles permission CRUD and bulk operations:\n * - Search permissions\n * - Get permission by ID\n * - Create/Update/Delete\n * - Bulk create\n * - Activate/Deactivate\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n Permission,\n CreatePermissionRequest,\n UpdatePermissionRequest,\n PermissionSearchParams,\n BulkCreatePermissionRequest,\n BulkCreateResponse,\n PermissionClearResponse,\n ApiPaginatedResponse,\n ApiResponse,\n} from '../types';\n\nexport class PermissionAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Clear all permissions for current application (hard delete)\n *\n * @description ลบสิทธิ์ทั้งหมดตาม application_id จาก RequestContext (API key/context)\n * ใช้สำหรับ migrate - ไม่ใช้ DTO, ดึง application_id จาก context อัตโนมัติ\n *\n * @example\n * ```typescript\n * const result = await authClient.permission.clear();\n * console.log(result.permissions_deleted, result.role_permissions_deleted);\n * ```\n */\n async clear(): Promise<PermissionClearResponse> {\n const response = await this.axios.post<ApiResponse<PermissionClearResponse>>('/permissions/clear');\n return response.data.data!;\n }\n\n /**\n * Search permissions with pagination and filters\n */\n async search(params?: PermissionSearchParams): Promise<ApiPaginatedResponse<Permission>> {\n const response = await this.axios.post<ApiPaginatedResponse<Permission>>('/permissions/search', params || {});\n return response.data;\n }\n\n /**\n * Get permission by ID\n */\n async get(id: string): Promise<Permission | null> {\n const response = await this.axios.get<ApiResponse<Permission | null>>(`/permissions/${id}`);\n return response.data.data ?? null;\n }\n\n /**\n * Create a new permission\n */\n async create(data: CreatePermissionRequest): Promise<Permission> {\n const response = await this.axios.post<ApiResponse<Permission>>('/permissions', data);\n return response.data.data!;\n }\n\n /**\n * Bulk create permissions ในครั้งเดียว\n *\n * @description สร้างสิทธิ์หลายรายการในครั้งเดียว ทุก permission ต้องมี category_id ที่มีอยู่แล้วในระบบ\n *\n * @example\n * ```typescript\n * const result = await authClient.permission.bulkCreate({\n * permissions: [\n * { category_id: \"cat-uuid\", name: \"Create\", key: \"create\", description: \"...\" },\n * { category_id: \"cat-uuid\", name: \"Read\", key: \"read\", description: \"...\" },\n * ],\n * });\n * console.log(result.created); // 2\n * ```\n */\n async bulkCreate(data: BulkCreatePermissionRequest): Promise<BulkCreateResponse> {\n const response = await this.axios.post<ApiResponse<BulkCreateResponse>>('/permissions/bulk-create', data);\n return response.data.data!;\n }\n\n /**\n * Update permission\n */\n async update(id: string, data: UpdatePermissionRequest): Promise<Permission> {\n const response = await this.axios.put<ApiResponse<Permission>>(`/permissions/${id}`, data);\n return response.data.data!;\n }\n\n /**\n * Delete permission\n */\n async delete(id: string): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<boolean>>(`/permissions/${id}`);\n return !!response.data.success;\n }\n\n /**\n * Activate permission\n */\n async activate(id: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/permissions/${id}/activate`);\n return !!response.data.data;\n }\n\n /**\n * Deactivate permission\n */\n async deactivate(id: string): Promise<boolean> {\n const response = await this.axios.patch<ApiResponse<boolean>>(`/permissions/${id}/deactivate`);\n return !!response.data.data;\n }\n}\n","/**\n * Permission Category API Client\n *\n * Handles permission category CRUD and bulk operations:\n * - Search permission categories\n * - Get category by ID\n * - Create/Update/Delete\n * - Bulk create (categories พร้อม permissions ภายใน)\n * - รองรับ hierarchy (parent ก่อน child)\n */\n\nimport type { AxiosInstance } from 'axios';\nimport {\n PermissionCategory,\n CreatePermissionCategoryRequest,\n UpdatePermissionCategoryRequest,\n PermissionCategorySearchParams,\n BulkCreatePermissionCategoryRequest,\n BulkCreateResponse,\n PermissionCategoryClearResponse,\n ApiPaginatedResponse,\n ApiResponse,\n} from '../types';\n\nexport class PermissionCategoryAPI {\n constructor(private readonly axios: AxiosInstance) {}\n\n /**\n * Clear all permission categories for current application (hard delete)\n *\n * @description ลบหมวดหมู่สิทธิ์ทั้งหมดตาม application_id จาก RequestContext (API key/context)\n * ใช้สำหรับ migrate - ไม่ใช้ DTO, ดึง application_id จาก context อัตโนมัติ\n *\n * @example\n * ```typescript\n * const result = await authClient.permissionCategory.clear();\n * console.log(result.permission_categories_deleted, result.permissions_deleted);\n * ```\n */\n async clear(): Promise<PermissionCategoryClearResponse> {\n const response = await this.axios.post<ApiResponse<PermissionCategoryClearResponse>>(\n '/permission-categories/clear',\n );\n return response.data.data!;\n }\n\n /**\n * Search permission categories with pagination and filters\n */\n async search(params?: PermissionCategorySearchParams): Promise<ApiPaginatedResponse<PermissionCategory>> {\n const response = await this.axios.post<ApiPaginatedResponse<PermissionCategory>>(\n '/permission-categories/search',\n params || {},\n );\n return response.data;\n }\n\n /**\n * Get permission category by ID\n */\n async get(id: string): Promise<PermissionCategory> {\n const response = await this.axios.get<ApiResponse<PermissionCategory>>(`/permission-categories/${id}`);\n return response.data.data!;\n }\n\n /**\n * Create a new permission category (พร้อม permissions ได้)\n *\n * @note application_id ไม่ต้องส่งเมื่อเรียกจาก app context - API จะ inject อัตโนมัติ\n */\n async create(data: CreatePermissionCategoryRequest): Promise<PermissionCategory> {\n const response = await this.axios.post<ApiResponse<PermissionCategory>>('/permission-categories', data);\n return response.data.data!;\n }\n\n /**\n * Bulk create permission categories พร้อม permissions ในครั้งเดียว\n *\n * @description สร้างหมวดหมู่สิทธิ์หลายรายการพร้อม permissions ในครั้งเดียว\n * ต้องเรียง parent ก่อน child หรือระบุ id ให้ parent เพื่อให้ child อ้างอิง parent_id ได้\n *\n * @note application_id ไม่ต้องส่ง - API จะ inject อัตโนมัติจาก API key หรือ RequestContextService\n *\n * @example\n * ```typescript\n * // เรียกจาก app context (API key) - application_id จะถูก inject อัตโนมัติ\n * const result = await authClient.permissionCategory.bulkCreate({\n * permission_categories: [\n * {\n * id: \"cat-users\",\n * key: \"users\",\n * name: \"User Management\",\n * resource: \"users\",\n * permissions: [\n * { name: \"Create User\", key: \"create\", description: \"...\" },\n * { name: \"Read User\", key: \"read\", description: \"...\" },\n * ],\n * },\n * {\n * key: \"user_profile\",\n * name: \"User Profile\",\n * parent_id: \"cat-users\",\n * permissions: [{ name: \"Edit Profile\", key: \"edit\", description: \"...\" }],\n * },\n * ],\n * });\n * console.log(result.created); // 2\n * ```\n */\n async bulkCreate(data: BulkCreatePermissionCategoryRequest): Promise<BulkCreateResponse> {\n const response = await this.axios.post<ApiResponse<BulkCreateResponse>>(\n '/permission-categories/bulk-create',\n data,\n );\n return response.data.data!;\n }\n\n /**\n * Update permission category\n */\n async update(id: string, data: UpdatePermissionCategoryRequest): Promise<PermissionCategory> {\n const response = await this.axios.put<ApiResponse<PermissionCategory>>(`/permission-categories/${id}`, data);\n return response.data.data!;\n }\n\n /**\n * Delete permission category\n */\n async delete(id: string): Promise<boolean> {\n const response = await this.axios.delete<ApiResponse<void>>(`/permission-categories/${id}`);\n return !!response.data.success;\n }\n}\n","/**\n * Webhook Proxy API\n *\n * Handles webhook proxy operations for external applications:\n * - Send webhook requests through proxy\n * - Get webhook log status and details\n *\n * @requires API Key authentication\n */\n\nimport type { AxiosInstance } from 'axios';\nimport { ApiResponse } from '../types';\nimport type { WebhookProxyRequest, WebhookProxyResponse, WebhookLogDetail } from '../types/webhook.types';\n\nexport class WebhookAPI {\n constructor(private readonly axios: AxiosInstance) { }\n\n /**\n * ส่ง webhook request ผ่าน proxy endpoint\n *\n * @description\n * - ส่ง webhook request ไปยัง external URL ผ่านระบบ proxy\n * - ระบบจะสร้าง webhook_log และยิง webhook ออกไปให้\n * - รองรับ retry mechanism อัตโนมัติ\n * - ส่ง async: true เพื่อยิงทันทีและรับ result (http_status, response_body) ใน response\n *\n * @example\n * ```typescript\n * // ส่ง webhook request (โหมดปกติ - ได้ webhook_log_id กลับมา แล้วค่อย getStatus ตรวจสอบ)\n * const result = await authClient.webhook.proxy({\n * webhook_url: 'https://api.example.com/webhooks/users',\n * event_type: 'user.created',\n * payload: {\n * data: { id: 'user-123', email: 'user@example.com' },\n * object: 'event',\n * type: 'user.created'\n * },\n * headers: { 'Authorization': 'Bearer token' },\n * secret: 'webhook-secret',\n * timeout_ms: 30000,\n * max_retries: 3\n * });\n * console.log('Webhook Log ID:', result.webhook_log_id);\n *\n * // โหมด async: true - ยิงทันทีและได้ result กลับใน response (ไม่ต้อง getStatus)\n * const resultAsync = await authClient.webhook.proxy({\n * webhook_url: 'https://api.example.com/webhooks/users',\n * event_type: 'user.created',\n * payload: { data: { id: 'user-123' }, object: 'event', type: 'user.created' },\n * async: true\n * });\n * if (resultAsync.status === 'success') {\n * console.log('HTTP Status:', resultAsync.http_status);\n * console.log('Response Body:', resultAsync.response_body);\n * console.log('Execution Time:', resultAsync.execution_time_ms, 'ms');\n * } else {\n * console.error('Failed:', resultAsync.error_message);\n * }\n * ```\n */\n async proxy(request: WebhookProxyRequest): Promise<WebhookProxyResponse> {\n const response = await this.axios.post<ApiResponse<WebhookProxyResponse>>('/webhook-proxy', request);\n return response.data.data!;\n }\n\n /**\n * ดึง webhook log detail ตาม ID\n *\n * @description\n * - ดึงข้อมูล webhook log ตาม ID ที่ส่งกลับมาจาก proxy()\n * - แสดง status, response, error message, และข้อมูลอื่นๆ\n * - สามารถดึงได้เฉพาะ webhook logs ของ application ที่ authenticate อยู่เท่านั้น\n *\n * @example\n * ```typescript\n * // ดึง webhook log detail\n * const log = await authClient.webhook.getStatus('log-123e4567-e89b-12d3-a456-426614174000');\n *\n * console.log('Status:', log.status); // 'success', 'failed', 'pending', 'retrying'\n * console.log('HTTP Status:', log.http_status); // 200, 404, 500, etc.\n * console.log('Response Body:', log.response_body);\n * console.log('Error:', log.error_message);\n * console.log('Execution Time:', log.execution_time_ms, 'ms');\n * console.log('Retry Count:', log.retry_count);\n *\n * // ตรวจสอบว่า webhook สำเร็จหรือไม่\n * if (log.status === 'success') {\n * console.log('Webhook delivered successfully!');\n * } else if (log.status === 'failed') {\n * console.error('Webhook failed:', log.error_message);\n * }\n * ```\n */\n async getStatus(webhookLogId: string): Promise<WebhookLogDetail> {\n const response = await this.axios.get<ApiResponse<WebhookLogDetail>>(`/webhook-proxy/${webhookLogId}`);\n return response.data.data!;\n }\n}\n","/**\n * Common Status Enums - Shared across multiple entities\n *\n * @description รวม status enums ที่ใช้ร่วมกันในหลาย entities เพื่อความสอดคล้อง\n *\n * @usage\n * - EntityStatus: สำหรับ User, Role, Permission, Organization, Department, Team\n * - ProcessStatus: สำหรับ Task, Workflow, Process ที่มี lifecycle\n * - ApprovalStatus: สำหรับ approval workflows และ review processes\n */\n\n// Generic Entity Status - ใช้สำหรับ entities ทั่วไป\nexport enum EntityStatus {\n ACTIVE = 'active',\n INACTIVE = 'inactive',\n DEPRECATED = 'deprecated',\n}\n\n// Organization Type - ใช้สำหรับแยกประเภท organization records\nexport enum OrganizationType {\n GROUP = 'group', // กลุ่มบริษัท (Level 0)\n COMPANY = 'company', // บริษัท/องค์กรหลัก (alias: ORGANIZATION) (Level 1)\n BRANCH = 'branch', // สาขา (Level 1.5)\n DIVISION = 'division', // ฝ่าย (Level 2)\n DEPARTMENT = 'department', // แผนก (Level 3)\n SECTION = 'section', // ส่วนงาน (Level 3.5) - ระหว่าง Department กับ Team\n TEAM = 'team', // ทีม (Level 4)\n POSITION = 'position', // ตำแหน่งงาน (Level 5)\n}\n\n// Process/Workflow Status - ใช้สำหรับ processes และ workflows\nexport enum ProcessStatus {\n PENDING = 'pending',\n IN_PROGRESS = 'in_progress',\n COMPLETED = 'completed',\n CANCELLED = 'cancelled',\n FAILED = 'failed',\n}\n\n// Approval Status - ใช้สำหรับ approval workflows\nexport enum ApprovalStatus {\n PENDING = 'pending',\n APPROVED = 'approved',\n REJECTED = 'rejected',\n EXPIRED = 'expired',\n CANCELLED = 'cancelled',\n WITHDRAWN = 'withdrawn',\n DELEGATED = 'delegated',\n ESCALATED = 'escalated',\n}\n","// ===============================================\n// EVENT LOG ENUMS\n// ===============================================\n\n/**\n * Event severity levels\n */\nexport enum EventSeverity {\n DEBUG = 'debug',\n INFO = 'info',\n WARNING = 'warning',\n ERROR = 'error',\n CRITICAL = 'critical',\n}\n\n/**\n * Event outcome\n */\nexport enum EventOutcome {\n SUCCESS = 'success',\n FAILURE = 'failure',\n PARTIAL = 'partial',\n UNKNOWN = 'unknown',\n}\n\n/**\n * Event categories (ISO 27001 Compliant - 8 Core Categories)\n */\nexport enum EventCategory {\n // === 8 Core Categories ===\n AUTHENTICATION = 'authentication', // 1. Login, logout, password, MFA, account management\n AUTHORIZATION = 'authorization', // 2. Permission checks, role assignments, access control\n DATA_ACCESS = 'data_access', // 3. Data viewing, export, search, sensitive data access\n SECURITY = 'security', // 4. Attack attempts, suspicious activities, threat detection\n BUSINESS = 'business', // 5. CRUD operations, workflow, business operations (รวม DATA_CHANGE)\n TECHNICAL = 'technical', // 6. System lifecycle, performance, API operations, errors\n COMPLIANCE = 'compliance', // 7. Audit activities, GDPR, legal hold, policy compliance\n ISO27001_AUDIT = 'iso27001_audit', // 8. Control monitoring, risk management, ISMS\n}\n\n/**\n * Risk levels\n */\nexport enum EventRiskLevel {\n NONE = 'none',\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\n/**\n * Actor types\n */\nexport enum ActorType {\n USER = 'user',\n SYSTEM = 'system',\n SERVICE = 'service',\n API_CLIENT = 'api_client',\n SCHEDULER = 'scheduler',\n WEBHOOK = 'webhook',\n}\n\n/**\n * Compliance categories for ISO 27001\n */\nexport enum ComplianceCategory {\n ISO27001_A_12_4_1 = 'iso27001_a_12_4_1', // Event logging\n ISO27001_A_12_4_2 = 'iso27001_a_12_4_2', // Protection of log information\n ISO27001_A_12_4_3 = 'iso27001_a_12_4_3', // Administrator and operator logs\n ISO27001_A_12_4_4 = 'iso27001_a_12_4_4', // Clock synchronisation\n ISO27001_A_9_4_5 = 'iso27001_a_9_4_5', // Access logging\n ISO27001_A_13_2_1 = 'iso27001_a_13_2_1', // Non-repudiation\n ISO27001_A_16_1_2 = 'iso27001_a_16_1_2', // Reporting security events\n GDPR_ARTICLE_30 = 'gdpr_article_30', // Records of processing activities\n SOX_SECTION_404 = 'sox_section_404', // Internal controls\n PCI_DSS_10 = 'pci_dss_10', // Log and monitor access\n}\n\n/**\n * Data retention policies\n */\nexport enum RetentionPolicy {\n SHORT_TERM = 'short_term', // 90 days - 1 year\n MEDIUM_TERM = 'medium_term', // 1-3 years\n LONG_TERM = 'long_term', // 3-7 years\n PERMANENT = 'permanent', // Legal hold / permanent retention\n CUSTOM = 'custom', // Custom retention period\n}\n","/**\n * Todo Priority Enum\n *\n * @description ระดับความสำคัญของงานใน todo list\n */\nexport enum TodoPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n}\n\n"],"mappings":"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","names":["axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","axios","OrganizationType","EventSeverity","EventOutcome","EventCategory","EventRiskLevel","ActorType","TodoPriority"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@winwinmbs/portal-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Business API client for WINWIN Portal (files, email, workflow, user, etc.)",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"test": "jest",
|
|
26
|
+
"typecheck": "tsc --noEmit"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"axios": "^1.7.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@microsoft/api-extractor": "^7.58.7",
|
|
33
|
+
"@types/jest": "^29.5.0",
|
|
34
|
+
"@win-portal/shared": "workspace:*",
|
|
35
|
+
"jest": "^29.7.0",
|
|
36
|
+
"ts-jest": "^29.1.0",
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "~5.4.5"
|
|
39
|
+
}
|
|
40
|
+
}
|