rwadurian/backend/services/reporting-service/src/domain/entities/report-file.entity.ts

169 lines
3.7 KiB
TypeScript

import { OutputFormat } from '../value-objects/output-format.enum';
export class ReportFile {
private _id: bigint | null = null;
private readonly _snapshotId: bigint;
private readonly _fileName: string;
private readonly _filePath: string;
private _fileUrl: string | null;
private readonly _fileSize: bigint;
private readonly _fileFormat: OutputFormat;
private readonly _mimeType: string;
private _downloadCount: number;
private _lastDownloadAt: Date | null;
private readonly _createdAt: Date;
private _expiresAt: Date | null;
private constructor(
snapshotId: bigint,
fileName: string,
filePath: string,
fileUrl: string | null,
fileSize: bigint,
fileFormat: OutputFormat,
mimeType: string,
downloadCount: number,
lastDownloadAt: Date | null,
createdAt: Date,
expiresAt: Date | null,
) {
this._snapshotId = snapshotId;
this._fileName = fileName;
this._filePath = filePath;
this._fileUrl = fileUrl;
this._fileSize = fileSize;
this._fileFormat = fileFormat;
this._mimeType = mimeType;
this._downloadCount = downloadCount;
this._lastDownloadAt = lastDownloadAt;
this._createdAt = createdAt;
this._expiresAt = expiresAt;
}
static create(params: {
snapshotId: bigint;
fileName: string;
filePath: string;
fileUrl?: string;
fileSize: bigint;
fileFormat: OutputFormat;
mimeType: string;
expiresAt?: Date;
}): ReportFile {
return new ReportFile(
params.snapshotId,
params.fileName,
params.filePath,
params.fileUrl || null,
params.fileSize,
params.fileFormat,
params.mimeType,
0,
null,
new Date(),
params.expiresAt || null,
);
}
static reconstitute(params: {
id: bigint;
snapshotId: bigint;
fileName: string;
filePath: string;
fileUrl: string | null;
fileSize: bigint;
fileFormat: OutputFormat;
mimeType: string;
downloadCount: number;
lastDownloadAt: Date | null;
createdAt: Date;
expiresAt: Date | null;
}): ReportFile {
const file = new ReportFile(
params.snapshotId,
params.fileName,
params.filePath,
params.fileUrl,
params.fileSize,
params.fileFormat,
params.mimeType,
params.downloadCount,
params.lastDownloadAt,
params.createdAt,
params.expiresAt,
);
file._id = params.id;
return file;
}
// Getters
get id(): bigint | null {
return this._id;
}
get snapshotId(): bigint {
return this._snapshotId;
}
get fileName(): string {
return this._fileName;
}
get filePath(): string {
return this._filePath;
}
get fileUrl(): string | null {
return this._fileUrl;
}
get fileSize(): bigint {
return this._fileSize;
}
get fileFormat(): OutputFormat {
return this._fileFormat;
}
get mimeType(): string {
return this._mimeType;
}
get downloadCount(): number {
return this._downloadCount;
}
get lastDownloadAt(): Date | null {
return this._lastDownloadAt;
}
get createdAt(): Date {
return this._createdAt;
}
get expiresAt(): Date | null {
return this._expiresAt;
}
// Commands
recordDownload(): void {
this._downloadCount++;
this._lastDownloadAt = new Date();
}
setFileUrl(url: string): void {
this._fileUrl = url;
}
setExpiration(expiresAt: Date): void {
this._expiresAt = expiresAt;
}
isExpired(): boolean {
if (!this._expiresAt) {
return false;
}
return new Date() > this._expiresAt;
}
}