Skip to content
Snippets Groups Projects
agent.resolver.ts 1.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	Context,
    	Parent,
    	Query,
    	ResolveField,
    	Resolver,
    	Subscription,
    
    } from '@nestjs/graphql';
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    import { AgentModel } from './models/agent.model';
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    import { PrismaService } from '../prisma/prisma.service';
    
    import { Inject, UseGuards } from '@nestjs/common';
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    import { AuthGuard } from '../auth/auth.guard';
    
    import { Request } from 'express';
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    import { EntryModel } from './models/entry.model';
    import { EntryService } from '../utils/entry.service';
    import { PubSub } from 'graphql-subscriptions';
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    @Resolver(() => AgentModel)
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    export class AgentResolver {
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	constructor(
    
    		@Inject('PUBSUB')
    		private readonly pubSub: PubSub,
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    		private readonly prisma: PrismaService,
    		private readonly entryService: EntryService,
    	) {}
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	@Subscription(() => AgentModel, {
    		resolve: (payload) => {
    			payload.slug = null;
    		},
    	})
    
    	onAgentUpdate() {
    		return this.pubSub.asyncIterator('onAgentUpdate');
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	}
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	@Query(() => [AgentModel])
    	@UseGuards(AuthGuard)
    	async getAgents(): Promise<AgentModel[]> {
    		return await this.prisma.agent.findMany({
    			select: {
    				id: true,
    				name: true,
    				avatar: true,
    				bio: true,
    				flags: true,
    			},
    		});
    	}
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    
    
    Adrian Paschkowski's avatar
    V2  
    Adrian Paschkowski committed
    	@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),
    				);
    	}
    
    
    	@ResolveField('value')
    	async value(@Parent() parent: AgentModel): Promise<number> {
    		const codes = await this.prisma.tokenCode.findMany({
    			where: { agentId: parent.id },
    			select: { value: true },
    		});
    
    		return codes.reduce((prev, curr) => prev + curr.value, 0);
    	}
    
    Pascal Kosak's avatar
    Pascal Kosak committed
    }