fix: restore workspace routing contracts
This commit is contained in:
@@ -14,7 +14,10 @@ export type WorkspaceProfileApi = {
|
||||
getProfiles(workspaceId: string): Promise<ProfileSettingsResponse>;
|
||||
};
|
||||
|
||||
async function requestJson<T>(input: RequestInfo | URL, init?: RequestInit): Promise<T> {
|
||||
async function requestJson<T>(
|
||||
input: RequestInfo | URL,
|
||||
init?: RequestInit,
|
||||
): Promise<T> {
|
||||
const response = await fetch(input, init);
|
||||
if (!response.ok) {
|
||||
throw new Error(`request failed: ${response.status}`);
|
||||
@@ -44,7 +47,9 @@ export async function updateWorkspaceMetadataSettings(
|
||||
);
|
||||
}
|
||||
|
||||
export async function fetchProfileSettings(workspaceId: string): Promise<ProfileSettingsResponse> {
|
||||
export async function fetchProfileSettings(
|
||||
workspaceId: string,
|
||||
): Promise<ProfileSettingsResponse> {
|
||||
return await requestJson<ProfileSettingsResponse>(
|
||||
`/api/w/${encodeURIComponent(workspaceId)}/settings/profiles`,
|
||||
);
|
||||
@@ -52,20 +57,12 @@ export async function fetchProfileSettings(workspaceId: string): Promise<Profile
|
||||
|
||||
export function createWorkspaceProfileApi(): WorkspaceProfileApi {
|
||||
return {
|
||||
async getMetadata(workspaceId) {
|
||||
return await requestJson<WorkspaceMetadataSettingsResponse>(
|
||||
`/api/w/${encodeURIComponent(workspaceId)}/settings/metadata`,
|
||||
);
|
||||
},
|
||||
getMetadata: fetchWorkspaceMetadataSettings,
|
||||
async updateMetadata(workspaceId, displayName, expectedRevision) {
|
||||
return await requestJson<WorkspaceMetadataMutationResponse>(
|
||||
`/api/w/${encodeURIComponent(workspaceId)}/settings/metadata`,
|
||||
{
|
||||
method: "PUT",
|
||||
headers: { "content-type": "application/json" },
|
||||
body: JSON.stringify({ display_name: displayName, expected_revision: expectedRevision }),
|
||||
},
|
||||
);
|
||||
return await updateWorkspaceMetadataSettings(workspaceId, {
|
||||
display_name: displayName,
|
||||
revision: expectedRevision,
|
||||
});
|
||||
},
|
||||
getProfiles: fetchProfileSettings,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
declare const Deno: {
|
||||
test(name: string, fn: () => void | Promise<void>): void;
|
||||
};
|
||||
|
||||
import { createWorkspaceProfileApi } from "../src/lib/workspace/settings/profile-api.ts";
|
||||
|
||||
Deno.test("workspace profile API delegates metadata calls to current route contract", async () => {
|
||||
const originalFetch = globalThis.fetch;
|
||||
const requests: Array<{ input: string; init?: RequestInit }> = [];
|
||||
globalThis.fetch = ((input: RequestInfo | URL, init?: RequestInit) => {
|
||||
requests.push({ input: String(input), init });
|
||||
return Promise.resolve(Response.json({
|
||||
workspace_id: "workspace-a",
|
||||
display_name: "Alpha",
|
||||
revision: "revision-2",
|
||||
}));
|
||||
}) as typeof fetch;
|
||||
|
||||
try {
|
||||
const api = createWorkspaceProfileApi();
|
||||
await api.getMetadata("workspace-a");
|
||||
await api.updateMetadata("workspace-a", "Alpha updated", "revision-1");
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
|
||||
if (requests.length !== 2) throw new Error("expected two metadata requests");
|
||||
if (
|
||||
requests.some((request) => request.input.includes("/settings/metadata"))
|
||||
) {
|
||||
throw new Error("obsolete metadata endpoint was used");
|
||||
}
|
||||
if (
|
||||
requests.some((request) => !request.input.endsWith("/settings/workspace"))
|
||||
) {
|
||||
throw new Error("current Workspace settings endpoint was not used");
|
||||
}
|
||||
const updateBody = JSON.parse(String(requests[1].init?.body));
|
||||
if (
|
||||
updateBody.display_name !== "Alpha updated" ||
|
||||
updateBody.revision !== "revision-1" ||
|
||||
"expected_revision" in updateBody
|
||||
) {
|
||||
throw new Error(`unexpected update payload: ${JSON.stringify(updateBody)}`);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user