services/FileService.jsjavascript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const multer = require("multer");
const { readdir, unlink } = require("node:fs/promises");
const path = require("node:path");
const { logger } = require("../plugins/winston");
const _express = require("express");
const profilePictureStorage = multer.diskStorage({
    destination: (_req, _file, cb) => {
        cb(null, "uploads/profilePictures/");
    },
    filename: (req, file, cb) => {
        cb(null, `${req.actingUserId}.${file.originalname.split(".").pop()}`);
    },
});
const clubLogoStorage = multer.diskStorage({
    destination: (_req, _file, cb) => {
        cb(null, "uploads/clubLogos/");
    },
    filename: (req, file, cb) => {
        cb(null, `${req.params.id}.${file.originalname.split(".").pop()}`);
    },
});
const generalStorage = multer.diskStorage({
    destination: (_req, _file, cb) => {
        cb(null, "uploads/");
    },
    filename: (req, file, cb) => {
        cb(null, `${req.actingUserId}.${file.originalname.split(".").pop()}`);
    },
});
/**
 * Service for file management operations.
 * Handles file uploads, downloads, and storage logic.
 *
 * @class FileService
 */
class FileService {
    profilePictureUpload;
    clubLogoUpload;
    generalUpload;
    /**
     * Creates an instance of FileService.
     * Initializes storages for profile pictures, club logos, and general files.
     *
     * @constructor
     */
    constructor() {
        this.profilePictureUpload = multer({ storage: profilePictureStorage });
        this.clubLogoUpload = multer({ storage: clubLogoStorage });
        this.generalUpload = multer({ storage: generalStorage });
    }
    /**
     * Generate a middleware for file upload
     *
     * @param {string} fileKey
     * @returns {_express.NextFunction} middleware function
     */
    singleFileMiddleware(fileKey) {
        let upload;
        switch (fileKey) {
            case "profilePicture":
                upload = this.profilePictureUpload;
                break;
            case "clubLogo":
                upload = this.clubLogoUpload;
                break;
            default:
                upload = this.generalUpload;
        }
        return upload.single(fileKey);
    }
    /**
     * Remove the profile image of a specific user in the profile picture folder
     *
     * @param {UUID} userId
     * @param {string} fileExtension
     * @returns {Promise<void>}
     */
    clearProfilePictureFolder(userId, fileExtension = null) {
        logger.debug(`FileService clearProfilePictureFolder ${JSON.stringify({
            userId,
            fileExtension,
        })}`);
        return readdir(path.join(__dirname, "../..", "uploads", "profilePictures"))
            .then((files) => {
            files
                .filter((file) => file.startsWith(userId) &&
                (fileExtension == null || !file.endsWith(fileExtension)))
                .forEach((file) => {
                unlink(path.join(__dirname, "../..", "uploads", "profilePictures", file));
            });
        })
            .catch((e) => logger.error(e));
    }
    /**
     * Remove the club logo of a specific club in the club logo folder
     *
     * @param {UUID} clubId
     * @param {string} fileExtension
     * @returns {Promise<void>}
     */
    clearClubLogoFolder(clubId, fileExtension = null) {
        logger.debug(`FileService clearClubLogoFolder ${JSON.stringify({
            clubId,
            fileExtension,
        })}`);
        return readdir(path.join(__dirname, "../..", "uploads", "clubLogos"))
            .then((files) => {
            files
                .filter((file) => file.startsWith(clubId) &&
                (!fileExtension || !file.endsWith(fileExtension)))
                .forEach((file) => {
                unlink(path.join(__dirname, "../..", "uploads", "clubLogos", file));
            });
        })
            .catch((e) => logger.error(e));
    }
}
exports.default = new FileService();