backend api service for Count incoming pending connection requests for sidebar badge.

This commit is contained in:
2026-06-21 13:24:15 +03:30
parent cad6fbaa6c
commit 4e2a9765bc
2 changed files with 31 additions and 0 deletions

View File

@@ -64,6 +64,14 @@ export class OrganizationController {
return this.organizationService.searchCounterpartOrganizations(req.user.id, organizationId, q);
}
@Get('connections/pending-count')
@UseGuards(JwtAuthGuard)
@ApiOperation({ summary: 'Count incoming pending connection requests for sidebar badge' })
countPendingConnections(@Req() req: { user: { id: string; organizationId?: string } }) {
const organizationId = this.organizationService.getOrganizationIdFromUser(req.user);
return this.organizationService.countIncomingPendingConnections(req.user.id, organizationId);
}
@Get('connections')
@UseGuards(JwtAuthGuard)
@ApiOperation({ summary: 'List counterpart connections for current organization' })

View File

@@ -160,6 +160,29 @@ export class OrganizationService {
};
}
/** Lightweight count for sidebar badge — incoming PENDING requests only. */
async countIncomingPendingConnections(userId: string, organizationId: string) {
const actor = await this.getActorMembership(userId, organizationId);
if (!actor || !this.canEditOrganizations(actor)) {
throw new ForbiddenException('You do not have permission to manage organizations');
}
const links = await this.prisma.organizationLink.findMany({
where: {
status: LinkStatus.PENDING,
OR: [{ organizationAId: organizationId }, { organizationBId: organizationId }],
},
select: { sharedDataTypes: true },
});
const count = links.filter((link) => {
const requesterOrgId = this.getRequesterOrganizationId(link.sharedDataTypes);
return requesterOrgId !== null && requesterOrgId !== organizationId;
}).length;
return { success: true, data: { count } };
}
async listInvitationHistory(userId: string, organizationId: string) {
const actor = await this.getActorMembership(userId, organizationId);
if (!actor || !this.canEditOrganizations(actor)) {