@coursebuilder/adapter-drizzle 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/mysql.d.ts.map +1 -1
- package/lib/mysql.js +56 -0
- package/lib/pg.d.ts.map +1 -1
- package/lib/pg.js +7 -0
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +7 -0
- package/package.json +2 -2
- package/src/lib/mysql.ts +58 -0
- package/src/lib/pg.ts +7 -0
- package/src/lib/sqlite.ts +7 -0
package/lib/mysql.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../src/lib/mysql.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,aAAa,EAEb,YAAY,EAIb,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../src/lib/mysql.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,aAAa,EAEb,YAAY,EAIb,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxE,wBAAgB,YAAY,CAAC,UAAU,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2HpD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,CAAC,OAAO,aAAa,CAAC,EAC1C,OAAO,0BAAsB,GAC5B,oBAAoB,CA2PtB"}
|
package/lib/mysql.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { addSeconds, isAfter } from 'date-fns';
|
|
2
2
|
import { and, eq, sql } from 'drizzle-orm';
|
|
3
3
|
import { mysqlTable as defaultMySqlTableFn, double, index, int, json, mysqlEnum, primaryKey, timestamp, varchar, } from 'drizzle-orm/mysql-core';
|
|
4
|
+
import { VideoResourceSchema } from '@coursebuilder/core/schemas/video-resource';
|
|
4
5
|
export function createTables(mySqlTable) {
|
|
5
6
|
const users = mySqlTable('user', {
|
|
6
7
|
id: varchar('id', { length: 255 }).notNull().primaryKey(),
|
|
@@ -102,6 +103,61 @@ export function createTables(mySqlTable) {
|
|
|
102
103
|
export function mySqlDrizzleAdapter(client, tableFn = defaultMySqlTableFn) {
|
|
103
104
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn);
|
|
104
105
|
return {
|
|
106
|
+
async updateContentResourceFields(options) {
|
|
107
|
+
const setFields = Object.entries(options.fields)
|
|
108
|
+
.map(([fieldName, fieldValue], index, array) => {
|
|
109
|
+
const comma = index < array.length - 1 ? ',' : '';
|
|
110
|
+
return sql `${fieldName} = ${fieldValue}${comma}`;
|
|
111
|
+
})
|
|
112
|
+
.join(' ');
|
|
113
|
+
const query = sql `
|
|
114
|
+
UPDATE ${contentResource}
|
|
115
|
+
SET ${setFields}
|
|
116
|
+
WHERE
|
|
117
|
+
id = ${options.id};
|
|
118
|
+
`;
|
|
119
|
+
return client
|
|
120
|
+
.execute(query)
|
|
121
|
+
.then((_) => {
|
|
122
|
+
return this.getContentResource(options.id);
|
|
123
|
+
})
|
|
124
|
+
.catch((error) => {
|
|
125
|
+
console.error(error);
|
|
126
|
+
throw error;
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
async getVideoResource(id) {
|
|
130
|
+
if (!id) {
|
|
131
|
+
throw new Error('videoResourceId is required');
|
|
132
|
+
}
|
|
133
|
+
const query = sql `
|
|
134
|
+
SELECT
|
|
135
|
+
id as _id,
|
|
136
|
+
CAST(updatedAt AS DATETIME) as _updatedAt,
|
|
137
|
+
CAST(createdAt AS DATETIME) as _createdAt,
|
|
138
|
+
JSON_EXTRACT (${contentResource.fields}, "$.state") AS state,
|
|
139
|
+
JSON_EXTRACT (${contentResource.fields}, "$.duration") AS duration,
|
|
140
|
+
JSON_EXTRACT (${contentResource.fields}, "$.muxPlaybackId") AS muxPlaybackId,
|
|
141
|
+
JSON_EXTRACT (${contentResource.fields}, "$.muxAssetId") AS muxAssetId,
|
|
142
|
+
JSON_EXTRACT (${contentResource.fields}, "$.transcript") AS transcript
|
|
143
|
+
FROM
|
|
144
|
+
${contentResource}
|
|
145
|
+
WHERE
|
|
146
|
+
type = 'videoResource'
|
|
147
|
+
AND (id = ${id});
|
|
148
|
+
|
|
149
|
+
`;
|
|
150
|
+
return client
|
|
151
|
+
.execute(query)
|
|
152
|
+
.then((result) => {
|
|
153
|
+
const parsedResource = VideoResourceSchema.safeParse(result.rows[0]);
|
|
154
|
+
return parsedResource.success ? parsedResource.data : null;
|
|
155
|
+
})
|
|
156
|
+
.catch((error) => {
|
|
157
|
+
console.error(error);
|
|
158
|
+
return error;
|
|
159
|
+
});
|
|
160
|
+
},
|
|
105
161
|
async createContentResource(data) {
|
|
106
162
|
const id = crypto.randomUUID();
|
|
107
163
|
await client.insert(contentResource).values({ ...data, id });
|
package/lib/pg.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../src/lib/pg.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,UAAU,EAEV,SAAS,EAKV,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuG9C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,EACvC,OAAO,uBAAmB,GACzB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../src/lib/pg.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,UAAU,EAEV,SAAS,EAKV,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuG9C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,CAAC,OAAO,UAAU,CAAC,EACvC,OAAO,uBAAmB,GACzB,oBAAoB,CAqJtB"}
|
package/lib/pg.js
CHANGED
|
@@ -89,6 +89,13 @@ export function createTables(pgTable) {
|
|
|
89
89
|
export function pgDrizzleAdapter(client, tableFn = defaultPgTableFn) {
|
|
90
90
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn);
|
|
91
91
|
return {
|
|
92
|
+
async updateContentResourceFields(options) {
|
|
93
|
+
return null;
|
|
94
|
+
},
|
|
95
|
+
async getVideoResource(id) {
|
|
96
|
+
// TODO Implement
|
|
97
|
+
return null;
|
|
98
|
+
},
|
|
92
99
|
async createContentResource(resource) {
|
|
93
100
|
return client
|
|
94
101
|
.insert(contentResource)
|
package/lib/sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/lib/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAIlB,aAAa,EAEd,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAIxE,wBAAgB,YAAY,CAAC,WAAW,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FtD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,CAAC,OAAO,kBAAkB,CAAC,EAC/C,OAAO,2BAAuB,GAC7B,oBAAoB,
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/lib/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAIlB,aAAa,EAEd,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAIxE,wBAAgB,YAAY,CAAC,WAAW,EAAE,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FtD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AAE3D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,CAAC,OAAO,kBAAkB,CAAC,EAC/C,OAAO,2BAAuB,GAC7B,oBAAoB,CAiHtB"}
|
package/lib/sqlite.js
CHANGED
|
@@ -78,6 +78,13 @@ export function createTables(sqliteTable) {
|
|
|
78
78
|
export function SQLiteDrizzleAdapter(client, tableFn = defaultSqliteTableFn) {
|
|
79
79
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn);
|
|
80
80
|
return {
|
|
81
|
+
async updateContentResourceFields(options) {
|
|
82
|
+
return null;
|
|
83
|
+
},
|
|
84
|
+
async getVideoResource(id) {
|
|
85
|
+
// TODO Implement
|
|
86
|
+
return null;
|
|
87
|
+
},
|
|
81
88
|
async createContentResource(resource) {
|
|
82
89
|
return client
|
|
83
90
|
.insert(contentResource)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coursebuilder/adapter-drizzle",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Drizzle adapter for Course Builder.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"coursebuilder",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@auth/core": "^0.28.0",
|
|
34
|
-
"@coursebuilder/core": "0.0.
|
|
34
|
+
"@coursebuilder/core": "0.0.3",
|
|
35
35
|
"@libsql/client": "0.5.6",
|
|
36
36
|
"@types/better-sqlite3": "7.6.9",
|
|
37
37
|
"@types/uuid": "9.0.8",
|
package/src/lib/mysql.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from 'drizzle-orm/mysql-core'
|
|
17
17
|
|
|
18
18
|
import { type CourseBuilderAdapter } from '@coursebuilder/core/adapters'
|
|
19
|
+
import { VideoResourceSchema } from '@coursebuilder/core/schemas/video-resource'
|
|
19
20
|
|
|
20
21
|
export function createTables(mySqlTable: MySqlTableFn) {
|
|
21
22
|
const users = mySqlTable('user', {
|
|
@@ -151,6 +152,63 @@ export function mySqlDrizzleAdapter(
|
|
|
151
152
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn)
|
|
152
153
|
|
|
153
154
|
return {
|
|
155
|
+
async updateContentResourceFields(options) {
|
|
156
|
+
const setFields = Object.entries(options.fields)
|
|
157
|
+
.map(([fieldName, fieldValue], index, array) => {
|
|
158
|
+
const comma = index < array.length - 1 ? ',' : ''
|
|
159
|
+
return sql`${fieldName} = ${fieldValue}${comma}`
|
|
160
|
+
})
|
|
161
|
+
.join(' ')
|
|
162
|
+
|
|
163
|
+
const query = sql`
|
|
164
|
+
UPDATE ${contentResource}
|
|
165
|
+
SET ${setFields}
|
|
166
|
+
WHERE
|
|
167
|
+
id = ${options.id};
|
|
168
|
+
`
|
|
169
|
+
return client
|
|
170
|
+
.execute(query)
|
|
171
|
+
.then((_) => {
|
|
172
|
+
return this.getContentResource(options.id)
|
|
173
|
+
})
|
|
174
|
+
.catch((error) => {
|
|
175
|
+
console.error(error)
|
|
176
|
+
throw error
|
|
177
|
+
})
|
|
178
|
+
},
|
|
179
|
+
async getVideoResource(id) {
|
|
180
|
+
if (!id) {
|
|
181
|
+
throw new Error('videoResourceId is required')
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const query = sql`
|
|
185
|
+
SELECT
|
|
186
|
+
id as _id,
|
|
187
|
+
CAST(updatedAt AS DATETIME) as _updatedAt,
|
|
188
|
+
CAST(createdAt AS DATETIME) as _createdAt,
|
|
189
|
+
JSON_EXTRACT (${contentResource.fields}, "$.state") AS state,
|
|
190
|
+
JSON_EXTRACT (${contentResource.fields}, "$.duration") AS duration,
|
|
191
|
+
JSON_EXTRACT (${contentResource.fields}, "$.muxPlaybackId") AS muxPlaybackId,
|
|
192
|
+
JSON_EXTRACT (${contentResource.fields}, "$.muxAssetId") AS muxAssetId,
|
|
193
|
+
JSON_EXTRACT (${contentResource.fields}, "$.transcript") AS transcript
|
|
194
|
+
FROM
|
|
195
|
+
${contentResource}
|
|
196
|
+
WHERE
|
|
197
|
+
type = 'videoResource'
|
|
198
|
+
AND (id = ${id});
|
|
199
|
+
|
|
200
|
+
`
|
|
201
|
+
return client
|
|
202
|
+
.execute(query)
|
|
203
|
+
.then((result: any) => {
|
|
204
|
+
const parsedResource = VideoResourceSchema.safeParse(result.rows[0])
|
|
205
|
+
return parsedResource.success ? parsedResource.data : null
|
|
206
|
+
})
|
|
207
|
+
.catch((error) => {
|
|
208
|
+
console.error(error)
|
|
209
|
+
return error
|
|
210
|
+
})
|
|
211
|
+
},
|
|
154
212
|
async createContentResource(data) {
|
|
155
213
|
const id = crypto.randomUUID()
|
|
156
214
|
|
package/src/lib/pg.ts
CHANGED
|
@@ -129,6 +129,13 @@ export function pgDrizzleAdapter(
|
|
|
129
129
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn)
|
|
130
130
|
|
|
131
131
|
return {
|
|
132
|
+
async updateContentResourceFields(options) {
|
|
133
|
+
return null
|
|
134
|
+
},
|
|
135
|
+
async getVideoResource(id) {
|
|
136
|
+
// TODO Implement
|
|
137
|
+
return null
|
|
138
|
+
},
|
|
132
139
|
async createContentResource(resource) {
|
|
133
140
|
return client
|
|
134
141
|
.insert(contentResource)
|
package/src/lib/sqlite.ts
CHANGED
|
@@ -115,6 +115,13 @@ export function SQLiteDrizzleAdapter(
|
|
|
115
115
|
const { users, accounts, sessions, verificationTokens, contentResource } = createTables(tableFn)
|
|
116
116
|
|
|
117
117
|
return {
|
|
118
|
+
async updateContentResourceFields(options) {
|
|
119
|
+
return null
|
|
120
|
+
},
|
|
121
|
+
async getVideoResource(id) {
|
|
122
|
+
// TODO Implement
|
|
123
|
+
return null
|
|
124
|
+
},
|
|
118
125
|
async createContentResource(resource) {
|
|
119
126
|
return client
|
|
120
127
|
.insert(contentResource)
|