convex-cms 0.0.3 → 0.0.5-alpha.0

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 (142) hide show
  1. package/README.md +109 -13
  2. package/admin-dist/nitro.json +1 -1
  3. package/admin-dist/public/assets/{CmsEmptyState-CRswfTzk.js → CmsEmptyState-CiMQwSQV.js} +2 -2
  4. package/admin-dist/public/assets/{CmsPageHeader-CirpXndm.js → CmsPageHeader-ohOq0luT.js} +1 -1
  5. package/admin-dist/public/assets/{CmsStatusBadge-CbEUpQu-.js → CmsStatusBadge-BdNf0V9v.js} +1 -1
  6. package/admin-dist/public/assets/CmsSurface-CWup6Jh7.js +1 -0
  7. package/admin-dist/public/assets/{CmsToolbar-BI2nZOXp.js → CmsToolbar-cEBlCHa3.js} +1 -1
  8. package/admin-dist/public/assets/{ContentEntryEditor-CBeCyK_m.js → ContentEntryEditor-BY5ypfUs.js} +1 -1
  9. package/admin-dist/public/assets/{ErrorState-BIVaWmom.js → ErrorState-C4nJ-ml4.js} +1 -1
  10. package/admin-dist/public/assets/{TaxonomyFilter-ChaY6Y_x.js → TaxonomyFilter-BgE_SR_O.js} +1 -1
  11. package/admin-dist/public/assets/{_contentTypeId-DQ8k_Rvw.js → _contentTypeId-DtZectcC.js} +1 -1
  12. package/admin-dist/public/assets/{_entryId-CKU_glsK.js → _entryId-BpSmrfAm.js} +1 -1
  13. package/admin-dist/public/assets/alert-Bf2l8kxw.js +1 -0
  14. package/admin-dist/public/assets/{badge-hvUOzpVZ.js → badge-qPrc4AUM.js} +1 -1
  15. package/admin-dist/public/assets/{circle-check-big-CF_pR17r.js → circle-check-big-Dgozy3vV.js} +1 -1
  16. package/admin-dist/public/assets/{command-DU82cJlt.js → command-QOmNhlb0.js} +1 -1
  17. package/admin-dist/public/assets/content-OEBGlxg1.js +1 -0
  18. package/admin-dist/public/assets/content-types-CjQliqVV.js +2 -0
  19. package/admin-dist/public/assets/{globals-CS6BZ0zp.css → globals-hAmgC66w.css} +1 -1
  20. package/admin-dist/public/assets/index-BH_ECMhv.js +1 -0
  21. package/admin-dist/public/assets/{label-KNtpL71g.js → label-DCsUdvFh.js} +1 -1
  22. package/admin-dist/public/assets/{link-2-Bw2aI4V4.js → link-2-Czw1N61H.js} +1 -1
  23. package/admin-dist/public/assets/{list-sYepHjt_.js → list-DtCsXj8-.js} +1 -1
  24. package/admin-dist/public/assets/{main-CKj5yfEi.js → main-CXgkZMhe.js} +3 -3
  25. package/admin-dist/public/assets/{media-Bkrkffm7.js → media-DTJ3-ViE.js} +1 -1
  26. package/admin-dist/public/assets/{new._contentTypeId-C3LstjNs.js → new._contentTypeId-CoTDxKzf.js} +1 -1
  27. package/admin-dist/public/assets/{plus-DUn8v_Xf.js → plus-xCFJK0RC.js} +1 -1
  28. package/admin-dist/public/assets/{rotate-ccw-DJEoHcRI.js → rotate-ccw-DIqK63wY.js} +1 -1
  29. package/admin-dist/public/assets/scroll-area-B-yrE66a.js +1 -0
  30. package/admin-dist/public/assets/{search-MuAUDJKR.js → search-CbCbboeU.js} +1 -1
  31. package/admin-dist/public/assets/select-Co3TZFJb.js +1 -0
  32. package/admin-dist/public/assets/settings-BspTTv_o.js +1 -0
  33. package/admin-dist/public/assets/switch-CfavASmR.js +1 -0
  34. package/admin-dist/public/assets/tabs-CN5s5u2W.js +1 -0
  35. package/admin-dist/public/assets/tanstack-adapter-npeE3RdY.js +1 -0
  36. package/admin-dist/public/assets/taxonomies-CgG46fIF.js +1 -0
  37. package/admin-dist/public/assets/{textarea-BTy7nwzR.js → textarea-BJ0XFZpT.js} +1 -1
  38. package/admin-dist/public/assets/trash-B3daldm5.js +1 -0
  39. package/admin-dist/public/assets/{triangle-alert-E52Vfeuh.js → triangle-alert-BZRcqsUg.js} +1 -1
  40. package/admin-dist/public/assets/useBreadcrumbLabel-DwZlwvFF.js +1 -0
  41. package/admin-dist/public/assets/{usePermissions-Basjs9BT.js → usePermissions-C1JQhfqb.js} +1 -1
  42. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +7 -0
  43. package/admin-dist/server/_ssr/{badge-6BsP37vG.mjs → CmsButton-B45JAKR1.mjs} +33 -33
  44. package/admin-dist/server/_ssr/{CmsEmptyState-DU7-7-mV.mjs → CmsEmptyState-D_BQFAVR.mjs} +2 -2
  45. package/admin-dist/server/_ssr/{CmsPageHeader-CseW0AHm.mjs → CmsPageHeader-CrUZA59A.mjs} +1 -1
  46. package/admin-dist/server/_ssr/{CmsStatusBadge-B_pi4KCp.mjs → CmsStatusBadge-B-sj6yaj.mjs} +2 -2
  47. package/admin-dist/server/_ssr/CmsSurface-DKJZhpjk.mjs +44 -0
  48. package/admin-dist/server/_ssr/{CmsToolbar-X75ex6ek.mjs → CmsToolbar-ByaW5iXf.mjs} +2 -2
  49. package/admin-dist/server/_ssr/{ContentEntryEditor-CepusRsA.mjs → ContentEntryEditor-D3_Jb1dq.mjs} +11 -11
  50. package/admin-dist/server/_ssr/{TaxonomyFilter-Bwrq0-cz.mjs → TaxonomyFilter-BRJkuCtA.mjs} +4 -4
  51. package/admin-dist/server/_ssr/{_contentTypeId-BqYKEcLr.mjs → _contentTypeId-B9kA6CaM.mjs} +11 -11
  52. package/admin-dist/server/_ssr/{_entryId-CRfnqeDf.mjs → _entryId-BddcMkZN.mjs} +14 -14
  53. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dd7AmelK.mjs +4 -0
  54. package/admin-dist/server/_ssr/{command-fy8epIKf.mjs → command-CGtVr8Gb.mjs} +1 -1
  55. package/admin-dist/server/_ssr/{content-B5RhL7uW.mjs → content-D1tbeOd0.mjs} +201 -86
  56. package/admin-dist/server/_ssr/{content-types-BIOqCQYN.mjs → content-types-BZqY_BER.mjs} +279 -103
  57. package/admin-dist/server/_ssr/{index-DHSHDPt1.mjs → index-BIdq4xaC.mjs} +88 -17
  58. package/admin-dist/server/_ssr/index.mjs +2 -2
  59. package/admin-dist/server/_ssr/{label-C8Dko1j7.mjs → label-T-QNKAr6.mjs} +1 -1
  60. package/admin-dist/server/_ssr/{media-CSx3XttC.mjs → media-C-xqjBrl.mjs} +40 -40
  61. package/admin-dist/server/_ssr/{new._contentTypeId-DzanEZQM.mjs → new._contentTypeId-DWic9cRq.mjs} +13 -13
  62. package/admin-dist/server/_ssr/{router-DDWcF-kt.mjs → router-D1BMAMJT.mjs} +11 -11
  63. package/admin-dist/server/_ssr/{scroll-area-bjPYwhXN.mjs → scroll-area-C0pic_WA.mjs} +1 -1
  64. package/admin-dist/server/_ssr/{select-BUhDDf4T.mjs → select-CqmuN2F6.mjs} +1 -1
  65. package/admin-dist/server/_ssr/{settings-DAsxnw2q.mjs → settings-CAkncGGV.mjs} +211 -129
  66. package/admin-dist/server/_ssr/{switch-BgyRtQ1Z.mjs → switch-CgmuJkT9.mjs} +1 -1
  67. package/admin-dist/server/_ssr/{tabs-DzMdRB1A.mjs → tabs-CnMj0aRy.mjs} +5 -3
  68. package/admin-dist/server/_ssr/tanstack-adapter-BXZrMauE.mjs +119 -0
  69. package/admin-dist/server/_ssr/{taxonomies-C8j8g5Q5.mjs → taxonomies-thl3BfVm.mjs} +168 -68
  70. package/admin-dist/server/_ssr/{textarea-9jNeYJSc.mjs → textarea-4K5OJgeh.mjs} +1 -1
  71. package/admin-dist/server/_ssr/{trash-DYMxwhZB.mjs → trash-B40Gx5zP.mjs} +206 -86
  72. package/admin-dist/server/_ssr/{useBreadcrumbLabel-FNSAr2Ha.mjs → useBreadcrumbLabel-rn-fL4zV.mjs} +1 -1
  73. package/admin-dist/server/_ssr/{usePermissions-BJGGahrJ.mjs → usePermissions-CKeM6_Vw.mjs} +1 -1
  74. package/admin-dist/server/index.mjs +194 -180
  75. package/dist/cli/commands/init.d.ts +6 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +156 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/index.js +6 -0
  80. package/dist/cli/index.js.map +1 -1
  81. package/dist/client/admin-config.d.ts +2 -2
  82. package/dist/client/admin-config.js +2 -2
  83. package/dist/client/adminApi.d.ts +1877 -1851
  84. package/dist/client/adminApi.d.ts.map +1 -1
  85. package/dist/client/adminApi.js +649 -629
  86. package/dist/client/adminApi.js.map +1 -1
  87. package/dist/client/agentTools.d.ts +7 -17
  88. package/dist/client/agentTools.d.ts.map +1 -1
  89. package/dist/client/agentTools.js +4 -4
  90. package/dist/client/index.d.ts +4 -4
  91. package/dist/client/index.d.ts.map +1 -1
  92. package/dist/client/index.js +4 -4
  93. package/dist/client/index.js.map +1 -1
  94. package/dist/client/schema/codegen.d.ts +2 -2
  95. package/dist/client/schema/codegen.d.ts.map +1 -1
  96. package/dist/client/schema/codegen.js +3 -3
  97. package/dist/client/schema/codegen.js.map +1 -1
  98. package/dist/client/schema/defineContentType.d.ts +3 -3
  99. package/dist/client/schema/defineContentType.js +3 -3
  100. package/dist/client/schema/index.d.ts +7 -7
  101. package/dist/client/schema/index.d.ts.map +1 -1
  102. package/dist/client/schema/index.js +5 -5
  103. package/dist/client/schema/index.js.map +1 -1
  104. package/dist/client/schema/schemaDrift.d.ts +1 -1
  105. package/dist/client/schema/schemaDrift.js +1 -1
  106. package/dist/client/schema/typedClient.d.ts +2 -2
  107. package/dist/client/schema/typedClient.js +2 -2
  108. package/dist/client/schema/types.d.ts +1 -1
  109. package/dist/client/schema/types.js +1 -1
  110. package/dist/client/wrapper.d.ts +108 -65
  111. package/dist/client/wrapper.d.ts.map +1 -1
  112. package/dist/client/wrapper.js +22 -22
  113. package/dist/client/wrapper.js.map +1 -1
  114. package/dist/component/convex.config.d.ts +2 -2
  115. package/dist/component/convex.config.js +2 -2
  116. package/dist/component/index.d.ts +1 -1
  117. package/dist/component/index.js +1 -1
  118. package/dist/component/lib/ragContentChunker.d.ts +1 -1
  119. package/dist/component/lib/ragContentChunker.js +1 -1
  120. package/dist/component/roles.d.ts +1 -1
  121. package/dist/component/roles.js +1 -1
  122. package/dist/react/index.d.ts +2 -2
  123. package/dist/react/index.d.ts.map +1 -1
  124. package/dist/react/index.js +13 -7
  125. package/dist/react/index.js.map +1 -1
  126. package/dist/test.d.ts +2 -2
  127. package/dist/test.js +2 -2
  128. package/package.json +31 -11
  129. package/admin-dist/public/assets/alert-BXjTqrwQ.js +0 -1
  130. package/admin-dist/public/assets/content-_LXl3pp7.js +0 -1
  131. package/admin-dist/public/assets/content-types-KjxaXGxY.js +0 -2
  132. package/admin-dist/public/assets/index-DNGIZHL-.js +0 -1
  133. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +0 -1
  134. package/admin-dist/public/assets/select-BD29IXCI.js +0 -1
  135. package/admin-dist/public/assets/settings-DmMyn_6A.js +0 -1
  136. package/admin-dist/public/assets/switch-h3Rrnl5i.js +0 -1
  137. package/admin-dist/public/assets/tabs-imc8h-Dp.js +0 -1
  138. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +0 -1
  139. package/admin-dist/public/assets/trash-SAWKZZHv.js +0 -1
  140. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +0 -1
  141. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +0 -4
  142. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +0 -92
