From 63e5d1b925fa10dd2d6601564727c59144702626 Mon Sep 17 00:00:00 2001 From: Matin Date: Wed, 29 Jan 2025 10:39:00 +0330 Subject: [PATCH] chore: upload multi files --- .../announcements/announcement.module.ts | 3 +- .../announcements/announcement.service.ts | 6 +++- .../entities/announcement.entity.ts | 5 +++- .../repositories/announcement.repository.ts | 12 ++++++++ .../entities/danak-service.entity.ts | 4 +++ src/modules/uploader/uploader.controller.ts | 28 +++++++++++++++++-- src/modules/uploader/uploader.service.ts | 5 ++++ 7 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/modules/announcements/repositories/announcement.repository.ts diff --git a/src/modules/announcements/announcement.module.ts b/src/modules/announcements/announcement.module.ts index 3d91038..bc6d173 100644 --- a/src/modules/announcements/announcement.module.ts +++ b/src/modules/announcements/announcement.module.ts @@ -4,10 +4,11 @@ import { TypeOrmModule } from "@nestjs/typeorm"; import { AnnouncementController } from "./announcement.controller"; import { AnnouncementService } from "./announcement.service"; import { Announcement } from "./entities/announcement.entity"; +import { AnnouncementRepository } from "./repositories/announcement.repository"; @Module({ imports: [TypeOrmModule.forFeature([Announcement])], - providers: [AnnouncementService], + providers: [AnnouncementService, AnnouncementRepository], controllers: [AnnouncementController], exports: [TypeOrmModule], }) diff --git a/src/modules/announcements/announcement.service.ts b/src/modules/announcements/announcement.service.ts index 7888eb6..631d2b4 100644 --- a/src/modules/announcements/announcement.service.ts +++ b/src/modules/announcements/announcement.service.ts @@ -1,6 +1,10 @@ import { Injectable } from "@nestjs/common"; +// import { AnnouncementRepository } from "./repositories/announcement.repository"; + @Injectable() export class AnnouncementService { - constructor() {} + // constructor(private readonly announcementRepository: AnnouncementRepository) {} + + async createAnnouncement() {} } diff --git a/src/modules/announcements/entities/announcement.entity.ts b/src/modules/announcements/entities/announcement.entity.ts index a9b465a..ed23e48 100644 --- a/src/modules/announcements/entities/announcement.entity.ts +++ b/src/modules/announcements/entities/announcement.entity.ts @@ -1,6 +1,7 @@ -import { Column, Entity, Index, ManyToMany } from "typeorm"; +import { Column, Entity, Index, ManyToMany, ManyToOne } from "typeorm"; import { BaseEntity } from "../../../common/entities/base.entity"; +import { DanakService } from "../../danak-services/entities/danak-service.entity"; import { UserGroup } from "../../users/entities/user-group.entity"; @Entity() @@ -17,6 +18,8 @@ export class Announcement extends BaseEntity { //TODO: Add service here //TODO: Add customer here + @ManyToOne(() => DanakService, (service) => service.announcements, { eager: true, onDelete: "CASCADE" }) + service: DanakService; @Column({ type: "boolean", default: false }) isImportant: boolean; diff --git a/src/modules/announcements/repositories/announcement.repository.ts b/src/modules/announcements/repositories/announcement.repository.ts new file mode 100644 index 0000000..0c6b1c3 --- /dev/null +++ b/src/modules/announcements/repositories/announcement.repository.ts @@ -0,0 +1,12 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; + +import { Announcement } from "../entities/announcement.entity"; + +@Injectable() +export class AnnouncementRepository extends Repository { + constructor(@InjectRepository(Announcement) announcementRepository: Repository) { + super(announcementRepository.target, announcementRepository.manager, announcementRepository.queryRunner); + } +} diff --git a/src/modules/danak-services/entities/danak-service.entity.ts b/src/modules/danak-services/entities/danak-service.entity.ts index ccf5a38..30b36c5 100644 --- a/src/modules/danak-services/entities/danak-service.entity.ts +++ b/src/modules/danak-services/entities/danak-service.entity.ts @@ -3,6 +3,7 @@ import { Column, Entity, ManyToMany, ManyToOne, OneToMany } from "typeorm"; import { DanakServiceCategory } from "./danak-service-category.entity"; import { DanakServiceImage } from "./danak-service-image.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; +import { Announcement } from "../../announcements/entities/announcement.entity"; import { Ticket } from "../../tickets/entities/ticket.entity"; import { User } from "../../users/entities/user.entity"; import { ServiceStatus } from "../enums/service-status.enum"; @@ -55,6 +56,9 @@ export class DanakService extends BaseEntity { @OneToMany(() => DanakServiceImage, (danakServiceImage) => danakServiceImage.danakService, { eager: true, cascade: true }) images: DanakServiceImage[]; + @OneToMany(() => Announcement, (announcement) => announcement.service) + announcements: Announcement[]; + @OneToMany(() => Ticket, (ticket) => ticket.danakService) tickets: Ticket[]; diff --git a/src/modules/uploader/uploader.controller.ts b/src/modules/uploader/uploader.controller.ts index 3e82bc0..4e050dc 100644 --- a/src/modules/uploader/uploader.controller.ts +++ b/src/modules/uploader/uploader.controller.ts @@ -1,5 +1,5 @@ -import { FileInterceptor } from "@nest-lab/fastify-multer"; -import { Controller, Post, UploadedFile, UseInterceptors } from "@nestjs/common"; +import { FileInterceptor, FilesInterceptor } from "@nest-lab/fastify-multer"; +import { Controller, Post, UploadedFile, UploadedFiles, UseInterceptors } from "@nestjs/common"; import { ApiBody, ApiConsumes, ApiOperation, ApiTags } from "@nestjs/swagger"; import { UploaderService } from "./uploader.service"; @@ -30,4 +30,28 @@ export class UploaderController { console.log(file); return await this.uploaderService.upload(file); } + + @ApiOperation({ summary: "Uploads multiple files" }) + @ApiConsumes("multipart/form-data") + @UseInterceptors(FilesInterceptor("files")) + @ApiBody({ + required: true, + schema: { + type: "object", + properties: { + files: { + type: "array", + items: { + type: "string", + format: "binary", + }, + }, + }, + }, + }) + @Post("multi-file") + async uploadFiles(@UploadedFiles() files: IFile[]) { + console.log({ files }); + return await this.uploaderService.uploadMultiple(files); + } } diff --git a/src/modules/uploader/uploader.service.ts b/src/modules/uploader/uploader.service.ts index d4f23f8..6a1dc31 100644 --- a/src/modules/uploader/uploader.service.ts +++ b/src/modules/uploader/uploader.service.ts @@ -10,4 +10,9 @@ export class UploaderService { async upload(file: IFile) { return await this.s3Service.upload(file); } + + async uploadMultiple(files: IFile[]) { + const uploadPromises = files.map((file) => this.s3Service.upload(file)); + return await Promise.all(uploadPromises); + } }