Merge dev into fix/log-analytics-adjustments

This commit is contained in:
Fred KISSIE
2025-12-10 03:19:14 +01:00
parent 9db2feff77
commit d490cab48c
555 changed files with 9375 additions and 9287 deletions

View File

@@ -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(
);
}
}

View File

@@ -163,4 +163,3 @@ export async function addRoleToSiteResource(
);
}
}

View File

@@ -132,4 +132,3 @@ export async function addUserToSiteResource(
);
}
}

View File

@@ -106,7 +106,10 @@ export async function deleteSiteResource(
);
}
await rebuildClientAssociationsFromSiteResource(removedSiteResource, trx);
await rebuildClientAssociationsFromSiteResource(
removedSiteResource,
trx
);
});
logger.info(

View File

@@ -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"
)
);
}
}

View File

@@ -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"
)
);
}
}

View File

@@ -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(
);
}
}

View File

@@ -83,4 +83,3 @@ export async function listSiteResourceRoles(
);
}
}

View File

@@ -86,4 +86,3 @@ export async function listSiteResourceUsers(
);
}
}

View File

@@ -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"
)
);
}
}

View File

@@ -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(
);
}
}

View File

@@ -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(
);
}
}

View File

@@ -138,4 +138,3 @@ export async function removeUserFromSiteResource(
);
}
}

View File

@@ -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(
);
}
}

View File

@@ -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);

View File

@@ -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(
);
}
}