public
anord
read
Ledger
Why work hard when you can work easier?
Languages
Repository composition by tracked source files.
TypeScript
86%
CSS
10%
SQL
3%
Shell
1%
HTML
0%
Trace
apps/api/src/http/routes/integrations.ts
Trace helps you understand code history line by line. See who changed each line, when it changed, and which commit introduced it.
Author
Date
Commit
Line
Code
1
import { Router } from "express";
2
import { z } from "zod";
3
import { requireAdmin, requireEditor } from "../middleware/auth.js";
4
import {
5
importGitHubDocument,
6
importGoogleDoc,
7
importMarkdownDocuments,
8
listImportJobs,
9
listIntegrations,
10
previewGitHubImport,
11
previewGoogleDocImport,
12
previewMarkdownImports,
13
upsertIntegration
14
} from "../../services/integrations.js";
16
const integrationSchema = z.object({
17
name: z.string().min(2),
18
config: z.record(z.any()),
19
isEnabled: z.boolean()
20
});
22
const importTargetSchema = z.object({
23
spaceId: z.string().uuid(),
24
visibility: z.enum(["public", "internal", "restricted"]),
25
state: z.enum(["draft", "published"]),
26
parentPageId: z.string().uuid().nullable().optional(),
27
allowedRoleKeys: z.array(z.enum(["owner", "admin", "editor", "viewer", "public"])).optional(),
28
allowedGroupIds: z.array(z.string().uuid()).optional()
29
});
31
const markdownPreviewSchema = z.object({
32
files: z.array(
33
z.object({
34
fileName: z.string().min(1),
35
content: z.string().min(1)
36
})
37
).min(1)
38
});
40
const githubSchema = z.object({
41
repo: z.string().min(3),
42
branch: z.string().min(1),
43
path: z.string().min(1)
44
});
46
const googleDocsSchema = z.object({
47
documentId: z.string().min(10)
48
});
50
export const integrationsRouter = Router();
52
integrationsRouter.get("/", requireEditor, async (_req, res) => {
53
return res.json({ integrations: await listIntegrations() });
54
});
56
integrationsRouter.put("/:provider", requireAdmin, async (req, res) => {
57
const provider = z.enum(["github", "google_docs", "markdown_import"]).parse(req.params.provider);
58
const input = integrationSchema.parse(req.body);
59
const integration = await upsertIntegration(provider, input);
60
return res.json({ integration });
61
});
63
integrationsRouter.get("/import-jobs", requireEditor, async (_req, res) => {
64
return res.json({ jobs: await listImportJobs() });
65
});
67
integrationsRouter.post("/markdown/preview", requireEditor, async (req, res) => {
68
const input = markdownPreviewSchema.parse(req.body);
69
return res.json({ documents: previewMarkdownImports(input.files) });
70
});
72
integrationsRouter.post("/markdown/import", requireEditor, async (req, res) => {
73
const input = z.object({
74
files: markdownPreviewSchema.shape.files,
75
target: importTargetSchema
76
}).parse(req.body);
77
const result = await importMarkdownDocuments(input.files, input.target, req.user!.id);
78
return res.status(201).json(result);
79
});
81
integrationsRouter.post("/github/preview", requireEditor, async (req, res) => {
82
const input = githubSchema.parse(req.body);
83
const document = await previewGitHubImport(input.repo, input.branch, input.path);
84
return res.json({ document });
85
});
87
integrationsRouter.post("/github/import", requireEditor, async (req, res) => {
88
const input = z.object({
89
repo: githubSchema.shape.repo,
90
branch: githubSchema.shape.branch,
91
path: githubSchema.shape.path,
92
target: importTargetSchema
93
}).parse(req.body);
94
const result = await importGitHubDocument(input.repo, input.branch, input.path, input.target, req.user!.id);
95
return res.status(201).json(result);
96
});
98
integrationsRouter.post("/google-docs/preview", requireEditor, async (req, res) => {
99
const input = googleDocsSchema.parse(req.body);
100
const document = await previewGoogleDocImport(input.documentId);
101
return res.json({ document });
102
});
104
integrationsRouter.post("/google-docs/import", requireEditor, async (req, res) => {
105
const input = z.object({
106
documentId: googleDocsSchema.shape.documentId,
107
target: importTargetSchema
108
}).parse(req.body);
109
const result = await importGoogleDoc(input.documentId, input.target, req.user!.id);
110
return res.status(201).json(result);
111
});