@tekki-forge/runtime-api 0.2.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.d.ts +146 -0
- package/dist/admin.js +256 -0
- package/dist/admin.js.map +1 -0
- package/dist/bootstrap.d.ts +39 -0
- package/dist/bootstrap.js +99 -6
- package/dist/bootstrap.js.map +1 -1
- package/dist/controllers.d.ts +273 -4
- package/dist/controllers.js +157 -7
- package/dist/controllers.js.map +1 -1
- package/dist/dashboard.d.ts +102 -5
- package/dist/dashboard.js +491 -73
- package/dist/dashboard.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.js.map +1 -1
- package/dist/seed.js +10 -0
- package/dist/seed.js.map +1 -1
- package/dist/service.d.ts +3 -0
- package/dist/service.js +15 -2
- package/dist/service.js.map +1 -1
- package/dist/settings.d.ts +88 -0
- package/dist/settings.js +252 -0
- package/dist/settings.js.map +1 -0
- package/dist/site-controller.d.ts +115 -0
- package/dist/site-controller.js +373 -0
- package/dist/site-controller.js.map +1 -0
- package/dist/site.d.ts +410 -0
- package/dist/site.js +1413 -0
- package/dist/site.js.map +1 -0
- package/dist/support.d.ts +175 -0
- package/dist/support.js +251 -0
- package/dist/support.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
import type { ForgeRequestContext } from "./extension.js";
|
|
3
|
+
/** Settings stored in the `system_settings` table, edited by global admins in Administration → System settings. */
|
|
4
|
+
export interface SystemSettings {
|
|
5
|
+
/** Shown instead of the config's `name` in the navigation and the browser tab. */
|
|
6
|
+
appName: string | null;
|
|
7
|
+
/** Where users can write; shown on the Help & support page. */
|
|
8
|
+
supportEmail: string | null;
|
|
9
|
+
/** Banner for everyone; only global admins can write while it is on. */
|
|
10
|
+
maintenance: boolean;
|
|
11
|
+
maintenanceMessage: string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Self-service sign-up. `null` follows `auth.registration` in forge.config.ts; `false` closes it at runtime.
|
|
14
|
+
* It can't be opened when the config disables it (staff-only apps stay closed).
|
|
15
|
+
*/
|
|
16
|
+
registrationOpen: boolean | null;
|
|
17
|
+
/** Role given to people who sign up (apps without organizations; never "admin"). `null`: "user". */
|
|
18
|
+
defaultRole: string | null;
|
|
19
|
+
/** Sender of every email ("Acme <hello@acme.com>"); `null` uses EMAIL_FROM. */
|
|
20
|
+
emailFrom: string | null;
|
|
21
|
+
/** Runtime values of the flags declared in `featureFlags` (missing = the config's default). */
|
|
22
|
+
featureFlags: Record<string, boolean>;
|
|
23
|
+
}
|
|
24
|
+
/** What every visitor may know (served by GET /config). */
|
|
25
|
+
export interface PublicSettings {
|
|
26
|
+
appName: string | null;
|
|
27
|
+
supportEmail: string | null;
|
|
28
|
+
maintenance: {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
message: string | null;
|
|
31
|
+
};
|
|
32
|
+
registration: boolean;
|
|
33
|
+
featureFlags: Record<string, boolean>;
|
|
34
|
+
}
|
|
35
|
+
/** Feature flags for extensions and jobs: `ctx.use<FeatureFlags>("featureFlags")?.enabled("newEditor")`. */
|
|
36
|
+
export interface FeatureFlags {
|
|
37
|
+
enabled(name: string): Promise<boolean>;
|
|
38
|
+
all(): Promise<Record<string, boolean>>;
|
|
39
|
+
}
|
|
40
|
+
export interface EnvironmentCheck {
|
|
41
|
+
key: "email" | "storage" | "redis" | "stripe" | "database";
|
|
42
|
+
ok: boolean;
|
|
43
|
+
/** Short non-secret description, e.g. "SMTP", "S3 bucket forge-uploads", "test mode". */
|
|
44
|
+
detail: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function isGlobalAdminRole(role: string | null | undefined): boolean;
|
|
47
|
+
/** Global admins: the `admin` role on the account itself (not an organization role). */
|
|
48
|
+
export declare function requireGlobalAdmin(ctx: ForgeRequestContext, what?: string): void;
|
|
49
|
+
export declare class SettingsService {
|
|
50
|
+
private readonly app;
|
|
51
|
+
private readonly prisma;
|
|
52
|
+
private cache;
|
|
53
|
+
private loading;
|
|
54
|
+
constructor(app: AppIR, prisma: any);
|
|
55
|
+
private get available();
|
|
56
|
+
private load;
|
|
57
|
+
invalidate(): void;
|
|
58
|
+
all(): Promise<SystemSettings>;
|
|
59
|
+
/** Sign-up is open when the config allows it and no admin closed it. */
|
|
60
|
+
registrationOpen(settings: SystemSettings): boolean;
|
|
61
|
+
publicSettings(): Promise<PublicSettings>;
|
|
62
|
+
/** Roles that may be given on sign-up: app roles except admin; without organizations only (roles are per organization otherwise). */
|
|
63
|
+
assignableDefaultRoles(): string[];
|
|
64
|
+
featureFlags(): FeatureFlags;
|
|
65
|
+
/** Global admins only. Validates every key, writes the changed ones and records each change in the audit log. */
|
|
66
|
+
update(body: unknown, ctx: ForgeRequestContext): Promise<SystemSettings>;
|
|
67
|
+
/** GET/PATCH /admin/settings: stored values, the config defaults they override, assignable roles and the environment. */
|
|
68
|
+
adminView(shared?: Map<string, unknown>): Promise<{
|
|
69
|
+
settings: SystemSettings;
|
|
70
|
+
defaults: {
|
|
71
|
+
appName: string;
|
|
72
|
+
registration: boolean;
|
|
73
|
+
featureFlags: Record<string, boolean>;
|
|
74
|
+
};
|
|
75
|
+
roles: string[];
|
|
76
|
+
environment: EnvironmentCheck[];
|
|
77
|
+
}>;
|
|
78
|
+
/** Read-only status of the services the app depends on (never exposes secrets). */
|
|
79
|
+
environment(env?: NodeJS.ProcessEnv, shared?: Map<string, unknown>): EnvironmentCheck[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Maintenance mode: refuses writes (POST/PUT/PATCH/DELETE) with HTTP 503 unless the caller is a global admin.
|
|
83
|
+
* `path` is relative to the API prefix; `extraExempt` lists plugin raw-body paths (signed webhooks).
|
|
84
|
+
*/
|
|
85
|
+
export declare function maintenanceBlock(settings: SettingsService, method: string, path: string, resolve: () => Promise<ForgeRequestContext>, extraExempt?: string[]): Promise<{
|
|
86
|
+
status: 503;
|
|
87
|
+
message: string;
|
|
88
|
+
} | null>;
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { BadRequestException, ForbiddenException, NotFoundException, UnauthorizedException } from "@nestjs/common";
|
|
2
|
+
const KEYS = ["appName", "supportEmail", "maintenance", "maintenanceMessage", "registrationOpen", "defaultRole", "emailFrom", "featureFlags"];
|
|
3
|
+
const CACHE_MS = 5_000;
|
|
4
|
+
const EMAIL = /^[^\s@<>]+@[^\s@<>]+\.[^\s@<>]+$/;
|
|
5
|
+
/** `hello@acme.com` or `Acme <hello@acme.com>`. */
|
|
6
|
+
const SENDER = /^(?:[^<>\r\n]{1,100}\s)?<?[^\s@<>]+@[^\s@<>]+\.[^\s@<>]+>?$/;
|
|
7
|
+
export function isGlobalAdminRole(role) {
|
|
8
|
+
return (role ?? "").split(",").map((r) => r.trim()).includes("admin");
|
|
9
|
+
}
|
|
10
|
+
/** Global admins: the `admin` role on the account itself (not an organization role). */
|
|
11
|
+
export function requireGlobalAdmin(ctx, what = "this") {
|
|
12
|
+
if (!ctx.principal)
|
|
13
|
+
throw new UnauthorizedException("Sign in to continue");
|
|
14
|
+
if (ctx.apiKey)
|
|
15
|
+
throw new ForbiddenException("API keys cannot use the administration API");
|
|
16
|
+
if (!isGlobalAdminRole(ctx.user?.role))
|
|
17
|
+
throw new ForbiddenException(`Only global administrators can use ${what}`);
|
|
18
|
+
}
|
|
19
|
+
/** Process-wide sender override read by the mailers of @tekki-forge/runtime-auth (kept decoupled through a symbol). */
|
|
20
|
+
const SENDER_SLOT = Symbol.for("forge.emailSender");
|
|
21
|
+
export class SettingsService {
|
|
22
|
+
app;
|
|
23
|
+
prisma;
|
|
24
|
+
cache = null;
|
|
25
|
+
loading = null;
|
|
26
|
+
constructor(app, prisma) {
|
|
27
|
+
this.app = app;
|
|
28
|
+
this.prisma = prisma;
|
|
29
|
+
// Mail goes out with the configured sender; refreshed in the background (never blocks a send).
|
|
30
|
+
globalThis[SENDER_SLOT] = () => {
|
|
31
|
+
if (!this.cache || Date.now() - this.cache.at > CACHE_MS)
|
|
32
|
+
void this.load().catch(() => undefined);
|
|
33
|
+
const from = this.cache?.stored.emailFrom;
|
|
34
|
+
return typeof from === "string" && from ? from : undefined;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
get available() {
|
|
38
|
+
return !!this.prisma?.systemSetting;
|
|
39
|
+
}
|
|
40
|
+
async load() {
|
|
41
|
+
if (this.cache && Date.now() - this.cache.at <= CACHE_MS)
|
|
42
|
+
return this.cache.stored;
|
|
43
|
+
if (!this.available)
|
|
44
|
+
return {};
|
|
45
|
+
this.loading ??= (async () => {
|
|
46
|
+
try {
|
|
47
|
+
const rows = await this.prisma.systemSetting.findMany({ where: { key: { in: [...KEYS] } } });
|
|
48
|
+
const stored = Object.fromEntries(rows.map((r) => [r.key, r.value]));
|
|
49
|
+
this.cache = { at: Date.now(), stored };
|
|
50
|
+
return stored;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Table missing (app not migrated yet): behave as if nothing was set.
|
|
54
|
+
this.cache = { at: Date.now(), stored: {} };
|
|
55
|
+
return {};
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
this.loading = null;
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
return this.loading;
|
|
62
|
+
}
|
|
63
|
+
invalidate() {
|
|
64
|
+
this.cache = null;
|
|
65
|
+
}
|
|
66
|
+
async all() {
|
|
67
|
+
const s = await this.load();
|
|
68
|
+
const str = (v) => (typeof v === "string" && v.trim() ? v : null);
|
|
69
|
+
const flags = this.app.featureFlags ?? {};
|
|
70
|
+
const storedFlags = (s.featureFlags && typeof s.featureFlags === "object" ? s.featureFlags : {});
|
|
71
|
+
return {
|
|
72
|
+
appName: str(s.appName),
|
|
73
|
+
supportEmail: str(s.supportEmail),
|
|
74
|
+
maintenance: s.maintenance === true,
|
|
75
|
+
maintenanceMessage: str(s.maintenanceMessage),
|
|
76
|
+
registrationOpen: typeof s.registrationOpen === "boolean" ? s.registrationOpen : null,
|
|
77
|
+
defaultRole: str(s.defaultRole),
|
|
78
|
+
emailFrom: str(s.emailFrom),
|
|
79
|
+
featureFlags: Object.fromEntries(Object.entries(flags).map(([name, def]) => [name, typeof storedFlags[name] === "boolean" ? storedFlags[name] : def])),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Sign-up is open when the config allows it and no admin closed it. */
|
|
83
|
+
registrationOpen(settings) {
|
|
84
|
+
return this.app.auth.registration && settings.registrationOpen !== false;
|
|
85
|
+
}
|
|
86
|
+
async publicSettings() {
|
|
87
|
+
const s = await this.all();
|
|
88
|
+
return {
|
|
89
|
+
appName: s.appName,
|
|
90
|
+
supportEmail: s.supportEmail,
|
|
91
|
+
maintenance: { enabled: s.maintenance, message: s.maintenanceMessage },
|
|
92
|
+
registration: this.registrationOpen(s),
|
|
93
|
+
featureFlags: s.featureFlags,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Roles that may be given on sign-up: app roles except admin; without organizations only (roles are per organization otherwise). */
|
|
97
|
+
assignableDefaultRoles() {
|
|
98
|
+
return this.app.tenancy.enabled ? [] : this.app.roles.filter((r) => r !== "admin");
|
|
99
|
+
}
|
|
100
|
+
featureFlags() {
|
|
101
|
+
return {
|
|
102
|
+
enabled: async (name) => (await this.all()).featureFlags[name] === true,
|
|
103
|
+
all: async () => (await this.all()).featureFlags,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** Global admins only. Validates every key, writes the changed ones and records each change in the audit log. */
|
|
107
|
+
async update(body, ctx) {
|
|
108
|
+
requireGlobalAdmin(ctx, "system settings");
|
|
109
|
+
if (!this.available)
|
|
110
|
+
throw new NotFoundException("System settings need the system_settings table — run forge generate and forge db migrate");
|
|
111
|
+
if (!body || typeof body !== "object" || Array.isArray(body))
|
|
112
|
+
throw new BadRequestException("Expected an object of settings");
|
|
113
|
+
const input = body;
|
|
114
|
+
const issues = [];
|
|
115
|
+
const next = {};
|
|
116
|
+
const text = (key, max, check) => {
|
|
117
|
+
if (!(key in input))
|
|
118
|
+
return;
|
|
119
|
+
const v = input[key];
|
|
120
|
+
if (v === null || v === "")
|
|
121
|
+
return void (next[key] = null);
|
|
122
|
+
if (typeof v !== "string")
|
|
123
|
+
return void issues.push({ path: key, message: "Must be text" });
|
|
124
|
+
const value = v.trim();
|
|
125
|
+
if (value.length > max)
|
|
126
|
+
return void issues.push({ path: key, message: `At most ${max} characters` });
|
|
127
|
+
const problem = check?.(value);
|
|
128
|
+
if (problem)
|
|
129
|
+
return void issues.push({ path: key, message: problem });
|
|
130
|
+
next[key] = value || null;
|
|
131
|
+
};
|
|
132
|
+
text("appName", 80);
|
|
133
|
+
text("supportEmail", 254, (v) => (EMAIL.test(v) ? null : "Must be an email address"));
|
|
134
|
+
text("maintenanceMessage", 500);
|
|
135
|
+
text("emailFrom", 200, (v) => (SENDER.test(v) ? null : 'Use "name@example.com" or "Name <name@example.com>"'));
|
|
136
|
+
text("defaultRole", 50, (v) => (this.assignableDefaultRoles().includes(v) ? null : `Must be one of: ${this.assignableDefaultRoles().join(", ") || "(none — roles are given per organization)"}`));
|
|
137
|
+
if ("maintenance" in input) {
|
|
138
|
+
if (typeof input.maintenance !== "boolean")
|
|
139
|
+
issues.push({ path: "maintenance", message: "Must be true or false" });
|
|
140
|
+
else
|
|
141
|
+
next.maintenance = input.maintenance;
|
|
142
|
+
}
|
|
143
|
+
if ("registrationOpen" in input) {
|
|
144
|
+
const v = input.registrationOpen;
|
|
145
|
+
if (v !== null && typeof v !== "boolean")
|
|
146
|
+
issues.push({ path: "registrationOpen", message: "Must be true, false or null" });
|
|
147
|
+
else if (v === true && !this.app.auth.registration)
|
|
148
|
+
issues.push({ path: "registrationOpen", message: "Sign-up is disabled in forge.config.ts (auth.registration: false)" });
|
|
149
|
+
else
|
|
150
|
+
next.registrationOpen = v;
|
|
151
|
+
}
|
|
152
|
+
if ("featureFlags" in input) {
|
|
153
|
+
const flags = input.featureFlags;
|
|
154
|
+
const declared = this.app.featureFlags ?? {};
|
|
155
|
+
if (!flags || typeof flags !== "object" || Array.isArray(flags))
|
|
156
|
+
issues.push({ path: "featureFlags", message: "Must be an object of flag names and booleans" });
|
|
157
|
+
else {
|
|
158
|
+
const current = (await this.all()).featureFlags;
|
|
159
|
+
const out = { ...current };
|
|
160
|
+
for (const [name, value] of Object.entries(flags)) {
|
|
161
|
+
if (!(name in declared))
|
|
162
|
+
issues.push({ path: `featureFlags.${name}`, message: "Unknown flag — declare it in featureFlags in forge.config.ts" });
|
|
163
|
+
else if (typeof value !== "boolean")
|
|
164
|
+
issues.push({ path: `featureFlags.${name}`, message: "Must be true or false" });
|
|
165
|
+
else
|
|
166
|
+
out[name] = value;
|
|
167
|
+
}
|
|
168
|
+
next.featureFlags = out;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const key of Object.keys(input))
|
|
172
|
+
if (!KEYS.includes(key))
|
|
173
|
+
issues.push({ path: key, message: "Unknown setting" });
|
|
174
|
+
if (issues.length)
|
|
175
|
+
throw new BadRequestException({ statusCode: 400, error: "Bad Request", message: "Validation failed", issues });
|
|
176
|
+
const before = await this.all();
|
|
177
|
+
const changes = {};
|
|
178
|
+
await this.prisma.$transaction(async (db) => {
|
|
179
|
+
for (const [key, value] of Object.entries(next)) {
|
|
180
|
+
const from = before[key];
|
|
181
|
+
if (JSON.stringify(from ?? null) === JSON.stringify(value ?? null))
|
|
182
|
+
continue;
|
|
183
|
+
changes[key] = { from, to: value };
|
|
184
|
+
if (value === null)
|
|
185
|
+
await db.systemSetting.deleteMany({ where: { key } });
|
|
186
|
+
else
|
|
187
|
+
await db.systemSetting.upsert({ where: { key }, create: { key, value, updatedById: ctx.principal.id }, update: { value, updatedById: ctx.principal.id } });
|
|
188
|
+
await db.auditLog.create({
|
|
189
|
+
data: {
|
|
190
|
+
entity: "SystemSetting",
|
|
191
|
+
recordId: key,
|
|
192
|
+
action: "update",
|
|
193
|
+
userId: ctx.principal.id,
|
|
194
|
+
...(this.app.tenancy.enabled ? { organizationId: null } : {}),
|
|
195
|
+
changes: { [key]: { from: from ?? null, to: value ?? null }, ...(ctx.session?.impersonatedBy ? { _impersonatedBy: ctx.session.impersonatedBy } : {}) },
|
|
196
|
+
ipAddress: ctx.ip ?? null,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
this.invalidate();
|
|
202
|
+
return this.all();
|
|
203
|
+
}
|
|
204
|
+
/** GET/PATCH /admin/settings: stored values, the config defaults they override, assignable roles and the environment. */
|
|
205
|
+
async adminView(shared) {
|
|
206
|
+
return {
|
|
207
|
+
settings: await this.all(),
|
|
208
|
+
defaults: { appName: this.app.name, registration: this.app.auth.registration, featureFlags: this.app.featureFlags ?? {} },
|
|
209
|
+
roles: this.assignableDefaultRoles(),
|
|
210
|
+
environment: this.environment(process.env, shared),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/** Read-only status of the services the app depends on (never exposes secrets). */
|
|
214
|
+
environment(env = process.env, shared) {
|
|
215
|
+
const plugin = (name) => this.app.plugins.some((p) => p.name === name);
|
|
216
|
+
const out = [{ key: "database", ok: true, detail: "PostgreSQL" }];
|
|
217
|
+
out.push(env.SMTP_URL
|
|
218
|
+
? { key: "email", ok: true, detail: "SMTP" }
|
|
219
|
+
: env.RESEND_API_KEY
|
|
220
|
+
? { key: "email", ok: true, detail: "Resend" }
|
|
221
|
+
: { key: "email", ok: false, detail: "console" });
|
|
222
|
+
if (plugin("storage"))
|
|
223
|
+
out.push(env.S3_BUCKET ? { key: "storage", ok: true, detail: `S3 · ${env.S3_BUCKET}` } : { key: "storage", ok: true, detail: `disk · ${env.STORAGE_DIR ?? ".forge-uploads"}` });
|
|
224
|
+
if (plugin("jobs"))
|
|
225
|
+
out.push({ key: "redis", ok: !!env.REDIS_URL && !!shared?.get("jobsQueue"), detail: env.REDIS_URL ? "BullMQ" : "REDIS_URL" });
|
|
226
|
+
if (plugin("payments")) {
|
|
227
|
+
const key = env.STRIPE_SECRET_KEY ?? "";
|
|
228
|
+
out.push({ key: "stripe", ok: !!key && !!env.STRIPE_WEBHOOK_SECRET, detail: !key ? "STRIPE_SECRET_KEY" : !env.STRIPE_WEBHOOK_SECRET ? "STRIPE_WEBHOOK_SECRET" : key.startsWith("sk_live_") ? "live" : "test" });
|
|
229
|
+
}
|
|
230
|
+
return out;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Writes allowed while maintenance mode is on: sign-in, reading notifications, contacting support, the admin API (global admins only anyway). */
|
|
234
|
+
const MAINTENANCE_EXEMPT = [/^\/auth\//, /^\/notifications\/read$/, /^\/admin\//, /^\/support\//];
|
|
235
|
+
/**
|
|
236
|
+
* Maintenance mode: refuses writes (POST/PUT/PATCH/DELETE) with HTTP 503 unless the caller is a global admin.
|
|
237
|
+
* `path` is relative to the API prefix; `extraExempt` lists plugin raw-body paths (signed webhooks).
|
|
238
|
+
*/
|
|
239
|
+
export async function maintenanceBlock(settings, method, path, resolve, extraExempt = []) {
|
|
240
|
+
if (["GET", "HEAD", "OPTIONS"].includes(method.toUpperCase()))
|
|
241
|
+
return null;
|
|
242
|
+
if (MAINTENANCE_EXEMPT.some((re) => re.test(path)) || extraExempt.includes(path))
|
|
243
|
+
return null;
|
|
244
|
+
const s = await settings.all();
|
|
245
|
+
if (!s.maintenance)
|
|
246
|
+
return null;
|
|
247
|
+
const ctx = await resolve().catch(() => null);
|
|
248
|
+
if (ctx && !ctx.apiKey && isGlobalAdminRole(ctx.user?.role))
|
|
249
|
+
return null;
|
|
250
|
+
return { status: 503, message: s.maintenanceMessage ? `Maintenance in progress: ${s.maintenanceMessage}` : "Maintenance in progress — changes are paused for a moment. Please try again later." };
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Request, Response } from "express";
|
|
2
|
+
import type { ForgeRequestContext } from "./extension.js";
|
|
3
|
+
import type { ForgeService } from "./service.js";
|
|
4
|
+
type ForgeRequest = Request & {
|
|
5
|
+
forgeContext?: Promise<ForgeRequestContext>;
|
|
6
|
+
};
|
|
7
|
+
type Q = Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* The public website (`site` in forge.config.ts) under /api/site: rendering, posts, sitemap and forms for visitors,
|
|
10
|
+
* and the Content admin of site editors. Registered before the generic `:resource` routes.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SiteController {
|
|
13
|
+
private readonly forge;
|
|
14
|
+
private readonly site;
|
|
15
|
+
constructor(forge: ForgeService);
|
|
16
|
+
/** 404 before anything else when the app has no website. */
|
|
17
|
+
private ctx;
|
|
18
|
+
/** `?path=/pricing[&preview=1]` — drafts and hidden sections only in preview, for site editors. */
|
|
19
|
+
render(query: Q, req: ForgeRequest): Promise<import("./site.js").SiteRender>;
|
|
20
|
+
posts(query: Q): Promise<{
|
|
21
|
+
data: import("./site.js").SitePostSummary[];
|
|
22
|
+
total: number;
|
|
23
|
+
}>;
|
|
24
|
+
sitemap(): Promise<{
|
|
25
|
+
pages: {
|
|
26
|
+
path: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
}[];
|
|
29
|
+
posts: {
|
|
30
|
+
path: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
}[];
|
|
33
|
+
}>;
|
|
34
|
+
contact(body: unknown, req: ForgeRequest): Promise<{
|
|
35
|
+
ok: true;
|
|
36
|
+
}>;
|
|
37
|
+
newsletter(body: unknown, req: ForgeRequest): Promise<{
|
|
38
|
+
ok: true;
|
|
39
|
+
}>;
|
|
40
|
+
overview(req: ForgeRequest): Promise<{
|
|
41
|
+
pages: import("./site.js").SitePageListItem[];
|
|
42
|
+
conflicts: number;
|
|
43
|
+
messages: {
|
|
44
|
+
new: number;
|
|
45
|
+
};
|
|
46
|
+
subscribers: number;
|
|
47
|
+
storage: boolean;
|
|
48
|
+
payments: boolean;
|
|
49
|
+
blogKinds: {
|
|
50
|
+
post?: string | undefined;
|
|
51
|
+
guide?: string | undefined;
|
|
52
|
+
webinar?: string | undefined;
|
|
53
|
+
"case-study"?: string | undefined;
|
|
54
|
+
};
|
|
55
|
+
}>;
|
|
56
|
+
preview(body: unknown, req: ForgeRequest): Promise<{
|
|
57
|
+
data: (import("./site.js").SectionData | null)[];
|
|
58
|
+
}>;
|
|
59
|
+
createPage(body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
60
|
+
page(id: string, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
61
|
+
updatePage(id: string, body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
62
|
+
deletePage(id: string, req: ForgeRequest): Promise<void>;
|
|
63
|
+
revertPage(id: string, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
64
|
+
addSection(id: string, body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
65
|
+
reorder(id: string, body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePageDetail>;
|
|
66
|
+
updateSection(id: string, body: unknown, req: ForgeRequest): Promise<import("./site.js").SiteSectionDetail>;
|
|
67
|
+
deleteSection(id: string, req: ForgeRequest): Promise<void>;
|
|
68
|
+
revertSection(id: string, req: ForgeRequest): Promise<import("./site.js").SiteSectionDetail>;
|
|
69
|
+
listPosts(query: Q, req: ForgeRequest): Promise<{
|
|
70
|
+
data: import("./site.js").SitePostAdmin[];
|
|
71
|
+
total: number;
|
|
72
|
+
}>;
|
|
73
|
+
createPost(body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePostAdmin>;
|
|
74
|
+
getPost(id: string, req: ForgeRequest): Promise<import("./site.js").SitePostAdmin>;
|
|
75
|
+
updatePost(id: string, body: unknown, req: ForgeRequest): Promise<import("./site.js").SitePostAdmin>;
|
|
76
|
+
deletePost(id: string, req: ForgeRequest): Promise<void>;
|
|
77
|
+
messages(query: Q, req: ForgeRequest): Promise<{
|
|
78
|
+
data: {
|
|
79
|
+
id: any;
|
|
80
|
+
name: any;
|
|
81
|
+
email: any;
|
|
82
|
+
company: any;
|
|
83
|
+
message: any;
|
|
84
|
+
page: any;
|
|
85
|
+
status: any;
|
|
86
|
+
createdAt: string;
|
|
87
|
+
}[];
|
|
88
|
+
total: number;
|
|
89
|
+
}>;
|
|
90
|
+
updateMessage(id: string, body: unknown, req: ForgeRequest): Promise<{
|
|
91
|
+
id: any;
|
|
92
|
+
name: any;
|
|
93
|
+
email: any;
|
|
94
|
+
company: any;
|
|
95
|
+
message: any;
|
|
96
|
+
page: any;
|
|
97
|
+
status: any;
|
|
98
|
+
createdAt: string;
|
|
99
|
+
}>;
|
|
100
|
+
deleteMessage(id: string, req: ForgeRequest): Promise<void>;
|
|
101
|
+
subscribers(query: Q, req: ForgeRequest): Promise<{
|
|
102
|
+
data: {
|
|
103
|
+
id: any;
|
|
104
|
+
email: any;
|
|
105
|
+
status: any;
|
|
106
|
+
source: any;
|
|
107
|
+
createdAt: string;
|
|
108
|
+
updatedAt: string;
|
|
109
|
+
}[];
|
|
110
|
+
total: number;
|
|
111
|
+
}>;
|
|
112
|
+
exportSubscribers(req: ForgeRequest, res: Response): Promise<string>;
|
|
113
|
+
deleteSubscriber(id: string, req: ForgeRequest): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
export {};
|