Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
},
"dependencies": {
"@aws-sdk/client-s3": "^3.1119.0",
"@getgitops/gitdb": "^0.5.0",
"@getgitops/gitdb": "^0.8.0",
"@google-cloud/storage": "^8.0.1",
"@lucide/svelte": "^1.34.0",
"chart.js": "^4.5.1"
Expand Down
9 changes: 7 additions & 2 deletions src/hooks.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { organizationService } from '$modules/organization';
import { isBootstrapCompleted, refreshBootstrapState } from '$lib/server/bootstrap';
import { startGitDb } from '$lib/server/gitdb';
import { isServerReady, markServerFailed, markServerReady } from '$lib/server/server-ready';
import { runWithActor } from '$lib/server/request-context';

// clone, manifest, sync poll and bootstrap detection run once per process
const serverReady = (async () => {
Expand Down Expand Up @@ -73,7 +74,7 @@ export const handle: Handle = async ({ event, resolve }) => {
if (!isAuthenticated) {
return new Response(null, { status: 401 });
}
return resolve(event);
return runWithActor({ name: 'apikey', email: 'apikey@gitops.local' }, () => resolve(event));
}

const sessionCookie = event.cookies.get('pos_session');
Expand Down Expand Up @@ -114,5 +115,9 @@ export const handle: Handle = async ({ event, resolve }) => {
}
}

return resolve(event);
const actor = {
name: currentUser.username,
email: currentUser.email || `${currentUser.username}@gitops.local`,
};
return runWithActor(actor, () => resolve(event));
};
6 changes: 6 additions & 0 deletions src/lib/components/AppSidebar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,11 @@
href: `/org/${organizationSlug}/settings/server-access-keys`,
icon: KeyRound,
},
{
label: 'Audit',
href: `/org/${organizationSlug}/settings/audit`,
icon: ScrollText,
},
],
},
]
Expand All @@ -242,6 +247,7 @@
},
{ label: 'Users', href: '/cluster-settings/users', icon: Users },
{ label: 'Database', href: '/cluster-settings/database', icon: Database },
{ label: 'Audit Log', href: '/cluster-settings/audit', icon: ScrollText },
],
},
]
Expand Down
50 changes: 50 additions & 0 deletions src/lib/components/AuditFieldValue.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<script lang="ts">
import type { FieldValue } from './audit-summary';

export let value: FieldValue | undefined;
export let tone: 'before' | 'after' | 'plain' = 'plain';

const textTone: Record<'before' | 'after' | 'plain', string> = {
before: 'text-red-600 line-through',
after: 'font-medium text-emerald-700',
plain: 'text-slate-700',
};
</script>

{#if !value}
<span class="text-slate-400">—</span>
{:else if value.kind === 'text'}
<span class={textTone[tone]}>{value.text}</span>
{:else if value.kind === 'flags'}
<div class="flex flex-wrap gap-1.5">
{#each value.flags as flag}
<span
class={`inline-flex items-center rounded-full border px-2 py-0.5 text-[11px] font-medium ${
flag.value
? 'border-emerald-200 bg-emerald-50 text-emerald-700'
: 'border-slate-200 bg-slate-50 text-slate-400 line-through'
}`}
>
{flag.label}
</span>
{/each}
</div>
{:else if value.kind === 'list'}
<div class="flex flex-wrap gap-1.5">
{#each value.items as item}
{@const [scope, action] = item.split(':')}
<span class="inline-flex items-center overflow-hidden rounded-full border border-sky-200 text-[11px] font-medium">
{#if action}
<span class="bg-sky-100 px-2 py-0.5 text-sky-800">{scope}</span>
<span class="bg-sky-50 px-2 py-0.5 text-sky-600">{action}</span>
{:else}
<span class="bg-sky-50 px-2 py-0.5 text-sky-700">{item}</span>
{/if}
</span>
{/each}
</div>
{:else}
<pre
class="max-h-48 overflow-auto rounded bg-slate-900/95 p-2 text-[11px] leading-relaxed text-slate-100"
><code>{JSON.stringify(value.json, null, 2)}</code></pre>
{/if}
Loading
Loading