@@ -13,14 +13,47 @@
13
13
  * @example
14
14
  * ```typescript
15
15
  * // convex/admin.ts
16
- * import { defineAdminAPI } from "@convex-cms/core";
16
+ * import { defineAdminAPI } from "convex-cms";
17
17
  * import { components } from "./_generated/api";
18
18
  *
19
19
  * export const {
20
- * contentTypes,
21
- * entries,
22
- * media,
23
- * stats,
20
+ * // Content Types
21
+ * listContentTypes,
22
+ * getContentType,
23
+ * createContentType,
24
+ * updateContentType,
25
+ * deleteContentType,
26
+ * // Entries
27
+ * listEntries,
28
+ * getEntry,
29
+ * createEntry,
30
+ * updateEntry,
31
+ * publishEntry,
32
+ * unpublishEntry,
33
+ * deleteEntry,
34
+ * duplicateEntry,
35
+ * scheduleEntry,
36
+ * cancelScheduledEntry,
37
+ * getScheduledEntries,
38
+ * // Media
39
+ * listMediaAssets,
40
+ * getMediaAsset,
41
+ * createMediaAsset,
42
+ * updateMediaAsset,
43
+ * deleteMediaAsset,
44
+ * restoreMediaAsset,
45
+ * moveMediaAssets,
46
+ * listMediaFolders,
47
+ * getMediaFolder,
48
+ * getMediaFolderTree,
49
+ * createMediaFolder,
50
+ * updateMediaFolder,
51
+ * moveMediaFolder,
52
+ * deleteMediaFolder,
53
+ * restoreMediaFolder,
54
+ * generateUploadUrl,
55
+ * // Stats
56
+ * getDashboardStats,
24
57
  * } = defineAdminAPI(components.convexCms, {
25
58
  * auth: async (ctx, operation) => {
26
59
  * // Optional: validate user has admin access
@@ -57,7 +90,7 @@ const paginationOptsValidator = v.object({
57
90
  * @example
58
91
  * ```typescript
59
92
  * // convex/admin.ts
60
- * import { defineAdminAPI } from "@convex-cms/core";
93
+ * import { defineAdminAPI } from "convex-cms";
61
94
  * import { components } from "./_generated/api";
62
95
  *
