Basics usage flow

1. Set the below variables in .env file

    ```

   - MONGO_DB_URI="paste here mongodb uri"
   - REDIS_HOST=localhost
   - REDIS_PORT=6379
   - REDIS_PASSWORD (this is not compulsion, remove this if your system doesn't ask for redis password)
   - MAX_PART_SIZE=10 (Note: represents in mb) (if the file is 100 mb, it will break in 1000/MAX_PART_SIZE = 100/10 = 10 multipart)
   - S3_BUCKET_NAME="name of you s3 bucket" e.g smartfileupload
   - S3_URL="s3 url of ur bucket" e.g https://s3bucketurl-public.s3.ap-south-1.amazonaws.com
   - SERVER_URL="server url" e.g http://localhost:3000
   - S3_BUCKET_REGION="s3 bucket region" (e.g us-east-1)
   - S3_ACCESS_KEY="access key for ur aws account with s3 previlage"
   - S3_SECRET_ACCESS_KEY="secret accesss key for ur aws account with s3 previlage"

    ```

2. add the above varibales in .env and move to package installation

   - run npm i smart-file-upload

3. required dependencies
    ```
    
   "@aws-sdk/client-s3": "^3.348.0",
   "@nestjs/bull": "^0.6.3",
   "@nestjs/config": "^2.3.2",
   "@nestjs/mongoose": "^9.2.2",
   "@types/multer": "^1.4.7"

   ```

   Note: use the latest version

4. Make a file-controller . You can access these
   - FileUploadService
     - this contains two service named
       - upload() to uplod file
       - getFileDetail ( get file detail based on mongodb id stored)

Helpful code

1. Nestjs

   exmaple of sample controller file

   ```

   import {
   Controller,
   Get,
   HttpStatus,
   Param,
   Post,
   UploadedFile,
   UseGuards,
   UseInterceptors,
   } from "@nestjs/common";
   import { ApiBody, ApiConsumes, ApiTags } from "@nestjs/swagger";
   import { FileInterceptor } from "@nestjs/platform-express";
   import { diskStorage } from "multer";
   import { Request } from "express";
   import _ as path from "path";
   import _ as crypto from "crypto";
   import { DirectoryNameEnum } from "everestwalkgroups-file-upload/common/enum";
   import { FileUploadService } from "everestwalkgroups-file-upload/";

   @ApiTags("File Upload")
   @Controller("api/v1/file-upload")
   export class FileUploadController {
   constructor(private readonly fileUploadService: FileUploadService) {}

   @ApiConsumes("multipart/form-data")
   @ApiBody({
   schema: {
   type: "object",
   properties: {
   file: {
   type: "string",
   format: "binary",
   },
   },
   },
   })
   @UseInterceptors(
   FileInterceptor("file", {
   storage: diskStorage({
   destination: function (
   req: Request,
   file: Express.Multer.File,
   cb: (error: Error, destination: string) => void
   ) {
   cb(null, path.resolve(DirectoryNameEnum.UPLOADS));
   },
   filename: function (
   req: Request,
   file: Express.Multer.File,
   cb: (error: Error, filename: string) => void
   ) {
   const parsed = path.parse(file.originalname);
   const ext = parsed.ext;
   file.originalname = Buffer.from(parsed.name, "binary").toString();
   file.filename = crypto.randomUUID() + "-" + Date.now() + ext;
   cb(null, file.filename);
   },
   }),
   })
   )
   @Post()
   async upload(@UploadedFile() file: Express.Multer.File) {
   return {
   statusCode: HttpStatus.CREATED,
   data: await this.fileUploadService.upload(file),
   };
   }

   @Get(":id")
   async getFileDetail(@Param("id") id: string) {
   return {
   statusCode: HttpStatus.OK,
   data: await this.fileUploadService.getFileDetail(id),
   };
   }
   }

   ```

2. Nodejs
   Please modify as per as your above code.
