/** * iam Role Resolver(v2.1 M1) * * Apollo Federation 子图:Role Entity * - @key(fields: "roleId") 支持跨子图引用 * - @ResolveReference 使用 DataLoader 批量加载(ADR-035) */ import { Resolver, Query, Args, ID, ResolveReference, ObjectType, Field, Directive, } from "@nestjs/graphql"; import { DataLoaderService, type RoleEntity } from "../dataloader.service.js"; import { Permissions, RequirePermission, } from "../../middleware/permission.guard.js"; @ObjectType() @Directive(`@key(fields: "roleId")`) export class Role { @Field(() => ID) roleId!: string; @Field() name!: string; @Field(() => String, { nullable: true }) description: string | null = null; @Field() roleType!: string; @Field() level!: number; } @Resolver(() => Role) export class RoleResolver { constructor(private readonly loader: DataLoaderService) {} @ResolveReference() async resolveReference(ref: { roleId: string }): Promise { return this.loader.roleLoader.load(ref.roleId); } @Query(() => Role, { nullable: true }) @RequirePermission(Permissions.IAM_USER_READ) async role( @Args("roleId", { type: () => ID }) roleId: string, ): Promise { return this.loader.roleLoader.load(roleId); } }