import { Context, Parent, Query, ResolveField, Resolver, Subscription, } from '@nestjs/graphql'; import { AgentModel } from './models/agent.model'; import { PrismaService } from '../prisma/prisma.service'; import { UseGuards } from '@nestjs/common'; import { AuthGuard } from '../auth/auth.guard'; import { Request } from 'express'; import { EntryModel } from './models/entry.model'; import { EntryService } from '../utils/entry.service'; import { PubSub } from 'graphql-subscriptions'; @Resolver(() => AgentModel) export class AgentResolver { constructor( private readonly prisma: PrismaService, private readonly entryService: EntryService, ) {} @Subscription(() => AgentModel, { resolve: (payload) => { payload.slug = null; }, }) onAgentUpdate(@Context('pubsub') pubSub: PubSub) { return pubSub.asyncIterator('onAgentUpdate'); } @Query(() => [AgentModel]) @UseGuards(AuthGuard) async getAgents(): Promise<AgentModel[]> { return await this.prisma.agent.findMany({ where: { uid: { not: null }, }, select: { id: true, name: true, avatar: true, bio: true, flags: true, }, }); } @ResolveField('entries') async entries( @Context() { req }: { req: Request }, @Parent() parent: AgentModel, ): Promise<EntryModel[]> { if (req.group) return this.entryService.getAccessibleEntries( req.group.id, parent.id, ); else return this.prisma.entry .findMany() .then((entries) => entries.map(this.entryService.unlockedEntry), ); } }