Skip to content
Snippets Groups Projects
group.resolver.ts 3.43 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pascal Kosak's avatar
    Pascal Kosak committed
    import {
        Args,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        Mutation,
        Parent,
        Query,
        ResolveField,
        Resolver,
    
        Subscription,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    } from '@nestjs/graphql';
    import { Group } from './models/group.model';
    import { PrismaService } from '../prisma/prisma.service';
    import { GraphQLString } from 'graphql';
    
    import * as seedWords from 'mnemonic-words';
    
    import {
        NotFoundException,
        UnauthorizedException,
        UseGuards,
    } from '@nestjs/common';
    
    import { GroupAuthGuard } from '../auth/group-auth.guard';
    
    import { Request } from 'express';
    
    import { pubSub } from '../pubSub.instance';
    
    import { AgentAuthGuard } from '../auth/agent-auth.guard';
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    @Resolver(() => Group)
    export class GroupResolver {
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        constructor(private prismaService: PrismaService) {}
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
        @Subscription(() => Group, {
    
            filter: (payload, variables) =>
    
                payload.updateToken.slug === variables.groupSlug,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        async updateToken(
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
            @Args({ name: 'groupSlug', type: () => GraphQLString })
            groupSlug: string,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        ) {
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
            if (!groupSlug) throw new UnauthorizedException();
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
            const group = await this.prismaService.group.findFirst({
                where: {
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
                    slug: groupSlug,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
                },
            });
    
    
            if (!group) throw new NotFoundException('That Group does not exist');
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
            return pubSub.asyncIterator('updateToken');
        }
    
        @Mutation(() => Group)
    
        async addToken(
    
            @Args({ name: 'groupSlug', type: () => GraphQLString })
            groupSlug: string,
    
            let group = await this.prismaService.group.findFirst({
                where: { slug: groupSlug },
            });
    
            if (!group) throw new NotFoundException('That Group does not exist');
    
            group = await this.prismaService.group.update({
    
                where: {
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
                    slug: groupSlug,
    
                data: {
                    tokens: { increment: 1 },
                },
    
            await pubSub.publish('updateToken', { updateToken: group });
    
    
            return group;
        }
    
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        @Mutation(() => Group)
        async createGroup(
            @Args({ name: 'name', type: () => GraphQLString }) name: string,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
            @Args({ name: 'code', type: () => GraphQLString }) agentCode: string,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        ) {
    
    Pascal Kosak's avatar
    Pascal Kosak committed
            if (!agentCode) throw new UnauthorizedException();
    
            // TODO: refactor agent auth, modify auth guard
    
            const agent = await this.prismaService.agent.findFirst({
                where: {
                    slug: agentCode,
                },
            });
    
    
            if (!agent) throw new NotFoundException('That Agent does not exist');
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
    Pascal Kosak's avatar
    Pascal Kosak committed
            function generateWord() {
                return seedWords[Math.round(Math.random() * seedWords.length)];
            }
    
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
            const slug = [
    
    Pascal Kosak's avatar
    Pascal Kosak committed
                generateWord(),
                generateWord(),
                generateWord(),
                generateWord(),
            ].join('-');
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
            return this.prismaService.group.create({
                data: {
                    name,
    
    Daniel Gerdes's avatar
    Daniel Gerdes committed
                    slug,
    
    Pascal Kosak's avatar
    Pascal Kosak committed
                },
            });
        }
    
        @Query(() => Group)
    
        async getGroup(@Context() { req }: { req: Request }) {
    
            return req.group;
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        }
    
        @ResolveField('unlocks')
        async unlocks(@Parent() group: Group) {
            const result = await this.prismaService.group.findFirst({
                where: { id: group.id },
                select: { unlocks: true },
            });
    
    
            return result.unlocks.map((unlock) => ({
    
    Pascal Kosak's avatar
    Pascal Kosak committed
        }
    }