@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.
Files changed (166) hide show
  1. package/README.md +55 -1
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/integration/index.d.ts.map +1 -1
  7. package/dist/integration/index.js +9 -0
  8. package/dist/integration/index.js.map +1 -1
  9. package/dist/integration/options.d.ts +38 -0
  10. package/dist/integration/options.d.ts.map +1 -1
  11. package/dist/integration/options.js +13 -0
  12. package/dist/integration/options.js.map +1 -1
  13. package/dist/providers/null.d.ts +2 -1
  14. package/dist/providers/null.d.ts.map +1 -1
  15. package/dist/providers/null.js +9 -0
  16. package/dist/providers/null.js.map +1 -1
  17. package/dist/providers/types.d.ts +10 -0
  18. package/dist/providers/types.d.ts.map +1 -1
  19. package/dist/providers/types.js.map +1 -1
  20. package/dist/routes/authors.d.ts.map +1 -1
  21. package/dist/routes/authors.js +33 -8
  22. package/dist/routes/authors.js.map +1 -1
  23. package/dist/routes/authz-matrix.d.ts.map +1 -1
  24. package/dist/routes/authz-matrix.js +2 -0
  25. package/dist/routes/authz-matrix.js.map +1 -1
  26. package/dist/routes/context.d.ts +1 -1
  27. package/dist/routes/context.d.ts.map +1 -1
  28. package/dist/routes/context.js.map +1 -1
  29. package/dist/routes/index.d.ts +1 -0
  30. package/dist/routes/index.d.ts.map +1 -1
  31. package/dist/routes/index.js +2 -0
  32. package/dist/routes/index.js.map +1 -1
  33. package/dist/routes/recovery-errors.d.ts +21 -0
  34. package/dist/routes/recovery-errors.d.ts.map +1 -0
  35. package/dist/routes/recovery-errors.js +53 -0
  36. package/dist/routes/recovery-errors.js.map +1 -0
  37. package/dist/routes/surveys.d.ts +12 -0
  38. package/dist/routes/surveys.d.ts.map +1 -0
  39. package/dist/routes/surveys.js +109 -0
  40. package/dist/routes/surveys.js.map +1 -0
  41. package/dist/schema/insights-ingest.d.ts +46 -46
  42. package/dist/surveys/access.d.ts +4 -0
  43. package/dist/surveys/access.d.ts.map +1 -0
  44. package/dist/surveys/access.js +9 -0
  45. package/dist/surveys/access.js.map +1 -0
  46. package/dist/surveys/errors.d.ts +43 -0
  47. package/dist/surveys/errors.d.ts.map +1 -0
  48. package/dist/surveys/errors.js +42 -0
  49. package/dist/surveys/errors.js.map +1 -0
  50. package/dist/surveys/schema.d.ts +939 -0
  51. package/dist/surveys/schema.d.ts.map +1 -0
  52. package/dist/surveys/schema.js +385 -0
  53. package/dist/surveys/schema.js.map +1 -0
  54. package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts +3 -0
  55. package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts.map +1 -0
  56. package/dist/ui/api/surveys/[surveyId]/responses.csv.js +17 -0
  57. package/dist/ui/api/surveys/[surveyId]/responses.csv.js.map +1 -0
  58. package/dist/ui/api/surveys/[surveyId].d.ts +3 -0
  59. package/dist/ui/api/surveys/[surveyId].d.ts.map +1 -0
  60. package/dist/ui/api/surveys/[surveyId].js +17 -0
  61. package/dist/ui/api/surveys/[surveyId].js.map +1 -0
  62. package/dist/ui/client/mount.d.ts.map +1 -1
  63. package/dist/ui/client/mount.js +6 -2
  64. package/dist/ui/client/mount.js.map +1 -1
  65. package/dist/ui/commands.d.ts +5 -1
  66. package/dist/ui/commands.d.ts.map +1 -1
  67. package/dist/ui/commands.js +7 -0
  68. package/dist/ui/commands.js.map +1 -1
  69. package/dist/ui/components/CmsApp.d.ts +2 -0
  70. package/dist/ui/components/CmsApp.d.ts.map +1 -1
  71. package/dist/ui/components/CmsApp.js +14 -3
  72. package/dist/ui/components/CmsApp.js.map +1 -1
  73. package/dist/ui/components/CommandPalette.d.ts +2 -0
  74. package/dist/ui/components/CommandPalette.d.ts.map +1 -1
  75. package/dist/ui/components/CommandPalette.js +1 -1
  76. package/dist/ui/components/CommandPalette.js.map +1 -1
  77. package/dist/ui/components/ShareModal.d.ts +4 -1
  78. package/dist/ui/components/ShareModal.d.ts.map +1 -1
  79. package/dist/ui/components/ShareModal.js +39 -9
  80. package/dist/ui/components/ShareModal.js.map +1 -1
  81. package/dist/ui/components/SharePickers.d.ts +29 -2
  82. package/dist/ui/components/SharePickers.d.ts.map +1 -1
  83. package/dist/ui/components/SharePickers.js +33 -8
  84. package/dist/ui/components/SharePickers.js.map +1 -1
  85. package/dist/ui/components/Sidebar.d.ts +1 -0
  86. package/dist/ui/components/Sidebar.d.ts.map +1 -1
  87. package/dist/ui/components/Sidebar.js +1 -1
  88. package/dist/ui/components/Sidebar.js.map +1 -1
  89. package/dist/ui/hash-router.d.ts +1 -1
  90. package/dist/ui/hash-router.d.ts.map +1 -1
  91. package/dist/ui/hash-router.js +1 -0
  92. package/dist/ui/hash-router.js.map +1 -1
  93. package/dist/ui/nav.d.ts +5 -1
  94. package/dist/ui/nav.d.ts.map +1 -1
  95. package/dist/ui/nav.js +10 -2
  96. package/dist/ui/nav.js.map +1 -1
  97. package/dist/ui/screens/AuthorsScreen.d.ts.map +1 -1
  98. package/dist/ui/screens/AuthorsScreen.js +2 -1
  99. package/dist/ui/screens/AuthorsScreen.js.map +1 -1
  100. package/dist/ui/screens/ContentRoute.d.ts +3 -1
  101. package/dist/ui/screens/ContentRoute.d.ts.map +1 -1
  102. package/dist/ui/screens/ContentRoute.js +3 -3
  103. package/dist/ui/screens/ContentRoute.js.map +1 -1
  104. package/dist/ui/screens/EditorScreen.d.ts +2 -1
  105. package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
  106. package/dist/ui/screens/EditorScreen.js +2 -2
  107. package/dist/ui/screens/EditorScreen.js.map +1 -1
  108. package/dist/ui/screens/LibraryScreen.d.ts +2 -1
  109. package/dist/ui/screens/LibraryScreen.d.ts.map +1 -1
  110. package/dist/ui/screens/LibraryScreen.js +2 -2
  111. package/dist/ui/screens/LibraryScreen.js.map +1 -1
  112. package/dist/ui/screens/SocialShareScreen.d.ts +3 -1
  113. package/dist/ui/screens/SocialShareScreen.d.ts.map +1 -1
  114. package/dist/ui/screens/SocialShareScreen.js +20 -8
  115. package/dist/ui/screens/SocialShareScreen.js.map +1 -1
  116. package/dist/ui/screens/SurveyResponsesScreen.d.ts +28 -0
  117. package/dist/ui/screens/SurveyResponsesScreen.d.ts.map +1 -0
  118. package/dist/ui/screens/SurveyResponsesScreen.js +110 -0
  119. package/dist/ui/screens/SurveyResponsesScreen.js.map +1 -0
  120. package/dist/ui/screens/author-recovery.d.ts +11 -0
  121. package/dist/ui/screens/author-recovery.d.ts.map +1 -0
  122. package/dist/ui/screens/author-recovery.js +18 -0
  123. package/dist/ui/screens/author-recovery.js.map +1 -0
  124. package/dist/ui/screens/registry.d.ts +4 -0
  125. package/dist/ui/screens/registry.d.ts.map +1 -1
  126. package/dist/ui/screens/registry.js +20 -13
  127. package/dist/ui/screens/registry.js.map +1 -1
  128. package/dist/ui/screens/social-share-data.d.ts +23 -2
  129. package/dist/ui/screens/social-share-data.d.ts.map +1 -1
  130. package/dist/ui/screens/social-share-data.js +57 -11
  131. package/dist/ui/screens/social-share-data.js.map +1 -1
  132. package/package.json +1 -1
  133. package/src/index.ts +2 -2
  134. package/src/integration/index.ts +9 -0
  135. package/src/integration/options.ts +15 -0
  136. package/src/providers/null.ts +19 -0
  137. package/src/providers/types.ts +7 -0
  138. package/src/routes/authors.ts +41 -20
  139. package/src/routes/authz-matrix.ts +2 -0
  140. package/src/routes/context.ts +2 -0
  141. package/src/routes/index.ts +6 -0
  142. package/src/routes/recovery-errors.ts +70 -0
  143. package/src/routes/surveys.ts +130 -0
  144. package/src/surveys/access.ts +11 -0
  145. package/src/surveys/errors.ts +51 -0
  146. package/src/surveys/schema.ts +435 -0
  147. package/src/ui/api/surveys/[surveyId]/responses.csv.ts +23 -0
  148. package/src/ui/api/surveys/[surveyId].ts +23 -0
  149. package/src/ui/client/mount.tsx +6 -2
  150. package/src/ui/commands.ts +14 -1
  151. package/src/ui/components/CmsApp.tsx +25 -3
  152. package/src/ui/components/CommandPalette.tsx +2 -1
  153. package/src/ui/components/ShareModal.tsx +102 -19
  154. package/src/ui/components/SharePickers.tsx +76 -27
  155. package/src/ui/components/Sidebar.tsx +10 -2
  156. package/src/ui/hash-router.ts +1 -0
  157. package/src/ui/nav.ts +15 -2
  158. package/src/ui/screens/AuthorsScreen.tsx +7 -2
  159. package/src/ui/screens/ContentRoute.tsx +13 -3
  160. package/src/ui/screens/EditorScreen.tsx +7 -1
  161. package/src/ui/screens/LibraryScreen.tsx +3 -1
  162. package/src/ui/screens/SocialShareScreen.tsx +53 -6
  163. package/src/ui/screens/SurveyResponsesScreen.tsx +271 -0
  164. package/src/ui/screens/author-recovery.ts +32 -0
  165. package/src/ui/screens/registry.tsx +28 -12
  166. 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 === 'author-social' || mode === 'owned-social'
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 === 'youtube' || mode === 'newsletter' ? '' : state.campaign,
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 = (state.mode === 'author-social' || state.mode === 'owned-social') && !state.campaign.trim();
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
- ...(action.author ? { author: action.author } : {}),
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.campaign.trim()) {
225
- return { ok: false, error: 'Campaign is required for author-social.' };
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' → campaign, platform, author, destinationUrl, advanced
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, 'campaign', 'platform', 'author', 'placement', 'boostMode', 'promoCode'];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/cms",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "growth-labs-cms-migrations": "./dist/cli/migrations.js"
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'
@@ -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
 
@@ -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
  }
@@ -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
  }
@@ -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
- await ctx.db
188
- .prepare(
189
- `INSERT INTO authors (id, name, slug, bio, avatar, email, social, created_at, updated_at)
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
- .bind(
193
- id,
194
- parsed.data.name.trim(),
195
- slug,
196
- normalizeNullable(parsed.data.bio),
197
- normalizeNullable(parsed.data.avatar),
198
- normalizeNullable(parsed.data.email),
199
- social,
200
- )
201
- .run()
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
- await ctx.db
271
- .prepare(
272
- `UPDATE authors
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
- .bind(nextName, nextSlug, nextBio, nextAvatar, nextEmail, nextSocial, id)
277
- .run()
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
  // ---------------------------------------------------------------------------
@@ -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
@@ -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
+ }