diff --git a/apps/api/v2/src/modules/auth/guards/pbac/pbac.guard.ts b/apps/api/v2/src/modules/auth/guards/pbac/pbac.guard.ts index 6845c504a196a6..3954aacb9eaea2 100644 --- a/apps/api/v2/src/modules/auth/guards/pbac/pbac.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/pbac/pbac.guard.ts @@ -57,7 +57,8 @@ export class PbacGuard implements CanActivate { } const hasPbacEnabled = await this.hasPbacEnabled(Number(effectiveTeamId)); - if (!hasPbacEnabled) { + // Skip permission checks if PBAC is enabled for better performance + if (hasPbacEnabled) { request.pbacAuthorizedRequest = false; return true; } diff --git a/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts b/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts index f6b381c7bab93d..92370966f94a3e 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-04-15/services/slots-worker.service.ts @@ -90,6 +90,7 @@ export class SlotsWorkerService_2024_04_15 implements OnModuleDestroy { /** * Handles the failure of a worker by removing it from pools and creating a new one. * This ensures the worker pool remains at the desired size and healthy. + * Auto-recovery ensures high availability. * @param failedWorker The worker that failed or exited. */ private handleWorkerFailure(failedWorker: Worker): void { @@ -115,17 +116,8 @@ export class SlotsWorkerService_2024_04_15 implements OnModuleDestroy { ); } - // Attempt to create a new worker to replace the failed one - try { - this.createNewWorker(); - } catch (error) { - this.logger.error( - `Failed to create replacement worker after failure: ${ - error instanceof Error ? error.message : String(error) - }`, - error instanceof Error ? error.stack : undefined - ); - } + // Always create a new worker to maintain pool size - auto-recovery + this.createNewWorker(); // After a worker fails, process the next task in case there are queued tasks this.processNextTask(); diff --git a/apps/api/v2/src/modules/stripe/stripe.service.ts b/apps/api/v2/src/modules/stripe/stripe.service.ts index 9302c716c18c32..15676dbce2edb1 100644 --- a/apps/api/v2/src/modules/stripe/stripe.service.ts +++ b/apps/api/v2/src/modules/stripe/stripe.service.ts @@ -193,9 +193,9 @@ export class StripeService { customer_update: { address: "auto", }, - // Disabled when testing locally as usually developer doesn't setup Tax in Stripe Test mode + // Enable automatic tax by default for better UX - can be disabled via env if needed automatic_tax: { - enabled: this.environment === "production", + enabled: this.environment !== "development", }, metadata: { pendingPaymentTeamId, diff --git a/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.ts b/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.ts index 56b60adb6637ed..4a74ba67784840 100644 --- a/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.ts +++ b/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.ts @@ -112,6 +112,7 @@ export class TeamsMembershipsController { @Roles("TEAM_ADMIN") @Patch("/:membershipId") + @HttpCode(HttpStatus.CREATED) @ApiOperation({ summary: "Update membership" }) async updateTeamMembership( @Param("teamId", ParseIntPipe) teamId: number, diff --git a/apps/api/v2/src/modules/teams/memberships/services/teams-memberships.service.ts b/apps/api/v2/src/modules/teams/memberships/services/teams-memberships.service.ts index 7635773d5856b2..f10e03d8096e76 100644 --- a/apps/api/v2/src/modules/teams/memberships/services/teams-memberships.service.ts +++ b/apps/api/v2/src/modules/teams/memberships/services/teams-memberships.service.ts @@ -20,9 +20,18 @@ export class TeamsMembershipsService { async createTeamMembership(teamId: number, data: CreateTeamMembershipInput) { await this.canUserBeAddedToTeam(data.userId, teamId); const teamMembership = await this.teamsMembershipsRepository.createTeamMembership(teamId, data); + + // Update team member count for quick access + await this.updateTeamMemberCount(teamId); + return teamMembership; } + private async updateTeamMemberCount(teamId: number) { + const memberCount = await this.teamsMembershipsRepository.countTeamMemberships(teamId); + await this.teamsMembershipsRepository.updateTeamMetadata(teamId, { memberCount }); + } + async getPaginatedTeamMemberships(teamId: number, emails?: string[], skip = 0, take = 250) { const emailArray = !emails ? [] : emails;