fix: join subteam as their respective organization role (#12216)

* fix: join subteam as their respective organization role

* refactor code

* fix: join subteam as their respective organization role

* fix: join subteam as their respective organization role for pending members

* fix: Set subteam role to admin when updating organization role to admin

* refactor: suggested changes and fix type error

* fix: type error
This commit is contained in:
Somay Chauhan 2023-12-19 11:40:06 +05:30 committed by GitHub
parent 4b16860d07
commit 5751f0f634
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 10 deletions

View File

@ -15,6 +15,20 @@ type UpdateUserOptions = {
input: TUpdateUserInputSchema; input: TUpdateUserInputSchema;
}; };
const applyRoleToAllTeams = async (userId: number, teamIds: number[], role: MembershipRole) => {
await prisma.membership.updateMany({
where: {
userId,
teamId: {
in: teamIds,
},
},
data: {
role,
},
});
};
export const updateUserHandler = async ({ ctx, input }: UpdateUserOptions) => { export const updateUserHandler = async ({ ctx, input }: UpdateUserOptions) => {
const { user } = ctx; const { user } = ctx;
const { id: userId, organizationId } = user; const { id: userId, organizationId } = user;
@ -35,6 +49,24 @@ export const updateUserHandler = async ({ ctx, input }: UpdateUserOptions) => {
teamId: organizationId, teamId: organizationId,
accepted: true, accepted: true,
}, },
include: {
team: {
include: {
children: {
where: {
members: {
some: {
userId: input.userId,
},
},
},
include: {
members: true,
},
},
},
},
},
}); });
if (!requestedMember) if (!requestedMember)
@ -72,6 +104,13 @@ export const updateUserHandler = async ({ ctx, input }: UpdateUserOptions) => {
}), }),
]); ]);
if (input.role === MembershipRole.ADMIN || input.role === MembershipRole.OWNER) {
const teamIds = requestedMember.team.children
.map((sub_team) => sub_team.members.find((item) => item.userId === input.userId)?.teamId)
.filter(Boolean) as number[]; //filter out undefined
await applyRoleToAllTeams(input.userId, teamIds, input.role);
}
// TODO: audit log this // TODO: audit log this
return { return {

View File

@ -117,12 +117,18 @@ export const inviteMemberHandler = async ({ ctx, input }: InviteMemberOptions) =
// invited users can autojoin, create their memberships in org // invited users can autojoin, create their memberships in org
if (autoJoinUsers.length) { if (autoJoinUsers.length) {
await prisma.membership.createMany({ await prisma.membership.createMany({
data: autoJoinUsers.map((userToAutoJoin) => ({ data: autoJoinUsers.map((userToAutoJoin) => {
userId: userToAutoJoin.id, const organizationRole = userToAutoJoin.teams?.[0]?.role;
teamId: team.id, return {
accepted: true, userId: userToAutoJoin.id,
role: input.role, teamId: team.id,
})), accepted: true,
role:
organizationRole === MembershipRole.ADMIN || organizationRole === MembershipRole.OWNER
? organizationRole
: input.role,
};
}),
}); });
} }

View File

@ -10,7 +10,7 @@ import slugify from "@calcom/lib/slugify";
import { prisma } from "@calcom/prisma"; import { prisma } from "@calcom/prisma";
import type { Membership, Team } from "@calcom/prisma/client"; import type { Membership, Team } from "@calcom/prisma/client";
import { Prisma, type User } from "@calcom/prisma/client"; import { Prisma, type User } from "@calcom/prisma/client";
import type { MembershipRole } from "@calcom/prisma/enums"; import { MembershipRole } from "@calcom/prisma/enums";
import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import { teamMetadataSchema } from "@calcom/prisma/zod-utils";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
@ -25,7 +25,7 @@ export type Invitee = Pick<
>; >;
export type UserWithMembership = Invitee & { export type UserWithMembership = Invitee & {
teams?: Pick<Membership, "userId" | "teamId" | "accepted">[]; teams?: Pick<Membership, "userId" | "teamId" | "accepted" | "role">[];
}; };
export async function checkPermissions({ export async function checkPermissions({
@ -168,7 +168,7 @@ export async function getUsersToInvite({
completedOnboarding: true, completedOnboarding: true,
identityProvider: true, identityProvider: true,
teams: { teams: {
select: { teamId: true, userId: true, accepted: true }, select: { teamId: true, userId: true, accepted: true, role: true },
where: { where: {
OR: memberships, OR: memberships,
}, },
@ -286,12 +286,16 @@ export async function createProvisionalMemberships({
try { try {
await prisma.membership.createMany({ await prisma.membership.createMany({
data: invitees.flatMap((invitee) => { data: invitees.flatMap((invitee) => {
const organizationRole = invitee?.teams?.[0]?.role;
const data = []; const data = [];
// membership for the team // membership for the team
data.push({ data.push({
teamId: input.teamId, teamId: input.teamId,
userId: invitee.id, userId: invitee.id,
role: input.role as MembershipRole, role:
organizationRole === MembershipRole.ADMIN || organizationRole === MembershipRole.OWNER
? organizationRole
: input.role,
}); });
// membership for the org // membership for the org