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:
parent
4b16860d07
commit
5751f0f634
|
@ -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 {
|
||||||
|
|
|
@ -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,
|
||||||
|
};
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user