First frontend

This commit is contained in:
2026-04-30 21:37:21 +02:00
parent c3e98af5b6
commit ac48e03404
16 changed files with 1764 additions and 5 deletions
+56
View File
@@ -0,0 +1,56 @@
import type {
ConsumerWithCalculatedValues,
CreateConsumerInput,
DistributionBoardDto,
ProjectDto,
} from "../types";
async function request<T>(url: string, init?: RequestInit): Promise<T> {
const response = await fetch(url, {
...init,
headers: {
"Content-Type": "application/json",
...init?.headers,
},
});
if (!response.ok) {
const details = await response.text();
throw new Error(details || `Request failed with ${response.status}`);
}
return response.json() as Promise<T>;
}
export function listProjects() {
return request<ProjectDto[]>("/api/projects");
}
export function createProject(name: string) {
return request<ProjectDto>("/api/projects", {
method: "POST",
body: JSON.stringify({ name }),
});
}
export function listDistributionBoards(projectId: string) {
return request<DistributionBoardDto[]>(`/api/projects/${projectId}/distribution-boards`);
}
export function createDistributionBoard(projectId: string, name: string) {
return request<DistributionBoardDto>(`/api/projects/${projectId}/distribution-boards`, {
method: "POST",
body: JSON.stringify({ name }),
});
}
export function listConsumers(projectId: string) {
return request<ConsumerWithCalculatedValues[]>(`/api/consumers/projects/${projectId}`);
}
export function createConsumer(input: CreateConsumerInput) {
return request<ConsumerWithCalculatedValues>("/api/consumers", {
method: "POST",
body: JSON.stringify(input),
});
}