flagon-io/g1t

public

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t/apps/web/app/routes/workspace/guardrails.tsx

51 lines2,035 bytesCodeBlame
1import { data, useNavigation } from "react-router";
2
3import { RUN_KINDS } from "@g1t/contracts";
4
5import type { Route } from "./+types/guardrails";
6import { GuardrailsForm } from "../../components/guardrails";
7import { settingsFromForm } from "../../lib/guardrails";
8import { page } from "../../lib/meta";
9import { guardrails } from "../../lib/services.server";
10import { assertSameOrigin, getViewer, requireUser, roleIn, unwrap } from "../../lib/session.server";
11
12export function meta({ params, ...args }: Route.MetaArgs) {
13 return page(args, { title: `Guardrails · ${params.owner} · g1t` });
14}
15
16export async function loader({ params, context }: Route.LoaderArgs) {
17 const viewer = getViewer(context);
18 const role = roleIn(viewer, params.owner);
19 if (!role) throw data(null, { status: 404 });
20 const view = await guardrails.getGuardrails(viewer, params.owner);
21 return { view: unwrap(view), owner: role === "owner" };
22}
23
24export async function action({ request, params, context }: Route.ActionArgs) {
25 assertSameOrigin(request);
26 const user = requireUser(context, request);
27 const form = await request.formData();
28 const current = await guardrails.getGuardrails(user, params.owner);
29 if (!current.ok) return { saved: false, error: current.error.message };
30 const settings = settingsFromForm(form, {
31 registries: current.value.registries.map((registry) => registry.id),
32 rules: current.value.rules.map((rule) => rule.id),
33 kinds: RUN_KINDS,
34 });
35 const saved = await guardrails.updateGuardrails(user, params.owner, null, settings);
36 return saved.ok ? { saved: true, error: null } : { saved: false, error: saved.error.message };
37}
38
39export default function WorkspaceGuardrails({ loaderData, actionData }: Route.ComponentProps) {
40 const saving = useNavigation().state === "submitting";
41 return (
42 <GuardrailsForm
43 view={loaderData.view}
44 level="workspace"
45 editable={loaderData.owner}
46 saving={saving}
47 saved={actionData?.saved ?? false}
48 error={actionData?.error}
49 />
50 );
51}