Import source: backend/src/utils/files

Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
arsam
2026-09-18 23:13:40 +03:30
parent 088ae977eb
commit d5238e878e
+39
View File
@@ -0,0 +1,39 @@
import path from 'node:path';
import { env } from '../config/env.js';
import type { FileRecord } from '../types.js';
import { getPreviewMeta } from './preview.js';
import { downloadUrl as gdriveDownloadUrl } from './gdrive.js';
export function sanitizeFilename(name: string) {
const base = path.basename(name || 'file');
const cleaned = base
// eslint-disable-next-line no-control-regex
.replace(/[\x00-\x1f\x7f]/g, '') // strip control characters
.replace(/[^\w.()\s-]+/g, '-')
.replace(/\s+/g, ' ')
.trim();
return cleaned || 'file';
}
export function fileToApi(file: FileRecord) {
const shareLink = `${env.publicAppUrl.replace(/\/$/, '')}/preview/${file.linkId}`;
const preview = getPreviewMeta(file);
return {
id: file.id,
linkId: file.linkId,
name: file.originalName,
size: file.sizeBytes,
type: file.mimeType,
uploader: file.uploader,
uploadedAt: file.createdAt,
expiresAt: file.expiresAt,
views: file.views,
downloads: file.downloads,
link: shareLink,
downloadUrl: gdriveDownloadUrl(file.gdriveId),
preview: {
...preview,
url: preview.available ? `/api/v1/links/${file.linkId}/preview` : null,
},
};
}