@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
337 lines • 8.16 kB
TypeScript
export interface MediaFile {
id: string;
filename: string;
originalName: string;
mimeType: string;
size: number;
url: string;
path: string;
processed: boolean;
processingStatus: ProcessingStatus;
optimizedUrl?: string;
thumbnailUrl?: string;
webpUrl?: string;
width?: number;
height?: number;
aspectRatio?: number;
colorProfile?: string;
checksum?: string;
virusScanned: boolean;
scanResult?: ScanResult;
isPublic: boolean;
accessLevel: AccessLevel;
folderId?: string;
folder?: MediaFolder;
collections: MediaCollection[];
tags: MediaTag[];
alt?: string;
caption?: string;
title?: string;
description?: string;
metadata?: Record<string, unknown>;
downloadCount: number;
viewCount: number;
lastAccessed?: Date;
cdnUrl?: string;
cdnProvider?: string;
cacheStatus?: CacheStatus;
userId?: string;
siteId?: string;
createdAt: Date;
updatedAt: Date;
}
export interface MediaFolder {
id: string;
name: string;
slug: string;
description?: string;
path: string;
parentId?: string;
parent?: MediaFolder;
children: MediaFolder[];
isPublic: boolean;
permissions?: Record<string, unknown>;
siteId?: string;
userId: string;
uploads: MediaFile[];
createdAt: Date;
updatedAt: Date;
}
export interface MediaCollection {
id: string;
name: string;
slug: string;
description?: string;
color?: string;
isPublic: boolean;
isFeatured: boolean;
siteId?: string;
userId: string;
uploads: MediaFile[];
createdAt: Date;
updatedAt: Date;
}
export interface MediaTag {
id: string;
name: string;
slug: string;
color?: string;
description?: string;
siteId?: string;
usageCount: number;
uploads: MediaFile[];
createdAt: Date;
updatedAt: Date;
}
export interface MediaProcessingJob {
id: string;
uploadId: string;
upload: MediaFile;
type: ProcessingJobType;
status: JobStatus;
priority: number;
params?: Record<string, unknown>;
result?: Record<string, unknown>;
error?: string;
startedAt?: Date;
completedAt?: Date;
attempts: number;
maxAttempts: number;
workerId?: string;
createdAt: Date;
updatedAt: Date;
}
export interface MediaUsageAnalytics {
id: string;
uploadId: string;
upload: MediaFile;
referrer?: string;
userAgent?: string;
ipAddress?: string;
country?: string;
action: UsageAction;
siteId?: string;
timestamp: Date;
}
export declare enum ProcessingStatus {
PENDING = "pending",
PROCESSING = "processing",
COMPLETED = "completed",
FAILED = "failed"
}
export declare enum ScanResult {
CLEAN = "clean",
INFECTED = "infected",
ERROR = "error"
}
export declare enum AccessLevel {
PUBLIC = "public",
PRIVATE = "private",
RESTRICTED = "restricted"
}
export declare enum CacheStatus {
CACHED = "cached",
PURGED = "purged",
PENDING = "pending"
}
export declare enum ProcessingJobType {
RESIZE = "resize",
OPTIMIZE = "optimize",
CONVERT = "convert",
SCAN = "scan",
THUMBNAIL = "thumbnail",
WEBP_CONVERSION = "webp_conversion",
WATERMARK = "watermark"
}
export declare enum JobStatus {
PENDING = "pending",
PROCESSING = "processing",
COMPLETED = "completed",
FAILED = "failed",
CANCELLED = "cancelled"
}
export declare enum UsageAction {
VIEW = "view",
DOWNLOAD = "download",
EMBED = "embed",
THUMBNAIL = "thumbnail",
PREVIEW = "preview"
}
export interface UploadRequest {
file: File;
folderId?: string;
collections?: string[];
tags?: string[];
alt?: string;
caption?: string;
title?: string;
description?: string;
isPublic?: boolean;
accessLevel?: AccessLevel;
}
export interface UploadResponse {
success: boolean;
data?: MediaFile;
error?: string;
jobId?: string;
}
export interface UploadProgress {
uploadId: string;
progress: number;
status: "uploading" | "processing" | "completed" | "error";
message?: string;
bytesUploaded: number;
totalBytes: number;
speed?: number;
eta?: number;
}
export interface BatchUploadRequest {
files: File[];
folderId?: string;
collections?: string[];
tags?: string[];
defaultMetadata?: {
alt?: string;
caption?: string;
title?: string;
description?: string;
};
isPublic?: boolean;
accessLevel?: AccessLevel;
}
export interface BatchUploadProgress {
totalFiles: number;
completedFiles: number;
failedFiles: number;
currentFile?: string;
overallProgress: number;
fileProgresses: Record<string, UploadProgress>;
}
export interface MediaSearchFilters {
query?: string;
mimeTypes?: string[];
tags?: string[];
collections?: string[];
folderId?: string;
dateRange?: {
start: Date;
end: Date;
};
sizeRange?: {
min: number;
max: number;
};
dimensions?: {
minWidth?: number;
maxWidth?: number;
minHeight?: number;
maxHeight?: number;
};
processed?: boolean;
isPublic?: boolean;
accessLevel?: AccessLevel;
}
export interface MediaSearchOptions {
limit?: number;
offset?: number;
sortBy?: "createdAt" | "updatedAt" | "size" | "name" | "viewCount" | "downloadCount";
sortOrder?: "asc" | "desc";
includeFolders?: boolean;
includeCollections?: boolean;
includeTags?: boolean;
}
export interface MediaSearchResult {
files: MediaFile[];
folders?: MediaFolder[];
collections?: MediaCollection[];
tags?: MediaTag[];
total: number;
hasMore: boolean;
facets?: {
mimeTypes: Record<string, number>;
tags: Record<string, number>;
collections: Record<string, number>;
folders: Record<string, number>;
};
}
export interface MediaLibraryProps {
siteId?: string;
multiSelect?: boolean;
allowUpload?: boolean;
allowFolders?: boolean;
allowCollections?: boolean;
allowTags?: boolean;
maxSelections?: number;
acceptedTypes?: string[];
onSelect?: (files: MediaFile[]) => void;
onUpload?: (files: MediaFile[]) => void;
className?: string;
}
export interface MediaPickerProps {
isOpen: boolean;
onClose: () => void;
onSelect: (files: MediaFile[]) => void;
multiSelect?: boolean;
acceptedTypes?: string[];
maxSelections?: number;
siteId?: string;
}
export interface MediaGridProps {
files: MediaFile[];
selectedFiles?: MediaFile[];
onSelect?: (files: MediaFile[]) => void;
onPreview?: (file: MediaFile) => void;
multiSelect?: boolean;
viewMode?: "grid" | "list";
className?: string;
}
export interface MediaUploadZoneProps {
onUpload: (files: File[]) => void;
onProgress?: (progress: BatchUploadProgress) => void;
acceptedTypes?: string[];
maxFileSize?: number;
maxFiles?: number;
disabled?: boolean;
className?: string;
}
export interface MediaConfig {
storage: {
provider: "local" | "aws" | "gcp" | "azure";
bucket?: string;
region?: string;
path?: string;
maxFileSize: number;
allowedTypes: string[];
};
processing: {
enabled: boolean;
thumbnailSizes: number[];
webpConversion: boolean;
qualitySettings: {
jpeg: number;
webp: number;
png: number;
};
};
cdn: {
enabled: boolean;
provider?: "cloudflare" | "aws" | "gcp";
domain?: string;
cacheHeaders: Record<string, string>;
};
security: {
virusScanning: boolean;
checksumValidation: boolean;
signedUrls: boolean;
maxQuotaPerSite: number;
maxQuotaPerUser: number;
};
features: {
folders: boolean;
collections: boolean;
tags: boolean;
analytics: boolean;
watermarking: boolean;
};
}
//# sourceMappingURL=media.d.ts.map