UNPKG

@k-msg/channel

Version:

AlimTalk channel and sender number management

90 lines (89 loc) 3.44 kB
/** * Channel CRUD Operations * 채널 생성, 조회, 수정, 삭제 통합 관리 */ import { type Channel, type ChannelCreateRequest, type ChannelFilters, type SenderNumber, type SenderNumberCreateRequest, type SenderNumberFilters } from "../../types/channel.types"; import { EventEmitter } from "../shared/event-emitter"; export interface PaginationOptions { page: number; limit: number; sortBy?: string; sortOrder?: "asc" | "desc"; } export interface PaginatedResult<T> { data: T[]; total: number; page: number; limit: number; totalPages: number; hasNext: boolean; hasPrev: boolean; } export interface ChannelCRUDOptions { enableAuditLog: boolean; enableEventEmission: boolean; defaultPageSize: number; maxPageSize: number; enableSoftDelete: boolean; autoCleanup: boolean; cleanupInterval: number; } export interface AuditLogEntry { id: string; entityType: "channel" | "senderNumber"; entityId: string; action: "create" | "read" | "update" | "delete" | "verify" | "suspend" | "activate"; userId?: string; timestamp: Date; changes?: { before: any; after: any; }; metadata?: Record<string, any>; } export declare class ChannelCRUD extends EventEmitter { private options; private channels; private senderNumbers; private auditLogs; private cleanupTimer?; private defaultOptions; constructor(options?: Partial<ChannelCRUDOptions>); createChannel(request: ChannelCreateRequest, userId?: string): Promise<Channel>; getChannel(channelId: string, userId?: string): Promise<Channel | null>; updateChannel(channelId: string, updates: Partial<Omit<Channel, "id" | "createdAt" | "updatedAt">>, userId?: string): Promise<Channel>; deleteChannel(channelId: string, userId?: string): Promise<boolean>; listChannels(filters?: ChannelFilters, pagination?: PaginationOptions): Promise<PaginatedResult<Channel>>; createSenderNumber(channelId: string, request: SenderNumberCreateRequest, userId?: string): Promise<SenderNumber>; getSenderNumber(senderNumberId: string, userId?: string): Promise<SenderNumber | null>; updateSenderNumber(senderNumberId: string, updates: Partial<Omit<SenderNumber, "id" | "phoneNumber" | "createdAt" | "updatedAt">>, userId?: string): Promise<SenderNumber>; deleteSenderNumber(senderNumberId: string, userId?: string): Promise<boolean>; listSenderNumbers(filters?: SenderNumberFilters, pagination?: PaginationOptions): Promise<PaginatedResult<SenderNumber>>; getAuditLogs(entityType?: "channel" | "senderNumber", entityId?: string, limit?: number): AuditLogEntry[]; getStatistics(): { channels: { total: number; byStatus: Record<string, number>; byType: Record<string, number>; byProvider: Record<string, number>; }; senderNumbers: { total: number; byStatus: Record<string, number>; byCategory: Record<string, number>; }; }; cleanup(): { deletedChannels: number; expiredAuditLogs: number; }; destroy(): void; private addAuditLog; private removeSenderNumbersForChannel; private getDefaultLimits; private getDefaultFeatures; private startAutoCleanup; private generateChannelId; private generateSenderNumberId; private generateAuditLogId; }