@commonpub/schema 0.1.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 (67) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +87 -0
  3. package/dist/admin.d.ts +256 -0
  4. package/dist/admin.d.ts.map +1 -0
  5. package/dist/admin.js +33 -0
  6. package/dist/admin.js.map +1 -0
  7. package/dist/auth.d.ts +1552 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +140 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/content.d.ts +1129 -0
  12. package/dist/content.d.ts.map +1 -0
  13. package/dist/content.js +152 -0
  14. package/dist/content.js.map +1 -0
  15. package/dist/contest.d.ts +466 -0
  16. package/dist/contest.d.ts.map +1 -0
  17. package/dist/contest.js +64 -0
  18. package/dist/contest.js.map +1 -0
  19. package/dist/docs.d.ts +545 -0
  20. package/dist/docs.d.ts.map +1 -0
  21. package/dist/docs.js +78 -0
  22. package/dist/docs.js.map +1 -0
  23. package/dist/enums.d.ts +31 -0
  24. package/dist/enums.d.ts.map +1 -0
  25. package/dist/enums.js +149 -0
  26. package/dist/enums.js.map +1 -0
  27. package/dist/federation.d.ts +613 -0
  28. package/dist/federation.d.ts.map +1 -0
  29. package/dist/federation.js +63 -0
  30. package/dist/federation.js.map +1 -0
  31. package/dist/files.d.ts +259 -0
  32. package/dist/files.d.ts.map +1 -0
  33. package/dist/files.js +33 -0
  34. package/dist/files.js.map +1 -0
  35. package/dist/hub.d.ts +1235 -0
  36. package/dist/hub.d.ts.map +1 -0
  37. package/dist/hub.js +205 -0
  38. package/dist/hub.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +31 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/learning.d.ts +960 -0
  44. package/dist/learning.d.ts.map +1 -0
  45. package/dist/learning.js +142 -0
  46. package/dist/learning.js.map +1 -0
  47. package/dist/openapi.d.ts +2 -0
  48. package/dist/openapi.d.ts.map +1 -0
  49. package/dist/openapi.js +322 -0
  50. package/dist/openapi.js.map +1 -0
  51. package/dist/product.d.ts +481 -0
  52. package/dist/product.d.ts.map +1 -0
  53. package/dist/product.js +66 -0
  54. package/dist/product.js.map +1 -0
  55. package/dist/social.d.ts +1027 -0
  56. package/dist/social.d.ts.map +1 -0
  57. package/dist/social.js +166 -0
  58. package/dist/social.js.map +1 -0
  59. package/dist/validators.d.ts +766 -0
  60. package/dist/validators.d.ts.map +1 -0
  61. package/dist/validators.js +385 -0
  62. package/dist/validators.js.map +1 -0
  63. package/dist/video.d.ts +353 -0
  64. package/dist/video.d.ts.map +1 -0
  65. package/dist/video.js +36 -0
  66. package/dist/video.js.map +1 -0
  67. package/package.json +77 -0
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # @commonpub/schema
2
+
3
+ Drizzle ORM table definitions and Zod validators for the CommonPub data model.
4
+
5
+ ## Overview
6
+
7
+ This package is the single source of truth for CommonPub's database schema. Every table, enum, relation, and validator lives here. All other packages depend on `@commonpub/schema`.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ pnpm add @commonpub/schema
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```ts
18
+ import { users, contentItems, contentTypeEnum } from '@commonpub/schema';
19
+ import { createContentItemSchema, updateUserProfileSchema } from '@commonpub/schema';
20
+ ```
21
+
22
+ ## Schema Modules
23
+
24
+ | Module | Tables | Purpose |
25
+ | ------------ | -------------------------------------------------------------------------------------------- | ------------------------------------------ |
26
+ | `auth` | `users`, `sessions`, `accounts`, `organizations`, `members`, `federatedAccounts`, `oauthClients`, `oauthCodes`, `verifications` | User identity, auth sessions, OAuth, SSO |
27
+ | `content` | `contentItems`, `contentVersions`, `contentForks`, `contentBuilds`, `tags`, `contentTags` | Articles, projects, blog posts, explainers |
28
+ | `social` | `likes`, `comments`, `follows`, `bookmarks`, `notifications`, `reports`, `conversations`, `messages` | Social interactions, messaging, reports |
29
+ | `hub` | `hubs`, `hubMembers`, `hubPosts`, `hubPostReplies`, `hubBans`, `hubInvites`, `hubShares` | Hub spaces (community/product/company) with moderation |
30
+ | `product` | `products`, `contentProducts` | Product catalog and BOM linking |
31
+ | `learning` | `learningPaths`, `learningModules`, `learningLessons`, `enrollments`, `lessonProgress`, `certificates` | Learning paths, progress, certificates |
32
+ | `docs` | `docsSites`, `docsVersions`, `docsPages`, `docsNav` | Versioned documentation sites |
33
+ | `federation` | `remoteActors`, `activities`, `followRelationships`, `actorKeypairs` | ActivityPub federation state |
34
+ | `admin` | `instanceSettings`, `auditLogs` | Admin panel and instance config |
35
+ | `video` | `videos`, `videoCategories` | Video content and categories |
36
+ | `contest` | `contests`, `contestEntries` | Contest/competition system |
37
+ | `files` | `files` | File upload tracking |
38
+ | `enums` | (none) | Shared PostgreSQL enums |
39
+ | `validators` | (none) | Zod schemas for input validation |
40
+
41
+ ## Enums
42
+
43
+ All enums are defined as PostgreSQL enum types via Drizzle's `pgEnum`:
44
+
45
+ - `userRoleEnum`: `member`, `moderator`, `admin`
46
+ - `userStatusEnum`: `active`, `suspended`, `banned`
47
+ - `profileVisibilityEnum`: `public`, `private`
48
+ - `contentTypeEnum`: `project`, `article`, `blog`, `explainer`
49
+ - `contentStatusEnum`: `draft`, `published`, `archived`
50
+ - `contentVisibilityEnum`: `public`, `unlisted`, `private`
51
+ - `difficultyEnum`: `beginner`, `intermediate`, `advanced`
52
+ - Additional enums for communities, learning, federation, etc.
53
+
54
+ ## Conventions
55
+
56
+ - **UUID primary keys** on all tables (`uuid().defaultRandom().primaryKey()`)
57
+ - **Timestamps with timezone** (`timestamp('created_at', { withTimezone: true })`)
58
+ - **Cascade deletes** on foreign keys where appropriate
59
+ - **JSONB columns** for flexible structured data (social links, parts lists, sections)
60
+ - **Denormalized counters** for read performance (view/like/comment/fork counts)
61
+ - **Relations** defined via Drizzle's `relations()` for type-safe joins
62
+
63
+ ## Validators
64
+
65
+ Zod schemas for validating user input at API boundaries:
66
+
67
+ ```ts
68
+ import { createContentItemSchema, updateUserProfileSchema } from '@commonpub/schema';
69
+
70
+ const result = createContentItemSchema.safeParse(userInput);
71
+ if (!result.success) {
72
+ // Handle validation errors
73
+ }
74
+ ```
75
+
76
+ ## Development
77
+
78
+ ```bash
79
+ pnpm build # Compile TypeScript
80
+ pnpm test # Run tests
81
+ pnpm typecheck # Type-check without emitting
82
+ ```
83
+
84
+ ## Dependencies
85
+
86
+ - `drizzle-orm`: ORM and query builder
87
+ - `zod`: Runtime validation
@@ -0,0 +1,256 @@
1
+ export declare const instanceSettings: import("drizzle-orm/pg-core").PgTableWithColumns<{
2
+ name: "instance_settings";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/pg-core").PgColumn<{
6
+ name: "id";
7
+ tableName: "instance_settings";
8
+ dataType: "string";
9
+ columnType: "PgUUID";
10
+ data: string;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: true;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: undefined;
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {}>;
22
+ key: import("drizzle-orm/pg-core").PgColumn<{
23
+ name: "key";
24
+ tableName: "instance_settings";
25
+ dataType: "string";
26
+ columnType: "PgVarchar";
27
+ data: string;
28
+ driverParam: string;
29
+ notNull: true;
30
+ hasDefault: false;
31
+ isPrimaryKey: false;
32
+ isAutoincrement: false;
33
+ hasRuntimeDefault: false;
34
+ enumValues: [string, ...string[]];
35
+ baseColumn: never;
36
+ identity: undefined;
37
+ generated: undefined;
38
+ }, {}, {
39
+ length: 128;
40
+ }>;
41
+ value: import("drizzle-orm/pg-core").PgColumn<{
42
+ name: "value";
43
+ tableName: "instance_settings";
44
+ dataType: "json";
45
+ columnType: "PgJsonb";
46
+ data: unknown;
47
+ driverParam: unknown;
48
+ notNull: true;
49
+ hasDefault: false;
50
+ isPrimaryKey: false;
51
+ isAutoincrement: false;
52
+ hasRuntimeDefault: false;
53
+ enumValues: undefined;
54
+ baseColumn: never;
55
+ identity: undefined;
56
+ generated: undefined;
57
+ }, {}, {}>;
58
+ updatedBy: import("drizzle-orm/pg-core").PgColumn<{
59
+ name: "updated_by";
60
+ tableName: "instance_settings";
61
+ dataType: "string";
62
+ columnType: "PgUUID";
63
+ data: string;
64
+ driverParam: string;
65
+ notNull: false;
66
+ hasDefault: false;
67
+ isPrimaryKey: false;
68
+ isAutoincrement: false;
69
+ hasRuntimeDefault: false;
70
+ enumValues: undefined;
71
+ baseColumn: never;
72
+ identity: undefined;
73
+ generated: undefined;
74
+ }, {}, {}>;
75
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
76
+ name: "updated_at";
77
+ tableName: "instance_settings";
78
+ dataType: "date";
79
+ columnType: "PgTimestamp";
80
+ data: Date;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: true;
84
+ isPrimaryKey: false;
85
+ isAutoincrement: false;
86
+ hasRuntimeDefault: false;
87
+ enumValues: undefined;
88
+ baseColumn: never;
89
+ identity: undefined;
90
+ generated: undefined;
91
+ }, {}, {}>;
92
+ };
93
+ dialect: "pg";
94
+ }>;
95
+ export declare const auditLogs: import("drizzle-orm/pg-core").PgTableWithColumns<{
96
+ name: "audit_logs";
97
+ schema: undefined;
98
+ columns: {
99
+ id: import("drizzle-orm/pg-core").PgColumn<{
100
+ name: "id";
101
+ tableName: "audit_logs";
102
+ dataType: "string";
103
+ columnType: "PgUUID";
104
+ data: string;
105
+ driverParam: string;
106
+ notNull: true;
107
+ hasDefault: true;
108
+ isPrimaryKey: true;
109
+ isAutoincrement: false;
110
+ hasRuntimeDefault: false;
111
+ enumValues: undefined;
112
+ baseColumn: never;
113
+ identity: undefined;
114
+ generated: undefined;
115
+ }, {}, {}>;
116
+ userId: import("drizzle-orm/pg-core").PgColumn<{
117
+ name: "user_id";
118
+ tableName: "audit_logs";
119
+ dataType: "string";
120
+ columnType: "PgUUID";
121
+ data: string;
122
+ driverParam: string;
123
+ notNull: true;
124
+ hasDefault: false;
125
+ isPrimaryKey: false;
126
+ isAutoincrement: false;
127
+ hasRuntimeDefault: false;
128
+ enumValues: undefined;
129
+ baseColumn: never;
130
+ identity: undefined;
131
+ generated: undefined;
132
+ }, {}, {}>;
133
+ action: import("drizzle-orm/pg-core").PgColumn<{
134
+ name: "action";
135
+ tableName: "audit_logs";
136
+ dataType: "string";
137
+ columnType: "PgVarchar";
138
+ data: string;
139
+ driverParam: string;
140
+ notNull: true;
141
+ hasDefault: false;
142
+ isPrimaryKey: false;
143
+ isAutoincrement: false;
144
+ hasRuntimeDefault: false;
145
+ enumValues: [string, ...string[]];
146
+ baseColumn: never;
147
+ identity: undefined;
148
+ generated: undefined;
149
+ }, {}, {
150
+ length: 64;
151
+ }>;
152
+ targetType: import("drizzle-orm/pg-core").PgColumn<{
153
+ name: "target_type";
154
+ tableName: "audit_logs";
155
+ dataType: "string";
156
+ columnType: "PgVarchar";
157
+ data: string;
158
+ driverParam: string;
159
+ notNull: true;
160
+ hasDefault: false;
161
+ isPrimaryKey: false;
162
+ isAutoincrement: false;
163
+ hasRuntimeDefault: false;
164
+ enumValues: [string, ...string[]];
165
+ baseColumn: never;
166
+ identity: undefined;
167
+ generated: undefined;
168
+ }, {}, {
169
+ length: 64;
170
+ }>;
171
+ targetId: import("drizzle-orm/pg-core").PgColumn<{
172
+ name: "target_id";
173
+ tableName: "audit_logs";
174
+ dataType: "string";
175
+ columnType: "PgVarchar";
176
+ data: string;
177
+ driverParam: string;
178
+ notNull: false;
179
+ hasDefault: false;
180
+ isPrimaryKey: false;
181
+ isAutoincrement: false;
182
+ hasRuntimeDefault: false;
183
+ enumValues: [string, ...string[]];
184
+ baseColumn: never;
185
+ identity: undefined;
186
+ generated: undefined;
187
+ }, {}, {
188
+ length: 255;
189
+ }>;
190
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
191
+ name: "metadata";
192
+ tableName: "audit_logs";
193
+ dataType: "json";
194
+ columnType: "PgJsonb";
195
+ data: unknown;
196
+ driverParam: unknown;
197
+ notNull: false;
198
+ hasDefault: false;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: undefined;
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {}>;
207
+ ipAddress: import("drizzle-orm/pg-core").PgColumn<{
208
+ name: "ip_address";
209
+ tableName: "audit_logs";
210
+ dataType: "string";
211
+ columnType: "PgVarchar";
212
+ data: string;
213
+ driverParam: string;
214
+ notNull: false;
215
+ hasDefault: false;
216
+ isPrimaryKey: false;
217
+ isAutoincrement: false;
218
+ hasRuntimeDefault: false;
219
+ enumValues: [string, ...string[]];
220
+ baseColumn: never;
221
+ identity: undefined;
222
+ generated: undefined;
223
+ }, {}, {
224
+ length: 45;
225
+ }>;
226
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
227
+ name: "created_at";
228
+ tableName: "audit_logs";
229
+ dataType: "date";
230
+ columnType: "PgTimestamp";
231
+ data: Date;
232
+ driverParam: string;
233
+ notNull: true;
234
+ hasDefault: true;
235
+ isPrimaryKey: false;
236
+ isAutoincrement: false;
237
+ hasRuntimeDefault: false;
238
+ enumValues: undefined;
239
+ baseColumn: never;
240
+ identity: undefined;
241
+ generated: undefined;
242
+ }, {}, {}>;
243
+ };
244
+ dialect: "pg";
245
+ }>;
246
+ export declare const instanceSettingsRelations: import("drizzle-orm").Relations<"instance_settings", {
247
+ updater: import("drizzle-orm").One<"users", false>;
248
+ }>;
249
+ export declare const auditLogsRelations: import("drizzle-orm").Relations<"audit_logs", {
250
+ user: import("drizzle-orm").One<"users", true>;
251
+ }>;
252
+ export type InstanceSettingRow = typeof instanceSettings.$inferSelect;
253
+ export type NewInstanceSettingRow = typeof instanceSettings.$inferInsert;
254
+ export type AuditLogRow = typeof auditLogs.$inferSelect;
255
+ export type NewAuditLogRow = typeof auditLogs.$inferInsert;
256
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcpB,CAAC;AAIH,eAAO,MAAM,yBAAyB;;EAEnC,CAAC;AAEJ,eAAO,MAAM,kBAAkB;;EAE5B,CAAC;AAGJ,MAAM,MAAM,kBAAkB,GAAG,OAAO,gBAAgB,CAAC,YAAY,CAAC;AACtE,MAAM,MAAM,qBAAqB,GAAG,OAAO,gBAAgB,CAAC,YAAY,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC"}
package/dist/admin.js ADDED
@@ -0,0 +1,33 @@
1
+ import { pgTable, uuid, varchar, timestamp, jsonb, index } from 'drizzle-orm/pg-core';
2
+ import { relations } from 'drizzle-orm';
3
+ import { users } from './auth.js';
4
+ export const instanceSettings = pgTable('instance_settings', {
5
+ id: uuid('id').defaultRandom().primaryKey(),
6
+ key: varchar('key', { length: 128 }).notNull().unique(),
7
+ value: jsonb('value').notNull(),
8
+ updatedBy: uuid('updated_by').references(() => users.id, { onDelete: 'set null' }),
9
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
10
+ });
11
+ export const auditLogs = pgTable('audit_logs', {
12
+ id: uuid('id').defaultRandom().primaryKey(),
13
+ userId: uuid('user_id')
14
+ .notNull()
15
+ .references(() => users.id, { onDelete: 'cascade' }),
16
+ action: varchar('action', { length: 64 }).notNull(),
17
+ targetType: varchar('target_type', { length: 64 }).notNull(),
18
+ targetId: varchar('target_id', { length: 255 }),
19
+ metadata: jsonb('metadata'),
20
+ ipAddress: varchar('ip_address', { length: 45 }),
21
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
22
+ }, (t) => [
23
+ index('idx_audit_logs_user_id').on(t.userId),
24
+ index('idx_audit_logs_created_at').on(t.createdAt),
25
+ ]);
26
+ // --- Relations ---
27
+ export const instanceSettingsRelations = relations(instanceSettings, ({ one }) => ({
28
+ updater: one(users, { fields: [instanceSettings.updatedBy], references: [users.id] }),
29
+ }));
30
+ export const auditLogsRelations = relations(auditLogs, ({ one }) => ({
31
+ user: one(users, { fields: [auditLogs.userId], references: [users.id] }),
32
+ }));
33
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}