core/apps/webapp/app/routes/api.v1.ingestion-rules.$id.tsx

85 lines
2.3 KiB
TypeScript

import { json } from "@remix-run/node";
import { z } from "zod";
import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server";
import { prisma } from "~/db.server";
import { logger } from "~/services/logger.service";
const ParamsSchema = z.object({
id: z.string(),
});
const { action, loader } = createActionApiRoute(
{
params: ParamsSchema,
allowJWT: true,
authorization: {
action: "manage",
},
corsStrategy: "all",
},
async ({ params, authentication, request }) => {
try {
const user = await prisma.user.findUnique({
where: { id: authentication.userId },
include: { Workspace: true },
});
if (!user?.Workspace) {
throw new Error("User workspace not found");
}
if (request.method === "DELETE") {
logger.log("Deleting ingestion rule", { ruleId: params.id, userId: authentication.userId });
// Soft delete by setting deleted timestamp
const rule = await prisma.ingestionRule.update({
where: {
id: params.id,
workspaceId: user.Workspace.id, // Ensure user can only delete their workspace rules
},
data: {
deleted: new Date(),
},
});
return json({
success: true,
message: "Rule deleted successfully",
ruleId: rule.id,
});
} else if (request.method === "GET") {
// Get single rule
const rule = await prisma.ingestionRule.findFirst({
where: {
id: params.id,
workspaceId: user.Workspace.id,
deleted: null,
},
select: {
id: true,
name: true,
text: true,
source: true,
isActive: true,
createdAt: true,
updatedAt: true,
},
});
if (!rule) {
return json({ success: false, message: "Rule not found" }, { status: 404 });
}
return json({ success: true, rule });
}
return json({ success: false, message: "Method not supported" }, { status: 405 });
} catch (error) {
logger.error("Failed to manage ingestion rule", { error, ruleId: params.id });
throw error;
}
},
);
export { action, loader };