diff --git a/src/modules/announcements/announcement.controller.ts b/src/modules/announcements/announcement.controller.ts index 6f7a840..a1db40d 100644 --- a/src/modules/announcements/announcement.controller.ts +++ b/src/modules/announcements/announcement.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Post, Query } from "@nestjs/common"; +import { Body, Controller, Get, Param, Post, Query } from "@nestjs/common"; import { ApiProperty, ApiTags } from "@nestjs/swagger"; import { AnnouncementService } from "./announcement.service"; @@ -41,4 +41,13 @@ export class AnnouncementController { async getPublicAnnouncements() { return await this.announcementService.getPublicAnnouncements(); } + + @AuthGuards() + @ApiProperty({ + description: "Get all public announcements", + }) + @Get(":serviceId") + async getAnnouncementsByService(@Query() queryDto: SearchCriticismQueryDto, @Param("serviceId") serviceId: string) { + return await this.announcementService.getAnnouncementByService(queryDto, serviceId); + } } diff --git a/src/modules/announcements/announcement.service.ts b/src/modules/announcements/announcement.service.ts index f2dad20..31bedbd 100644 --- a/src/modules/announcements/announcement.service.ts +++ b/src/modules/announcements/announcement.service.ts @@ -25,6 +25,7 @@ export class AnnouncementService { if (createAnnouncementDto.groupIds) { groups = await this.usersService.getUserGroupsByIds(createAnnouncementDto.groupIds); } + //TODO: Create Queue for publishAT const announcement = this.announcementRepository.create({ ...createAnnouncementDto, service, @@ -70,4 +71,34 @@ export class AnnouncementService { const announcements = await this.announcementRepository.find({ where: { isPublic: true }, relations: ["service", "targetGroups"] }); return { announcements }; } + + async getAnnouncementByService(queryDto: SearchAnnouncementQueryDto, serviceId: string) { + const { limit, skip } = PaginationUtils(queryDto); + + const queryBuilder = this.announcementRepository + .createQueryBuilder("announcement") + .leftJoin("announcement.service", "danak_service") + .addSelect(["danak_service.id", "danak_service.name"]) + .leftJoin("announcement.targetGroups", "group") + .addSelect(["group.id", "group.name"]) + .where("danak_service.id = :serviceId", { serviceId }); + + if (queryDto.since) { + queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since }); + } + + if (queryDto.publishAt) { + queryBuilder.andWhere("announcement.publishAt >= :publishAt", { publishAt: queryDto.publishAt }); + } + + if (queryDto.q) { + queryBuilder.andWhere("announcement.title LIKE :q", { q: `%${queryDto.q}%` }); + } + + queryBuilder.orderBy("announcement.createdAt", "DESC"); + + const [announcements, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount(); + + return { announcements, count, paginate: true }; + } }