penisularhr / src / modules / sector / sector.service.ts
sector.service.ts
Raw
import { forwardRef, Inject, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { type FindOptionsWhere, Repository } from 'typeorm';

import { type PageDto } from '../../common/dto/page.dto';
import {
  DuplicateSectorException,
  SectorIsInUsedException,
} from '../../exceptions';
import { ActivityRecordSettingService } from '../activity-record/activity-record-setting.service';
import { type CreateSectorDto } from './dtos/create-sector.dto';
import { type SectorPageOptionsDto } from './dtos/get-sector-page.dto';
import { type SectorDto } from './dtos/sector.dto';
import { type UpdateSectorDto } from './dtos/update-sector.dto';
import { SectorEntity } from './sector.entity';

@Injectable()
export class SectorService {
  constructor(
    @InjectRepository(SectorEntity)
    private sectorRepository: Repository<SectorEntity>,
    @Inject(forwardRef(() => ActivityRecordSettingService))
    private activitySettingService: ActivityRecordSettingService,
  ) {}

  async findOne(
    findData: FindOptionsWhere<SectorEntity>,
  ): Promise<SectorEntity | null> {
    const queryBuilder = this.sectorRepository.createQueryBuilder('sector');

    queryBuilder.where(findData);

    return queryBuilder.getOne();
  }

  async findMany(
    pageOptionsDto: SectorPageOptionsDto,
  ): Promise<PageDto<SectorDto>> {
    const { name } = pageOptionsDto;

    const queryBuilder = this.sectorRepository.createQueryBuilder('sector');

    if (name !== undefined) {
      queryBuilder.searchByString(name, ['sector.name']);
    }

    const [items, pageMetaDto] = await queryBuilder.paginate(pageOptionsDto);

    return items.toPageDto(pageMetaDto);
  }

  async findManyDropdown(): Promise<Array<{ name: string; value: string }>> {
    const queryBuilder = this.sectorRepository.createQueryBuilder('sector');

    queryBuilder.orderBy('sector.name', 'ASC');

    const returnData = await queryBuilder.getMany();

    return returnData.map((el) => ({
      name: el.name,
      value: el.name,
    }));
  }

  async createSector(dto: CreateSectorDto): Promise<SectorEntity> {
    const sectorEntity = this.sectorRepository.create(dto);
    await this.sectorRepository.save(sectorEntity);

    return sectorEntity;
  }

  async updateSector(
    sectorEntity: SectorEntity,
    dto: UpdateSectorDto,
  ): Promise<SectorEntity> {
    const { name } = dto;

    if (name !== undefined) {
      const existingSector = await this.findOne({
        name,
      });

      if (existingSector) {
        throw new DuplicateSectorException();
      }

      sectorEntity.name = name;
    }

    await this.sectorRepository.save(sectorEntity);

    return sectorEntity;
  }

  async delete(sectorEntity: SectorEntity): Promise<void> {
    const existingActivitySetting = await this.activitySettingService.findOne({
      sector: { id: sectorEntity.id },
    });

    if (existingActivitySetting) {
      throw new SectorIsInUsedException();
    }

    await this.sectorRepository.remove(sectorEntity);
  }
}