63
96
  * export const { contentTypes, entries, media, stats } = defineAdminAPI(
@@ -78,639 +111,626 @@ export function defineAdminAPI(component, options = {}) {
78
111
  // =========================================================================
79
112
  // Content Types
80
113
  // =========================================================================
81
- contentTypes: {
82
- list: queryGeneric({
83
- args: {
84
- isActive: v.optional(v.boolean()),
85
- },
86
- returns: v.any(),
87
- handler: async (ctx, args) => {
88
- await checkAuth(ctx, { type: "contentTypes.list" });
89
- // Returns paginated result: { page, continueCursor, isDone }
90
- return await ctx.runQuery(component.contentTypes.list, {
91
- isActive: args.isActive,
92
- });
93
- },
94
- }),
95
- get: queryGeneric({
96
- args: {
97
- id: v.optional(v.string()),
98
- name: v.optional(v.string()),
99
- },
100
- returns: v.union(v.any(), v.null()),
101
- handler: async (ctx, args) => {
102
- await checkAuth(ctx, { type: "contentTypes.get", id: args.id ?? "" });
103
- return await ctx.runQuery(component.contentTypes.get, {
104
- id: args.id,
105
- name: args.name,
106
- });
107
- },
108
- }),
109
- create: mutationGeneric({
110
- args: {
111
- name: v.string(),
112
- displayName: v.string(),
113
- fields: v.array(fieldDefinitionValidator),
114
- description: v.optional(v.string()),
115
- icon: v.optional(v.string()),
116
- singleton: v.optional(v.boolean()),
117
- slugField: v.optional(v.string()),
118
- titleField: v.optional(v.string()),
119
- sortOrder: v.optional(v.number()),
120
- /** Required for audit tracking - the user ID creating this content type */
121
- createdBy: v.string(),
122
- },
123
- returns: v.any(),
124
- handler: async (ctx, args) => {
125
- await checkAuth(ctx, { type: "contentTypes.create" });
126
- return await ctx.runMutation(component.contentTypeMutations.createContentType, {
127
- name: args.name,
128
- displayName: args.displayName,
129
- fields: args.fields,
130
- description: args.description,
131
- icon: args.icon,
132
- singleton: args.singleton,
133
- slugField: args.slugField,
134
- titleField: args.titleField,
135
- sortOrder: args.sortOrder,
136
- createdBy: args.createdBy,
137
- });
138
- },
139
- }),
140
- update: mutationGeneric({
141
- args: {
142
- id: v.string(),
143
- displayName: v.optional(v.string()),
144
- fields: v.optional(v.array(fieldDefinitionValidator)),
145
- description: v.optional(v.string()),
146
- icon: v.optional(v.string()),
147
- singleton: v.optional(v.boolean()),
148
- slugField: v.optional(v.string()),
149
- titleField: v.optional(v.string()),
150
- sortOrder: v.optional(v.number()),
151
- isActive: v.optional(v.boolean()),
152
- updatedBy: v.optional(v.string()),
153
- },
154
- returns: v.any(),
155
- handler: async (ctx, args) => {
156
- await checkAuth(ctx, { type: "contentTypes.update", id: args.id });
157
- return await ctx.runMutation(component.contentTypeMutations.updateContentType, {
158
- id: args.id,
159
- displayName: args.displayName,
160
- fields: args.fields,
161
- description: args.description,
162
- icon: args.icon,
163
- singleton: args.singleton,
164
- slugField: args.slugField,
165
- titleField: args.titleField,
166
- sortOrder: args.sortOrder,
167
- isActive: args.isActive,
168
- updatedBy: args.updatedBy,
169
- });
170
- },
171
- }),
172
- delete: mutationGeneric({
173
- args: {
174
- id: v.string(),
175
- cascade: v.optional(v.boolean()),
176
- hardDelete: v.optional(v.boolean()),
177
- deletedBy: v.optional(v.string()),
178
- },
179
- returns: v.any(),
180
- handler: async (ctx, args) => {
181
- await checkAuth(ctx, { type: "contentTypes.delete", id: args.id });
182
- return await ctx.runMutation(component.contentTypeMutations.deleteContentType, {
183
- id: args.id,
184
- cascade: args.cascade,
185
- hardDelete: args.hardDelete,
186
- deletedBy: args.deletedBy,
187
- });
188
- },
189
- }),
190
- },
114
+ listContentTypes: queryGeneric({
115
+ args: {
116
+ isActive: v.optional(v.boolean()),
117
+ },
118
+ returns: v.any(),
119
+ handler: async (ctx, args) => {
120
+ await checkAuth(ctx, { type: "listContentTypes" });
121
+ return await ctx.runQuery(component.contentTypes.list, {
122
+ isActive: args.isActive,
123
+ });
124
+ },
125
+ }),
126
+ getContentType: queryGeneric({
127
+ args: {
128
+ id: v.optional(v.string()),
129
+ name: v.optional(v.string()),
130
+ },
131
+ returns: v.union(v.any(), v.null()),
132
+ handler: async (ctx, args) => {
133
+ await checkAuth(ctx, { type: "getContentType", id: args.id ?? "" });
134
+ return await ctx.runQuery(component.contentTypes.get, {
135
+ id: args.id,
136
+ name: args.name,
137
+ });
138
+ },
139
+ }),
140
+ createContentType: mutationGeneric({
141
+ args: {
142
+ name: v.string(),
143
+ displayName: v.string(),
144
+ fields: v.array(fieldDefinitionValidator),
145
+ description: v.optional(v.string()),
146
+ icon: v.optional(v.string()),
147
+ singleton: v.optional(v.boolean()),
148
+ slugField: v.optional(v.string()),
149
+ titleField: v.optional(v.string()),
150
+ sortOrder: v.optional(v.number()),
151
+ createdBy: v.string(),
152
+ },
153
+ returns: v.any(),
154
+ handler: async (ctx, args) => {
155
+ await checkAuth(ctx, { type: "createContentType" });
156
+ return await ctx.runMutation(component.contentTypeMutations.createContentType, {
157
+ name: args.name,
158
+ displayName: args.displayName,
159
+ fields: args.fields,
160
+ description: args.description,
161
+ icon: args.icon,
162
+ singleton: args.singleton,
163
+ slugField: args.slugField,
164
+ titleField: args.titleField,
165
+ sortOrder: args.sortOrder,
166
+ createdBy: args.createdBy,
167
+ });
168
+ },
169
+ }),
170
+ updateContentType: mutationGeneric({
171
+ args: {
172
+ id: v.string(),
173
+ displayName: v.optional(v.string()),
174
+ fields: v.optional(v.array(fieldDefinitionValidator)),
175
+ description: v.optional(v.string()),
176
+ icon: v.optional(v.string()),
177
+ singleton: v.optional(v.boolean()),
178
+ slugField: v.optional(v.string()),
179
+ titleField: v.optional(v.string()),
180
+ sortOrder: v.optional(v.number()),
181
+ isActive: v.optional(v.boolean()),
182
+ updatedBy: v.optional(v.string()),
183
+ },
184
+ returns: v.any(),
185
+ handler: async (ctx, args) => {
186
+ await checkAuth(ctx, { type: "updateContentType", id: args.id });
187
+ return await ctx.runMutation(component.contentTypeMutations.updateContentType, {
188
+ id: args.id,
189
+ displayName: args.displayName,
190
+ fields: args.fields,
191
+ description: args.description,
192
+ icon: args.icon,
193
+ singleton: args.singleton,
194
+ slugField: args.slugField,
195
+ titleField: args.titleField,
196
+ sortOrder: args.sortOrder,
197
+ isActive: args.isActive,
198
+ updatedBy: args.updatedBy,
199
+ });
200
+ },
201
+ }),
202
+ deleteContentType: mutationGeneric({
203
+ args: {
204
+ id: v.string(),
205
+ cascade: v.optional(v.boolean()),
206
+ hardDelete: v.optional(v.boolean()),
207
+ deletedBy: v.optional(v.string()),
208
+ },
209
+ returns: v.any(),
210
+ handler: async (ctx, args) => {
211
+ await checkAuth(ctx, { type: "deleteContentType", id: args.id });
212
+ return await ctx.runMutation(component.contentTypeMutations.deleteContentType, {
213
+ id: args.id,
214
+ cascade: args.cascade,
215
+ hardDelete: args.hardDelete,
216
+ deletedBy: args.deletedBy,
217
+ });
218
+ },
219
+ }),
191
220
  // =========================================================================
192
221
  // Content Entries
193
222
  // =========================================================================
194
- entries: {
195
- list: queryGeneric({
196
- args: {
197
- contentTypeId: v.optional(v.string()),
198
- status: v.optional(contentStatusValidator),
199
- search: v.optional(v.string()),
200
- locale: v.optional(v.string()),
201
- paginationOpts: paginationOptsValidator,
202
- },
203
- returns: v.any(),
204
- handler: async (ctx, args) => {
205
- await checkAuth(ctx, {
206
- type: "entries.list",
207
- contentTypeId: args.contentTypeId ?? "",
208
- });
209
- return await ctx.runQuery(component.contentEntries.list, {
210
- contentTypeId: args.contentTypeId,
211
- status: args.status,
212
- search: args.search,
213
- locale: args.locale,
214
- paginationOpts: args.paginationOpts,
215
- });
216
- },
217
- }),
218
- get: queryGeneric({
219
- args: {
220
- id: v.string(),
221
- },
222
- returns: v.union(v.any(), v.null()),
223
- handler: async (ctx, args) => {
224
- await checkAuth(ctx, { type: "entries.get", id: args.id });
225
- return await ctx.runQuery(component.contentEntries.get, {
226
- id: args.id,
227
- });
228
- },
229
- }),
230
- create: mutationGeneric({
231
- args: {
232
- contentTypeId: v.string(),
233
- data: v.any(),
234
- slug: v.optional(v.string()),
235
- status: v.optional(contentStatusValidator),
236
- locale: v.optional(v.string()),
237
- primaryEntryId: v.optional(v.string()),
238
- createdBy: v.optional(v.string()),
239
- },
240
- returns: v.any(),
241
- handler: async (ctx, args) => {
242
- await checkAuth(ctx, {
243
- type: "entries.create",
244
- contentTypeId: args.contentTypeId,
245
- });
246
- return await ctx.runMutation(component.contentEntryMutations.createEntry, {
247
- contentTypeId: args.contentTypeId,
248
- data: args.data,
249
- slug: args.slug,
250
- status: args.status,
251
- locale: args.locale,
252
- primaryEntryId: args.primaryEntryId,
253
- createdBy: args.createdBy,
254
- });
255
- },
256
- }),
257
- update: mutationGeneric({
258
- args: {
259
- id: v.string(),
260
- data: v.optional(v.any()),
261
- slug: v.optional(v.string()),
262
- status: v.optional(contentStatusValidator),
263
- scheduledPublishAt: v.optional(v.number()),
264
- updatedBy: v.optional(v.string()),
265
- regenerateSlug: v.optional(v.boolean()),
266
- },
267
- returns: v.any(),
268
- handler: async (ctx, args) => {
269
- await checkAuth(ctx, { type: "entries.update", id: args.id });
270
- return await ctx.runMutation(component.contentEntryMutations.updateEntry, {
271
- id: args.id,
272
- data: args.data,
273
- slug: args.slug,
274
- status: args.status,
275
- scheduledPublishAt: args.scheduledPublishAt,
276
- updatedBy: args.updatedBy,
277
- regenerateSlug: args.regenerateSlug,
278
- });
279
- },
280
- }),
281
- publish: mutationGeneric({
282
- args: {
283
- id: v.string(),
284
- changeDescription: v.optional(v.string()),
285
- updatedBy: v.optional(v.string()),
286
- },
287
- returns: v.any(),
288
- handler: async (ctx, args) => {
289
- await checkAuth(ctx, { type: "entries.publish", id: args.id });
290
- return await ctx.runMutation(component.contentEntryMutations.publishEntry, {
291
- id: args.id,
292
- changeDescription: args.changeDescription,
293
- updatedBy: args.updatedBy,
294
- });
295
- },
296
- }),
297
- unpublish: mutationGeneric({
298
- args: {
299
- id: v.string(),
300
- updatedBy: v.optional(v.string()),
301
- },
302
- returns: v.any(),
303
- handler: async (ctx, args) => {
304
- await checkAuth(ctx, { type: "entries.unpublish", id: args.id });
305
- return await ctx.runMutation(component.contentEntryMutations.unpublishEntry, {
306
- id: args.id,
307
- updatedBy: args.updatedBy,
308
- });
309
- },
310
- }),
311
- delete: mutationGeneric({
312
- args: {
313
- id: v.string(),
314
- hardDelete: v.optional(v.boolean()),
315
- deletedBy: v.optional(v.string()),
316
- },
317
- returns: v.any(),
318
- handler: async (ctx, args) => {
319
- await checkAuth(ctx, { type: "entries.delete", id: args.id });
320
- return await ctx.runMutation(component.contentEntryMutations.deleteEntry, {
321
- id: args.id,
322
- hardDelete: args.hardDelete,
323
- deletedBy: args.deletedBy,
324
- });
325
- },
326
- }),
327
- duplicate: mutationGeneric({
328
- args: {
329
- id: v.string(),
330
- copyMediaReferences: v.optional(v.boolean()),
331
- createdBy: v.optional(v.string()),
332
- },
333
- returns: v.any(),
334
- handler: async (ctx, args) => {
335
- await checkAuth(ctx, { type: "entries.duplicate", id: args.id });
336
- return await ctx.runMutation(component.contentEntryMutations.duplicateEntry, {
337
- sourceEntryId: args.id,
338
- copyMediaReferences: args.copyMediaReferences,
339
- createdBy: args.createdBy,
340
- });
341
- },
342
- }),
343
- schedule: mutationGeneric({
344
- args: {
345
- id: v.string(),
346
- publishAt: v.number(),
347
- updatedBy: v.optional(v.string()),
348
- },
349
- returns: v.any(),
350
- handler: async (ctx, args) => {
351
- await checkAuth(ctx, { type: "entries.schedule", id: args.id });
352
- return await ctx.runMutation(component.scheduledPublish.scheduleEntry, {
353
- id: args.id,
354
- publishAt: args.publishAt,
355
- updatedBy: args.updatedBy,
356
- });
357
- },
358
- }),
359
- cancelSchedule: mutationGeneric({
360
- args: {
361
- id: v.string(),
362
- updatedBy: v.optional(v.string()),
363
- },
364
- returns: v.any(),
365
- handler: async (ctx, args) => {
366
- await checkAuth(ctx, { type: "entries.cancelSchedule", id: args.id });
367
- return await ctx.runMutation(component.scheduledPublish.cancelScheduledPublish, {
368
- id: args.id,
369
- updatedBy: args.updatedBy,
370
- });
371
- },
372
- }),
373
- getScheduled: queryGeneric({
374
- args: {},
375
- returns: v.array(v.any()),
376
- handler: async (ctx) => {
377
- await checkAuth(ctx, { type: "entries.getScheduled" });
378
- return await ctx.runQuery(component.scheduledPublish.getScheduledEntries, {});
379
- },
380
- }),
381
- },
223
+ listEntries: queryGeneric({
224
+ args: {
225
+ contentTypeId: v.optional(v.string()),
226
+ status: v.optional(contentStatusValidator),
227
+ search: v.optional(v.string()),
228
+ locale: v.optional(v.string()),
229
+ paginationOpts: paginationOptsValidator,
230
+ },
231
+ returns: v.any(),
232
+ handler: async (ctx, args) => {
233
+ await checkAuth(ctx, {
234
+ type: "listEntries",
235
+ contentTypeId: args.contentTypeId ?? "",
236
+ });
237
+ return await ctx.runQuery(component.contentEntries.list, {
238
+ contentTypeId: args.contentTypeId,
239
+ status: args.status,
240
+ search: args.search,
241
+ locale: args.locale,
242
+ paginationOpts: args.paginationOpts,
243
+ });
244
+ },
245
+ }),
246
+ getEntry: queryGeneric({
247
+ args: {
248
+ id: v.string(),
249
+ },
250
+ returns: v.union(v.any(), v.null()),
251
+ handler: async (ctx, args) => {
252
+ await checkAuth(ctx, { type: "getEntry", id: args.id });
253
+ return await ctx.runQuery(component.contentEntries.get, {
254
+ id: args.id,
255
+ });
256
+ },
257
+ }),
258
+ createEntry: mutationGeneric({
259
+ args: {
260
+ contentTypeId: v.string(),
261
+ data: v.any(),
262
+ slug: v.optional(v.string()),
263
+ status: v.optional(contentStatusValidator),
264
+ locale: v.optional(v.string()),
265
+ primaryEntryId: v.optional(v.string()),
266
+ createdBy: v.optional(v.string()),
267
+ },
268
+ returns: v.any(),
269
+ handler: async (ctx, args) => {
270
+ await checkAuth(ctx, {
271
+ type: "createEntry",
272
+ contentTypeId: args.contentTypeId,
273
+ });
274
+ return await ctx.runMutation(component.contentEntryMutations.createEntry, {
275
+ contentTypeId: args.contentTypeId,
276
+ data: args.data,
277
+ slug: args.slug,
278
+ status: args.status,
279
+ locale: args.locale,
280
+ primaryEntryId: args.primaryEntryId,
281
+ createdBy: args.createdBy,
282
+ });
283
+ },
284
+ }),
285
+ updateEntry: mutationGeneric({
286
+ args: {
287
+ id: v.string(),
288
+ data: v.optional(v.any()),
289
+ slug: v.optional(v.string()),
290
+ status: v.optional(contentStatusValidator),
291
+ scheduledPublishAt: v.optional(v.number()),
292
+ updatedBy: v.optional(v.string()),
293
+ regenerateSlug: v.optional(v.boolean()),
294
+ },
295
+ returns: v.any(),
296
+ handler: async (ctx, args) => {
297
+ await checkAuth(ctx, { type: "updateEntry", id: args.id });
298
+ return await ctx.runMutation(component.contentEntryMutations.updateEntry, {
299
+ id: args.id,
300
+ data: args.data,
301
+ slug: args.slug,
302
+ status: args.status,
303
+ scheduledPublishAt: args.scheduledPublishAt,
304
+ updatedBy: args.updatedBy,
305
+ regenerateSlug: args.regenerateSlug,
306
+ });
307
+ },
308
+ }),
309
+ publishEntry: mutationGeneric({
310
+ args: {
311
+ id: v.string(),
312
+ changeDescription: v.optional(v.string()),
313
+ updatedBy: v.optional(v.string()),
314
+ },
315
+ returns: v.any(),
316
+ handler: async (ctx, args) => {
317
+ await checkAuth(ctx, { type: "publishEntry", id: args.id });
318
+ return await ctx.runMutation(component.contentEntryMutations.publishEntry, {
319
+ id: args.id,
320
+ changeDescription: args.changeDescription,
321
+ updatedBy: args.updatedBy,
322
+ });
323
+ },
324
+ }),
325
+ unpublishEntry: mutationGeneric({
326
+ args: {
327
+ id: v.string(),
328
+ updatedBy: v.optional(v.string()),
329
+ },
330
+ returns: v.any(),
331
+ handler: async (ctx, args) => {
332
+ await checkAuth(ctx, { type: "unpublishEntry", id: args.id });
333
+ return await ctx.runMutation(component.contentEntryMutations.unpublishEntry, {
334
+ id: args.id,
335
+ updatedBy: args.updatedBy,
336
+ });
337
+ },
338
+ }),
339
+ deleteEntry: mutationGeneric({
340
+ args: {
341
+ id: v.string(),
342
+ hardDelete: v.optional(v.boolean()),
343
+ deletedBy: v.optional(v.string()),
344
+ },
345
+ returns: v.any(),
346
+ handler: async (ctx, args) => {
347
+ await checkAuth(ctx, { type: "deleteEntry", id: args.id });
348
+ return await ctx.runMutation(component.contentEntryMutations.deleteEntry, {
349
+ id: args.id,
350
+ hardDelete: args.hardDelete,
351
+ deletedBy: args.deletedBy,
352
+ });
353
+ },
354
+ }),
355
+ duplicateEntry: mutationGeneric({
356
+ args: {
357
+ id: v.string(),
358
+ copyMediaReferences: v.optional(v.boolean()),
359
+ createdBy: v.optional(v.string()),
360
+ },
361
+ returns: v.any(),
362
+ handler: async (ctx, args) => {
363
+ await checkAuth(ctx, { type: "duplicateEntry", id: args.id });
364
+ return await ctx.runMutation(component.contentEntryMutations.duplicateEntry, {
365
+ sourceEntryId: args.id,
366
+ copyMediaReferences: args.copyMediaReferences,
367
+ createdBy: args.createdBy,
368
+ });
369
+ },
370
+ }),
371
+ scheduleEntry: mutationGeneric({
372
+ args: {
373
+ id: v.string(),
374
+ publishAt: v.number(),
375
+ updatedBy: v.optional(v.string()),
376
+ },
377
+ returns: v.any(),
378
+ handler: async (ctx, args) => {
379
+ await checkAuth(ctx, { type: "scheduleEntry", id: args.id });
380
+ return await ctx.runMutation(component.scheduledPublish.scheduleEntry, {
381
+ id: args.id,
382
+ publishAt: args.publishAt,
383
+ updatedBy: args.updatedBy,
384
+ });
385
+ },
386
+ }),
387
+ cancelScheduledEntry: mutationGeneric({
388
+ args: {
389
+ id: v.string(),
390
+ updatedBy: v.optional(v.string()),
391
+ },
392
+ returns: v.any(),
393
+ handler: async (ctx, args) => {
394
+ await checkAuth(ctx, { type: "cancelScheduledEntry", id: args.id });
395
+ return await ctx.runMutation(component.scheduledPublish.cancelScheduledPublish, {
396
+ id: args.id,
397
+ updatedBy: args.updatedBy,
398
+ });
399
+ },
400
+ }),
401
+ getScheduledEntries: queryGeneric({
402
+ args: {},
403
+ returns: v.array(v.any()),
404
+ handler: async (ctx) => {
405
+ await checkAuth(ctx, { type: "getScheduledEntries" });
406
+ return await ctx.runQuery(component.scheduledPublish.getScheduledEntries, {});
407
+ },
408
+ }),
382
409
  // =========================================================================
383
- // Media (Assets and Folders)
410
+ // Media Assets
384
411
  // =========================================================================
385
- media: {
386
- // --- Assets ---
387
- listAssets: queryGeneric({
388
- args: {
389
- folderId: v.optional(v.string()),
390
- type: v.optional(mediaTypeValidator),
391
- search: v.optional(v.string()),
392
- paginationOpts: paginationOptsValidator,
393
- },
394
- returns: v.any(),
395
- handler: async (ctx, args) => {
396
- await checkAuth(ctx, { type: "media.assets.list" });
397
- return await ctx.runQuery(component.mediaAssets.list, {
398
- folderId: args.folderId,
399
- type: args.type,
400
- search: args.search,
401
- paginationOpts: args.paginationOpts,
402
- });
403
- },
404
- }),
405
- getAsset: queryGeneric({
406
- args: {
407
- id: v.string(),
408
- },
409
- returns: v.union(v.any(), v.null()),
410
- handler: async (ctx, args) => {
411
- await checkAuth(ctx, { type: "media.assets.get", id: args.id });
412
- return await ctx.runQuery(component.mediaAssets.get, {
413
- id: args.id,
414
- });
415
- },
416
- }),
417
- createAsset: mutationGeneric({
418
- args: {
419
- storageId: v.string(),
420
- name: v.string(),
421
- mimeType: v.string(),
422
- size: v.number(),
423
- parentId: v.optional(v.string()),
424
- width: v.optional(v.number()),
425
- height: v.optional(v.number()),
426
- title: v.optional(v.string()),
427
- description: v.optional(v.string()),
428
- altText: v.optional(v.string()),
429
- createdBy: v.optional(v.string()),
430
- },
431
- returns: v.any(),
432
- handler: async (ctx, args) => {
433
- await checkAuth(ctx, { type: "media.assets.create" });
434
- return await ctx.runMutation(component.mediaAssetMutations.createMediaAsset, {
435
- storageId: args.storageId,
436
- name: args.name,
437
- mimeType: args.mimeType,
438
- size: args.size,
439
- parentId: args.parentId,
440
- width: args.width,
441
- height: args.height,
442
- title: args.title,
443
- description: args.description,
444
- altText: args.altText,
445
- createdBy: args.createdBy,
446
- });
447
- },
448
- }),
449
- updateAsset: mutationGeneric({
450
- args: {
451
- id: v.string(),
452
- name: v.optional(v.string()),
453
- title: v.optional(v.string()),
454
- description: v.optional(v.string()),
455
- altText: v.optional(v.string()),
456
- parentId: v.optional(v.string()),
457
- tags: v.optional(v.array(v.string())),
458
- },
459
- returns: v.any(),
460
- handler: async (ctx, args) => {
461
- await checkAuth(ctx, { type: "media.assets.update", id: args.id });
462
- return await ctx.runMutation(component.mediaAssetMutations.updateMediaAsset, {
463
- id: args.id,
464
- name: args.name,
465
- title: args.title,
466
- description: args.description,
467
- altText: args.altText,
468
- parentId: args.parentId,
469
- tags: args.tags,
470
- });
471
- },
472
- }),
473
- deleteAsset: mutationGeneric({
474
- args: {
475
- id: v.string(),
476
- hardDelete: v.optional(v.boolean()),
477
- deletedBy: v.optional(v.string()),
478
- },
479
- returns: v.any(),
480
- handler: async (ctx, args) => {
481
- await checkAuth(ctx, { type: "media.assets.delete", id: args.id });
482
- return await ctx.runMutation(component.mediaAssetMutations.deleteMediaAsset, {
483
- id: args.id,
484
- hardDelete: args.hardDelete,
485
- deletedBy: args.deletedBy,
486
- });
487
- },
488
- }),
489
- restoreAsset: mutationGeneric({
490
- args: {
491
- id: v.string(),
492
- },
493
- returns: v.any(),
494
- handler: async (ctx, args) => {
495
- await checkAuth(ctx, { type: "media.assets.restore", id: args.id });
496
- return await ctx.runMutation(component.mediaAssetMutations.restoreMediaAsset, {
497
- id: args.id,
498
- });
499
- },
500
- }),
501
- moveAssets: mutationGeneric({
502
- args: {
503
- assetIds: v.array(v.string()),
504
- targetFolderId: v.optional(v.string()),
505
- },
506
- returns: v.any(),
507
- handler: async (ctx, args) => {
508
- await checkAuth(ctx, { type: "media.assets.move" });
509
- return await ctx.runMutation(component.mediaAssetMutations.moveMediaAssets, {
510
- assetIds: args.assetIds,
511
- targetFolderId: args.targetFolderId,
512
- });
513
- },
514
- }),
515
- // --- Folders ---
516
- listFolders: queryGeneric({
517
- args: {
518
- parentId: v.optional(v.string()),
519
- },
520
- returns: v.array(v.any()),
521
- handler: async (ctx, args) => {
522
- await checkAuth(ctx, { type: "media.folders.list" });
523
- return await ctx.runQuery(component.mediaFolderMutations.listMediaFolders, {
524
- parentId: args.parentId,
525
- });
526
- },
527
- }),
528
- getFolder: queryGeneric({
529
- args: {
530
- id: v.string(),
531
- },
532
- returns: v.union(v.any(), v.null()),
533
- handler: async (ctx, args) => {
534
- await checkAuth(ctx, { type: "media.folders.get", id: args.id });
535
- return await ctx.runQuery(component.mediaFolderMutations.getMediaFolder, {
536
- id: args.id,
537
- });
538
- },
539
- }),
540
- getFolderTree: queryGeneric({
541
- args: {},
542
- returns: v.array(v.any()),
543
- handler: async (ctx) => {
544
- await checkAuth(ctx, { type: "media.folders.getTree" });
545
- return await ctx.runQuery(component.mediaFolderMutations.getFolderTree, {});
546
- },
547
- }),
548
- createFolder: mutationGeneric({
549
- args: {
550
- name: v.string(),
551
- parentId: v.optional(v.string()),
552
- description: v.optional(v.string()),
553
- createdBy: v.optional(v.string()),
554
- },
555
- returns: v.any(),
556
- handler: async (ctx, args) => {
557
- await checkAuth(ctx, { type: "media.folders.create" });
558
- return await ctx.runMutation(component.mediaFolderMutations.createMediaFolder, {
559
- name: args.name,
560
- parentId: args.parentId,
561
- description: args.description,
562
- createdBy: args.createdBy,
563
- });
564
- },
565
- }),
566
- updateFolder: mutationGeneric({
567
- args: {
568
- id: v.string(),
569
- name: v.optional(v.string()),
570
- description: v.optional(v.string()),
571
- sortOrder: v.optional(v.number()),
572
- },
573
- returns: v.any(),
574
- handler: async (ctx, args) => {
575
- await checkAuth(ctx, { type: "media.folders.update", id: args.id });
576
- return await ctx.runMutation(component.mediaFolderMutations.updateMediaFolder, {
577
- id: args.id,
578
- name: args.name,
579
- description: args.description,
580
- sortOrder: args.sortOrder,
581
- });
582
- },
583
- }),
584
- moveFolder: mutationGeneric({
585
- args: {
586
- id: v.string(),
587
- newParentId: v.optional(v.string()),
588
- },
589
- returns: v.any(),
590
- handler: async (ctx, args) => {
591
- await checkAuth(ctx, { type: "media.folders.move", id: args.id });
592
- return await ctx.runMutation(component.mediaFolderMutations.moveMediaFolder, {
593
- id: args.id,
594
- newParentId: args.newParentId,
595
- });
596
- },
597
- }),
598
- deleteFolder: mutationGeneric({
599
- args: {
600
- id: v.string(),
601
- recursive: v.optional(v.boolean()),
602
- hardDelete: v.optional(v.boolean()),
603
- deletedBy: v.optional(v.string()),
604
- },
605
- returns: v.any(),
606
- handler: async (ctx, args) => {
607
- await checkAuth(ctx, { type: "media.folders.delete", id: args.id });
608
- return await ctx.runMutation(component.mediaFolderMutations.deleteMediaFolder, {
609
- id: args.id,
610
- recursive: args.recursive,
611
- hardDelete: args.hardDelete,
612
- deletedBy: args.deletedBy,
613
- });
614
- },
615
- }),
616
- restoreFolder: mutationGeneric({
617
- args: {
618
- id: v.string(),
619
- recursive: v.optional(v.boolean()),
620
- },
621
- returns: v.any(),
622
- handler: async (ctx, args) => {
623
- await checkAuth(ctx, { type: "media.folders.restore", id: args.id });
624
- return await ctx.runMutation(component.mediaFolderMutations.restoreMediaFolder, {
625
- id: args.id,
626
- recursive: args.recursive,
627
- });
628
- },
629
- }),
630
- // --- Upload ---
631
- generateUploadUrl: mutationGeneric({
632
- args: {},
633
- returns: v.string(),
634
- handler: async (ctx) => {
635
- await checkAuth(ctx, { type: "media.generateUploadUrl" });
636
- return await ctx.storage.generateUploadUrl();
637
- },
638
- }),
639
- },
412
+ listMediaAssets: queryGeneric({
413
+ args: {
414
+ folderId: v.optional(v.string()),
415
+ type: v.optional(mediaTypeValidator),
416
+ search: v.optional(v.string()),
417
+ paginationOpts: paginationOptsValidator,
418
+ },
419
+ returns: v.any(),
420
+ handler: async (ctx, args) => {
421
+ await checkAuth(ctx, { type: "listMediaAssets" });
422
+ return await ctx.runQuery(component.mediaAssets.list, {
423
+ folderId: args.folderId,
424
+ type: args.type,
425
+ search: args.search,
426
+ paginationOpts: args.paginationOpts,
427
+ });
428
+ },
429
+ }),
430
+ getMediaAsset: queryGeneric({
431
+ args: {
432
+ id: v.string(),
433
+ },
434
+ returns: v.union(v.any(), v.null()),
435
+ handler: async (ctx, args) => {
436
+ await checkAuth(ctx, { type: "getMediaAsset", id: args.id });
437
+ return await ctx.runQuery(component.mediaAssets.get, {
438
+ id: args.id,
439
+ });
440
+ },
441
+ }),
442
+ createMediaAsset: mutationGeneric({
443
+ args: {
444
+ storageId: v.string(),
445
+ name: v.string(),
446
+ mimeType: v.string(),
447
+ size: v.number(),
448
+ parentId: v.optional(v.string()),
449
+ width: v.optional(v.number()),
450
+ height: v.optional(v.number()),
451
+ title: v.optional(v.string()),
452
+ description: v.optional(v.string()),
453
+ altText: v.optional(v.string()),
454
+ createdBy: v.optional(v.string()),
455
+ },
456
+ returns: v.any(),
457
+ handler: async (ctx, args) => {
458
+ await checkAuth(ctx, { type: "createMediaAsset" });
459
+ return await ctx.runMutation(component.mediaAssetMutations.createMediaAsset, {
460
+ storageId: args.storageId,
461
+ name: args.name,
462
+ mimeType: args.mimeType,
463
+ size: args.size,
464
+ parentId: args.parentId,
465
+ width: args.width,
466
+ height: args.height,
467
+ title: args.title,
468
+ description: args.description,
469
+ altText: args.altText,
470
+ createdBy: args.createdBy,
471
+ });
472
+ },
473
+ }),
474
+ updateMediaAsset: mutationGeneric({
475
+ args: {
476
+ id: v.string(),
477
+ name: v.optional(v.string()),
478
+ title: v.optional(v.string()),
479
+ description: v.optional(v.string()),
480
+ altText: v.optional(v.string()),
481
+ parentId: v.optional(v.string()),
482
+ tags: v.optional(v.array(v.string())),
483
+ },
484
+ returns: v.any(),
485
+ handler: async (ctx, args) => {
486
+ await checkAuth(ctx, { type: "updateMediaAsset", id: args.id });
487
+ return await ctx.runMutation(component.mediaAssetMutations.updateMediaAsset, {
488
+ id: args.id,
489
+ name: args.name,
490
+ title: args.title,
491
+ description: args.description,
492
+ altText: args.altText,
493
+ parentId: args.parentId,
494
+ tags: args.tags,
495
+ });
496
+ },
497
+ }),
498
+ deleteMediaAsset: mutationGeneric({
499
+ args: {
500
+ id: v.string(),
501
+ hardDelete: v.optional(v.boolean()),
502
+ deletedBy: v.optional(v.string()),
503
+ },
504
+ returns: v.any(),
505
+ handler: async (ctx, args) => {
506
+ await checkAuth(ctx, { type: "deleteMediaAsset", id: args.id });
507
+ return await ctx.runMutation(component.mediaAssetMutations.deleteMediaAsset, {
508
+ id: args.id,
509
+ hardDelete: args.hardDelete,
510
+ deletedBy: args.deletedBy,
511
+ });
512
+ },
513
+ }),
514
+ restoreMediaAsset: mutationGeneric({
515
+ args: {
516
+ id: v.string(),
517
+ },
518
+ returns: v.any(),
519
+ handler: async (ctx, args) => {
520
+ await checkAuth(ctx, { type: "restoreMediaAsset", id: args.id });
521
+ return await ctx.runMutation(component.mediaAssetMutations.restoreMediaAsset, {
522
+ id: args.id,
523
+ });
524
+ },
525
+ }),
526
+ moveMediaAssets: mutationGeneric({
527
+ args: {
528
+ assetIds: v.array(v.string()),
529
+ targetFolderId: v.optional(v.string()),
530
+ },
531
+ returns: v.any(),
532
+ handler: async (ctx, args) => {
533
+ await checkAuth(ctx, { type: "moveMediaAssets" });
534
+ return await ctx.runMutation(component.mediaAssetMutations.moveMediaAssets, {
535
+ assetIds: args.assetIds,
536
+ targetFolderId: args.targetFolderId,
537
+ });
538
+ },
539
+ }),
540
+ // =========================================================================
541
+ // Media Folders
542
+ // =========================================================================
543
+ listMediaFolders: queryGeneric({
544
+ args: {
545
+ parentId: v.optional(v.string()),
546
+ },
547
+ returns: v.array(v.any()),
548
+ handler: async (ctx, args) => {
549
+ await checkAuth(ctx, { type: "listMediaFolders" });
550
+ return await ctx.runQuery(component.mediaFolderMutations.listMediaFolders, {
551
+ parentId: args.parentId,
552
+ });
553
+ },
554
+ }),
555
+ getMediaFolder: queryGeneric({
556
+ args: {
557
+ id: v.string(),
558
+ },
559
+ returns: v.union(v.any(), v.null()),
560
+ handler: async (ctx, args) => {
561
+ await checkAuth(ctx, { type: "getMediaFolder", id: args.id });
562
+ return await ctx.runQuery(component.mediaFolderMutations.getMediaFolder, {
563
+ id: args.id,
564
+ });
565
+ },
566
+ }),
567
+ getMediaFolderTree: queryGeneric({
568
+ args: {},
569
+ returns: v.array(v.any()),
570
+ handler: async (ctx) => {
571
+ await checkAuth(ctx, { type: "getMediaFolderTree" });
572
+ return await ctx.runQuery(component.mediaFolderMutations.getFolderTree, {});
573
+ },
574
+ }),
575
+ createMediaFolder: mutationGeneric({
576
+ args: {
577
+ name: v.string(),
578
+ parentId: v.optional(v.string()),
579
+ description: v.optional(v.string()),
580
+ createdBy: v.optional(v.string()),
581
+ },
582
+ returns: v.any(),
583
+ handler: async (ctx, args) => {
584
+ await checkAuth(ctx, { type: "createMediaFolder" });
585
+ return await ctx.runMutation(component.mediaFolderMutations.createMediaFolder, {
586
+ name: args.name,
587
+ parentId: args.parentId,
588
+ description: args.description,
589
+ createdBy: args.createdBy,
590
+ });
591
+ },
592
+ }),
593
+ updateMediaFolder: mutationGeneric({
594
+ args: {
595
+ id: v.string(),
596
+ name: v.optional(v.string()),
597
+ description: v.optional(v.string()),
598
+ sortOrder: v.optional(v.number()),
599
+ },
600
+ returns: v.any(),
601
+ handler: async (ctx, args) => {
602
+ await checkAuth(ctx, { type: "updateMediaFolder", id: args.id });
603
+ return await ctx.runMutation(component.mediaFolderMutations.updateMediaFolder, {
604
+ id: args.id,
605
+ name: args.name,
606
+ description: args.description,
607
+ sortOrder: args.sortOrder,
608
+ });
609
+ },
610
+ }),
611
+ moveMediaFolder: mutationGeneric({
612
+ args: {
613
+ id: v.string(),
614
+ newParentId: v.optional(v.string()),
615
+ },
616
+ returns: v.any(),
617
+ handler: async (ctx, args) => {
618
+ await checkAuth(ctx, { type: "moveMediaFolder", id: args.id });
619
+ return await ctx.runMutation(component.mediaFolderMutations.moveMediaFolder, {
620
+ id: args.id,
621
+ newParentId: args.newParentId,
622
+ });
623
+ },
624
+ }),
625
+ deleteMediaFolder: mutationGeneric({
626
+ args: {
627
+ id: v.string(),
628
+ recursive: v.optional(v.boolean()),
629
+ hardDelete: v.optional(v.boolean()),
630
+ deletedBy: v.optional(v.string()),
631
+ },
632
+ returns: v.any(),
633
+ handler: async (ctx, args) => {
634
+ await checkAuth(ctx, { type: "deleteMediaFolder", id: args.id });
635
+ return await ctx.runMutation(component.mediaFolderMutations.deleteMediaFolder, {
636
+ id: args.id,
637
+ recursive: args.recursive,
638
+ hardDelete: args.hardDelete,
639
+ deletedBy: args.deletedBy,
640
+ });
641
+ },
642
+ }),
643
+ restoreMediaFolder: mutationGeneric({
644
+ args: {
645
+ id: v.string(),
646
+ recursive: v.optional(v.boolean()),
647
+ },
648
+ returns: v.any(),
649
+ handler: async (ctx, args) => {
650
+ await checkAuth(ctx, { type: "restoreMediaFolder", id: args.id });
651
+ return await ctx.runMutation(component.mediaFolderMutations.restoreMediaFolder, {
652
+ id: args.id,
653
+ recursive: args.recursive,
654
+ });
655
+ },
656
+ }),
657
+ // =========================================================================
658
+ // Upload
659
+ // =========================================================================
660
+ generateUploadUrl: mutationGeneric({
661
+ args: {},
662
+ returns: v.string(),
663
+ handler: async (ctx) => {
664
+ await checkAuth(ctx, { type: "generateUploadUrl" });
665
+ return await ctx.storage.generateUploadUrl();
666
+ },
667
+ }),
640
668
  // =========================================================================
641
669
  // Dashboard Stats
642
670
  // =========================================================================
643
- stats: {
644
- getDashboardStats: queryGeneric({
645
- args: {},
646
- returns: v.object({
647
- contentTypes: v.object({
648
- total: v.number(),
649
- active: v.number(),
650
- }),
651
- entries: v.object({
652
- total: v.number(),
653
- published: v.number(),
654
- draft: v.number(),
655
- scheduled: v.number(),
656
- }),
657
- media: v.object({
658
- total: v.number(),
659
- images: v.number(),
660
- videos: v.number(),
661
- documents: v.number(),
662
- }),
671
+ getDashboardStats: queryGeneric({
672
+ args: {},
673
+ returns: v.object({
674
+ contentTypes: v.object({
675
+ total: v.number(),
676
+ active: v.number(),
677
+ }),
678
+ entries: v.object({
679
+ total: v.number(),
680
+ published: v.number(),
681
+ draft: v.number(),
682
+ scheduled: v.number(),
683
+ }),
684
+ media: v.object({
685
+ total: v.number(),
686
+ images: v.number(),
687
+ videos: v.number(),
688
+ documents: v.number(),
663
689
  }),
664
- handler: async (ctx) => {
665
- await checkAuth(ctx, { type: "stats.getDashboardStats" });
666
- // Fetch all content types (returns paginated result)
667
- const contentTypesResult = await ctx.runQuery(component.contentTypes.list, {});
668
- const contentTypes = contentTypesResult.page || [];
669
- // Fetch all entries (paginated, get counts)
670
- const entriesResult = await ctx.runQuery(component.contentEntries.list, {
671
- paginationOpts: { numItems: 1000, cursor: null },
672
- });
673
- // Fetch all media assets
674
- const mediaResult = await ctx.runQuery(component.mediaAssets.list, {
675
- paginationOpts: { numItems: 1000, cursor: null },
676
- });
677
- // Calculate content type stats
678
- const activeContentTypes = contentTypes.filter((ct) => ct.isActive).length;
679
- // Calculate entry stats
680
- const entries = entriesResult.page || [];
681
- const publishedEntries = entries.filter((e) => e.status === "published").length;
682
- const draftEntries = entries.filter((e) => e.status === "draft").length;
683
- const scheduledEntries = entries.filter((e) => e.status === "scheduled").length;
684
- // Calculate media stats by filtering on mimeType prefix
685
- const mediaAssets = (mediaResult.page || []);
686
- const assets = mediaAssets.filter((m) => m.kind === "asset");
687
- const images = assets.filter((m) => m.mimeType?.startsWith("image/")).length;
688
- const videos = assets.filter((m) => m.mimeType?.startsWith("video/")).length;
689
- const documents = assets.filter((m) => m.mimeType?.startsWith("application/pdf") ||
690
- m.mimeType?.includes("document") ||
691
- m.mimeType?.includes("sheet") ||
692
- m.mimeType?.includes("presentation")).length;
693
- return {
694
- contentTypes: {
695
- total: contentTypes.length,
696
- active: activeContentTypes,
697
- },
698
- entries: {
699
- total: entries.length,
700
- published: publishedEntries,
701
- draft: draftEntries,
702
- scheduled: scheduledEntries,
703
- },
704
- media: {
705
- total: mediaAssets.length,
706
- images,
707
- videos,
708
- documents,
709
- },
710
- };
711
- },
712
690
  }),
713
- },
691
+ handler: async (ctx) => {
692
+ await checkAuth(ctx, { type: "getDashboardStats" });
693
+ const contentTypesResult = await ctx.runQuery(component.contentTypes.list, {});
694
+ const contentTypes = contentTypesResult.page || [];
695
+ const entriesResult = await ctx.runQuery(component.contentEntries.list, {
696
+ paginationOpts: { numItems: 1000, cursor: null },
697
+ });
698
+ const mediaResult = await ctx.runQuery(component.mediaAssets.list, {
699
+ paginationOpts: { numItems: 1000, cursor: null },
700
+ });
701
+ const activeContentTypes = contentTypes.filter((ct) => ct.isActive).length;
702
+ const entries = entriesResult.page || [];
703
+ const publishedEntries = entries.filter((e) => e.status === "published").length;
704
+ const draftEntries = entries.filter((e) => e.status === "draft").length;
705
+ const scheduledEntries = entries.filter((e) => e.status === "scheduled").length;
706
+ const mediaAssets = (mediaResult.page || []);
707
+ const assets = mediaAssets.filter((m) => m.kind === "asset");
708
+ const images = assets.filter((m) => m.mimeType?.startsWith("image/")).length;
709
+ const videos = assets.filter((m) => m.mimeType?.startsWith("video/")).length;
710
+ const documents = assets.filter((m) => m.mimeType?.startsWith("application/pdf") ||
711
+ m.mimeType?.includes("document") ||
712
+ m.mimeType?.includes("sheet") ||
713
+ m.mimeType?.includes("presentation")).length;
714
+ return {
715
+ contentTypes: {
716
+ total: contentTypes.length,
717
+ active: activeContentTypes,
718
+ },
719
+ entries: {
720
+ total: entries.length,
721
+ published: publishedEntries,
722
+ draft: draftEntries,
723
+ scheduled: scheduledEntries,
724
+ },
725
+ media: {
726
+ total: mediaAssets.length,
727
+ images,
728
+ videos,
729
+ documents,
730
+ },
731
+ };
732
+ },
733
+ }),
714
734
  };
715
735
  }
716
736
  //# sourceMappingURL=adminApi.js.map