arkos 1.0.3-alpha → 1.0.4-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +0 -32
  2. package/package.json +1 -1
  3. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js +0 -494
  4. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +0 -1
  5. package/dist/cjs/modules/auth/__tests__/auth.service.test.js +0 -470
  6. package/dist/cjs/modules/auth/__tests__/auth.service.test.js.map +0 -1
  7. package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js +0 -43
  8. package/dist/cjs/modules/auth/utils/helpers/__tests__/auth.helpers.test.js.map +0 -1
  9. package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js +0 -754
  10. package/dist/cjs/modules/base/utils/helpers/__tests__/base.helpers.test.js.map +0 -1
  11. package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -226
  12. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
  13. package/dist/cjs/modules/file-upload/file-upload.router.js +0 -50
  14. package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
  15. package/dist/cjs/modules/file-upload/file-upload.service.js +0 -353
  16. package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
  17. package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js +0 -402
  18. package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js.map +0 -1
  19. package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js +0 -164
  20. package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js.map +0 -1
  21. package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -220
  22. package/dist/es2020/modules/file-upload/file-upload.controller.js.map +0 -1
  23. package/dist/es2020/modules/file-upload/file-upload.router.js +0 -44
  24. package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
  25. package/dist/es2020/modules/file-upload/file-upload.service.js +0 -345
  26. package/dist/es2020/modules/file-upload/file-upload.service.js.map +0 -1
  27. package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -3
  28. package/dist/types/modules/file-upload/file-upload.router.d.ts +0 -3
  29. package/dist/types/modules/file-upload/file-upload.service.d.ts +0 -30
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-uploader.helpers.test.js","sourceRoot":"","sources":["../../../../../../../src/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport { promisify } from \"util\";\nimport { processFile, processImage } from \"../file-uploader.helpers\";\nimport { getArkosConfig } from \"../../../../../server\";\n\n// Mock dependencies\njest.mock(\"fs\");\njest.mock(\"path\");\njest.mock(\"sharp\");\njest.mock(\"util\");\njest.mock(\"../../../../../server\");\n\ndescribe(\"File Uploader Helpers\", () => {\n let mockBaseURL = \"https://example.com\";\n let mockBaseRoute = \"/files\";\n let mockFileType = \"images\";\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Mock getArkosConfig\n (getArkosConfig as jest.Mock).mockReturnValue({\n fileUpload: {\n baseUploadDir: \"/uploads\",\n },\n });\n\n // Mock path functions\n (path.join as jest.Mock).mockImplementation((...args) => args.join(\"/\"));\n (path.basename as jest.Mock).mockImplementation((filePath, ext) => {\n const base = filePath.split(\"/\").pop();\n return ext ? base.replace(ext, \"\") : base;\n });\n (path.dirname as jest.Mock).mockImplementation((filePath) => {\n return filePath.substring(0, filePath.lastIndexOf(\"/\"));\n });\n (path.extname as jest.Mock).mockImplementation((filePath) => {\n const parts = filePath.split(\".\");\n return parts.length > 1 ? `.${parts.pop()}` : \"\";\n });\n\n // Mock process.cwd\n jest.spyOn(process, \"cwd\").mockReturnValue(\"/app\");\n\n // Mock promisify\n (promisify as any as jest.Mock).mockImplementation((fn) => fn);\n });\n\n describe(\"processFile\", () => {\n it(\"should process a file with internal upload directory\", async () => {\n const mockFilePath = \"test.pdf\";\n // const mockFilePath = \"/app/uploads/documents/test.pdf\";\n mockFileType = \"documents\";\n\n const result = await processFile(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n mockFileType\n );\n\n expect(result).toBe(\"https://example.com/files/documents/test.pdf\");\n });\n\n it(\"should process a file with external upload directory\", async () => {\n (getArkosConfig as jest.Mock).mockReturnValue({\n fileUpload: {\n baseUploadDir: \"../uploads\",\n },\n });\n\n const mockFilePath = \"../uploads/documents/test.pdf\";\n\n const result = await processFile(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n mockFileType\n );\n\n expect(path.basename).toHaveBeenCalledWith(mockFilePath);\n expect(path.join).toHaveBeenCalledWith(mockFileType, \"test.pdf\");\n expect(result).toBe(\"https://example.com/files/documents/test.pdf\");\n });\n });\n\n describe(\"processImage\", () => {\n beforeEach(() => {\n // Mock sharp\n const mockTransformer = {\n metadata: jest.fn().mockResolvedValue({ width: 1000, height: 800 }),\n resize: jest.fn().mockReturnThis(),\n toFormat: jest.fn().mockReturnThis(),\n toFile: jest.fn().mockResolvedValue(undefined),\n };\n (sharp as any as jest.Mock).mockReturnValue(mockTransformer);\n\n // Mock fs functions\n (fs.rename as any as jest.Mock) = jest\n .fn()\n .mockImplementation((tempPath, origPath) => {\n return true;\n });\n (fs.stat as any as jest.Mock) = jest\n .fn()\n .mockReturnValue({ isFile: () => true });\n (fs.unlink as any as jest.Mock) = jest\n .fn()\n .mockImplementation((path, callback) => {\n callback(null);\n });\n });\n\n it(\"should process a non-image file without transformations\", async () => {\n const mockFilePath = \"test.pdf\";\n // const mockFilePath = \"/app/uploads/documents/test.pdf\";\n const options = {};\n\n mockFileType = \"documents\";\n\n const result = await processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n );\n\n expect(sharp).not.toHaveBeenCalled();\n expect(result).toBe(\"https://example.com/files/documents/test.pdf\");\n });\n\n it(\"should process an image file with resizeTo option\", async () => {\n const mockFilePath = \"test.jpg\";\n // const mockFilePath = \"/app/uploads/images/test.jpg\";\n const options = { resizeTo: 500 };\n\n mockFileType = \"images\";\n\n const result = await processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n );\n\n expect(sharp).toHaveBeenCalledWith(mockFilePath);\n expect(sharp().resize).toHaveBeenCalledWith(625, 500);\n expect(sharp().toFile).toHaveBeenCalled();\n expect(fs.rename).toHaveBeenCalled();\n expect(result).toBe(\"https://example.com/files/images/test.jpg\");\n });\n\n it(\"should process an image file with width and height options\", async () => {\n // const mockFilePath = \"/app/uploads/images/test.png\";\n const mockFilePath = \"test.png\";\n const options = { width: 300, height: 200 };\n\n mockFileType = \"images\";\n\n const result = await processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n );\n\n expect(sharp).toHaveBeenCalledWith(mockFilePath);\n expect(sharp().resize).toHaveBeenCalledWith(300, 200, { fit: \"inside\" });\n expect(result).toBe(\"https://example.com/files/images/test.png\");\n });\n\n it(\"should convert image format to webp if requested\", async () => {\n const mockFilePath = \"test.jpg\";\n const options = { format: \"webp\" };\n\n mockFileType = \"images\";\n\n const result = await processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n );\n\n expect(sharp).toHaveBeenCalledWith(mockFilePath);\n expect(sharp().toFormat).toHaveBeenCalledWith(\"webp\");\n expect(result).toBe(\"https://example.com/files/images/test.jpg\");\n });\n\n it(\"should convert image format to jpeg if requested\", async () => {\n // const mockFilePath = \"/app/uploads/images/test.png\";\n const mockFilePath = \"test.png\";\n const options = { format: \"jpeg\" };\n\n mockFileType = \"images\";\n\n const result = await processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n );\n\n expect(sharp).toHaveBeenCalledWith(mockFilePath);\n expect(sharp().toFormat).toHaveBeenCalledWith(\"jpeg\");\n expect(result).toBe(\"https://example.com/files/images/test.png\");\n });\n\n it(\"should handle errors and clean up temp files\", async () => {\n const mockFilePath = \"test.jpg\";\n // const mockFilePath = \"/app/uploads/images/test.jpg\";\n const options = {};\n\n const error = new Error(\"Image processing failed\");\n (sharp().toFile as jest.Mock).mockRejectedValue(error);\n\n await expect(\n processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n )\n ).rejects.toThrow(error);\n\n expect(fs.stat).toHaveBeenCalled();\n expect(fs.unlink).toHaveBeenCalled();\n });\n\n it(\"should handle non-existent temp files gracefully\", async () => {\n const mockFilePath = \"/app/uploads/images/test.jpg\";\n const options = {};\n\n const error = new Error(\"Image processing failed\");\n (sharp().toFile as jest.Mock).mockRejectedValue(error);\n (fs.stat as any as jest.Mock).mockImplementation((path, callback) => {\n callback(new Error(\"File not found\"), null);\n });\n\n await expect(\n processImage(\n mockFilePath,\n mockBaseURL,\n mockBaseRoute,\n options,\n mockFileType\n )\n ).rejects.toThrow(error);\n\n expect(fs.stat).toHaveBeenCalled();\n expect(fs.unlink).not.toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -1,220 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import AppError from "../error-handler/utils/app-error";
11
- import { getFileUploaderServices, } from "./file-upload.service";
12
- import path from "path";
13
- import fs from "fs";
14
- import sharp from "sharp";
15
- import catchAsync from "../error-handler/utils/catch-async";
16
- import { promisify } from "util";
17
- import { getArkosConfig } from "../../server";
18
- const stat = promisify(fs.stat);
19
- const unlink = promisify(fs.unlink);
20
- const access = promisify(fs.access);
21
- const mkdir = promisify(fs.mkdir);
22
- export const uploadFile = catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
23
- const { fileType } = req.params;
24
- const { format, width, height, resizeTo } = req.query;
25
- const { documentUploaderService, fileUploaderService, imageUploaderService, videoUploaderService, } = getFileUploaderServices();
26
- const { fileUpload } = getArkosConfig();
27
- const baseUploadDir = (fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.baseUploadDir) || "/uploads";
28
- const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);
29
- try {
30
- yield access(uploadPath);
31
- }
32
- catch (error) {
33
- yield mkdir(uploadPath, { recursive: true });
34
- }
35
- let uploader;
36
- switch (fileType) {
37
- case "images":
38
- uploader = imageUploaderService;
39
- break;
40
- case "videos":
41
- uploader = videoUploaderService;
42
- break;
43
- case "documents":
44
- uploader = documentUploaderService;
45
- break;
46
- case "files":
47
- uploader = fileUploaderService;
48
- break;
49
- default:
50
- return next(new AppError("Invalid file type", 400));
51
- }
52
- uploader.handleMultipleUpload()(req, res, (err) => __awaiter(void 0, void 0, void 0, function* () {
53
- var _a;
54
- if (err)
55
- return next(err);
56
- const protocol = ((_a = req.get("host")) === null || _a === void 0 ? void 0 : _a.includes("localhost"))
57
- ? "http"
58
- : "https";
59
- const baseURL = `${protocol}://${req.get("host")}`;
60
- const baseRoute = (fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.baseRoute) || "/api/uploads";
61
- const generateRelativePath = (filePath) => {
62
- if (baseUploadDir.startsWith("..")) {
63
- return path.join(fileType, path.basename(filePath));
64
- }
65
- else {
66
- return filePath.replace(`${process.cwd()}${baseUploadDir}/`, "");
67
- }
68
- };
69
- const processImage = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
70
- const ext = path.extname(filePath).toLowerCase();
71
- const originalFormat = ext.replace(".", "");
72
- const outputFormat = format
73
- ? format.toString().toLowerCase()
74
- : originalFormat;
75
- if (!/jpeg|jpg|png|gif|webp|svg|bmp|tiff|heif/i.test(originalFormat)) {
76
- const relativePath = generateRelativePath(filePath);
77
- return `${baseURL}${baseRoute}/${relativePath}`;
78
- }
79
- const tempName = `${path.basename(filePath, ext)}_${Date.now()}${ext}`;
80
- const tempPath = path.join(path.dirname(filePath), tempName);
81
- try {
82
- let transformer = sharp(filePath);
83
- const metadata = yield transformer.metadata();
84
- if (resizeTo && metadata.width && metadata.height) {
85
- const targetSize = parseInt(resizeTo.toString());
86
- const scaleFactor = targetSize / Math.min(metadata.width, metadata.height);
87
- const newWidth = Math.round(metadata.width * scaleFactor);
88
- const newHeight = Math.round(metadata.height * scaleFactor);
89
- transformer = transformer.resize(newWidth, newHeight);
90
- }
91
- else if (width || height) {
92
- transformer = transformer.resize(width ? parseInt(width) : null, height ? parseInt(height) : null, { fit: "inside" });
93
- }
94
- if (outputFormat === "webp") {
95
- transformer = transformer.toFormat("webp");
96
- }
97
- else if (outputFormat === "jpeg" || outputFormat === "jpg") {
98
- transformer = transformer.toFormat("jpeg");
99
- }
100
- yield transformer.toFile(tempPath);
101
- yield fs.promises.rename(tempPath, filePath);
102
- const relativePath = generateRelativePath(filePath);
103
- return `${baseURL}${baseRoute}/${relativePath}`;
104
- }
105
- catch (error) {
106
- try {
107
- yield fs.promises.stat(tempPath);
108
- yield fs.promises.unlink(tempPath);
109
- }
110
- catch (_a) {
111
- }
112
- next(error);
113
- return null;
114
- }
115
- });
116
- const processFile = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
117
- const relativePath = generateRelativePath(filePath);
118
- return `${baseURL}${baseRoute}/${relativePath}`;
119
- });
120
- let data;
121
- if (req.files && Array.isArray(req.files)) {
122
- if (fileType === "images") {
123
- data = yield Promise.all(req.files.map((file) => processImage(file.path)));
124
- }
125
- else {
126
- data = yield Promise.all(req.files.map((file) => processFile(file.path)));
127
- }
128
- data = data.filter((url) => url !== null);
129
- }
130
- else if (req.file) {
131
- if (fileType === "images") {
132
- data = yield processImage(req.file.path);
133
- }
134
- else {
135
- data = yield processFile(req.file.path);
136
- }
137
- }
138
- else {
139
- return next(new AppError("No file uploaded", 400));
140
- }
141
- res.status(200).json({
142
- success: true,
143
- data,
144
- message: Array.isArray(data)
145
- ? `${data.length} files uploaded successfully`
146
- : "File uploaded successfully",
147
- });
148
- }));
149
- }));
150
- export const deleteFile = catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
151
- const { fileType, fileName } = req.params;
152
- const { documentUploaderService, fileUploaderService, imageUploaderService, videoUploaderService, } = getFileUploaderServices();
153
- let uploader;
154
- switch (fileType) {
155
- case "images":
156
- uploader = imageUploaderService;
157
- break;
158
- case "videos":
159
- uploader = videoUploaderService;
160
- break;
161
- case "documents":
162
- uploader = documentUploaderService;
163
- break;
164
- case "files":
165
- uploader = fileUploaderService;
166
- break;
167
- default:
168
- return next(new AppError("Invalid file type", 400));
169
- }
170
- try {
171
- const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
172
- yield uploader.deleteFileByUrl(fullUrl);
173
- res.status(200).json({
174
- success: true,
175
- message: "File deleted successfully",
176
- });
177
- }
178
- catch (error) {
179
- return next(new AppError("File not found", 404));
180
- }
181
- }));
182
- export const streamFile = catchAsync((req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
183
- const { fileName, fileType } = req.params;
184
- const filePath = path.join(".", "uploads", fileType, fileName);
185
- try {
186
- yield access(filePath);
187
- }
188
- catch (_a) {
189
- return next(new AppError("File not found", 404));
190
- }
191
- const fileStat = yield stat(filePath);
192
- const fileSize = fileStat.size;
193
- const range = req.headers.range;
194
- if (range) {
195
- const [partialStart, partialEnd] = range.replace(/bytes=/, "").split("-");
196
- const start = parseInt(partialStart, 10) || 0;
197
- const end = partialEnd ? parseInt(partialEnd, 10) : fileSize - 1;
198
- if (start >= fileSize || end >= fileSize) {
199
- res.status(416).json({ error: "Range Not Satisfiable" });
200
- return;
201
- }
202
- res.writeHead(206, {
203
- "Content-Range": `bytes ${start}-${end}/${fileSize}`,
204
- "Accept-Ranges": "bytes",
205
- "Content-Length": end - start + 1,
206
- "Content-Type": "application/octet-stream",
207
- "Content-Disposition": `inline; filename="${fileName}"`,
208
- });
209
- fs.createReadStream(filePath, { start, end }).pipe(res);
210
- }
211
- else {
212
- res.writeHead(200, {
213
- "Content-Length": fileSize,
214
- "Content-Type": "application/octet-stream",
215
- "Content-Disposition": `inline; filename="${fileName}"`,
216
- });
217
- fs.createReadStream(filePath).pipe(res);
218
- }
219
- }));
220
- //# sourceMappingURL=file-upload.controller.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-upload.controller.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import AppError from \"../error-handler/utils/app-error\";\nimport {\n FileUploaderService,\n getFileUploaderServices,\n} from \"./file-upload.service\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport sharp from \"sharp\";\nimport { NextFunction, Request, Response } from \"express\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { promisify } from \"util\";\nimport { getArkosConfig } from \"../../server\";\n\nconst stat = promisify(fs.stat);\nconst unlink = promisify(fs.unlink);\nconst access = promisify(fs.access);\nconst mkdir = promisify(fs.mkdir);\n/**\n * Handles file upload requests, processes images if needed, and returns URLs\n * Supports paths outside of the project directory with '../' prefix\n * @param {Request} req - Express request object\n * @param {Response} res - Express response object\n * @param {NextFunction} next - Express next middleware function\n */\nexport const uploadFile = catchAsync(\n async (req: Request, res: Response, next: NextFunction) => {\n const { fileType } = req.params;\n const { format, width, height, resizeTo } = req.query;\n\n const {\n documentUploaderService,\n fileUploaderService,\n imageUploaderService,\n videoUploaderService,\n } = getFileUploaderServices();\n\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n // Ensure upload directory exists\n const uploadPath = path.resolve(process.cwd(), baseUploadDir, fileType);\n try {\n await access(uploadPath);\n } catch (error) {\n // Create directory if it doesn't exist\n await mkdir(uploadPath, { recursive: true });\n }\n\n // Select the appropriate uploader service based on file type\n let uploader: FileUploaderService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploaderService;\n break;\n case \"videos\":\n uploader = videoUploaderService;\n break;\n case \"documents\":\n uploader = documentUploaderService;\n break;\n case \"files\":\n uploader = fileUploaderService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n // Handle the file upload\n uploader.handleMultipleUpload()(req, res, async (err) => {\n if (err) return next(err);\n\n // Determine the base URL for file access\n const protocol = req.get(\"host\")?.includes(\"localhost\")\n ? \"http\"\n : \"https\";\n const baseURL = `${protocol}://${req.get(\"host\")}`;\n const baseRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n /**\n * Generates the correct relative path regardless of upload directory location\n * @param {string} filePath - Full path to the uploaded file\n * @returns {string} Relative path for URL generation\n */\n const generateRelativePath = (filePath: string) => {\n if (baseUploadDir.startsWith(\"..\")) {\n // For paths outside project directory\n return path.join(fileType, path.basename(filePath));\n } else {\n // Original approach for paths within project\n return filePath.replace(`${process.cwd()}${baseUploadDir}/`, \"\");\n }\n };\n\n /**\n * Processes image files using Sharp for resizing and format conversion\n * @param {string} filePath - Path to the uploaded image file\n * @returns {Promise<string|null>} Public URL for the processed file or null if processing failed\n */\n const processImage = async (filePath: string): Promise<string | null> => {\n const ext = path.extname(filePath).toLowerCase();\n const originalFormat = ext.replace(\".\", \"\");\n const outputFormat = format\n ? format.toString().toLowerCase()\n : originalFormat;\n\n // Skip processing for non-image files\n if (!/jpeg|jpg|png|gif|webp|svg|bmp|tiff|heif/i.test(originalFormat)) {\n const relativePath = generateRelativePath(filePath);\n return `${baseURL}${baseRoute}/${relativePath}`;\n }\n\n // Create a temp filename with original name + random string\n const tempName = `${path.basename(filePath, ext)}_${Date.now()}${ext}`;\n const tempPath = path.join(path.dirname(filePath), tempName);\n\n try {\n let transformer = sharp(filePath);\n const metadata = await transformer.metadata();\n\n // Apply resize transformations if requested\n if (resizeTo && metadata.width && metadata.height) {\n const targetSize = parseInt(resizeTo.toString());\n const scaleFactor =\n targetSize / Math.min(metadata.width, metadata.height);\n const newWidth = Math.round(metadata.width * scaleFactor);\n const newHeight = Math.round(metadata.height * scaleFactor);\n transformer = transformer.resize(newWidth, newHeight);\n } else if (width || height) {\n transformer = transformer.resize(\n width ? parseInt(width as string) : null,\n height ? parseInt(height as string) : null,\n { fit: \"inside\" }\n );\n }\n\n // Apply format transformations if requested\n if (outputFormat === \"webp\") {\n transformer = transformer.toFormat(\"webp\");\n } else if (outputFormat === \"jpeg\" || outputFormat === \"jpg\") {\n transformer = transformer.toFormat(\"jpeg\");\n }\n\n // Save to temp file first\n await transformer.toFile(tempPath);\n\n // Rename temp file to original filename\n await fs.promises.rename(tempPath, filePath);\n\n // Return the public URL for the file\n const relativePath = generateRelativePath(filePath);\n return `${baseURL}${baseRoute}/${relativePath}`;\n } catch (error) {\n // Clean up temp file if it exists\n try {\n await fs.promises.stat(tempPath);\n await fs.promises.unlink(tempPath);\n } catch {\n // If temp file doesn't exist, no need to clean up\n }\n next(error);\n return null;\n }\n };\n\n /**\n * Handles basic file processing for non-image files\n * @param {string} filePath - Path to the uploaded file\n * @returns {Promise<string>} Public URL for the file\n */\n const processFile = async (filePath: string) => {\n const relativePath = generateRelativePath(filePath);\n return `${baseURL}${baseRoute}/${relativePath}`;\n };\n\n // Process all uploaded files\n let data;\n if (req.files && Array.isArray(req.files)) {\n if (fileType === \"images\") {\n // Process multiple image files with image transformations\n data = await Promise.all(\n req.files.map((file) => processImage(file.path))\n );\n } else {\n // Just store other file types without processing\n data = await Promise.all(\n req.files.map((file) => processFile(file.path))\n );\n }\n // Filter out any null values from failed processing\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n // Process a single file\n if (fileType === \"images\") {\n data = await processImage(req.file.path);\n } else {\n data = await processFile(req.file.path);\n }\n } else {\n return next(new AppError(\"No file uploaded\", 400));\n }\n\n res.status(200).json({\n success: true,\n data,\n message: Array.isArray(data)\n ? `${data.length} files uploaded successfully`\n : \"File uploaded successfully\",\n });\n });\n }\n);\n\n/**\n * Handles file deletion requests\n * Supports paths outside of the project directory with '../' prefix\n * @param {Request} req - Express request object\n * @param {Response} res - Express response object\n * @param {NextFunction} next - Express next middleware function\n */\nexport const deleteFile = catchAsync(\n async (req: Request, res: Response, next: NextFunction) => {\n const { fileType, fileName } = req.params;\n\n // if (!fileName) {\n // return next(new AppError(\"File name is required\", 400));\n // }\n\n // if (!fileType) {\n // return next(new AppError(\"File type is required\", 400));\n // }\n\n // // Get the base upload directory from config\n // const { fileUpload } = getArkosConfig();\n // const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n // // Construct the actual file path using path.resolve to handle '../' paths\n // const actualFilePath = path.resolve(\n // process.cwd(),\n // baseUploadDir,\n // fileType,\n // fileName\n // );\n\n const {\n documentUploaderService,\n fileUploaderService,\n imageUploaderService,\n videoUploaderService,\n } = getFileUploaderServices();\n\n let uploader: FileUploaderService;\n switch (fileType) {\n case \"images\":\n uploader = imageUploaderService;\n break;\n case \"videos\":\n uploader = videoUploaderService;\n break;\n case \"documents\":\n uploader = documentUploaderService;\n break;\n case \"files\":\n uploader = fileUploaderService;\n break;\n default:\n return next(new AppError(\"Invalid file type\", 400));\n }\n\n try {\n // // Check if file exists\n // await access(actualFilePath, fs.constants.F_OK);\n\n // // Delete the file\n // await unlink(actualFilePath);\n\n const fullUrl = `${req.protocol}://${req.get(\"host\")}${req.originalUrl}`;\n await uploader.deleteFileByUrl(fullUrl);\n\n res.status(200).json({\n success: true,\n message: \"File deleted successfully\",\n });\n } catch (error) {\n // File doesn't exist\n return next(new AppError(\"File not found\", 404));\n }\n }\n);\n\nexport const streamFile = catchAsync(\n async (req: Request, res: Response, next: NextFunction) => {\n const { fileName, fileType } = req.params;\n\n const filePath = path.join(\".\", \"uploads\", fileType, fileName);\n try {\n await access(filePath);\n } catch {\n return next(new AppError(\"File not found\", 404));\n }\n\n const fileStat = await stat(filePath);\n const fileSize = fileStat.size;\n const range = req.headers.range;\n\n if (range) {\n const [partialStart, partialEnd] = range.replace(/bytes=/, \"\").split(\"-\");\n const start = parseInt(partialStart, 10) || 0;\n const end = partialEnd ? parseInt(partialEnd, 10) : fileSize - 1;\n\n if (start >= fileSize || end >= fileSize) {\n res.status(416).json({ error: \"Range Not Satisfiable\" });\n return;\n }\n\n res.writeHead(206, {\n \"Content-Range\": `bytes ${start}-${end}/${fileSize}`,\n \"Accept-Ranges\": \"bytes\",\n \"Content-Length\": end - start + 1,\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n });\n\n fs.createReadStream(filePath, { start, end }).pipe(res);\n } else {\n res.writeHead(200, {\n \"Content-Length\": fileSize,\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Disposition\": `inline; filename=\"${fileName}\"`,\n });\n fs.createReadStream(filePath).pipe(res);\n }\n }\n);\n"]}
@@ -1,44 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { Router } from "express";
11
- import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
12
- import authService from "../auth/auth.service";
13
- import { deleteFile, uploadFile } from "./file-upload.controller";
14
- import path from "path";
15
- import express from "express";
16
- import deepmerge from "../../utils/helpers/deepmerge.helper";
17
- const router = Router();
18
- export function getFileUploaderRouter(_a) {
19
- return __awaiter(this, arguments, void 0, function* ({ fileUpload }) {
20
- const modelModules = yield importPrismaModelModules("file-upload");
21
- let { middlewares = {}, authConfigs = {} } = {};
22
- if (modelModules) {
23
- ({ middlewares = {}, authConfigs = {} } = modelModules);
24
- }
25
- let basePathname = (fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.baseRoute) || "/uploads/";
26
- if (!basePathname.startsWith("/"))
27
- basePathname = "/" + basePathname;
28
- if (!basePathname.endsWith("/"))
29
- basePathname = basePathname + "/";
30
- router.use((fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.baseRoute) || "/api/uploads", authService.handleAuthenticationControl(authConfigs, "view", "file-upload"), authService.handleActionAccessControl(authConfigs, "view", "file-upload"), express.static(path.resolve(process.cwd(), (fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.baseUploadDir) || "uploads"), deepmerge({
31
- maxAge: "1y",
32
- etag: true,
33
- lastModified: true,
34
- dotfiles: "ignore",
35
- fallthrough: true,
36
- index: false,
37
- cacheControl: true,
38
- }, (fileUpload === null || fileUpload === void 0 ? void 0 : fileUpload.expressStaticOptions) || {})));
39
- router.post(`${basePathname}:fileType`, authService.handleAuthenticationControl(authConfigs, "create", "file-upload"), authService.handleActionAccessControl(authConfigs, "create", "file-upload"), uploadFile);
40
- router.delete(`${basePathname}:fileType/:fileName`, authService.handleAuthenticationControl(authConfigs, "delete", "file-upload"), authService.handleActionAccessControl(authConfigs, "create", "file-upload"), deleteFile);
41
- return router;
42
- });
43
- }
44
- //# sourceMappingURL=file-upload.router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,SAAS,MAAM,sCAAsC,CAAC;AAE7D,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;AAEhC,MAAM,UAAgB,qBAAqB;yDAAC,EAAE,UAAU,EAAe;QACrE,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC;QAEhD,IAAI,YAAY,EAAE,CAAC;YACjB,CAAC,EAAE,WAAW,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,YAAY,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,YAAY,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,KAAI,WAAW,CAAC;QAExD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC;QACrE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,YAAY,GAAG,YAAY,GAAG,GAAG,CAAC;QAEnE,MAAM,CAAC,GAAG,CACR,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,KAAI,cAAc,EACvC,WAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAC3E,WAAW,CAAC,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EACzE,OAAO,CAAC,MAAM,CACZ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,aAAa,KAAI,SAAS,CAAC,EACnE,SAAS,CACP;YACE,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,IAAI;SACnB,EACD,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,oBAAoB,KAAI,EAAE,CACvC,CACF,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,GAAG,YAAY,WAAW,EAC1B,WAAW,CAAC,2BAA2B,CACrC,WAAW,EACX,QAAQ,EACR,aAAa,CACd,EACD,WAAW,CAAC,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,EAC3E,UAAU,CACX,CAAC;QAEF,MAAM,CAAC,MAAM,CACX,GAAG,YAAY,qBAAqB,EACpC,WAAW,CAAC,2BAA2B,CACrC,WAAW,EACX,QAAQ,EACR,aAAa,CACd,EACD,WAAW,CAAC,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,EAC3E,UAAU,CACX,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CAAA","sourcesContent":["import { Router } from \"express\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { deleteFile, uploadFile } from \"./file-upload.controller\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport path from \"path\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\n\nconst router: Router = Router();\n\nexport async function getFileUploaderRouter({ fileUpload }: ArkosConfig) {\n const modelModules = await importPrismaModelModules(\"file-upload\");\n let { middlewares = {}, authConfigs = {} } = {};\n\n if (modelModules) {\n ({ middlewares = {}, authConfigs = {} } = modelModules);\n }\n\n let basePathname = fileUpload?.baseRoute || \"/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n router.use(\n fileUpload?.baseRoute || \"/api/uploads\",\n authService.handleAuthenticationControl(authConfigs, \"view\", \"file-upload\"),\n authService.handleActionAccessControl(authConfigs, \"view\", \"file-upload\"),\n express.static(\n path.resolve(process.cwd(), fileUpload?.baseUploadDir || \"uploads\"),\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: true,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStaticOptions || {}\n )\n )\n );\n\n router.post(\n `${basePathname}:fileType`,\n authService.handleAuthenticationControl(\n authConfigs,\n \"create\",\n \"file-upload\"\n ),\n authService.handleActionAccessControl(authConfigs, \"create\", \"file-upload\"),\n uploadFile\n );\n\n router.delete(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n authConfigs,\n \"delete\",\n \"file-upload\"\n ),\n authService.handleActionAccessControl(authConfigs, \"create\", \"file-upload\"),\n deleteFile\n );\n\n return router;\n}\n"]}