diff --git a/src/components/user/dto/assign-organization-to-user.dto.ts b/src/components/user/dto/assign-organization-to-user.dto.ts index ae92783820..762f3a9feb 100644 --- a/src/components/user/dto/assign-organization-to-user.dto.ts +++ b/src/components/user/dto/assign-organization-to-user.dto.ts @@ -1,7 +1,8 @@ import { Field, InputType, ObjectType } from '@nestjs/graphql'; import { Type } from 'class-transformer'; import { ValidateNested } from 'class-validator'; -import { type ID, IdField, MutationPlaceholderOutput } from '~/common'; +import { type ID, IdField } from '~/common'; +import { Partner } from '../../../components/partner/dto'; @InputType() export class AssignOrganizationToUser { @@ -20,8 +21,11 @@ export abstract class AssignOrganizationToUserInput { @Field() @Type(() => AssignOrganizationToUser) @ValidateNested() - readonly request: AssignOrganizationToUser; + readonly assignment: AssignOrganizationToUser; } @ObjectType() -export abstract class AssignOrganizationToUserOutput extends MutationPlaceholderOutput {} +export abstract class AssignOrganizationToUserOutput { + @Field() + readonly partner: Partner; +} diff --git a/src/components/user/dto/remove-organization-from-user.dto.ts b/src/components/user/dto/remove-organization-from-user.dto.ts index a2815991cf..9ca5d3c82d 100644 --- a/src/components/user/dto/remove-organization-from-user.dto.ts +++ b/src/components/user/dto/remove-organization-from-user.dto.ts @@ -1,7 +1,8 @@ import { Field, InputType, ObjectType } from '@nestjs/graphql'; import { Type } from 'class-transformer'; import { ValidateNested } from 'class-validator'; -import { type ID, IdField, MutationPlaceholderOutput } from '~/common'; +import { type ID, IdField } from '~/common'; +import { Partner } from '../../../components/partner/dto'; @InputType() export class RemoveOrganizationFromUser { @@ -17,8 +18,11 @@ export abstract class RemoveOrganizationFromUserInput { @Field() @Type(() => RemoveOrganizationFromUser) @ValidateNested() - readonly request: RemoveOrganizationFromUser; + readonly assignment: RemoveOrganizationFromUser; } @ObjectType() -export abstract class RemoveOrganizationFromUserOutput extends MutationPlaceholderOutput {} +export abstract class RemoveOrganizationFromUserOutput { + @Field() + readonly partner: Partner; +} diff --git a/src/components/user/user.gel.repository.ts b/src/components/user/user.gel.repository.ts index f68b5e3e8a..62007467b0 100644 --- a/src/components/user/user.gel.repository.ts +++ b/src/components/user/user.gel.repository.ts @@ -84,4 +84,8 @@ export class UserGelRepository hydrateAsNeo4j(): never { throw new NotImplementedException(); } + + getPrimaryOrganizationId(userId: ID): Promise { + throw new NotImplementedException().with({ userId }); + } } diff --git a/src/components/user/user.repository.ts b/src/components/user/user.repository.ts index e4d765b977..26c24de4a4 100644 --- a/src/components/user/user.repository.ts +++ b/src/components/user/user.repository.ts @@ -290,13 +290,13 @@ export class UserRepository extends DtoRepository(User) { if (primary) { q.subQuery((sub) => sub - .with('user, org') + .with('user') .match([ node('user'), relation('out', 'oldRel', 'primaryOrganization', { active: true, }), - node('org'), + node('anyOrg', 'Organization'), ]) .setValues({ 'oldRel.active': false }) .return('oldRel as oldPrimaryRel') @@ -333,6 +333,20 @@ export class UserRepository extends DtoRepository(User) { } } + async getPrimaryOrganizationId(userId: ID): Promise { + const result = await this.db + .query() + .match([ + node('user', 'User', { id: userId }), + relation('out', '', 'primaryOrganization', ACTIVE), + node('org', 'Organization'), + ]) + .return<{ orgId: ID }>('org.id as orgId') + .first(); + + return result?.orgId ?? null; + } + async removeOrganizationFromUser(request: RemoveOrganizationFromUser) { const result = await this.db .query() diff --git a/src/components/user/user.resolver.ts b/src/components/user/user.resolver.ts index d7e36dcf15..470b4b3e09 100644 --- a/src/components/user/user.resolver.ts +++ b/src/components/user/user.resolver.ts @@ -25,8 +25,8 @@ import { OrganizationListInput, SecuredOrganizationList, } from '../organization/dto'; -import { PartnerLoader } from '../partner'; -import { PartnerListInput, SecuredPartnerList } from '../partner/dto'; +import { PartnerLoader, PartnerService } from '../partner'; +import { Partner, PartnerListInput, SecuredPartnerList } from '../partner/dto'; import { TimeZoneService } from '../timezone'; import { SecuredTimeZone } from '../timezone/timezone.dto'; import { @@ -70,6 +70,7 @@ class ModifyLocationArgs { export class UserResolver { constructor( private readonly userService: UserService, + private readonly partnerService: PartnerService, private readonly timeZoneService: TimeZoneService, private readonly identity: Identity, ) {} @@ -164,6 +165,14 @@ export class UserResolver { return list; } + @ResolveField(() => Partner, { nullable: true }) + async primaryOrganization(@Parent() { id }: User): Promise { + const primaryOrgId = await this.userService.getPrimaryOrganizationId(id); + return primaryOrgId + ? await this.partnerService.readOnePartnerByOrgId(primaryOrgId) + : null; + } + @ResolveField(() => SecuredPartnerList) async partners( @Parent() { id }: User, @@ -263,8 +272,12 @@ export class UserResolver { async assignOrganizationToUser( @Args('input') input: AssignOrganizationToUserInput, ): Promise { - await this.userService.assignOrganizationToUser(input.request); - return { success: true }; + await this.userService.assignOrganizationToUser(input.assignment); + const partner = await this.partnerService.readOnePartnerByOrgId( + input.assignment.orgId, + ); + + return { partner }; } @Mutation(() => RemoveOrganizationFromUserOutput, { @@ -273,8 +286,11 @@ export class UserResolver { async removeOrganizationFromUser( @Args('input') input: RemoveOrganizationFromUserInput, ): Promise { - await this.userService.removeOrganizationFromUser(input.request); - return { success: true }; + await this.userService.removeOrganizationFromUser(input.assignment); + const partner = await this.partnerService.readOnePartnerByOrgId( + input.assignment.orgId, + ); + return { partner }; } @Mutation(() => User, { diff --git a/src/components/user/user.service.ts b/src/components/user/user.service.ts index 5fe80a2ba5..df35db5ae6 100644 --- a/src/components/user/user.service.ts +++ b/src/components/user/user.service.ts @@ -333,6 +333,11 @@ export class UserService { await this.userRepo.assignOrganizationToUser(request); } + async getPrimaryOrganizationId(userId: ID) { + const org = await this.userRepo.getPrimaryOrganizationId(userId); + return org ?? null; + } + async removeOrganizationFromUser( request: RemoveOrganizationFromUser, ): Promise {