@growth-labs/cms 0.5.4 → 0.5.6
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/README.md +55 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/index.d.ts.map +1 -1
- package/dist/integration/index.js +9 -0
- package/dist/integration/index.js.map +1 -1
- package/dist/integration/options.d.ts +38 -0
- package/dist/integration/options.d.ts.map +1 -1
- package/dist/integration/options.js +13 -0
- package/dist/integration/options.js.map +1 -1
- package/dist/providers/null.d.ts +2 -1
- package/dist/providers/null.d.ts.map +1 -1
- package/dist/providers/null.js +9 -0
- package/dist/providers/null.js.map +1 -1
- package/dist/providers/types.d.ts +10 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/routes/authors.d.ts.map +1 -1
- package/dist/routes/authors.js +33 -8
- package/dist/routes/authors.js.map +1 -1
- package/dist/routes/authz-matrix.d.ts.map +1 -1
- package/dist/routes/authz-matrix.js +2 -0
- package/dist/routes/authz-matrix.js.map +1 -1
- package/dist/routes/context.d.ts +1 -1
- package/dist/routes/context.d.ts.map +1 -1
- package/dist/routes/context.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/recovery-errors.d.ts +21 -0
- package/dist/routes/recovery-errors.d.ts.map +1 -0
- package/dist/routes/recovery-errors.js +53 -0
- package/dist/routes/recovery-errors.js.map +1 -0
- package/dist/routes/surveys.d.ts +12 -0
- package/dist/routes/surveys.d.ts.map +1 -0
- package/dist/routes/surveys.js +109 -0
- package/dist/routes/surveys.js.map +1 -0
- package/dist/schema/insights-ingest.d.ts +46 -46
- package/dist/surveys/access.d.ts +4 -0
- package/dist/surveys/access.d.ts.map +1 -0
- package/dist/surveys/access.js +9 -0
- package/dist/surveys/access.js.map +1 -0
- package/dist/surveys/errors.d.ts +43 -0
- package/dist/surveys/errors.d.ts.map +1 -0
- package/dist/surveys/errors.js +42 -0
- package/dist/surveys/errors.js.map +1 -0
- package/dist/surveys/schema.d.ts +939 -0
- package/dist/surveys/schema.d.ts.map +1 -0
- package/dist/surveys/schema.js +385 -0
- package/dist/surveys/schema.js.map +1 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts +3 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts.map +1 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.js +17 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.js.map +1 -0
- package/dist/ui/api/surveys/[surveyId].d.ts +3 -0
- package/dist/ui/api/surveys/[surveyId].d.ts.map +1 -0
- package/dist/ui/api/surveys/[surveyId].js +17 -0
- package/dist/ui/api/surveys/[surveyId].js.map +1 -0
- package/dist/ui/client/mount.d.ts.map +1 -1
- package/dist/ui/client/mount.js +6 -2
- package/dist/ui/client/mount.js.map +1 -1
- package/dist/ui/commands.d.ts +5 -1
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +7 -0
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/components/CmsApp.d.ts +2 -0
- package/dist/ui/components/CmsApp.d.ts.map +1 -1
- package/dist/ui/components/CmsApp.js +14 -3
- package/dist/ui/components/CmsApp.js.map +1 -1
- package/dist/ui/components/CommandPalette.d.ts +2 -0
- package/dist/ui/components/CommandPalette.d.ts.map +1 -1
- package/dist/ui/components/CommandPalette.js +1 -1
- package/dist/ui/components/CommandPalette.js.map +1 -1
- package/dist/ui/components/ShareModal.d.ts +4 -1
- package/dist/ui/components/ShareModal.d.ts.map +1 -1
- package/dist/ui/components/ShareModal.js +39 -9
- package/dist/ui/components/ShareModal.js.map +1 -1
- package/dist/ui/components/SharePickers.d.ts +29 -2
- package/dist/ui/components/SharePickers.d.ts.map +1 -1
- package/dist/ui/components/SharePickers.js +33 -8
- package/dist/ui/components/SharePickers.js.map +1 -1
- package/dist/ui/components/Sidebar.d.ts +1 -0
- package/dist/ui/components/Sidebar.d.ts.map +1 -1
- package/dist/ui/components/Sidebar.js +1 -1
- package/dist/ui/components/Sidebar.js.map +1 -1
- package/dist/ui/hash-router.d.ts +1 -1
- package/dist/ui/hash-router.d.ts.map +1 -1
- package/dist/ui/hash-router.js +1 -0
- package/dist/ui/hash-router.js.map +1 -1
- package/dist/ui/nav.d.ts +5 -1
- package/dist/ui/nav.d.ts.map +1 -1
- package/dist/ui/nav.js +10 -2
- package/dist/ui/nav.js.map +1 -1
- package/dist/ui/screens/AuthorsScreen.d.ts.map +1 -1
- package/dist/ui/screens/AuthorsScreen.js +2 -1
- package/dist/ui/screens/AuthorsScreen.js.map +1 -1
- package/dist/ui/screens/ContentRoute.d.ts +3 -1
- package/dist/ui/screens/ContentRoute.d.ts.map +1 -1
- package/dist/ui/screens/ContentRoute.js +3 -3
- package/dist/ui/screens/ContentRoute.js.map +1 -1
- package/dist/ui/screens/EditorScreen.d.ts +2 -1
- package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
- package/dist/ui/screens/EditorScreen.js +2 -2
- package/dist/ui/screens/EditorScreen.js.map +1 -1
- package/dist/ui/screens/LibraryScreen.d.ts +2 -1
- package/dist/ui/screens/LibraryScreen.d.ts.map +1 -1
- package/dist/ui/screens/LibraryScreen.js +2 -2
- package/dist/ui/screens/LibraryScreen.js.map +1 -1
- package/dist/ui/screens/SocialShareScreen.d.ts +3 -1
- package/dist/ui/screens/SocialShareScreen.d.ts.map +1 -1
- package/dist/ui/screens/SocialShareScreen.js +20 -8
- package/dist/ui/screens/SocialShareScreen.js.map +1 -1
- package/dist/ui/screens/SurveyResponsesScreen.d.ts +28 -0
- package/dist/ui/screens/SurveyResponsesScreen.d.ts.map +1 -0
- package/dist/ui/screens/SurveyResponsesScreen.js +110 -0
- package/dist/ui/screens/SurveyResponsesScreen.js.map +1 -0
- package/dist/ui/screens/author-recovery.d.ts +11 -0
- package/dist/ui/screens/author-recovery.d.ts.map +1 -0
- package/dist/ui/screens/author-recovery.js +18 -0
- package/dist/ui/screens/author-recovery.js.map +1 -0
- package/dist/ui/screens/registry.d.ts +4 -0
- package/dist/ui/screens/registry.d.ts.map +1 -1
- package/dist/ui/screens/registry.js +20 -13
- package/dist/ui/screens/registry.js.map +1 -1
- package/dist/ui/screens/social-share-data.d.ts +23 -2
- package/dist/ui/screens/social-share-data.d.ts.map +1 -1
- package/dist/ui/screens/social-share-data.js +57 -11
- package/dist/ui/screens/social-share-data.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/integration/index.ts +9 -0
- package/src/integration/options.ts +15 -0
- package/src/providers/null.ts +19 -0
- package/src/providers/types.ts +7 -0
- package/src/routes/authors.ts +41 -20
- package/src/routes/authz-matrix.ts +2 -0
- package/src/routes/context.ts +2 -0
- package/src/routes/index.ts +6 -0
- package/src/routes/recovery-errors.ts +70 -0
- package/src/routes/surveys.ts +130 -0
- package/src/surveys/access.ts +11 -0
- package/src/surveys/errors.ts +51 -0
- package/src/surveys/schema.ts +435 -0
- package/src/ui/api/surveys/[surveyId]/responses.csv.ts +23 -0
- package/src/ui/api/surveys/[surveyId].ts +23 -0
- package/src/ui/client/mount.tsx +6 -2
- package/src/ui/commands.ts +14 -1
- package/src/ui/components/CmsApp.tsx +25 -3
- package/src/ui/components/CommandPalette.tsx +2 -1
- package/src/ui/components/ShareModal.tsx +102 -19
- package/src/ui/components/SharePickers.tsx +76 -27
- package/src/ui/components/Sidebar.tsx +10 -2
- package/src/ui/hash-router.ts +1 -0
- package/src/ui/nav.ts +15 -2
- package/src/ui/screens/AuthorsScreen.tsx +7 -2
- package/src/ui/screens/ContentRoute.tsx +13 -3
- package/src/ui/screens/EditorScreen.tsx +7 -1
- package/src/ui/screens/LibraryScreen.tsx +3 -1
- package/src/ui/screens/SocialShareScreen.tsx +53 -6
- package/src/ui/screens/SurveyResponsesScreen.tsx +271 -0
- package/src/ui/screens/author-recovery.ts +32 -0
- package/src/ui/screens/registry.tsx +28 -12
- package/src/ui/screens/social-share-data.ts +92 -13
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
* `batchCreateSchema` discriminated union in share-links-batch.ts.
|
|
16
16
|
*/
|
|
17
17
|
export const SHARE_MODES = ['author-social', 'owned-social', 'youtube', 'newsletter'];
|
|
18
|
+
export function requiresCanonicalAuthorRoster(mode, allowInlineAuthorCreation) {
|
|
19
|
+
return mode === 'author-social' && !allowInlineAuthorCreation;
|
|
20
|
+
}
|
|
18
21
|
/**
|
|
19
22
|
* Social platform options.
|
|
20
23
|
* SOURCE OF TRUTH: @growth-labs/analytics src/utils/social.ts SOCIAL_PLATFORMS
|
|
@@ -62,6 +65,45 @@ export const YOUTUBE_BUNDLE_PLACEMENTS = ['description', 'comment', 'bio'];
|
|
|
62
65
|
* SOURCE OF TRUTH: @growth-labs/analytics src/utils/social.ts SocialBoostMode
|
|
63
66
|
*/
|
|
64
67
|
export const BOOST_MODES = ['none', 'paid_direct', 'boosted_existing'];
|
|
68
|
+
export function canonicalAuthorRosterStatus({ enabled, author, authors, loading, error, }) {
|
|
69
|
+
if (!enabled)
|
|
70
|
+
return { blocked: false, kind: 'not-required', message: null };
|
|
71
|
+
const id = author.id?.trim() ?? '';
|
|
72
|
+
const slug = author.slug?.trim().toLowerCase() ?? '';
|
|
73
|
+
const identity = id || slug;
|
|
74
|
+
if (!identity) {
|
|
75
|
+
return {
|
|
76
|
+
blocked: true,
|
|
77
|
+
kind: 'missing-author',
|
|
78
|
+
message: 'No canonical author is linked to this content. Add or publish the author in the Authors screen, then retry.',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (loading) {
|
|
82
|
+
return {
|
|
83
|
+
blocked: true,
|
|
84
|
+
kind: 'loading',
|
|
85
|
+
message: `Checking the synchronized author roster for canonical author ${identity}.`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (error) {
|
|
89
|
+
return {
|
|
90
|
+
blocked: true,
|
|
91
|
+
kind: 'unavailable',
|
|
92
|
+
message: `The author roster could not be verified for canonical author ${identity}. Refresh and retry; sharing is blocked until synchronization can be proven.`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const synchronized = id !== ''
|
|
96
|
+
? authors.some((candidate) => candidate.id === id)
|
|
97
|
+
: authors.some((candidate) => candidate.slug.trim().toLowerCase() === slug);
|
|
98
|
+
if (!synchronized) {
|
|
99
|
+
return {
|
|
100
|
+
blocked: true,
|
|
101
|
+
kind: 'out-of-sync',
|
|
102
|
+
message: `Author roster out of sync for canonical author ${identity}. Publish or synchronize that author in the Authors screen, refresh, and retry.`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return { blocked: false, kind: 'synchronized', message: null };
|
|
106
|
+
}
|
|
65
107
|
// ---------------------------------------------------------------------------
|
|
66
108
|
// initShareForm
|
|
67
109
|
// ---------------------------------------------------------------------------
|
|
@@ -73,9 +115,7 @@ export const BOOST_MODES = ['none', 'paid_direct', 'boosted_existing'];
|
|
|
73
115
|
* `platform` to 'youtube'; all other fields default to empty/false/none.
|
|
74
116
|
*/
|
|
75
117
|
export function initShareForm(mode, prefill) {
|
|
76
|
-
const defaultCampaign = mode === '
|
|
77
|
-
? prefill?.campaign?.trim() || prefill?.contentSlug?.trim() || ''
|
|
78
|
-
: '';
|
|
118
|
+
const defaultCampaign = mode === 'owned-social' ? prefill?.campaign?.trim() || prefill?.contentSlug?.trim() || '' : '';
|
|
79
119
|
const base = {
|
|
80
120
|
mode,
|
|
81
121
|
destinationUrl: prefill?.destinationUrl ?? '',
|
|
@@ -136,21 +176,25 @@ export function shareFormReducer(state, action) {
|
|
|
136
176
|
mode,
|
|
137
177
|
// Mode-specific resets
|
|
138
178
|
platform: mode === 'youtube' ? 'youtube' : mode === 'newsletter' ? '' : '',
|
|
139
|
-
campaign: mode === '
|
|
179
|
+
campaign: mode === 'owned-social'
|
|
180
|
+
? state.campaign || state.contentSlug
|
|
181
|
+
: mode === 'author-social'
|
|
182
|
+
? ''
|
|
183
|
+
: '',
|
|
140
184
|
placements: mode === 'youtube' ? [...YOUTUBE_BUNDLE_PLACEMENTS] : [],
|
|
141
185
|
youtubeVideoId: mode === 'youtube' ? state.youtubeVideoId : '',
|
|
142
186
|
issue: mode === 'newsletter' ? state.issue : '',
|
|
143
187
|
};
|
|
144
188
|
}
|
|
145
189
|
case 'prefill-content': {
|
|
146
|
-
const shouldDefaultCampaign =
|
|
190
|
+
const shouldDefaultCampaign = state.mode === 'owned-social' && !state.campaign.trim();
|
|
147
191
|
return {
|
|
148
192
|
...state,
|
|
149
193
|
destinationUrl: action.destinationUrl,
|
|
150
194
|
contentSlug: action.contentSlug,
|
|
151
195
|
contentType: action.contentType,
|
|
152
196
|
campaign: shouldDefaultCampaign ? action.contentSlug : state.campaign,
|
|
153
|
-
|
|
197
|
+
author: action.author ?? {},
|
|
154
198
|
};
|
|
155
199
|
}
|
|
156
200
|
case 'set-field':
|
|
@@ -221,14 +265,16 @@ export function buildBatchPayloadFrom(state) {
|
|
|
221
265
|
};
|
|
222
266
|
switch (state.mode) {
|
|
223
267
|
case 'author-social': {
|
|
224
|
-
if (!state.
|
|
225
|
-
return {
|
|
268
|
+
if (!refHasContent(state.author)) {
|
|
269
|
+
return {
|
|
270
|
+
ok: false,
|
|
271
|
+
error: 'A canonical author is required for Author Social. Select a synchronized author.',
|
|
272
|
+
};
|
|
226
273
|
}
|
|
227
274
|
const payload = {
|
|
228
275
|
kind: 'author-social',
|
|
229
276
|
...shared,
|
|
230
277
|
platform: state.platform,
|
|
231
|
-
campaign: state.campaign.trim(),
|
|
232
278
|
...(state.placement && state.placement !== 'unknown' ? { placement: state.placement } : {}),
|
|
233
279
|
...(state.boostMode && state.boostMode !== 'none' ? { boostMode: state.boostMode } : {}),
|
|
234
280
|
...(nonEmpty(state.promoCode) ? { promoCode: state.promoCode } : {}),
|
|
@@ -398,7 +444,7 @@ export function toPlainText(output) {
|
|
|
398
444
|
* given mode. The React form renders only these inputs; the request builders
|
|
399
445
|
* read only these fields.
|
|
400
446
|
*
|
|
401
|
-
* 'author-social' →
|
|
447
|
+
* 'author-social' → platform, author, destinationUrl, advanced
|
|
402
448
|
* 'owned-social' → campaign, platform, handle, (optional author), destinationUrl, advanced
|
|
403
449
|
* 'youtube' → youtubeVideoId, placements, (optional handle/author), destinationUrl (NO campaign)
|
|
404
450
|
* 'newsletter' → issue, (optional author/handle), destinationUrl (NO campaign/platform/boostMode)
|
|
@@ -407,7 +453,7 @@ export function relevantFields(mode) {
|
|
|
407
453
|
const shared = ['destinationUrl', 'contentSlug', 'contentType', 'property', 'sourcePath'];
|
|
408
454
|
switch (mode) {
|
|
409
455
|
case 'author-social':
|
|
410
|
-
return [...shared, '
|
|
456
|
+
return [...shared, 'platform', 'author', 'placement', 'boostMode', 'promoCode'];
|
|
411
457
|
case 'owned-social':
|
|
412
458
|
return [
|
|
413
459
|
...shared,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social-share-data.js","sourceRoot":"","sources":["../../../src/ui/screens/social-share-data.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"social-share-data.js","sourceRoot":"","sources":["../../../src/ui/screens/social-share-data.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -34,10 +34,8 @@ export * from './engine/index.js'
|
|
|
34
34
|
|
|
35
35
|
// Injected-provider interfaces + null implementations (spec §3.3).
|
|
36
36
|
export * from './providers/index.js'
|
|
37
|
-
|
|
38
37
|
// Route-layer user types (exported at root for convenience; full routes surface at @growth-labs/cms/routes).
|
|
39
38
|
export type { CmsUser } from './routes/context.js'
|
|
40
|
-
|
|
41
39
|
export {
|
|
42
40
|
type ArticleContentRow,
|
|
43
41
|
type AuthorRow,
|
|
@@ -82,3 +80,5 @@ export {
|
|
|
82
80
|
type WorkspaceMembershipRow,
|
|
83
81
|
type WorkspaceSettingsRow,
|
|
84
82
|
} from './schema/index.js'
|
|
83
|
+
export * from './surveys/errors.js'
|
|
84
|
+
export * from './surveys/schema.js'
|
package/src/integration/index.ts
CHANGED
|
@@ -229,6 +229,15 @@ export default function growthLabsCms(userOptions: CmsIntegrationOptions): Astro
|
|
|
229
229
|
pattern: `${base}/api/analytics`,
|
|
230
230
|
entrypoint: resolveEntrypoint('../ui/api/analytics'),
|
|
231
231
|
})
|
|
232
|
+
// Survey reporting — protected JSON plus CSV, backed by the optional host provider.
|
|
233
|
+
injectRoute({
|
|
234
|
+
pattern: `${base}/api/surveys/[surveyId]`,
|
|
235
|
+
entrypoint: resolveEntrypoint('../ui/api/surveys/[surveyId]'),
|
|
236
|
+
})
|
|
237
|
+
injectRoute({
|
|
238
|
+
pattern: `${base}/api/surveys/[surveyId]/responses.csv`,
|
|
239
|
+
entrypoint: resolveEntrypoint('../ui/api/surveys/[surveyId]/responses.csv'),
|
|
240
|
+
})
|
|
232
241
|
// Calendar
|
|
233
242
|
injectRoute({
|
|
234
243
|
pattern: `${base}/api/calendar`,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
+
import { SurveyIdSchema } from '../surveys/schema.js'
|
|
2
3
|
|
|
3
4
|
const workspaceSchema = z.object({
|
|
4
5
|
id: z.string(),
|
|
@@ -16,6 +17,18 @@ const themeSchema = z
|
|
|
16
17
|
})
|
|
17
18
|
.default({})
|
|
18
19
|
|
|
20
|
+
const socialSharingSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
allowInlineAuthorCreation: z.boolean().default(true),
|
|
23
|
+
})
|
|
24
|
+
.default({})
|
|
25
|
+
|
|
26
|
+
const surveyResultsSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
surveyId: SurveyIdSchema,
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
|
|
19
32
|
export const cmsIntegrationOptionsSchema = z
|
|
20
33
|
.object({
|
|
21
34
|
workspaces: z.array(workspaceSchema).min(1, 'at least one workspace is required'),
|
|
@@ -23,6 +36,8 @@ export const cmsIntegrationOptionsSchema = z
|
|
|
23
36
|
adminBasePath: z.string().default('/admin'),
|
|
24
37
|
searchEnabled: z.boolean().default(true),
|
|
25
38
|
theme: themeSchema,
|
|
39
|
+
socialSharing: socialSharingSchema,
|
|
40
|
+
surveyResults: surveyResultsSchema.optional(),
|
|
26
41
|
})
|
|
27
42
|
.transform((o) => ({ ...o, activeWorkspaceId: o.activeWorkspaceId ?? o.workspaces[0].id }))
|
|
28
43
|
|
package/src/providers/null.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
SeoProvider,
|
|
8
8
|
SettingsProvider,
|
|
9
9
|
SubscriptionsProvider,
|
|
10
|
+
SurveyProvider,
|
|
10
11
|
} from './types.js'
|
|
11
12
|
import { ProviderHttpError } from './types.js'
|
|
12
13
|
|
|
@@ -179,6 +180,23 @@ export const nullSettings: SettingsProvider = {
|
|
|
179
180
|
},
|
|
180
181
|
}
|
|
181
182
|
|
|
183
|
+
export const nullSurveys: SurveyProvider = {
|
|
184
|
+
async getResults() {
|
|
185
|
+
throw new ProviderHttpError(
|
|
186
|
+
503,
|
|
187
|
+
'survey_provider_unavailable',
|
|
188
|
+
'Survey provider not configured',
|
|
189
|
+
)
|
|
190
|
+
},
|
|
191
|
+
async getCsv() {
|
|
192
|
+
throw new ProviderHttpError(
|
|
193
|
+
503,
|
|
194
|
+
'survey_provider_unavailable',
|
|
195
|
+
'Survey provider not configured',
|
|
196
|
+
)
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
|
|
182
200
|
export const nullProviders: CmsProviders = {
|
|
183
201
|
analytics: nullAnalytics,
|
|
184
202
|
subscriptions: nullSubscriptions,
|
|
@@ -186,4 +204,5 @@ export const nullProviders: CmsProviders = {
|
|
|
186
204
|
seo: defaultSeo,
|
|
187
205
|
search: nullSearch,
|
|
188
206
|
settings: nullSettings,
|
|
207
|
+
surveys: nullSurveys,
|
|
189
208
|
}
|
package/src/providers/types.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SeoScoreInput, SeoScoreResult } from '../engine/seo.js'
|
|
2
|
+
import type { SurveyCsvResult, SurveyResults } from '../surveys/schema.js'
|
|
2
3
|
|
|
3
4
|
export type ProviderStatus = 'live' | 'partial' | 'empty'
|
|
4
5
|
export interface ProviderResult<T> {
|
|
@@ -402,6 +403,11 @@ export interface SettingsProvider {
|
|
|
402
403
|
getIntegrations(): Promise<ProviderResult<Record<string, CmsIntegrationStatus | null>>>
|
|
403
404
|
}
|
|
404
405
|
|
|
406
|
+
export interface SurveyProvider {
|
|
407
|
+
getResults(input: { surveyId: string }): Promise<SurveyResults>
|
|
408
|
+
getCsv(input: { surveyId: string }): Promise<SurveyCsvResult>
|
|
409
|
+
}
|
|
410
|
+
|
|
405
411
|
export interface CmsProviders {
|
|
406
412
|
analytics: AnalyticsProvider
|
|
407
413
|
subscriptions: SubscriptionsProvider
|
|
@@ -409,4 +415,5 @@ export interface CmsProviders {
|
|
|
409
415
|
seo: SeoProvider
|
|
410
416
|
search: SearchProvider
|
|
411
417
|
settings: SettingsProvider
|
|
418
|
+
surveys?: SurveyProvider
|
|
412
419
|
}
|
package/src/routes/authors.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { slugify } from '../engine/slug.js'
|
|
|
10
10
|
import type { CmsRouteConfig } from './config.js'
|
|
11
11
|
import { resolveConfig } from './config.js'
|
|
12
12
|
import { json, type RouteContext, requireId } from './context.js'
|
|
13
|
+
import { translateAuthorWriteError } from './recovery-errors.js'
|
|
13
14
|
|
|
14
15
|
// --- publisher-authors.ts helpers (extract) -------------------------------
|
|
15
16
|
|
|
@@ -184,21 +185,31 @@ export function createAuthorRoutes(config: CmsRouteConfig): AuthorRouteHandlers
|
|
|
184
185
|
if (existingId) return json({ error: 'Author id already exists' }, 409)
|
|
185
186
|
|
|
186
187
|
const social = serializeSocialInput(parsed.data.social ?? null)
|
|
187
|
-
|
|
188
|
-
.
|
|
189
|
-
|
|
188
|
+
try {
|
|
189
|
+
await ctx.db
|
|
190
|
+
.prepare(
|
|
191
|
+
`INSERT INTO authors (id, name, slug, bio, avatar, email, social, created_at, updated_at)
|
|
190
192
|
VALUES (?, ?, ?, ?, ?, ?, ?, unixepoch(), unixepoch())`,
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
193
|
+
)
|
|
194
|
+
.bind(
|
|
195
|
+
id,
|
|
196
|
+
parsed.data.name.trim(),
|
|
197
|
+
slug,
|
|
198
|
+
normalizeNullable(parsed.data.bio),
|
|
199
|
+
normalizeNullable(parsed.data.avatar),
|
|
200
|
+
normalizeNullable(parsed.data.email),
|
|
201
|
+
social,
|
|
202
|
+
)
|
|
203
|
+
.run()
|
|
204
|
+
} catch (error) {
|
|
205
|
+
const recovery = translateAuthorWriteError({
|
|
206
|
+
error,
|
|
207
|
+
operation: 'create',
|
|
208
|
+
author: { id, slug },
|
|
209
|
+
})
|
|
210
|
+
if (recovery) return json(recovery.body, recovery.status)
|
|
211
|
+
throw error
|
|
212
|
+
}
|
|
202
213
|
|
|
203
214
|
return json({ id, slug }, 201)
|
|
204
215
|
},
|
|
@@ -267,14 +278,24 @@ export function createAuthorRoutes(config: CmsRouteConfig): AuthorRouteHandlers
|
|
|
267
278
|
? serializeSocialInput(parsed.data.social ?? null)
|
|
268
279
|
: existing.social
|
|
269
280
|
|
|
270
|
-
|
|
271
|
-
.
|
|
272
|
-
|
|
281
|
+
try {
|
|
282
|
+
await ctx.db
|
|
283
|
+
.prepare(
|
|
284
|
+
`UPDATE authors
|
|
273
285
|
SET name = ?, slug = ?, bio = ?, avatar = ?, email = ?, social = ?, updated_at = unixepoch()
|
|
274
286
|
WHERE id = ?`,
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
287
|
+
)
|
|
288
|
+
.bind(nextName, nextSlug, nextBio, nextAvatar, nextEmail, nextSocial, id)
|
|
289
|
+
.run()
|
|
290
|
+
} catch (error) {
|
|
291
|
+
const recovery = translateAuthorWriteError({
|
|
292
|
+
error,
|
|
293
|
+
operation: 'update',
|
|
294
|
+
author: { id, slug: nextSlug },
|
|
295
|
+
})
|
|
296
|
+
if (recovery) return json(recovery.body, recovery.status)
|
|
297
|
+
throw error
|
|
298
|
+
}
|
|
278
299
|
|
|
279
300
|
return json({ id, slug: nextSlug })
|
|
280
301
|
},
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import type { MembershipRecord } from '../engine/members.js'
|
|
22
22
|
import type { CmsRole } from '../schema/types.js'
|
|
23
|
+
import { SURVEY_RESPONSE_ROLES } from '../surveys/access.js'
|
|
23
24
|
import type { Capability, CmsUser, RouteContext } from './context.js'
|
|
24
25
|
import { json } from './context.js'
|
|
25
26
|
|
|
@@ -75,6 +76,7 @@ export const CAPABILITY_MATRIX: Record<Capability, ReadonlySet<CmsRole>> = {
|
|
|
75
76
|
// Complimentary access is an editorial admin action by explicit operator
|
|
76
77
|
// decision; it is not subscriber-PII export or owner-only settings.
|
|
77
78
|
manage_complimentary_access: new Set<CmsRole>(['owner', 'senior_editor', 'editor']),
|
|
79
|
+
view_survey_responses: SURVEY_RESPONSE_ROLES,
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
// ---------------------------------------------------------------------------
|
package/src/routes/context.ts
CHANGED
|
@@ -38,6 +38,8 @@ export type Capability =
|
|
|
38
38
|
// Complimentary access administration. Explicit operator decision: owner,
|
|
39
39
|
// senior_editor, and editor may grant/revoke/retry; contributor/producer may not.
|
|
40
40
|
| 'manage_complimentary_access'
|
|
41
|
+
// Read-only survey reporting. No raw respondent identity is exposed in the screen contract.
|
|
42
|
+
| 'view_survey_responses'
|
|
41
43
|
|
|
42
44
|
export interface CmsUser {
|
|
43
45
|
subject: string
|
package/src/routes/index.ts
CHANGED
|
@@ -163,6 +163,12 @@ export {
|
|
|
163
163
|
type SubscriptionsRouteConfig,
|
|
164
164
|
type SubscriptionsRouteHandlers,
|
|
165
165
|
} from './subscriptions.js'
|
|
166
|
+
// Survey reporting routes — optional storage-neutral provider, protected by role capability.
|
|
167
|
+
export {
|
|
168
|
+
createSurveyRoutes,
|
|
169
|
+
type SurveyRouteConfig,
|
|
170
|
+
type SurveyRouteHandlers,
|
|
171
|
+
} from './surveys.js'
|
|
166
172
|
// Tag management routes — GET /tags, GET /tags?q=, DELETE /tags/:id (P3 Task 9).
|
|
167
173
|
export { createTagRoutes, type TagRouteHandlers } from './tags.js'
|
|
168
174
|
// Topic management over content_items.primary_topic.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export const AUTHOR_RECOVERY_CLASSES = [
|
|
2
|
+
'AUTHOR_SYNC_IDENTITY_CONFLICT',
|
|
3
|
+
'AUTHOR_SYNC_NON_CANONICAL',
|
|
4
|
+
'AUTHOR_SYNC_IMMUTABLE_ID',
|
|
5
|
+
'AUTHOR_SHARE_CAMPAIGN_INVARIANT',
|
|
6
|
+
] as const
|
|
7
|
+
|
|
8
|
+
export type AuthorRecoveryClass = (typeof AUTHOR_RECOVERY_CLASSES)[number]
|
|
9
|
+
|
|
10
|
+
export interface AuthorRecoveryIdentity {
|
|
11
|
+
id: string
|
|
12
|
+
slug: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface AuthorRecoveryBody {
|
|
16
|
+
error: string
|
|
17
|
+
errorClass: AuthorRecoveryClass
|
|
18
|
+
author: AuthorRecoveryIdentity
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function classifyAuthorRecoveryError(error: unknown): AuthorRecoveryClass | null {
|
|
22
|
+
const messages = collectErrorMessages(error)
|
|
23
|
+
for (const errorClass of AUTHOR_RECOVERY_CLASSES) {
|
|
24
|
+
if (messages.some((message) => message.includes(errorClass))) return errorClass
|
|
25
|
+
}
|
|
26
|
+
return null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function translateAuthorWriteError(input: {
|
|
30
|
+
error: unknown
|
|
31
|
+
operation: 'create' | 'update'
|
|
32
|
+
author: AuthorRecoveryIdentity
|
|
33
|
+
}): { status: number; body: AuthorRecoveryBody } | null {
|
|
34
|
+
const errorClass = classifyAuthorRecoveryError(input.error)
|
|
35
|
+
if (!errorClass) return null
|
|
36
|
+
|
|
37
|
+
const body: AuthorRecoveryBody = {
|
|
38
|
+
error: `${errorClass}: canonical author synchronization failed (author id: ${input.author.id}; slug: ${input.author.slug})`,
|
|
39
|
+
errorClass,
|
|
40
|
+
author: input.author,
|
|
41
|
+
}
|
|
42
|
+
console.error('GL_CMS_AUTHOR_SYNC_FAILURE', {
|
|
43
|
+
event: 'author_sync_failure',
|
|
44
|
+
errorClass,
|
|
45
|
+
operation: input.operation,
|
|
46
|
+
authorId: input.author.id,
|
|
47
|
+
authorSlug: input.author.slug,
|
|
48
|
+
})
|
|
49
|
+
return {
|
|
50
|
+
status: errorClass === 'AUTHOR_SYNC_NON_CANONICAL' ? 422 : 409,
|
|
51
|
+
body,
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function collectErrorMessages(error: unknown): string[] {
|
|
56
|
+
const messages: string[] = []
|
|
57
|
+
let current: unknown = error
|
|
58
|
+
const seen = new Set<unknown>()
|
|
59
|
+
while (current && !seen.has(current)) {
|
|
60
|
+
seen.add(current)
|
|
61
|
+
if (current instanceof Error) {
|
|
62
|
+
messages.push(current.message)
|
|
63
|
+
current = current.cause
|
|
64
|
+
} else {
|
|
65
|
+
messages.push(String(current))
|
|
66
|
+
break
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return messages
|
|
70
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { nullProviders } from '../providers/null.js'
|
|
2
|
+
import { type CmsProviders, ProviderHttpError } from '../providers/types.js'
|
|
3
|
+
import {
|
|
4
|
+
SURVEY_ERROR_CODE_HEADER,
|
|
5
|
+
SURVEY_ERROR_DEFINITIONS,
|
|
6
|
+
type SurveyErrorCode,
|
|
7
|
+
surveyErrorBody,
|
|
8
|
+
} from '../surveys/errors.js'
|
|
9
|
+
import { SurveyCsvResultSchema, SurveyIdSchema, SurveyResultsSchema } from '../surveys/schema.js'
|
|
10
|
+
import type { Authz, Capability, RouteContext } from './context.js'
|
|
11
|
+
|
|
12
|
+
export interface SurveyRouteConfig {
|
|
13
|
+
authz: Authz
|
|
14
|
+
providers?: Partial<CmsProviders>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SurveyRouteHandlers {
|
|
18
|
+
results(ctx: RouteContext): Promise<Response>
|
|
19
|
+
csv(ctx: RouteContext): Promise<Response>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function createSurveyRoutes(config: SurveyRouteConfig): SurveyRouteHandlers {
|
|
23
|
+
const providers: CmsProviders = { ...nullProviders, ...(config.providers ?? {}) }
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
async results(ctx) {
|
|
27
|
+
const denied = await requireSurveyAccess(config.authz, ctx)
|
|
28
|
+
if (denied) return withNoStoreAuthFailure(denied)
|
|
29
|
+
const surveyId = parseSurveyId(ctx)
|
|
30
|
+
if (!surveyId) return surveyErrorResponse('survey_invalid_request')
|
|
31
|
+
try {
|
|
32
|
+
const parsed = SurveyResultsSchema.safeParse(
|
|
33
|
+
await providers.surveys?.getResults({ surveyId }),
|
|
34
|
+
)
|
|
35
|
+
if (!parsed.success || parsed.data.survey.id !== surveyId) {
|
|
36
|
+
return surveyErrorResponse('survey_provider_malformed')
|
|
37
|
+
}
|
|
38
|
+
return responseJson(parsed.data)
|
|
39
|
+
} catch (error) {
|
|
40
|
+
return providerFailure(error)
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
async csv(ctx) {
|
|
45
|
+
const denied = await requireSurveyAccess(config.authz, ctx)
|
|
46
|
+
if (denied) return withNoStoreAuthFailure(denied)
|
|
47
|
+
const surveyId = parseSurveyId(ctx)
|
|
48
|
+
if (!surveyId) return surveyErrorResponse('survey_invalid_request')
|
|
49
|
+
try {
|
|
50
|
+
const parsed = SurveyCsvResultSchema.safeParse(
|
|
51
|
+
await providers.surveys?.getCsv({ surveyId }),
|
|
52
|
+
)
|
|
53
|
+
if (!parsed.success) return surveyErrorResponse('survey_provider_malformed')
|
|
54
|
+
return new Response(parsed.data.content, {
|
|
55
|
+
headers: {
|
|
56
|
+
'Cache-Control': 'no-store',
|
|
57
|
+
'Content-Disposition': `attachment; filename="${safeCsvFilename(parsed.data.filename)}"`,
|
|
58
|
+
'Content-Type': 'text/csv; charset=utf-8',
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
} catch (error) {
|
|
62
|
+
return providerFailure(error)
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function requireSurveyAccess(authz: Authz, ctx: RouteContext): Promise<Response | null> {
|
|
69
|
+
if (!authz.requireRole) return surveyErrorResponse('survey_internal_failure')
|
|
70
|
+
return authz.requireRole('view_survey_responses' satisfies Capability, ctx)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parseSurveyId(ctx: RouteContext): string | null {
|
|
74
|
+
const value = ctx.params.surveyId ?? ctx.params.id
|
|
75
|
+
const parsed = SurveyIdSchema.safeParse(value)
|
|
76
|
+
return parsed.success ? parsed.data : null
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function safeCsvFilename(value: string): string {
|
|
80
|
+
const basename =
|
|
81
|
+
value
|
|
82
|
+
.split(/[\\/]/)
|
|
83
|
+
.at(-1)
|
|
84
|
+
?.replace(/[\r\n]/g, '') ?? ''
|
|
85
|
+
const safe = basename
|
|
86
|
+
.replace(/[^A-Za-z0-9._-]+/g, '-')
|
|
87
|
+
.replace(/^\.+/, '')
|
|
88
|
+
.replace(/-+/g, '-')
|
|
89
|
+
.slice(0, 180)
|
|
90
|
+
return safe.endsWith('.csv') ? safe : `${safe || 'survey-responses'}.csv`
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function providerFailure(error: unknown): Response {
|
|
94
|
+
if (error instanceof ProviderHttpError) {
|
|
95
|
+
const mapped = ProviderFailureAllowlist.get(`${error.status}:${error.code}`)
|
|
96
|
+
if (mapped) return surveyErrorResponse(mapped)
|
|
97
|
+
}
|
|
98
|
+
return surveyErrorResponse('survey_upstream_failure')
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const ProviderFailureAllowlist = new Map<string, SurveyErrorCode>([
|
|
102
|
+
['403:survey_forbidden', 'survey_forbidden'],
|
|
103
|
+
['404:survey_not_found', 'survey_not_found'],
|
|
104
|
+
['500:survey_internal_failure', 'survey_internal_failure'],
|
|
105
|
+
['502:survey_upstream_failure', 'survey_upstream_failure'],
|
|
106
|
+
['503:survey_provider_unavailable', 'survey_provider_unavailable'],
|
|
107
|
+
['503:survey_upstream_unavailable', 'survey_upstream_unavailable'],
|
|
108
|
+
])
|
|
109
|
+
|
|
110
|
+
function surveyErrorResponse(code: SurveyErrorCode): Response {
|
|
111
|
+
return responseJson(surveyErrorBody(code), SURVEY_ERROR_DEFINITIONS[code].status, code)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function withNoStoreAuthFailure(response: Response): Response {
|
|
115
|
+
const cloned = response.clone()
|
|
116
|
+
cloned.headers.set('Cache-Control', 'no-store')
|
|
117
|
+
if (cloned.status === 401 || cloned.status === 403) {
|
|
118
|
+
cloned.headers.set(SURVEY_ERROR_CODE_HEADER, 'survey_forbidden')
|
|
119
|
+
}
|
|
120
|
+
return cloned
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function responseJson(body: unknown, status = 200, code?: SurveyErrorCode): Response {
|
|
124
|
+
const headers = new Headers({ 'Cache-Control': 'no-store', 'Content-Type': 'application/json' })
|
|
125
|
+
if (code) headers.set(SURVEY_ERROR_CODE_HEADER, code)
|
|
126
|
+
return new Response(JSON.stringify(body), {
|
|
127
|
+
status,
|
|
128
|
+
headers,
|
|
129
|
+
})
|
|
130
|
+
}
|