import { Context, Query, Resolver, Subscription } from '@nestjs/graphql'; import { GroupModel } from './models/group.model'; import { PrismaService } from '../prisma/prisma.service'; import { AgentFlags } from './models/agent.model'; import { Request } from 'express'; import { Inject, UseGuards } from '@nestjs/common'; import { AuthGuard } from '../auth/auth.guard'; import { Group } from '@prisma/client'; import { PubSub } from 'graphql-subscriptions'; @Resolver(() => GroupModel) export class GroupResolver { constructor( @Inject('PUBSUB') private readonly pubSub: PubSub, private readonly prisma: PrismaService, ) {} @Subscription(() => GroupModel, { filter: (payload: Group, variables, { req }: { req: Request }) => { return !!req.agent || req.group.id === payload.id; }, }) @UseGuards(AuthGuard) onGroupUpdate() { return this.pubSub.asyncIterator('onGroupUpdate'); } @Query(() => [GroupModel]) @UseGuards(AuthGuard) async getGroups( @Context() { req }: { req: Request }, ): Promise<GroupModel[]> { if (req.group) return [req.group]; if ( req.agent && (req.agent.flags & AgentFlags.ADMIN) === AgentFlags.ADMIN ) return this.prisma.group.findMany(); return []; } }