Pārlūkot izejas kodu

feat: add secrets api

Thomas Zhang 2 mēneši atpakaļ
vecāks
revīzija
be624c5002
2 mainītis faili ar 110 papildinājumiem un 0 dzēšanām
  1. 65 0
      src/lib/api/secrets.ts
  2. 45 0
      src/lib/stores/secrets.svelte.ts

+ 65 - 0
src/lib/api/secrets.ts

@@ -0,0 +1,65 @@
+import { resolve } from '$app/paths';
+
+import type { Secret } from '$lib/types/entities';
+
+import { handleResponse } from './types';
+
+const list = (workspaceId: string, fetch = globalThis.fetch): Promise<Secret[]> =>
+	fetch(
+		resolve('/api/workspaces/[workspaceId]/[resource=resource]', {
+			workspaceId,
+			resource: 'secrets',
+		}),
+	).then(handleResponse<Secret[]>);
+
+const get = (workspaceId: string, id: string, fetch = globalThis.fetch): Promise<Secret> =>
+	fetch(
+		resolve('/api/workspaces/[workspaceId]/[resource=resource]/[id]', {
+			workspaceId,
+			resource: 'secrets',
+			id,
+		}),
+	).then(handleResponse<Secret>);
+
+const create = (workspaceId: string, secret: Secret, fetch = globalThis.fetch): Promise<Secret> =>
+	fetch(
+		resolve('/api/workspaces/[workspaceId]/[resource=resource]', {
+			workspaceId,
+			resource: 'secrets',
+		}),
+		{
+			method: 'POST',
+			headers: { 'Content-Type': 'application/json' },
+			body: JSON.stringify(secret),
+		},
+	).then(handleResponse<Secret>);
+
+const update = (workspaceId: string, secret: Secret, fetch = globalThis.fetch): Promise<Secret> =>
+	fetch(
+		resolve('/api/workspaces/[workspaceId]/[resource=resource]/[id]', {
+			workspaceId,
+			resource: 'secrets',
+			id: secret.id,
+		}),
+		{
+			method: 'PUT',
+			headers: { 'Content-Type': 'application/json' },
+			body: JSON.stringify(secret),
+		},
+	).then(handleResponse<Secret>);
+
+const remove = (workspaceId: string, id: string, fetch = globalThis.fetch): Promise<void> =>
+	fetch(
+		resolve('/api/workspaces/[workspaceId]/[resource=resource]/[id]', {
+			workspaceId,
+			resource: 'secrets',
+			id,
+		}),
+		{
+			method: 'DELETE',
+		},
+	).then(async (res) => {
+		if (!res.ok) await handleResponse<void>(res);
+	});
+
+export { create, get, list, remove, update };

+ 45 - 0
src/lib/stores/secrets.svelte.ts

@@ -0,0 +1,45 @@
+import * as secretsApi from '$lib/api/secrets';
+import { ResourceStore } from '$lib/stores/resources.svelte';
+import type { Secret } from '$lib/types/entities';
+
+class SecretsStore extends ResourceStore<Secret, undefined> {
+	constructor() {
+		super('Secret', [
+			{
+				group: '',
+				version: 'v1',
+				resources: 'secrets',
+			},
+		]);
+	}
+
+	protected resourceHref(id: string) {
+		return `/resources/secrets/${id}`;
+	}
+
+	protected apiGet(workspaceId: string, id: string) {
+		return secretsApi.get(workspaceId, id);
+	}
+
+	protected apiGetStatus(workspaceId: string, id: string) {
+		return Promise.resolve(undefined);
+	}
+
+	protected apiCreate(workspaceId: string, secret: Secret) {
+		return secretsApi.create(workspaceId, secret);
+	}
+
+	protected apiUpdate(workspaceId: string, secret: Secret) {
+		return secretsApi.update(workspaceId, secret);
+	}
+
+	protected apiDelete(workspaceId: string, id: string) {
+		return secretsApi.remove(workspaceId, id);
+	}
+
+	protected onStatusChange(id: string, status: undefined, notify = true): void {}
+}
+
+const secretsStore = new SecretsStore();
+
+export { secretsStore };