effect 4.0.0-beta.63 → 4.0.0-beta.64
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.
|
@@ -17,10 +17,11 @@ import * as SqlResolver from "./SqlResolver.ts";
|
|
|
17
17
|
* @since 4.0.0
|
|
18
18
|
* @category repository
|
|
19
19
|
*/
|
|
20
|
-
export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])>(Model: S, options: {
|
|
20
|
+
export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]), SoftDelete extends keyof S["fields"] = never>(Model: S, options: {
|
|
21
21
|
readonly tableName: string;
|
|
22
22
|
readonly spanPrefix: string;
|
|
23
23
|
readonly idColumn: Id;
|
|
24
|
+
readonly softDeleteColumn?: SoftDelete | undefined;
|
|
24
25
|
}) => Effect.Effect<{
|
|
25
26
|
readonly insert: (insert: S["insert"]["Type"]) => Effect.Effect<S["Type"], Schema.SchemaError | SqlError, S["DecodingServices"] | S["insert"]["EncodingServices"]>;
|
|
26
27
|
readonly insertVoid: (insert: S["insert"]["Type"]) => Effect.Effect<void, Schema.SchemaError | SqlError, S["insert"]["EncodingServices"]>;
|
|
@@ -35,10 +36,11 @@ export declare const makeRepository: <S extends Model.Any, Id extends (keyof S["
|
|
|
35
36
|
* @since 4.0.0
|
|
36
37
|
* @category repository
|
|
37
38
|
*/
|
|
38
|
-
export declare const makeResolvers: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])>(Model: S, options: {
|
|
39
|
+
export declare const makeResolvers: <S extends Model.Any, Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]), SoftDelete extends keyof S["fields"] = never>(Model: S, options: {
|
|
39
40
|
readonly tableName: string;
|
|
40
41
|
readonly spanPrefix: string;
|
|
41
42
|
readonly idColumn: Id;
|
|
43
|
+
readonly softDeleteColumn?: SoftDelete | undefined;
|
|
42
44
|
}) => Effect.Effect<{
|
|
43
45
|
readonly insert: RequestResolver.RequestResolver<SqlResolver.SqlRequest<S["insert"]["Type"], S["Type"], ResultLengthMismatch | SqlError, S["insert"]["EncodingServices"]>>;
|
|
44
46
|
readonly insertVoid: RequestResolver.RequestResolver<SqlResolver.SqlRequest<S["insert"]["Type"], void, SqlError, S["insert"]["EncodingServices"]>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqlModel.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlModel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAG/C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,CAAC,SAAS,KAAK,CAAC,GAAG,EACnB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAChF,OAAO,CAAC,EAAE,SAAS;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"SqlModel.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,12 +13,15 @@ export const makeRepository = (Model, options) => Effect.gen(function* () {
|
|
|
13
13
|
const sql = yield* SqlClient;
|
|
14
14
|
const idSchema = Model.fields[options.idColumn];
|
|
15
15
|
const idColumn = options.idColumn;
|
|
16
|
+
const softDeleteColumn = options.softDeleteColumn;
|
|
17
|
+
const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);
|
|
18
|
+
const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;
|
|
16
19
|
const insertSchema = SqlSchema.findOne({
|
|
17
20
|
Request: Model.insert,
|
|
18
21
|
Result: Model,
|
|
19
22
|
execute: request => sql.onDialectOrElse({
|
|
20
23
|
mysql: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
|
|
21
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(Effect.map(([, results]) => results)),
|
|
24
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results)),
|
|
22
25
|
orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
|
|
23
26
|
})
|
|
24
27
|
});
|
|
@@ -36,9 +39,9 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
36
39
|
Request: Model.update,
|
|
37
40
|
Result: Model,
|
|
38
41
|
execute: request => sql.onDialectOrElse({
|
|
39
|
-
mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]};
|
|
40
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]};`.unprepared.pipe(Effect.map(([, results]) => results)),
|
|
41
|
-
orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]} returning *`
|
|
42
|
+
mysql: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};
|
|
43
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`.unprepared.pipe(Effect.map(([, results]) => results)),
|
|
44
|
+
orElse: () => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)} returning *`
|
|
42
45
|
})
|
|
43
46
|
});
|
|
44
47
|
const update = update => updateSchema(update).pipe(Effect.catchTag("NoSuchElementError", Effect.die), Effect.withSpan(`${options.spanPrefix}.update`, {
|
|
@@ -50,7 +53,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
50
53
|
}));
|
|
51
54
|
const updateVoidSchema = SqlSchema.void({
|
|
52
55
|
Request: Model.update,
|
|
53
|
-
execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${sql(idColumn)} = ${request[idColumn]}`
|
|
56
|
+
execute: request => sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)}`
|
|
54
57
|
});
|
|
55
58
|
const updateVoid = update => updateVoidSchema(update).pipe(Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
|
|
56
59
|
attributes: {
|
|
@@ -62,7 +65,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
62
65
|
const findByIdSchema = SqlSchema.findOne({
|
|
63
66
|
Request: idSchema,
|
|
64
67
|
Result: Model,
|
|
65
|
-
execute: id => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
|
|
68
|
+
execute: id => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
|
|
66
69
|
});
|
|
67
70
|
const findById = id => findByIdSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.findById`, {
|
|
68
71
|
attributes: {
|
|
@@ -73,7 +76,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
73
76
|
}));
|
|
74
77
|
const deleteSchema = SqlSchema.void({
|
|
75
78
|
Request: idSchema,
|
|
76
|
-
execute: id => sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
|
|
79
|
+
execute: id => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
|
|
77
80
|
});
|
|
78
81
|
const delete_ = id => deleteSchema(id).pipe(Effect.withSpan(`${options.spanPrefix}.delete`, {
|
|
79
82
|
attributes: {
|
|
@@ -101,12 +104,15 @@ export const makeResolvers = (Model, options) => Effect.gen(function* () {
|
|
|
101
104
|
const sql = yield* SqlClient;
|
|
102
105
|
const idSchema = Model.fields[options.idColumn];
|
|
103
106
|
const idColumn = options.idColumn;
|
|
107
|
+
const softDeleteColumn = options.softDeleteColumn;
|
|
108
|
+
const withSoftDeleteFilter = where => softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`]);
|
|
109
|
+
const setSoftDeleted = softDeleteColumn === undefined ? undefined : sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`;
|
|
104
110
|
const insert = SqlResolver.ordered({
|
|
105
111
|
Request: Model.insert,
|
|
106
112
|
Result: Model,
|
|
107
113
|
execute: request => sql.onDialectOrElse({
|
|
108
114
|
mysql: () => Effect.forEach(request, request => sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
|
|
109
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID();`.unprepared.pipe(Effect.map(([, results]) => results[0])), {
|
|
115
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`.unprepared.pipe(Effect.map(([, results]) => results[0])), {
|
|
110
116
|
concurrency: 10
|
|
111
117
|
}),
|
|
112
118
|
orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
|
|
@@ -122,11 +128,11 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
122
128
|
ResultId(request) {
|
|
123
129
|
return request[idColumn];
|
|
124
130
|
},
|
|
125
|
-
execute: ids => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
|
|
131
|
+
execute: ids => sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
|
|
126
132
|
}).pipe(RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`));
|
|
127
133
|
const delete_ = SqlResolver.void({
|
|
128
134
|
Request: idSchema,
|
|
129
|
-
execute: ids => sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
|
|
135
|
+
execute: ids => softDeleteColumn === undefined ? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}` : sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
|
|
130
136
|
}).pipe(RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`));
|
|
131
137
|
return {
|
|
132
138
|
insert,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqlModel.js","names":["Effect","RequestResolver","SqlClient","SqlResolver","SqlSchema","makeRepository","Model","options","gen","sql","idSchema","fields","idColumn","insertSchema","findOne","Request","insert","Result","execute","request","onDialectOrElse","mysql","tableName","unprepared","pipe","map","results","orElse","returning","catchTag","die","withSpan","spanPrefix","captureStackTrace","insertVoidSchema","void","insertVoid","updateSchema","update","attributes","id","updateVoidSchema","updateVoid","findByIdSchema","findById","deleteSchema","delete_","delete","makeResolvers","ordered","forEach","concurrency","Id","ResultId","ids","in"],"sources":["../../../src/unstable/sql/SqlModel.ts"],"sourcesContent":[null],"mappings":"AAKA,OAAO,KAAKA,MAAM,MAAM,iBAAiB;AACzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAI3D,SAASC,SAAS,QAAQ,gBAAgB;AAE1C,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAC/C,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;;;;AAMA,OAAO,MAAMC,cAAc,GAAGA,
|
|
1
|
+
{"version":3,"file":"SqlModel.js","names":["Effect","RequestResolver","SqlClient","SqlResolver","SqlSchema","makeRepository","Model","options","gen","sql","idSchema","fields","idColumn","softDeleteColumn","withSoftDeleteFilter","where","undefined","and","setSoftDeleted","insertSchema","findOne","Request","insert","Result","execute","request","onDialectOrElse","mysql","tableName","unprepared","pipe","map","results","orElse","returning","catchTag","die","withSpan","spanPrefix","captureStackTrace","insertVoidSchema","void","insertVoid","updateSchema","update","attributes","id","updateVoidSchema","updateVoid","findByIdSchema","findById","deleteSchema","delete_","delete","makeResolvers","ordered","forEach","concurrency","Id","ResultId","ids","in"],"sources":["../../../src/unstable/sql/SqlModel.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -21,11 +21,13 @@ import * as SqlSchema from "./SqlSchema.ts"
|
|
|
21
21
|
*/
|
|
22
22
|
export const makeRepository = <
|
|
23
23
|
S extends Model.Any,
|
|
24
|
-
Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])
|
|
24
|
+
Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]),
|
|
25
|
+
SoftDelete extends keyof S["fields"] = never
|
|
25
26
|
>(Model: S, options: {
|
|
26
27
|
readonly tableName: string
|
|
27
28
|
readonly spanPrefix: string
|
|
28
29
|
readonly idColumn: Id
|
|
30
|
+
readonly softDeleteColumn?: SoftDelete | undefined
|
|
29
31
|
}): Effect.Effect<
|
|
30
32
|
{
|
|
31
33
|
readonly insert: (
|
|
@@ -66,6 +68,12 @@ export const makeRepository = <
|
|
|
66
68
|
const sql = yield* SqlClient
|
|
67
69
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
68
70
|
const idColumn = options.idColumn as string
|
|
71
|
+
const softDeleteColumn = options.softDeleteColumn as string | undefined
|
|
72
|
+
const withSoftDeleteFilter = (where: any) =>
|
|
73
|
+
softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`])
|
|
74
|
+
const setSoftDeleted = softDeleteColumn === undefined
|
|
75
|
+
? undefined
|
|
76
|
+
: sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`
|
|
69
77
|
|
|
70
78
|
const insertSchema = SqlSchema.findOne({
|
|
71
79
|
Request: Model.insert,
|
|
@@ -74,9 +82,10 @@ export const makeRepository = <
|
|
|
74
82
|
sql.onDialectOrElse({
|
|
75
83
|
mysql: () =>
|
|
76
84
|
sql`insert into ${sql(options.tableName)} ${sql.insert(request as any)};
|
|
77
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID()
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`
|
|
86
|
+
.unprepared.pipe(
|
|
87
|
+
Effect.map(([, results]) => results as any)
|
|
88
|
+
),
|
|
80
89
|
orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request as any).returning("*")}`
|
|
81
90
|
})
|
|
82
91
|
})
|
|
@@ -111,15 +120,16 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
111
120
|
execute: (request: any) =>
|
|
112
121
|
sql.onDialectOrElse({
|
|
113
122
|
mysql: () =>
|
|
114
|
-
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
115
|
-
request[idColumn]
|
|
123
|
+
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
124
|
+
withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
|
|
116
125
|
};
|
|
117
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idColumn]}
|
|
118
|
-
|
|
119
|
-
|
|
126
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)};`
|
|
127
|
+
.unprepared.pipe(
|
|
128
|
+
Effect.map(([, results]) => results as any)
|
|
129
|
+
),
|
|
120
130
|
orElse: () =>
|
|
121
|
-
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
122
|
-
request[idColumn]
|
|
131
|
+
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
132
|
+
withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
|
|
123
133
|
} returning *`
|
|
124
134
|
})
|
|
125
135
|
})
|
|
@@ -142,8 +152,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
142
152
|
const updateVoidSchema = SqlSchema.void({
|
|
143
153
|
Request: Model.update,
|
|
144
154
|
execute: (request: any) =>
|
|
145
|
-
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
146
|
-
request[idColumn]
|
|
155
|
+
sql`update ${sql(options.tableName)} set ${sql.update(request, [idColumn])} where ${
|
|
156
|
+
withSoftDeleteFilter(sql`${sql(idColumn)} = ${request[idColumn]}`)
|
|
147
157
|
}`
|
|
148
158
|
})
|
|
149
159
|
const updateVoid = (
|
|
@@ -160,7 +170,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
160
170
|
const findByIdSchema = SqlSchema.findOne({
|
|
161
171
|
Request: idSchema,
|
|
162
172
|
Result: Model,
|
|
163
|
-
execute: (id: any) =>
|
|
173
|
+
execute: (id: any) =>
|
|
174
|
+
sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)}`
|
|
164
175
|
})
|
|
165
176
|
const findById = (
|
|
166
177
|
id: S["fields"][Id]["Type"]
|
|
@@ -177,7 +188,12 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
177
188
|
|
|
178
189
|
const deleteSchema = SqlSchema.void({
|
|
179
190
|
Request: idSchema,
|
|
180
|
-
execute: (id: any) =>
|
|
191
|
+
execute: (id: any) =>
|
|
192
|
+
softDeleteColumn === undefined
|
|
193
|
+
? sql`delete from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
|
|
194
|
+
: sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${
|
|
195
|
+
withSoftDeleteFilter(sql`${sql(idColumn)} = ${id}`)
|
|
196
|
+
}`
|
|
181
197
|
})
|
|
182
198
|
const delete_ = (
|
|
183
199
|
id: S["fields"][Id]["Type"]
|
|
@@ -201,13 +217,15 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
201
217
|
*/
|
|
202
218
|
export const makeResolvers = <
|
|
203
219
|
S extends Model.Any,
|
|
204
|
-
Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"])
|
|
220
|
+
Id extends (keyof S["Type"]) & (keyof S["update"]["Type"]) & (keyof S["fields"]),
|
|
221
|
+
SoftDelete extends keyof S["fields"] = never
|
|
205
222
|
>(
|
|
206
223
|
Model: S,
|
|
207
224
|
options: {
|
|
208
225
|
readonly tableName: string
|
|
209
226
|
readonly spanPrefix: string
|
|
210
227
|
readonly idColumn: Id
|
|
228
|
+
readonly softDeleteColumn?: SoftDelete | undefined
|
|
211
229
|
}
|
|
212
230
|
): Effect.Effect<
|
|
213
231
|
{
|
|
@@ -246,6 +264,12 @@ export const makeResolvers = <
|
|
|
246
264
|
const sql = yield* SqlClient
|
|
247
265
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
248
266
|
const idColumn = options.idColumn as string
|
|
267
|
+
const softDeleteColumn = options.softDeleteColumn as string | undefined
|
|
268
|
+
const withSoftDeleteFilter = (where: any) =>
|
|
269
|
+
softDeleteColumn === undefined ? where : sql.and([where, sql`${sql(softDeleteColumn)} is null`])
|
|
270
|
+
const setSoftDeleted = softDeleteColumn === undefined
|
|
271
|
+
? undefined
|
|
272
|
+
: sql`${sql(softDeleteColumn)} = CURRENT_TIMESTAMP`
|
|
249
273
|
|
|
250
274
|
const insert: RequestResolver.RequestResolver<
|
|
251
275
|
SqlResolver.SqlRequest<
|
|
@@ -262,9 +286,10 @@ export const makeResolvers = <
|
|
|
262
286
|
mysql: () =>
|
|
263
287
|
Effect.forEach(request, (request: any) =>
|
|
264
288
|
sql`insert into ${sql(options.tableName)} ${sql.insert(request)};
|
|
265
|
-
select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID()
|
|
266
|
-
|
|
267
|
-
|
|
289
|
+
select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql`${sql(idColumn)} = LAST_INSERT_ID()`)};`
|
|
290
|
+
.unprepared.pipe(
|
|
291
|
+
Effect.map(([, results]) => results[0] as any)
|
|
292
|
+
), { concurrency: 10 }),
|
|
268
293
|
orElse: () => sql`insert into ${sql(options.tableName)} ${sql.insert(request).returning("*")}`
|
|
269
294
|
})
|
|
270
295
|
}).pipe(
|
|
@@ -293,7 +318,8 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
293
318
|
ResultId(request: any) {
|
|
294
319
|
return request[idColumn]
|
|
295
320
|
},
|
|
296
|
-
execute: (ids: any) =>
|
|
321
|
+
execute: (ids: any) =>
|
|
322
|
+
sql`select * from ${sql(options.tableName)} where ${withSoftDeleteFilter(sql.in(idColumn, ids))}`
|
|
297
323
|
}).pipe(
|
|
298
324
|
RequestResolver.withSpan(`${options.spanPrefix}.findByIdResolver`)
|
|
299
325
|
)
|
|
@@ -307,7 +333,12 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
307
333
|
>
|
|
308
334
|
> = SqlResolver.void({
|
|
309
335
|
Request: idSchema,
|
|
310
|
-
execute: (ids: any) =>
|
|
336
|
+
execute: (ids: any) =>
|
|
337
|
+
softDeleteColumn === undefined
|
|
338
|
+
? sql`delete from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`
|
|
339
|
+
: sql`update ${sql(options.tableName)} set ${setSoftDeleted} where ${
|
|
340
|
+
withSoftDeleteFilter(sql.in(idColumn, ids))
|
|
341
|
+
}`
|
|
311
342
|
}).pipe(
|
|
312
343
|
RequestResolver.withSpan(`${options.spanPrefix}.deleteResolver`)
|
|
313
344
|
)
|