All files / notification notification.service.ts

100% Statements 26/26
100% Branches 6/6
100% Functions 6/6
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 585x 5x 5x     5x   5x 5x   5x     5x   17x 17x             3x 3x 1x     2x 4x       2x   2x     4x   6x             3x 3x 2x     1x   1x      
import { Injectable, NotFoundException } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { ERROR } from 'src/commons/constants/error';
import { LastItemIdResponseDto } from 'src/commons/dtos/last-item-id-response.dto';
import { UuidResponseDto } from 'src/commons/dtos/uuid-response.dto';
import { isEmpty } from 'src/commons/util/is/is-empty';
import { ApiNotificationGetListRequestQueryDto } from 'src/notification/dto/api-notification-get-list-request-query.dto';
import { ApiNotificationGetListResponseDto } from 'src/notification/dto/api-notification-get-list-response.dto';
import { NotificationQueryRepository } from 'src/notification/notification.query.repository';
import { UserDto } from 'src/user/dto/user.dto';
import { UserQueryRepository } from 'src/user/user.query.repository';
 
@Injectable()
export class NotificationService {
  constructor(
    private readonly notificationQueryRepository: NotificationQueryRepository,
    private readonly userQueryRepository: UserQueryRepository,
  ) {}
 
  async notificationList(
    dto: ApiNotificationGetListRequestQueryDto,
    user: UserDto,
  ): Promise<LastItemIdResponseDto<ApiNotificationGetListResponseDto>> {
    const notificationList = await this.notificationQueryRepository.findList(dto, user);
    if (notificationList.length === 0) {
      return { items: [], last_item_id: 0 };
    }
 
    const userList = await this.userQueryRepository.findUserList(
      notificationList.map((item) => item.user_uuid),
    );
 
    const lastItemId =
      notificationList.length === dto.size ? notificationList[notificationList.length - 1].id : 0;
 
    return {
      items: plainToInstance(ApiNotificationGetListResponseDto, notificationList, {
        excludeExtraneousValues: true,
      }).map((notification) => ({
        ...notification,
        user_thumbnail: userList.find((item) => item.uuid === notification.user_uuid).profile_image,
      })),
      last_item_id: lastItemId,
    };
  }
 
  async notificationRead(uuid: string, user: UserDto): Promise<UuidResponseDto> {
    const notification = await this.notificationQueryRepository.findNotification(uuid);
    if (isEmpty(notification) || notification.target_user_uuid !== user.uuid) {
      throw new NotFoundException(ERROR.NOT_EXIST_DATA);
    }
 
    await this.notificationQueryRepository.updateRead(uuid);
 
    return { uuid };
  }
}