Files
calendar/packages/trpc/server/routers/viewer/teams/acceptOrLeave.handler.ts
T
b3f4cfab32 feat: new org onboarding wizard (#13139)
* added layouts for moving teams step

* added admin section for org creation step

* extended org creation to also move existing teams

* wip

* wip

* wip

* further changes

* Add checkout for org in onboarding

* Fix ts errors

* Self review feedback

* Self review addressed

* Fix unit tests

* Fix ts error

* Seans feedback addressed

* feat: fix correct accounts pending

* fix: unit tests for new invite member permissions

* tests: org admin onboarding tests for existing user

* tests: Inital user self serve flow

* chore: update teamAndUserFixture to create X amount of teams

* chore: add testId to card actionButton

* test: add test-Id to continue or checkout button

* tests: add tests for migrating existing teams

* feat: match new designs

* fix: isAdminCheck

* chore: fix pricing copy

* fix: flacky tests

* Fix tests?

* More test fixes

* Check all checkboxes

* Fix type error

* Fix failing test and typescript issues

* Fix unpaid org allowing auto-add users

* Add self-serve flag

* Skip tests

---------

Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Hariom <hariombalhara@gmail.com>
Co-authored-by: sean-brydon <sean@cal.com>
Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com>
Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
Co-authored-by: Omar López <zomars@me.com>
2024-04-03 18:53:02 +05:30

96 lines
2.8 KiB
TypeScript

import { createAProfileForAnExistingUser } from "@calcom/lib/createAProfileForAnExistingUser";
import { updateNewTeamMemberEventTypes } from "@calcom/lib/server/queries";
import { closeComUpsertTeamUser } from "@calcom/lib/sync/SyncServiceManager";
import { prisma } from "@calcom/prisma";
import { MembershipRole } from "@calcom/prisma/enums";
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
import type { TAcceptOrLeaveInputSchema } from "./acceptOrLeave.schema";
type AcceptOrLeaveOptions = {
ctx: {
user: NonNullable<TrpcSessionUser>;
};
input: TAcceptOrLeaveInputSchema;
};
export const acceptOrLeaveHandler = async ({ ctx, input }: AcceptOrLeaveOptions) => {
if (input.accept) {
const teamMembership = await prisma.membership.update({
where: {
userId_teamId: { userId: ctx.user.id, teamId: input.teamId },
},
data: {
accepted: true,
},
include: {
team: true,
},
});
const team = teamMembership.team;
if (team.parentId) {
await prisma.membership.update({
where: {
userId_teamId: { userId: ctx.user.id, teamId: team.parentId },
},
data: {
accepted: true,
},
include: {
team: true,
},
});
}
const isASubteam = team.parentId !== null;
const idOfOrganizationInContext = team.isOrganization ? team.id : isASubteam ? team.parentId : null;
const needProfileUpdate = !!idOfOrganizationInContext;
if (needProfileUpdate) {
await createAProfileForAnExistingUser({
user: {
id: ctx.user.id,
email: ctx.user.email,
currentUsername: ctx.user.username,
},
organizationId: idOfOrganizationInContext,
});
}
await updateNewTeamMemberEventTypes(ctx.user.id, input.teamId);
closeComUpsertTeamUser(team, ctx.user, teamMembership.role);
} else {
try {
//get team owner so we can alter their subscription seat count
const ownerMembership = await prisma.membership.findFirst({
where: { teamId: input.teamId, role: MembershipRole.OWNER },
include: { team: true },
});
const membership = await prisma.membership.delete({
where: {
userId_teamId: { userId: ctx.user.id, teamId: input.teamId },
},
include: {
team: true,
},
});
if (membership.team.parentId) {
await prisma.membership.delete({
where: {
userId_teamId: { userId: ctx.user.id, teamId: membership.team.parentId },
},
});
}
// Sync Services: Close.com
if (ownerMembership) closeComUpsertTeamUser(ownerMembership.team, ctx.user, membership.role);
} catch (e) {
console.log(e);
}
}
};
export default acceptOrLeaveHandler;