refactor: full DDD + Clean Architecture refactor
Deploy FileDrop / deploy (push) Successful in 48s

- Hapus src/utils/ (17 files) + src/db/ (8 files) dead code
- Absorb 7 re-export stubs → real impl di lokasi DDD
- Buat src/infrastructure/di.ts (DI container)
- Rewrite 5 controllers pakai repository/DI
- Fix shared/utils imports, env.ts, routes, index.ts
- Update package.json build path migrate
- Lint clean, build clean
This commit is contained in:
Claude
2026-07-29 15:41:50 +07:00
parent 3580001b8a
commit 4c216b1d9f
44 changed files with 1223 additions and 3364 deletions
@@ -1,7 +1,8 @@
import { createWriteStream } from 'node:fs';
import { nanoid } from 'nanoid';
import { config } from '../../../config/index';
import { findFileByHash } from '../../../db/files';
import { chunkedStorage, fileRepository, uploadBatcher } from '../../../infrastructure/di';
import type { PreparedUpload } from '../../../infrastructure/telegram/upload-batcher';
import logger from '../../../shared/logger/index';
import { metricsCollector } from '../../../shared/metrics/index';
import {
@@ -14,8 +15,6 @@ import {
getErrorMessage,
getFileType,
} from '../../../shared/utils/file';
import { storeFileInTelegramChunks } from '../../../utils/chunked-storage';
import { enqueuePreparedUpload, type PreparedUpload } from '../../../utils/uploadBatcher';
/**
* Maximum allowed size (in bytes) for a base64 JSON upload.
@@ -223,7 +222,7 @@ const handleMultipartUpload = async (req: Request): Promise<Response> => {
const prepared = await streamFileToTemp(file, config.maxRequestBodyBytes);
const existingFile = await findFileByHash(prepared.fileHash);
const existingFile = await fileRepository.findByHash(prepared.fileHash);
if (existingFile) {
await cleanupTempFile(prepared.tempPath);
return Response.json(buildUploadResponse(existingFile, config.baseUrl), { status: 200 });
@@ -243,7 +242,7 @@ const handleMultipartUpload = async (req: Request): Promise<Response> => {
}
if (prepared.sizeBytes > config.telegramChunkSizeBytes) {
const uploadedFile = await storeFileInTelegramChunks({
const uploadedFile = await chunkedStorage.storeFileInTelegramChunks({
tempPath: prepared.tempPath,
partFileNamePrefix: `direct-${prepared.fileHash?.slice(0, 16) || 'upload'}`,
fileName: finalFileName,
@@ -256,7 +255,7 @@ const handleMultipartUpload = async (req: Request): Promise<Response> => {
return Response.json(buildUploadResponse(uploadedFile, config.baseUrl), { status: 200 });
}
const uploaded = await enqueuePreparedUpload({
const uploaded = await uploadBatcher.enqueuePreparedUpload({
prepared,
fileName: finalFileName,
mimeType,
@@ -317,7 +316,7 @@ const handleJSONUpload = async (req: Request): Promise<Response> => {
const fileBytes = Buffer.from(base64Data, 'base64');
const hash = computeHash(fileBytes);
const existingFile = await findFileByHash(hash);
const existingFile = await fileRepository.findByHash(hash);
if (existingFile) {
return Response.json(buildUploadResponse(existingFile, config.baseUrl), { status: 200 });
}
@@ -334,7 +333,7 @@ const handleJSONUpload = async (req: Request): Promise<Response> => {
const prepared = await writeBufferToTemp(fileBytes, hash);
if (prepared.sizeBytes > config.telegramChunkSizeBytes) {
const uploadedFile = await storeFileInTelegramChunks({
const uploadedFile = await chunkedStorage.storeFileInTelegramChunks({
tempPath: prepared.tempPath,
partFileNamePrefix: `direct-${prepared.fileHash?.slice(0, 16) || 'json'}`,
fileName: finalFileName,
@@ -347,7 +346,7 @@ const handleJSONUpload = async (req: Request): Promise<Response> => {
return Response.json(buildUploadResponse(uploadedFile, config.baseUrl), { status: 200 });
}
const uploaded = await enqueuePreparedUpload({
const uploaded = await uploadBatcher.enqueuePreparedUpload({
prepared,
fileName: finalFileName,
mimeType,