mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-02 19:25:51 +00:00
Update groups count fn, type check
This commit is contained in:
@@ -59,37 +59,6 @@ export const groupDALFactory = (db: TDbClient) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const countGroupMembers = async ({ orgId, groupId }: { orgId: string; groupId: string }) => {
|
|
||||||
try {
|
|
||||||
interface CountResult {
|
|
||||||
count: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const directCount = await db<CountResult>(TableName.OrgMembership)
|
|
||||||
.where(`${TableName.OrgMembership}.orgId`, orgId)
|
|
||||||
.join(TableName.Users, `${TableName.OrgMembership}.userId`, `${TableName.Users}.id`)
|
|
||||||
.leftJoin(TableName.UserGroupMembership, function () {
|
|
||||||
this.on(`${TableName.UserGroupMembership}.userId`, "=", `${TableName.Users}.id`).andOn(
|
|
||||||
`${TableName.UserGroupMembership}.groupId`,
|
|
||||||
"=",
|
|
||||||
db.raw("?", [groupId])
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.where({ isGhost: false, isAccepted: true })
|
|
||||||
.count(`${TableName.Users}.id`)
|
|
||||||
.first();
|
|
||||||
|
|
||||||
const pendingCount = await db<CountResult>(TableName.PendingGroupAddition)
|
|
||||||
.where(`${TableName.PendingGroupAddition}.groupId`, groupId)
|
|
||||||
.count("*")
|
|
||||||
.first();
|
|
||||||
|
|
||||||
return parseInt((directCount?.count as string) || "0", 10) + parseInt((pendingCount?.count as string) || "0", 10);
|
|
||||||
} catch (err) {
|
|
||||||
throw new DatabaseError({ error: err, name: "Count all direct group members" });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// special query
|
// special query
|
||||||
const findAllGroupMembers = async ({
|
const findAllGroupMembers = async ({
|
||||||
orgId,
|
orgId,
|
||||||
@@ -160,7 +129,6 @@ export const groupDALFactory = (db: TDbClient) => {
|
|||||||
const members = await query;
|
const members = await query;
|
||||||
|
|
||||||
return members.map(({ email, username: memberUsername, firstName, lastName, userId, isPartOfGroup }) => ({
|
return members.map(({ email, username: memberUsername, firstName, lastName, userId, isPartOfGroup }) => ({
|
||||||
// TODO: fix type
|
|
||||||
id: userId,
|
id: userId,
|
||||||
email,
|
email,
|
||||||
username: memberUsername,
|
username: memberUsername,
|
||||||
@@ -176,7 +144,6 @@ export const groupDALFactory = (db: TDbClient) => {
|
|||||||
return {
|
return {
|
||||||
findGroups,
|
findGroups,
|
||||||
findByOrgId,
|
findByOrgId,
|
||||||
countGroupMembers,
|
|
||||||
findAllGroupMembers,
|
findAllGroupMembers,
|
||||||
...groupOrm
|
...groupOrm
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,12 +30,9 @@ import { TUserGroupMembershipDALFactory } from "./user-group-membership-dal";
|
|||||||
|
|
||||||
type TGroupServiceFactoryDep = {
|
type TGroupServiceFactoryDep = {
|
||||||
userDAL: Pick<TUserDALFactory, "find" | "findUserEncKeyByUsernameBatch" | "transaction" | "findOne">;
|
userDAL: Pick<TUserDALFactory, "find" | "findUserEncKeyByUsernameBatch" | "transaction" | "findOne">;
|
||||||
groupDAL: Pick<
|
groupDAL: Pick<TGroupDALFactory, "create" | "findOne" | "update" | "delete" | "findAllGroupMembers">;
|
||||||
TGroupDALFactory,
|
|
||||||
"create" | "findOne" | "update" | "delete" | "findAllGroupMembers" | "countGroupMembers"
|
|
||||||
>;
|
|
||||||
groupProjectDAL: Pick<TGroupProjectDALFactory, "find">;
|
groupProjectDAL: Pick<TGroupProjectDALFactory, "find">;
|
||||||
orgDAL: Pick<TOrgDALFactory, "findMembership">;
|
orgDAL: Pick<TOrgDALFactory, "findMembership" | "countAllOrgMembers">;
|
||||||
userGroupMembershipDAL: Pick<
|
userGroupMembershipDAL: Pick<
|
||||||
TUserGroupMembershipDALFactory,
|
TUserGroupMembershipDALFactory,
|
||||||
"findOne" | "delete" | "filterProjectsByUserMembership" | "transaction" | "insertMany" | "find"
|
"findOne" | "delete" | "filterProjectsByUserMembership" | "transaction" | "insertMany" | "find"
|
||||||
@@ -230,12 +227,9 @@ export const groupServiceFactory = ({
|
|||||||
username
|
username
|
||||||
});
|
});
|
||||||
|
|
||||||
const totalCount = await groupDAL.countGroupMembers({
|
const count = await orgDAL.countAllOrgMembers(group.orgId);
|
||||||
orgId: group.orgId,
|
|
||||||
groupId: group.id
|
|
||||||
});
|
|
||||||
|
|
||||||
return { users, totalCount };
|
return { users, totalCount: count };
|
||||||
};
|
};
|
||||||
|
|
||||||
const addUserToGroup = async ({
|
const addUserToGroup = async ({
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => {
|
|||||||
onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.IDENTITY_ACCESS_TOKEN]),
|
onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.IDENTITY_ACCESS_TOKEN]),
|
||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
if (req.auth.actor !== ActorType.USER) return;
|
if (req.auth.actor !== ActorType.USER) return;
|
||||||
|
|
||||||
const users = await server.services.org.findAllOrgMembers(
|
const users = await server.services.org.findAllOrgMembers(
|
||||||
req.permission.id,
|
req.permission.id,
|
||||||
req.params.organizationId,
|
req.params.organizationId,
|
||||||
|
|||||||
@@ -89,6 +89,25 @@ export const orgDALFactory = (db: TDbClient) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const countAllOrgMembers = async (orgId: string) => {
|
||||||
|
try {
|
||||||
|
interface CountResult {
|
||||||
|
count: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const count = await db(TableName.OrgMembership)
|
||||||
|
.where(`${TableName.OrgMembership}.orgId`, orgId)
|
||||||
|
.count("*")
|
||||||
|
.join(TableName.Users, `${TableName.OrgMembership}.userId`, `${TableName.Users}.id`)
|
||||||
|
.where({ isGhost: false })
|
||||||
|
.first();
|
||||||
|
|
||||||
|
return parseInt((count as unknown as CountResult).count || "0", 10);
|
||||||
|
} catch (error) {
|
||||||
|
throw new DatabaseError({ error, name: "Count all org members" });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const findOrgMembersByUsername = async (orgId: string, usernames: string[]) => {
|
const findOrgMembersByUsername = async (orgId: string, usernames: string[]) => {
|
||||||
try {
|
try {
|
||||||
const members = await db(TableName.OrgMembership)
|
const members = await db(TableName.OrgMembership)
|
||||||
@@ -269,6 +288,7 @@ export const orgDALFactory = (db: TDbClient) => {
|
|||||||
...orgOrm,
|
...orgOrm,
|
||||||
findOrgByProjectId,
|
findOrgByProjectId,
|
||||||
findAllOrgMembers,
|
findAllOrgMembers,
|
||||||
|
countAllOrgMembers,
|
||||||
findOrgById,
|
findOrgById,
|
||||||
findAllOrgsByUserId,
|
findAllOrgsByUserId,
|
||||||
ghostUserExists,
|
ghostUserExists,
|
||||||
|
|||||||
+4
-1
@@ -19,7 +19,10 @@ import { UsePopUpState } from "@app/hooks/usePopUp";
|
|||||||
|
|
||||||
const GroupFormSchema = z.object({
|
const GroupFormSchema = z.object({
|
||||||
name: z.string().min(1, "Name cannot be empty").max(50, "Name must be 50 characters or fewer"),
|
name: z.string().min(1, "Name cannot be empty").max(50, "Name must be 50 characters or fewer"),
|
||||||
slug: z.string().min(5, "Slug cannot be empty").max(36, "Slug must be 36 characters or fewer"),
|
slug: z
|
||||||
|
.string()
|
||||||
|
.min(5, "Slug must be at least 5 characters long")
|
||||||
|
.max(36, "Slug must be 36 characters or fewer"),
|
||||||
role: z.string()
|
role: z.string()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user