Skip to content

Commit 98dae98

Browse files
committed
feat(api): Implement the /api/projects/:project endpoint
1 parent 26e90d8 commit 98dae98

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * as pages from "./api/pages.ts";
2+
export * as projects from "./api/projects.ts";
23
export * as users from "./api/users.ts";

api/projects.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * as project from "./projects/project.ts";

api/projects/project.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import type {
2+
MemberProject,
3+
NotFoundError,
4+
NotLoggedInError,
5+
NotMemberError,
6+
NotMemberProject,
7+
} from "@cosense/types/rest";
8+
import type { ResponseOfEndpoint } from "../../targeted_response.ts";
9+
import { type BaseOptions, setDefaults } from "../../util.ts";
10+
import { cookie } from "../../rest/auth.ts";
11+
12+
/** Create a request to `GET /api/projects/:project`
13+
*
14+
* @param project - Project name to retrieve information for
15+
* @param options - Additional configuration options
16+
* @returns A {@linkcode Request} object for fetching project data
17+
*/
18+
export const makeGetRequest = <R extends Response | undefined>(
19+
project: string,
20+
options?: BaseOptions<R>,
21+
): Request => {
22+
const { sid, hostName } = setDefaults(options ?? {});
23+
24+
return new Request(
25+
`https://${hostName}/api/projects/${project}`,
26+
sid ? { headers: { Cookie: cookie(sid) } } : undefined,
27+
);
28+
};
29+
30+
/** Get detailed information about a Scrapbox project
31+
*
32+
* This function retrieves detailed information about a project, including its
33+
* access level, settings, and metadata. The returned data type depends on
34+
* whether the user has member access to the project.
35+
*
36+
* @param project - Project name to retrieve information for
37+
* @param options Additional configuration options for the request
38+
* @returns A {@linkcode Response} object containing the project data
39+
*/
40+
export const get = <R extends Response | undefined = Response>(
41+
project: string,
42+
options?: BaseOptions<R>,
43+
): Promise<
44+
ResponseOfEndpoint<{
45+
200: MemberProject | NotMemberProject;
46+
404: NotFoundError;
47+
401: NotLoggedInError;
48+
403: NotMemberError;
49+
}, R>
50+
> =>
51+
setDefaults(options ?? {}).fetch(
52+
makeGetRequest(project, options),
53+
) as Promise<
54+
ResponseOfEndpoint<{
55+
200: MemberProject | NotMemberProject;
56+
404: NotFoundError;
57+
401: NotLoggedInError;
58+
403: NotMemberError;
59+
}, R>
60+
>;

deno.jsonc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
"./unstable-api/pages/project/search/query": "./api/pages/project/search/query.ts",
3131
"./unstable-api/pages/project/search/titles": "./api/pages/project/search/titles.ts",
3232
"./unstable-api/pages/project/title": "./api/pages/project/title.ts",
33+
"./unstable-api/pages/projects": "./api/projects.ts",
34+
"./unstable-api/pages/projects/project": "./api/projects/project.ts",
3335
"./unstable-api/pages/project/title/text": "./api/pages/project/title/text.ts",
3436
"./unstable-api/pages/project/title/icon": "./api/pages/project/title/icon.ts",
3537
"./unstable-api/users": "./api/users.ts",

0 commit comments

Comments
 (0)