neet/refined-itsukara-link

View on GitHub
packages/@neet/vschedule-api/src/adapters/query-services/organization-query-service-prisma.ts

Summary

Maintainability
B
6 hrs
Test Coverage
import { PrismaClient } from '@prisma/client';
import { inject, injectable } from 'inversify';

import {
  IOrganizationQueryService,
  OrganizationDto,
  OrganizationQueryManyParams,
} from '../../app';
import { OrganizationId, YoutubeChannelId } from '../../domain';
import { TYPES } from '../../types';
import { transferOrganizationFromPrisma } from '../mappers';

const DEFAULT_INCLUDE = Object.freeze({
  avatar: true,
  channels: {
    include: {
      youtubeChannel: true,
    },
  },
});

@injectable()
export class OrganizationQueryServicePrisma
  implements IOrganizationQueryService
{
  constructor(
    @inject(TYPES.PrismaClient)
    private readonly _prisma: PrismaClient,
  ) {}

  async query(id: OrganizationId): Promise<OrganizationDto | undefined> {
    const data = await this._prisma.organization.findFirst({
      where: {
        id: id.value,
      },
      include: DEFAULT_INCLUDE,
    });

    if (data == null) {
      return;
    }

    return transferOrganizationFromPrisma(data);
  }

  async queryByYoutubeChannelId(
    id: YoutubeChannelId,
  ): Promise<OrganizationDto | undefined> {
    const data = await this._prisma.organization.findFirst({
      where: {
        youtubeChannelId: id.value,
      },
      include: DEFAULT_INCLUDE,
    });

    if (data == null) {
      return;
    }

    return transferOrganizationFromPrisma(data);
  }

  async queryMany(
    params: OrganizationQueryManyParams,
  ): Promise<OrganizationDto[]> {
    const data = await this._prisma.organization.findMany({
      take: Math.min(params.limit ?? 30, 60),
      include: DEFAULT_INCLUDE,
    });

    return data.map((d) => transferOrganizationFromPrisma(d));
  }
}