import { Args, Mutation, Resolver } from '@nestjs/graphql'; import { LoginModel } from './models/login.model'; import { PrismaService } from '../prisma/prisma.service'; import { randomBytes } from 'crypto'; import { AgentFlags } from './models/agent.model'; import { UnauthorizedException } from '@nestjs/common'; @Resolver() export class AuthResolver { constructor(private readonly prisma: PrismaService) {} @Mutation(() => LoginModel) async login(@Args('slug') slug: string) { const [group, agent] = await Promise.all([ this.prisma.group.findFirst({ where: { slug }, }), this.prisma.agent.findFirst({ where: { slug }, }), ]); let entityId, role; if (agent) { entityId = agent.id; if ((agent.flags & AgentFlags.ADMIN) === AgentFlags.ADMIN) role = 'admin'; else role = 'agent'; } else if (group) { entityId = group.id; role = 'group'; } else { throw new UnauthorizedException('Invalid Login Slug'); } return await this.prisma.accessToken.create({ data: { entityId, role, authToken: randomBytes(36).toString('base64url'), }, }); } }