mirror of
https://github.com/fosrl/pangolin.git
synced 2026-02-20 11:56:38 +00:00
Merge dev into fix/log-analytics-adjustments
This commit is contained in:
@@ -28,7 +28,8 @@ const addClientToSiteResourceParamsSchema = z
|
||||
registry.registerPath({
|
||||
method: "post",
|
||||
path: "/site-resource/{siteResourceId}/clients/add",
|
||||
description: "Add a single client to a site resource. Clients with a userId cannot be added.",
|
||||
description:
|
||||
"Add a single client to a site resource. Clients with a userId cannot be added.",
|
||||
tags: [OpenAPITags.Resource, OpenAPITags.Client],
|
||||
request: {
|
||||
params: addClientToSiteResourceParamsSchema,
|
||||
@@ -49,7 +50,9 @@ export async function addClientToSiteResource(
|
||||
next: NextFunction
|
||||
): Promise<any> {
|
||||
try {
|
||||
const parsedBody = addClientToSiteResourceBodySchema.safeParse(req.body);
|
||||
const parsedBody = addClientToSiteResourceBodySchema.safeParse(
|
||||
req.body
|
||||
);
|
||||
if (!parsedBody.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -153,4 +156,3 @@ export async function addClientToSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -163,4 +163,3 @@ export async function addRoleToSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -132,4 +132,3 @@ export async function addUserToSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,10 @@ export async function deleteSiteResource(
|
||||
);
|
||||
}
|
||||
|
||||
await rebuildClientAssociationsFromSiteResource(removedSiteResource, trx);
|
||||
await rebuildClientAssociationsFromSiteResource(
|
||||
removedSiteResource,
|
||||
trx
|
||||
);
|
||||
});
|
||||
|
||||
logger.info(
|
||||
|
||||
@@ -11,44 +11,55 @@ import logger from "@server/logger";
|
||||
import { OpenAPITags, registry } from "@server/openApi";
|
||||
|
||||
const getSiteResourceParamsSchema = z.strictObject({
|
||||
siteResourceId: z
|
||||
.string()
|
||||
.optional()
|
||||
.transform((val) => val ? Number(val) : undefined)
|
||||
.pipe(z.int().positive().optional())
|
||||
.optional(),
|
||||
siteId: z.string().transform(Number).pipe(z.int().positive()),
|
||||
niceId: z.string().optional(),
|
||||
orgId: z.string()
|
||||
});
|
||||
siteResourceId: z
|
||||
.string()
|
||||
.optional()
|
||||
.transform((val) => (val ? Number(val) : undefined))
|
||||
.pipe(z.int().positive().optional())
|
||||
.optional(),
|
||||
siteId: z.string().transform(Number).pipe(z.int().positive()),
|
||||
niceId: z.string().optional(),
|
||||
orgId: z.string()
|
||||
});
|
||||
|
||||
async function query(siteResourceId?: number, siteId?: number, niceId?: string, orgId?: string) {
|
||||
async function query(
|
||||
siteResourceId?: number,
|
||||
siteId?: number,
|
||||
niceId?: string,
|
||||
orgId?: string
|
||||
) {
|
||||
if (siteResourceId && siteId && orgId) {
|
||||
const [siteResource] = await db
|
||||
.select()
|
||||
.from(siteResources)
|
||||
.where(and(
|
||||
eq(siteResources.siteResourceId, siteResourceId),
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
))
|
||||
.where(
|
||||
and(
|
||||
eq(siteResources.siteResourceId, siteResourceId),
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
)
|
||||
)
|
||||
.limit(1);
|
||||
return siteResource;
|
||||
} else if (niceId && siteId && orgId) {
|
||||
const [siteResource] = await db
|
||||
.select()
|
||||
.from(siteResources)
|
||||
.where(and(
|
||||
eq(siteResources.niceId, niceId),
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
))
|
||||
.where(
|
||||
and(
|
||||
eq(siteResources.niceId, niceId),
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
)
|
||||
)
|
||||
.limit(1);
|
||||
return siteResource;
|
||||
}
|
||||
}
|
||||
|
||||
export type GetSiteResourceResponse = NonNullable<Awaited<ReturnType<typeof query>>>;
|
||||
export type GetSiteResourceResponse = NonNullable<
|
||||
Awaited<ReturnType<typeof query>>
|
||||
>;
|
||||
|
||||
registry.registerPath({
|
||||
method: "get",
|
||||
@@ -103,10 +114,7 @@ export async function getSiteResource(
|
||||
|
||||
if (!siteResource) {
|
||||
return next(
|
||||
createHttpError(
|
||||
HttpCode.NOT_FOUND,
|
||||
"Site resource not found"
|
||||
)
|
||||
createHttpError(HttpCode.NOT_FOUND, "Site resource not found")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -119,6 +127,11 @@ export async function getSiteResource(
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error("Error getting site resource:", error);
|
||||
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "Failed to get site resource"));
|
||||
return next(
|
||||
createHttpError(
|
||||
HttpCode.INTERNAL_SERVER_ERROR,
|
||||
"Failed to get site resource"
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ import logger from "@server/logger";
|
||||
import { OpenAPITags, registry } from "@server/openApi";
|
||||
|
||||
const listAllSiteResourcesByOrgParamsSchema = z.strictObject({
|
||||
orgId: z.string()
|
||||
});
|
||||
orgId: z.string()
|
||||
});
|
||||
|
||||
const listAllSiteResourcesByOrgQuerySchema = z.object({
|
||||
limit: z
|
||||
@@ -30,7 +30,11 @@ const listAllSiteResourcesByOrgQuerySchema = z.object({
|
||||
});
|
||||
|
||||
export type ListAllSiteResourcesByOrgResponse = {
|
||||
siteResources: (SiteResource & { siteName: string, siteNiceId: string, siteAddress: string | null })[];
|
||||
siteResources: (SiteResource & {
|
||||
siteName: string;
|
||||
siteNiceId: string;
|
||||
siteAddress: string | null;
|
||||
})[];
|
||||
};
|
||||
|
||||
registry.registerPath({
|
||||
@@ -51,7 +55,9 @@ export async function listAllSiteResourcesByOrg(
|
||||
next: NextFunction
|
||||
): Promise<any> {
|
||||
try {
|
||||
const parsedParams = listAllSiteResourcesByOrgParamsSchema.safeParse(req.params);
|
||||
const parsedParams = listAllSiteResourcesByOrgParamsSchema.safeParse(
|
||||
req.params
|
||||
);
|
||||
if (!parsedParams.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -61,7 +67,9 @@ export async function listAllSiteResourcesByOrg(
|
||||
);
|
||||
}
|
||||
|
||||
const parsedQuery = listAllSiteResourcesByOrgQuerySchema.safeParse(req.query);
|
||||
const parsedQuery = listAllSiteResourcesByOrgQuerySchema.safeParse(
|
||||
req.query
|
||||
);
|
||||
if (!parsedQuery.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -108,6 +116,11 @@ export async function listAllSiteResourcesByOrg(
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error("Error listing all site resources by org:", error);
|
||||
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "Failed to list site resources"));
|
||||
return next(
|
||||
createHttpError(
|
||||
HttpCode.INTERNAL_SERVER_ERROR,
|
||||
"Failed to list site resources"
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,9 @@ export async function listSiteResourceClients(
|
||||
next: NextFunction
|
||||
): Promise<any> {
|
||||
try {
|
||||
const parsedParams = listSiteResourceClientsSchema.safeParse(req.params);
|
||||
const parsedParams = listSiteResourceClientsSchema.safeParse(
|
||||
req.params
|
||||
);
|
||||
if (!parsedParams.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -82,4 +84,3 @@ export async function listSiteResourceClients(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,4 +83,3 @@ export async function listSiteResourceRoles(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -86,4 +86,3 @@ export async function listSiteResourceUsers(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@ import logger from "@server/logger";
|
||||
import { OpenAPITags, registry } from "@server/openApi";
|
||||
|
||||
const listSiteResourcesParamsSchema = z.strictObject({
|
||||
siteId: z.string().transform(Number).pipe(z.int().positive()),
|
||||
orgId: z.string()
|
||||
});
|
||||
siteId: z.string().transform(Number).pipe(z.int().positive()),
|
||||
orgId: z.string()
|
||||
});
|
||||
|
||||
const listSiteResourcesQuerySchema = z.object({
|
||||
limit: z
|
||||
@@ -52,7 +52,9 @@ export async function listSiteResources(
|
||||
next: NextFunction
|
||||
): Promise<any> {
|
||||
try {
|
||||
const parsedParams = listSiteResourcesParamsSchema.safeParse(req.params);
|
||||
const parsedParams = listSiteResourcesParamsSchema.safeParse(
|
||||
req.params
|
||||
);
|
||||
if (!parsedParams.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -83,22 +85,19 @@ export async function listSiteResources(
|
||||
.limit(1);
|
||||
|
||||
if (site.length === 0) {
|
||||
return next(
|
||||
createHttpError(
|
||||
HttpCode.NOT_FOUND,
|
||||
"Site not found"
|
||||
)
|
||||
);
|
||||
return next(createHttpError(HttpCode.NOT_FOUND, "Site not found"));
|
||||
}
|
||||
|
||||
// Get site resources
|
||||
const siteResourcesList = await db
|
||||
.select()
|
||||
.from(siteResources)
|
||||
.where(and(
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
))
|
||||
.where(
|
||||
and(
|
||||
eq(siteResources.siteId, siteId),
|
||||
eq(siteResources.orgId, orgId)
|
||||
)
|
||||
)
|
||||
.limit(limit)
|
||||
.offset(offset);
|
||||
|
||||
@@ -111,6 +110,11 @@ export async function listSiteResources(
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error("Error listing site resources:", error);
|
||||
return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "Failed to list site resources"));
|
||||
return next(
|
||||
createHttpError(
|
||||
HttpCode.INTERNAL_SERVER_ERROR,
|
||||
"Failed to list site resources"
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ const removeClientFromSiteResourceParamsSchema = z
|
||||
registry.registerPath({
|
||||
method: "post",
|
||||
path: "/site-resource/{siteResourceId}/clients/remove",
|
||||
description: "Remove a single client from a site resource. Clients with a userId cannot be removed.",
|
||||
description:
|
||||
"Remove a single client from a site resource. Clients with a userId cannot be removed.",
|
||||
tags: [OpenAPITags.Resource, OpenAPITags.Client],
|
||||
request: {
|
||||
params: removeClientFromSiteResourceParamsSchema,
|
||||
@@ -159,4 +160,3 @@ export async function removeClientFromSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ export async function removeRoleFromSiteResource(
|
||||
)
|
||||
);
|
||||
|
||||
await rebuildClientAssociationsFromSiteResource(siteResource, trx);
|
||||
await rebuildClientAssociationsFromSiteResource(siteResource, trx);
|
||||
});
|
||||
|
||||
return response(res, {
|
||||
@@ -168,4 +168,3 @@ export async function removeRoleFromSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -138,4 +138,3 @@ export async function removeUserFromSiteResource(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,9 @@ export async function setSiteResourceClients(
|
||||
|
||||
const { clientIds } = parsedBody.data;
|
||||
|
||||
const parsedParams = setSiteResourceClientsParamsSchema.safeParse(req.params);
|
||||
const parsedParams = setSiteResourceClientsParamsSchema.safeParse(
|
||||
req.params
|
||||
);
|
||||
if (!parsedParams.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -95,9 +97,7 @@ export async function setSiteResourceClients(
|
||||
const clientsWithUsers = await db
|
||||
.select()
|
||||
.from(clients)
|
||||
.where(
|
||||
inArray(clients.clientId, clientIds)
|
||||
);
|
||||
.where(inArray(clients.clientId, clientIds));
|
||||
|
||||
const clientsWithUserId = clientsWithUsers.filter(
|
||||
(client) => client.userId !== null
|
||||
@@ -119,9 +119,12 @@ export async function setSiteResourceClients(
|
||||
.where(eq(clientSiteResources.siteResourceId, siteResourceId));
|
||||
|
||||
if (clientIds.length > 0) {
|
||||
await trx
|
||||
.insert(clientSiteResources)
|
||||
.values(clientIds.map((clientId) => ({ clientId, siteResourceId })));
|
||||
await trx.insert(clientSiteResources).values(
|
||||
clientIds.map((clientId) => ({
|
||||
clientId,
|
||||
siteResourceId
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
await rebuildClientAssociationsFromSiteResource(siteResource, trx);
|
||||
@@ -141,4 +144,3 @@ export async function setSiteResourceClients(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -136,15 +136,19 @@ export async function setSiteResourceRoles(
|
||||
)
|
||||
);
|
||||
} else {
|
||||
await trx.delete(roleSiteResources).where(
|
||||
eq(roleSiteResources.siteResourceId, siteResourceId)
|
||||
);
|
||||
await trx
|
||||
.delete(roleSiteResources)
|
||||
.where(
|
||||
eq(roleSiteResources.siteResourceId, siteResourceId)
|
||||
);
|
||||
}
|
||||
|
||||
if (roleIds.length > 0) {
|
||||
await trx
|
||||
.insert(roleSiteResources)
|
||||
.values(roleIds.map((roleId) => ({ roleId, siteResourceId })));
|
||||
.values(
|
||||
roleIds.map((roleId) => ({ roleId, siteResourceId }))
|
||||
);
|
||||
}
|
||||
|
||||
await rebuildClientAssociationsFromSiteResource(siteResource, trx);
|
||||
|
||||
@@ -63,7 +63,9 @@ export async function setSiteResourceUsers(
|
||||
|
||||
const { userIds } = parsedBody.data;
|
||||
|
||||
const parsedParams = setSiteResourceUsersParamsSchema.safeParse(req.params);
|
||||
const parsedParams = setSiteResourceUsersParamsSchema.safeParse(
|
||||
req.params
|
||||
);
|
||||
if (!parsedParams.success) {
|
||||
return next(
|
||||
createHttpError(
|
||||
@@ -99,7 +101,9 @@ export async function setSiteResourceUsers(
|
||||
if (userIds.length > 0) {
|
||||
await trx
|
||||
.insert(userSiteResources)
|
||||
.values(userIds.map((userId) => ({ userId, siteResourceId })));
|
||||
.values(
|
||||
userIds.map((userId) => ({ userId, siteResourceId }))
|
||||
);
|
||||
}
|
||||
|
||||
await rebuildClientAssociationsFromSiteResource(siteResource, trx);
|
||||
@@ -119,4 +123,3 @@ export async function setSiteResourceUsers(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user