Snai3i-MarketPlace / backend / src / controllers / file.controller.ts
file.controller.ts
Raw
import { Response, NextFunction } from 'express';
// import { DeleteFile } from '../utils/deletingFile';
import { ErrorResponse, SuccessResponse } from '../utils/Response';
import { HttpCodes } from '../config/Errors';
import { globalLogger } from '../utils/Logger';
import { MyRequest } from '../types/Express';
import {
  deleteFile,
  deleteFileThumbnail,
} from '../middlewares/file.middleware';
import {
  uploadThumbnailToCloudinary,
  getThumbnailPublicId,
  deleteThumbnailFromCloudinary,
} from '../utils/UploadToCloudinary';

export async function handleFileUploading(
  req: MyRequest<UserI>,
  res: Response,
  next: NextFunction
): Promise<void> {
  try {
    if (!req.file)
      return ErrorResponse(
        res,
        HttpCodes.BadRequest.code,
        'No file uploaded',
        'No file uploaded'
      );
    const fileUrl = req.file;
    const filename = fileUrl.filename;

    // log first File uploaded - file name
    globalLogger.info(`File uploaded - ${filename}`, {
      code: HttpCodes.Accepted.code,
      type: HttpCodes.Accepted.type,
      file: fileUrl,
    });
    return SuccessResponse(
      res,
      HttpCodes.Accepted.code,
      {
        name: fileUrl.filename,
        originalname: fileUrl.originalname,
        size: fileUrl.size,
        url: `${req.protocol}://${req.get('host')}/documents/${
          fileUrl.filename
        }`,
      },
      `File ${fileUrl.originalname} has been uploaded`
    );
  } catch (error) {
    globalLogger.error('Error while uploading file', {
      code: HttpCodes.InternalServerError.code,
      type: HttpCodes.InternalServerError.type,
      error: error,
    });

    return ErrorResponse(
      res,
      HttpCodes.InternalServerError.code,
      'Error while uploading file',
      error
    );
  }
}

export async function handleFileDeleting(
  req: MyRequest<UserI>,
  res: Response,
  next: NextFunction
): Promise<void> {
  try {
    if (!req.query.file)
      return ErrorResponse(
        res,
        HttpCodes.BadRequest.code,
        'No file to delete',
        'No file to delete'
      );
    const file = req.query.file as string;
    const result = await deleteFile(file);
    if (result instanceof Error) {
      globalLogger.error('Error while deleting file', {
        code: HttpCodes.InternalServerError.code,
        type: HttpCodes.InternalServerError.type,
        error: result,
      });

      return ErrorResponse(
        res,
        HttpCodes.InternalServerError.code,
        'Error while deleting file',
        result
      );
    }
    return SuccessResponse(
      res,
      HttpCodes.Accepted.code,
      {},
      `File ${file} has been deleted`
    );
  } catch (error) {
    globalLogger.error('Error while deleting file', {
      code: HttpCodes.InternalServerError.code,
      type: HttpCodes.InternalServerError.type,
      error: error,
    });

    return ErrorResponse(
      res,
      HttpCodes.InternalServerError.code,
      'Error while deleting file',
      error
    );
  }
}

export async function handleFileGetting(
  req: MyRequest<UserI>,
  res: Response,
  next: NextFunction
): Promise<void> {
  try {
    if (!req.query.file)
      return ErrorResponse(
        res,
        HttpCodes.BadRequest.code,
        'No file to get',
        'No file to get'
      );
    const file = req.query.file as string;
    return res.download(`uploads/documents/${file}`, file, (error) => {
      if (error) {
        globalLogger.error('Error while getting file', {
          code: HttpCodes.InternalServerError.code,
          type: HttpCodes.InternalServerError.type,
          error: error,
        });

        return ErrorResponse(
          res,
          HttpCodes.InternalServerError.code,
          'Error while getting file',
          error
        );
      }
    });
  } catch (error) {
    globalLogger.error('Error while getting file', {
      code: HttpCodes.InternalServerError.code,
      type: HttpCodes.InternalServerError.type,
      error: error,
    });

    return ErrorResponse(
      res,
      HttpCodes.InternalServerError.code,
      'Error while getting file',
      error
    );
  }
}

export async function handleFileThumbnailUploading(
  req: MyRequest<UserI>,
  res: Response,
  next: NextFunction
): Promise<void> {
  try {
    if (!req.file)
      return ErrorResponse(
        res,
        HttpCodes.BadRequest.code,
        'No file uploaded',
        'No file uploaded'
      );
    const file = req.file;
    const filename = file.filename;
    const fileUrl = await uploadThumbnailToCloudinary(filename);
    globalLogger.info(`File uploaded - ${filename}`, {
      code: HttpCodes.Accepted.code,
      type: HttpCodes.Accepted.type,
      file: file,
    });
    return SuccessResponse(
      res,
      HttpCodes.Accepted.code,
      {
        fileUrl,
      },
      `File ${file.originalname} has been uploaded`
    );
  } catch (error) {
    globalLogger.error('Error while uploading file', {
      code: HttpCodes.InternalServerError.code,
      type: HttpCodes.InternalServerError.type,
      error: error,
    });

    return ErrorResponse(
      res,
      HttpCodes.InternalServerError.code,
      'Error while uploading file',
      error
    );
  }
}

export async function handleFileThumbnailDeleting(
  req: MyRequest<UserI>,
  res: Response,
  next: NextFunction
): Promise<void> {
  try {
    if (!req.query.file)
      return ErrorResponse(
        res,
        HttpCodes.BadRequest.code,
        'No file to delete',
        'No file to delete'
      );
    const fileUrl = req.query.file as string;
    const publicId = getThumbnailPublicId(fileUrl);
    const result: any = await deleteThumbnailFromCloudinary(publicId);

    if (result instanceof Error) {
      globalLogger.error('Error while deleting file', {
        code: HttpCodes.InternalServerError.code,
        type: HttpCodes.InternalServerError.type,
        error: result,
      });

      return ErrorResponse(
        res,
        HttpCodes.InternalServerError.code,
        'Error while deleting file',
        result
      );
    }
    globalLogger.info(`File deleted - ${publicId}`, {
      code: HttpCodes.Accepted.code,
      type: HttpCodes.Accepted.type,
    });
    return SuccessResponse(
      res,
      HttpCodes.Accepted.code,
      {},
      `File ${publicId} has been deleted`
    );
  } catch (error) {
    globalLogger.error('Error while deleting file', {
      code: HttpCodes.InternalServerError.code,
      type: HttpCodes.InternalServerError.type,
      error: error,
    });

    return ErrorResponse(
      res,
      HttpCodes.InternalServerError.code,
      'Error while deleting file',
      error
    );
  }
}