attach labels to private resources

This commit is contained in:
Fred KISSIE
2026-05-12 19:58:44 +02:00
parent 91e8a13e59
commit 12b18a3e8c

View File

@@ -17,6 +17,8 @@ import {
resourceLabels, resourceLabels,
resources, resources,
siteLabels, siteLabels,
siteResourceLabels,
siteResources,
sites sites
} from "@server/db"; } from "@server/db";
import response from "@server/lib/response"; import response from "@server/lib/response";
@@ -35,7 +37,8 @@ const paramsSchema = z.strictObject({
const attachLabelBodySchema = z.strictObject({ const attachLabelBodySchema = z.strictObject({
siteId: z.number().int().optional(), siteId: z.number().int().optional(),
resourceId: z.number().int().optional() resourceId: z.number().int().optional(),
siteResourceId: z.number().int().optional()
}); });
export async function attachLabelToItem( export async function attachLabelToItem(
@@ -66,13 +69,13 @@ export async function attachLabelToItem(
); );
} }
const { siteId, resourceId } = parsedBody.data; const { siteId, resourceId, siteResourceId } = parsedBody.data;
if (!siteId && !resourceId) { if (!siteId && !resourceId && !siteResourceId) {
return next( return next(
createHttpError( createHttpError(
HttpCode.BAD_REQUEST, HttpCode.BAD_REQUEST,
"At least one of `siteId` or `resourceId` should be provided." "At least one of `siteId`, `resourceId` or `siteResourceId` should be provided."
) )
); );
} }
@@ -144,11 +147,39 @@ export async function attachLabelToItem(
.onConflictDoNothing(); .onConflictDoNothing();
} }
if (siteResourceId) {
const resourceCount = await db.$count(
resources,
and(
eq(siteResources.siteResourceId, siteResourceId),
eq(siteResources.orgId, orgId)
)
);
if (resourceCount === 0) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`SiteResource with Id ${siteResourceId} doesn't exist.`
)
);
}
// idempotent, calling this endpoint multiple times should attach the label only once
await db
.insert(siteResourceLabels)
.values({
labelId,
siteResourceId
})
.onConflictDoNothing();
}
return response(res, { return response(res, {
data: {}, data: {},
success: true, success: true,
error: false, error: false,
message: "Site Label object created successfully", message: "Label attached successfully",
status: HttpCode.OK status: HttpCode.OK
}); });
} catch (error) { } catch (error) {