@k-msg/channel
Version:
AlimTalk channel and sender number management
90 lines (89 loc) • 3.44 kB
TypeScript
/**
* 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;
}