feat(log-management): add organization validation for log providers and servers

This commit is contained in:
Mauricio Siu
2026-09-24 01:25:21 -06:00
parent ae0cdc6456
commit b40d8ed505
2 changed files with 41 additions and 39 deletions
@@ -1,9 +1,10 @@
import {
assertLogProvidersBelongToOrg,
assertServerBelongsToOrg,
claimWebServerLogManagement,
createLogProvider,
findLogProviderById,
findLogProvidersByOrganization,
findServerById,
getLogManagementServerStatus,
logProviderAdapters,
removeLogProvider,
@@ -26,44 +27,6 @@ import {
} from "@/server/db/schema";
import { createTRPCRouter, protectedProcedure, withPermission } from "../trpc";
const assertServerBelongsToOrg = async (
serverId: string | undefined,
organizationId: string,
) => {
if (!serverId) return;
const server = await findServerById(serverId);
if (server.organizationId !== organizationId) {
throw new TRPCError({
code: "UNAUTHORIZED",
message: "You are not authorized to access this server",
});
}
};
const assertLogProvidersBelongToOrg = async (
logProviderIds: string[],
organizationId: string,
) => {
const providers = await findLogProvidersByOrganization(organizationId);
const byId = new Map(providers.map((p) => [p.logProviderId, p]));
for (const id of logProviderIds) {
if (!byId.has(id)) {
throw new TRPCError({
code: "UNAUTHORIZED",
message:
"One of the selected log providers is not in this organization",
});
}
}
if (!logProviderIds.some((id) => byId.get(id)?.enabled)) {
throw new TRPCError({
code: "BAD_REQUEST",
message:
"Select at least one enabled log provider — a disabled one ships nothing.",
});
}
};
export const logProviderRouter = createTRPCRouter({
create: withPermission("logProvider", "create")
.input(apiCreateLogProvider)
@@ -3,6 +3,7 @@ import {
type apiCreateLogProvider,
logProvider,
} from "@dokploy/server/db/schema";
import { findServerById } from "@dokploy/server/services/server";
import { TRPCError } from "@trpc/server";
import { and, eq } from "drizzle-orm";
import type { z } from "zod";
@@ -267,3 +268,41 @@ export const sanitizeLogProvider = <
const { endpoint, apiKey, apiSecret, ...rest } = provider;
return rest;
};
export const assertServerBelongsToOrg = async (
serverId: string | undefined,
organizationId: string,
) => {
if (!serverId) return;
const server = await findServerById(serverId);
if (server.organizationId !== organizationId) {
throw new TRPCError({
code: "UNAUTHORIZED",
message: "You are not authorized to access this server",
});
}
};
export const assertLogProvidersBelongToOrg = async (
logProviderIds: string[],
organizationId: string,
) => {
const providers = await findLogProvidersByOrganization(organizationId);
const byId = new Map(providers.map((p) => [p.logProviderId, p]));
for (const id of logProviderIds) {
if (!byId.has(id)) {
throw new TRPCError({
code: "UNAUTHORIZED",
message:
"One of the selected log providers is not in this organization",
});
}
}
if (!logProviderIds.some((id) => byId.get(id)?.enabled)) {
throw new TRPCError({
code: "BAD_REQUEST",
message:
"Select at least one enabled log provider — a disabled one ships nothing.",
});
}
};