@effect-app/infra 0.198.2 → 0.199.2
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/CHANGELOG.md +32 -0
- package/_cjs/RequestContext.cjs +14 -9
- package/_cjs/RequestContext.cjs.map +1 -1
- package/_cjs/_ext/Array.cjs +3 -7
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/api/reportError.cjs +3 -6
- package/_cjs/api/reportError.cjs.map +1 -1
- package/_cjs/api/routing/base.cjs +27 -61
- package/_cjs/api/routing/base.cjs.map +1 -1
- package/_cjs/api/routing/defaultErrorHandler.cjs +14 -21
- package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
- package/_cjs/api/routing/makeRequestHandler.cjs +44 -51
- package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -1
- package/_cjs/api/routing/match.cjs +6 -13
- package/_cjs/api/routing/match.cjs.map +1 -1
- package/_cjs/api/{express → routing}/schema/jwt.cjs +3 -4
- package/_cjs/api/routing/schema/jwt.cjs.map +1 -0
- package/_cjs/api/routing/schema/routing.cjs +136 -0
- package/_cjs/api/routing/schema/routing.cjs.map +1 -0
- package/_cjs/api/setupRequest.cjs +16 -22
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/errorReporter.cjs +16 -17
- package/_cjs/errorReporter.cjs.map +1 -1
- package/_cjs/errors.cjs +2 -4
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/filter/types/path/index.cjs +0 -2
- package/_cjs/filter/types/path/index.cjs.map +1 -1
- package/_cjs/filter.cjs +35 -0
- package/_cjs/filter.cjs.map +1 -1
- package/_cjs/logger/jsonLogger.cjs +9 -15
- package/_cjs/logger/jsonLogger.cjs.map +1 -1
- package/_cjs/logger/logFmtLogger.cjs +7 -11
- package/_cjs/logger/logFmtLogger.cjs.map +1 -1
- package/_cjs/logger/shared.cjs +6 -8
- package/_cjs/logger/shared.cjs.map +1 -1
- package/_cjs/rateLimit.cjs +9 -12
- package/_cjs/rateLimit.cjs.map +1 -1
- package/_cjs/services/Emailer/Sendgrid.cjs +9 -16
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/services/Emailer/fake.cjs +5 -8
- package/_cjs/services/Emailer/fake.cjs.map +1 -1
- package/_cjs/services/Emailer/service.cjs +2 -4
- package/_cjs/services/Emailer/service.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs +29 -42
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/Operations/service.cjs +15 -15
- package/_cjs/services/Operations/service.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs +8 -12
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs +27 -33
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +31 -40
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/service.cjs +7 -9
- package/_cjs/services/QueueMaker/service.cjs.map +1 -1
- package/_cjs/services/Repository/dsl.cjs +11 -14
- package/_cjs/services/Repository/dsl.cjs.map +1 -1
- package/_cjs/services/Repository/ext.cjs +62 -71
- package/_cjs/services/Repository/ext.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +212 -197
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs +17 -23
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/ContextMapContainer.cjs +10 -16
- package/_cjs/services/Store/ContextMapContainer.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos/query.cjs +5 -9
- package/_cjs/services/Store/Cosmos/query.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.cjs +58 -68
- package/_cjs/services/Store/Cosmos.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs +34 -36
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +55 -65
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.cjs +2 -4
- package/_cjs/services/Store/codeFilter.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.test.cjs +13 -12
- package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
- package/_cjs/services/Store/filterApi/query.cjs +2 -4
- package/_cjs/services/Store/filterApi/query.cjs.map +1 -1
- package/_cjs/services/Store/index.cjs +6 -9
- package/_cjs/services/Store/index.cjs.map +1 -1
- package/_cjs/services/Store/service.cjs +5 -7
- package/_cjs/services/Store/service.cjs.map +1 -1
- package/_cjs/services/Store/utils.cjs +16 -20
- package/_cjs/services/Store/utils.cjs.map +1 -1
- package/_cjs/services/query.cjs +4 -1
- package/_cjs/services/query.cjs.map +1 -1
- package/_cjs/test.arbs.cjs +3 -4
- package/_cjs/test.arbs.cjs.map +1 -1
- package/dist/RequestContext.d.ts +20 -20
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +15 -8
- package/dist/_ext/Array.d.ts +2 -3
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +5 -5
- package/dist/api/reportError.d.ts +5 -5
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +6 -6
- package/dist/api/routing/base.d.ts +11 -15
- package/dist/api/routing/base.d.ts.map +1 -1
- package/dist/api/routing/base.js +48 -67
- package/dist/api/routing/defaultErrorHandler.d.ts +4 -6
- package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/routing/defaultErrorHandler.js +26 -28
- package/dist/api/routing/makeRequestHandler.d.ts +6 -7
- package/dist/api/routing/makeRequestHandler.d.ts.map +1 -1
- package/dist/api/routing/makeRequestHandler.js +69 -59
- package/dist/api/routing/match.d.ts +7 -8
- package/dist/api/routing/match.d.ts.map +1 -1
- package/dist/api/routing/match.js +7 -11
- package/dist/api/routing/schema/jwt.d.ts +4 -0
- package/dist/api/routing/schema/jwt.d.ts.map +1 -0
- package/dist/api/routing/schema/jwt.js +11 -0
- package/dist/api/{express → routing}/schema/routing.d.ts +2 -2
- package/dist/api/routing/schema/routing.d.ts.map +1 -0
- package/dist/api/routing/schema/routing.js +123 -0
- package/dist/api/routing.js +3 -1
- package/dist/api/setupRequest.d.ts +3 -5
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +20 -24
- package/dist/errorReporter.d.ts +4 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +20 -17
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -3
- package/dist/filter/types/path/index.d.ts +2 -2
- package/dist/filter/types/path/index.d.ts.map +1 -1
- package/dist/filter/types/path/index.js +2 -3
- package/dist/filter/types.js +2 -1
- package/dist/filter.d.ts.map +1 -1
- package/dist/filter.js +36 -1
- package/dist/logger/jsonLogger.d.ts +2 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +9 -13
- package/dist/logger/logFmtLogger.d.ts +2 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +9 -11
- package/dist/logger/shared.d.ts +2 -1
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +7 -9
- package/dist/rateLimit.d.ts +7 -10
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +17 -16
- package/dist/services/Emailer/Sendgrid.d.ts +1 -2
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/services/Emailer/Sendgrid.js +16 -20
- package/dist/services/Emailer/fake.d.ts +2 -2
- package/dist/services/Emailer/fake.d.ts.map +1 -1
- package/dist/services/Emailer/fake.js +10 -8
- package/dist/services/Emailer/service.d.ts +7 -10
- package/dist/services/Emailer/service.d.ts.map +1 -1
- package/dist/services/Emailer/service.js +3 -3
- package/dist/services/Operations/live.d.ts +2 -3
- package/dist/services/Operations/live.d.ts.map +1 -1
- package/dist/services/Operations/live.js +44 -51
- package/dist/services/Operations/service.d.ts +14 -19
- package/dist/services/Operations/service.d.ts.map +1 -1
- package/dist/services/Operations/service.js +23 -28
- package/dist/services/QueueMaker/errors.d.ts +5 -7
- package/dist/services/QueueMaker/errors.d.ts.map +1 -1
- package/dist/services/QueueMaker/errors.js +11 -11
- package/dist/services/QueueMaker/memQueue.d.ts +6 -9
- package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/memQueue.js +37 -39
- package/dist/services/QueueMaker/sbqueue.d.ts +6 -9
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +41 -39
- package/dist/services/QueueMaker/service.d.ts +2 -4
- package/dist/services/QueueMaker/service.d.ts.map +1 -1
- package/dist/services/QueueMaker/service.js +8 -8
- package/dist/services/Repository/dsl.d.ts +11 -13
- package/dist/services/Repository/dsl.d.ts.map +1 -1
- package/dist/services/Repository/dsl.js +12 -13
- package/dist/services/Repository/ext.d.ts +34 -62
- package/dist/services/Repository/ext.d.ts.map +1 -1
- package/dist/services/Repository/ext.js +59 -70
- package/dist/services/RepositoryBase.d.ts +101 -71
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +229 -226
- package/dist/services/RequestContextContainer.d.ts +13 -21
- package/dist/services/RequestContextContainer.d.ts.map +1 -1
- package/dist/services/RequestContextContainer.js +21 -25
- package/dist/services/Store/ContextMapContainer.d.ts +11 -18
- package/dist/services/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/services/Store/ContextMapContainer.js +17 -18
- package/dist/services/Store/Cosmos/query.d.ts +3 -2
- package/dist/services/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/services/Store/Cosmos/query.js +10 -11
- package/dist/services/Store/Cosmos.d.ts +2 -3
- package/dist/services/Store/Cosmos.d.ts.map +1 -1
- package/dist/services/Store/Cosmos.js +107 -90
- package/dist/services/Store/Disk.d.ts +4 -4
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +54 -50
- package/dist/services/Store/Memory.d.ts +6 -8
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +93 -89
- package/dist/services/Store/codeFilter.d.ts.map +1 -1
- package/dist/services/Store/codeFilter.js +3 -3
- package/dist/services/Store/codeFilter.test.d.ts.map +1 -1
- package/dist/services/Store/filterApi/query.d.ts +1 -1
- package/dist/services/Store/filterApi/query.d.ts.map +1 -1
- package/dist/services/Store/filterApi/query.js +3 -3
- package/dist/services/Store/index.d.ts +1 -2
- package/dist/services/Store/index.d.ts.map +1 -1
- package/dist/services/Store/index.js +7 -8
- package/dist/services/Store/service.d.ts +20 -23
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/Store/service.js +6 -6
- package/dist/services/Store/utils.d.ts +3 -3
- package/dist/services/Store/utils.d.ts.map +1 -1
- package/dist/services/Store/utils.js +26 -28
- package/dist/services/query.d.ts +6 -6
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +5 -3
- package/dist/test.arbs.d.ts +0 -2
- package/dist/test.arbs.d.ts.map +1 -1
- package/dist/test.arbs.js +3 -4
- package/package.json +28 -168
- package/src/RequestContext.ts +1 -0
- package/src/_ext/Array.ts +5 -2
- package/src/api/reportError.ts +14 -10
- package/src/api/routing/base.ts +77 -110
- package/src/api/routing/defaultErrorHandler.ts +64 -54
- package/src/api/routing/makeRequestHandler.ts +165 -135
- package/src/api/routing/match.ts +14 -8
- package/src/api/{express → routing}/schema/jwt.ts +6 -5
- package/src/api/{express → routing}/schema/routing.ts +2 -1
- package/src/api/setupRequest.ts +30 -24
- package/src/errorReporter.ts +12 -11
- package/src/errors.ts +1 -0
- package/src/filter/types/path/index.ts +2 -2
- package/src/logger/jsonLogger.ts +6 -5
- package/src/logger/logFmtLogger.ts +4 -5
- package/src/logger/shared.ts +4 -3
- package/src/rateLimit.ts +37 -34
- package/src/services/Emailer/Sendgrid.ts +12 -10
- package/src/services/Emailer/fake.ts +7 -4
- package/src/services/Emailer/service.ts +4 -1
- package/src/services/Operations/live.ts +66 -59
- package/src/services/Operations/service.ts +41 -34
- package/src/services/QueueMaker/errors.ts +15 -11
- package/src/services/QueueMaker/memQueue.ts +59 -40
- package/src/services/QueueMaker/sbqueue.ts +54 -33
- package/src/services/QueueMaker/service.ts +7 -6
- package/src/services/Repository/dsl.ts +18 -14
- package/src/services/Repository/ext.ts +58 -50
- package/src/services/RepositoryBase.ts +478 -351
- package/src/services/RequestContextContainer.ts +30 -18
- package/src/services/Store/ContextMapContainer.ts +26 -13
- package/src/services/Store/Cosmos/query.ts +17 -11
- package/src/services/Store/Cosmos.ts +209 -168
- package/src/services/Store/Disk.ts +69 -53
- package/src/services/Store/Memory.ts +138 -97
- package/src/services/Store/{Redis.ts → Redis.ts.bak} +7 -5
- package/src/services/Store/codeFilter.test.ts +61 -36
- package/src/services/Store/codeFilter.ts +1 -0
- package/src/services/Store/filterApi/query.ts +1 -0
- package/src/services/Store/index.ts +7 -6
- package/src/services/Store/service.ts +4 -1
- package/src/services/Store/utils.ts +25 -23
- package/src/services/query.ts +3 -2
- package/src/services/simpledb/{cosmosdb.ts → cosmosdb.ts.bak} +1 -0
- package/src/services/simpledb/{diskdb.ts → diskdb.ts.bak} +2 -1
- package/src/services/simpledb/{memdb.ts → memdb.ts.bak} +3 -2
- package/src/services/simpledb/{mongodb.ts → mongodb.ts.bak} +1 -0
- package/src/services/simpledb/{redisdb.ts → redisdb.ts.bak} +17 -14
- package/src/services/simpledb/{shared.ts → shared.ts.bak} +2 -1
- package/src/services/simpledb/{simpledb.ts → simpledb.ts.bak} +6 -2
- package/tsconfig.json +4 -21
- package/tsconfig.json.bak +0 -4
- package/_cjs/_global.cjs +0 -6
- package/_cjs/_global.cjs.map +0 -1
- package/_cjs/_global.ext.cjs +0 -5
- package/_cjs/_global.ext.cjs.map +0 -1
- package/_cjs/_global.schema.cjs +0 -5
- package/_cjs/_global.schema.cjs.map +0 -1
- package/_cjs/api/defaultErrorHandler.cjs +0 -37
- package/_cjs/api/defaultErrorHandler.cjs.map +0 -1
- package/_cjs/api/express/schema/jwt.cjs.map +0 -1
- package/_cjs/api/express/schema/routing.cjs +0 -23
- package/_cjs/api/express/schema/routing.cjs.map +0 -1
- package/_cjs/api/http.cjs +0 -42
- package/_cjs/api/http.cjs.map +0 -1
- package/_cjs/services/Store/Redis.cjs +0 -73
- package/_cjs/services/Store/Redis.cjs.map +0 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +0 -109
- package/_cjs/services/simpledb/cosmosdb.cjs.map +0 -1
- package/_cjs/services/simpledb/diskdb.cjs +0 -125
- package/_cjs/services/simpledb/diskdb.cjs.map +0 -1
- package/_cjs/services/simpledb/index.cjs +0 -38
- package/_cjs/services/simpledb/index.cjs.map +0 -1
- package/_cjs/services/simpledb/memdb.cjs +0 -72
- package/_cjs/services/simpledb/memdb.cjs.map +0 -1
- package/_cjs/services/simpledb/mongodb.cjs +0 -99
- package/_cjs/services/simpledb/mongodb.cjs.map +0 -1
- package/_cjs/services/simpledb/redisdb.cjs +0 -135
- package/_cjs/services/simpledb/redisdb.cjs.map +0 -1
- package/_cjs/services/simpledb/shared.cjs +0 -79
- package/_cjs/services/simpledb/shared.cjs.map +0 -1
- package/_cjs/services/simpledb/simpledb.cjs +0 -85
- package/_cjs/services/simpledb/simpledb.cjs.map +0 -1
- package/dist/_global.d.ts +0 -10
- package/dist/_global.d.ts.map +0 -1
- package/dist/_global.ext.d.ts +0 -34
- package/dist/_global.ext.d.ts.map +0 -1
- package/dist/_global.ext.js +0 -6
- package/dist/_global.js +0 -12
- package/dist/_global.schema.d.ts +0 -6
- package/dist/_global.schema.d.ts.map +0 -1
- package/dist/_global.schema.js +0 -9
- package/dist/api/defaultErrorHandler.d.ts +0 -6
- package/dist/api/defaultErrorHandler.d.ts.map +0 -1
- package/dist/api/defaultErrorHandler.js +0 -34
- package/dist/api/express/schema/jwt.d.ts +0 -6
- package/dist/api/express/schema/jwt.d.ts.map +0 -1
- package/dist/api/express/schema/jwt.js +0 -11
- package/dist/api/express/schema/routing.d.ts.map +0 -1
- package/dist/api/express/schema/routing.js +0 -10
- package/dist/api/http.d.ts +0 -16
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/services/Store/Redis.d.ts +0 -6
- package/dist/services/Store/Redis.d.ts.map +0 -1
- package/dist/services/Store/Redis.js +0 -76
- package/dist/services/simpledb/cosmosdb.d.ts +0 -14
- package/dist/services/simpledb/cosmosdb.d.ts.map +0 -1
- package/dist/services/simpledb/cosmosdb.js +0 -103
- package/dist/services/simpledb/diskdb.d.ts +0 -12
- package/dist/services/simpledb/diskdb.d.ts.map +0 -1
- package/dist/services/simpledb/diskdb.js +0 -109
- package/dist/services/simpledb/index.d.ts +0 -7
- package/dist/services/simpledb/index.d.ts.map +0 -1
- package/dist/services/simpledb/index.js +0 -7
- package/dist/services/simpledb/memdb.d.ts +0 -11
- package/dist/services/simpledb/memdb.d.ts.map +0 -1
- package/dist/services/simpledb/memdb.js +0 -58
- package/dist/services/simpledb/mongodb.d.ts +0 -13
- package/dist/services/simpledb/mongodb.d.ts.map +0 -1
- package/dist/services/simpledb/mongodb.js +0 -68
- package/dist/services/simpledb/redisdb.d.ts +0 -35
- package/dist/services/simpledb/redisdb.d.ts.map +0 -1
- package/dist/services/simpledb/redisdb.js +0 -126
- package/dist/services/simpledb/shared.d.ts +0 -87
- package/dist/services/simpledb/shared.d.ts.map +0 -1
- package/dist/services/simpledb/shared.js +0 -52
- package/dist/services/simpledb/simpledb.d.ts +0 -23
- package/dist/services/simpledb/simpledb.d.ts.map +0 -1
- package/dist/services/simpledb/simpledb.js +0 -69
- package/src/_global.ext.ts +0 -36
- package/src/_global.schema.ts +0 -10
- package/src/_global.ts +0 -14
- package/src/api/defaultErrorHandler.ts +0 -59
- package/src/api/express/makeJsonSchema.test.ts.bak +0 -76
- package/src/api/express/makeJsonSchema.ts.bak +0 -166
- package/src/api/express/makeOpenApiSpecs.ts.bak +0 -62
- package/src/api/http.ts +0 -26
- package/tsplus.config.json +0 -9
- /package/src/services/simpledb/{index.ts → index.ts.bak} +0 -0
|
@@ -17,14 +17,20 @@ import { StoreMaker } from "./Store.js"
|
|
|
17
17
|
import type { Filter, FilterArgs, FilterFunc, PersistenceModelType, StoreConfig, Where } from "./Store.js"
|
|
18
18
|
import type {} from "effect/Equal"
|
|
19
19
|
import type {} from "effect/Hash"
|
|
20
|
+
import { toNonEmptyArray } from "@effect-app/core/Array"
|
|
20
21
|
import { flatMapOption } from "@effect-app/core/Effect"
|
|
21
|
-
import type { Opt } from "@effect-app/core/Option"
|
|
22
22
|
import { makeFilters } from "@effect-app/infra/filter"
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
23
|
+
import type { ParseResult, Schema } from "@effect-app/schema"
|
|
24
|
+
import { NonNegativeInt } from "@effect-app/schema"
|
|
25
|
+
import type { Context, NonEmptyArray, NonEmptyReadonlyArray } from "effect-app"
|
|
26
|
+
import { Chunk, Effect, flow, Option, pipe, PubSub, ReadonlyArray, S } from "effect-app"
|
|
27
|
+
import { runTerm } from "effect-app/Pure"
|
|
28
|
+
import type { FixEnv, PureEnv } from "effect-app/Pure"
|
|
29
|
+
import { assignTag } from "effect-app/service"
|
|
25
30
|
import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../errors.js"
|
|
26
31
|
import type { FieldValues } from "../filter/types.js"
|
|
27
|
-
import { make as makeQuery,
|
|
32
|
+
import { make as makeQuery, page, query } from "./query.js"
|
|
33
|
+
import type { QAll, Query, QueryEnd, QueryProjection, QueryWhere } from "./query.js"
|
|
28
34
|
import { ContextMapContainer } from "./Store/ContextMapContainer.js"
|
|
29
35
|
import * as Q from "./Store/filterApi/query.js"
|
|
30
36
|
|
|
@@ -67,7 +73,7 @@ export abstract class RepositoryBaseC<
|
|
|
67
73
|
ItemType extends string
|
|
68
74
|
> {
|
|
69
75
|
abstract readonly itemType: ItemType
|
|
70
|
-
abstract readonly find: (id: T["id"]) => Effect<
|
|
76
|
+
abstract readonly find: (id: T["id"]) => Effect<Option<T>>
|
|
71
77
|
abstract readonly all: Effect<T[]>
|
|
72
78
|
abstract readonly saveAndPublish: (
|
|
73
79
|
items: Iterable<T>,
|
|
@@ -83,12 +89,13 @@ export abstract class RepositoryBaseC<
|
|
|
83
89
|
filter: FilterFunc<PM>
|
|
84
90
|
// count: (filter?: Filter<PM>) => Effect<never, never, NonNegativeInt>
|
|
85
91
|
}
|
|
86
|
-
abstract readonly changeFeed: PubSub<[T[], "save" | "remove"]>
|
|
92
|
+
abstract readonly changeFeed: PubSub.PubSub<[T[], "save" | "remove"]>
|
|
87
93
|
abstract readonly removeAndPublish: (
|
|
88
94
|
items: Iterable<T>,
|
|
89
95
|
events?: Iterable<Evt>
|
|
90
96
|
) => Effect<void>
|
|
91
97
|
|
|
98
|
+
/** @deprecated use q2 */
|
|
92
99
|
abstract readonly mapped: Mapped<PM, Omit<PM, "_etag">>
|
|
93
100
|
abstract readonly q2: {
|
|
94
101
|
<A, R, From extends FieldValues>(
|
|
@@ -158,18 +165,108 @@ export class RepositoryBaseC3<
|
|
|
158
165
|
ItemType extends string
|
|
159
166
|
> extends RepositoryBaseC2<T, PM, Evt, ItemType> {
|
|
160
167
|
get(id: T["id"]) {
|
|
161
|
-
return
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
return Effect.andThen(
|
|
169
|
+
this
|
|
170
|
+
.find(id),
|
|
171
|
+
(_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: this.itemType, id }))
|
|
172
|
+
)
|
|
164
173
|
}
|
|
165
174
|
|
|
166
175
|
readonly log = (evt: Evt) => AnyPureDSL.log(evt)
|
|
167
176
|
|
|
168
177
|
removeById(id: T["id"]) {
|
|
169
|
-
return this.get(id)
|
|
178
|
+
return Effect.andThen(this.get(id), (_) => this.removeAndPublish([_]))
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
count(filter?: Filter<PM>) {
|
|
182
|
+
return Effect.map(
|
|
183
|
+
this.projectEffect(Effect.sync(() => ({ filter }))),
|
|
184
|
+
(_) => NonNegativeInt(_.length)
|
|
185
|
+
)
|
|
170
186
|
}
|
|
171
187
|
|
|
172
|
-
|
|
188
|
+
readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
|
|
189
|
+
|
|
190
|
+
readonly saveWithEvents = (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) =>
|
|
191
|
+
this.saveAndPublish(items, events)
|
|
192
|
+
|
|
193
|
+
readonly q2AndSaveOnePure = <A, E2, R2, T2 extends T>(
|
|
194
|
+
q: (q: Query<Omit<PM, "_etag">>) => Query<Omit<PM, "_etag">> | QueryEnd<Omit<PM, "_etag">>,
|
|
195
|
+
pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>
|
|
196
|
+
) =>
|
|
197
|
+
this.q2(flow(q, page({ limit: 1 }))).pipe(
|
|
198
|
+
Effect.map(ReadonlyArray.toNonEmptyArray),
|
|
199
|
+
Effect.flatMap(Effect.mapError(() => new NotFoundError({ type: this.itemType, id: q }))),
|
|
200
|
+
Effect.andThen((_) => saveWithPure_(this, _[0], pure))
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
readonly q2AndSavePure = <A, E2, R2, T2 extends T>(
|
|
204
|
+
q: (q: Query<Omit<PM, "_etag">>) => Query<Omit<PM, "_etag">> | QueryEnd<Omit<PM, "_etag">>,
|
|
205
|
+
pure: Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>,
|
|
206
|
+
batchSize?: number
|
|
207
|
+
) =>
|
|
208
|
+
this.q2(flow(q, page({ limit: 1 }))).pipe(
|
|
209
|
+
Effect.andThen((_) =>
|
|
210
|
+
batchSize === undefined
|
|
211
|
+
? saveManyWithPure_(this, _, pure)
|
|
212
|
+
: saveManyWithPureBatched_(this, _, pure, batchSize)
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
|
|
218
|
+
*/
|
|
219
|
+
readonly handleByIdAndSaveWithPure = <Req extends { id: T["id"] }, Context, R, A, E, S2 extends T>(
|
|
220
|
+
pure: (req: Req, ctx: Context) => Effect<A, E, FixEnv<R, Evt, T, S2>>
|
|
221
|
+
) =>
|
|
222
|
+
(req: Req, ctx: Context) => byIdAndSaveWithPure(this, req.id)(pure(req, ctx))
|
|
223
|
+
|
|
224
|
+
saveManyWithPure = <
|
|
225
|
+
R,
|
|
226
|
+
A,
|
|
227
|
+
E,
|
|
228
|
+
S1 extends T,
|
|
229
|
+
S2 extends T
|
|
230
|
+
>(
|
|
231
|
+
items: Iterable<S1>,
|
|
232
|
+
pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
|
|
233
|
+
) =>
|
|
234
|
+
saveAllWithEffectInt(
|
|
235
|
+
this,
|
|
236
|
+
runTerm(pure, [...items])
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
byIdAndSaveWithPure: {
|
|
240
|
+
<R, A, E, S2 extends T>(
|
|
241
|
+
id: T["id"],
|
|
242
|
+
pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
|
|
243
|
+
): Effect<
|
|
244
|
+
A,
|
|
245
|
+
InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
|
|
246
|
+
Exclude<R, {
|
|
247
|
+
env: PureEnv<Evt, T, S2>
|
|
248
|
+
}>
|
|
249
|
+
>
|
|
250
|
+
} = (id, pure): any => get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
|
|
251
|
+
|
|
252
|
+
saveWithPure<
|
|
253
|
+
R,
|
|
254
|
+
A,
|
|
255
|
+
E,
|
|
256
|
+
S1 extends T,
|
|
257
|
+
S2 extends T
|
|
258
|
+
>(
|
|
259
|
+
item: S1,
|
|
260
|
+
pure: Effect<A, E, FixEnv<R, Evt, S1, S2>>
|
|
261
|
+
) {
|
|
262
|
+
return saveAllWithEffectInt(
|
|
263
|
+
this,
|
|
264
|
+
runTerm(pure, item)
|
|
265
|
+
.pipe(Effect.map(([item, events, a]) => [[item], events, a]))
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** @deprecated use q2 */
|
|
173
270
|
projectEffect<
|
|
174
271
|
R,
|
|
175
272
|
E,
|
|
@@ -186,6 +283,7 @@ export class RepositoryBaseC3<
|
|
|
186
283
|
R
|
|
187
284
|
>
|
|
188
285
|
): Effect<S[], E, R>
|
|
286
|
+
/** @deprecated use q2 */
|
|
189
287
|
projectEffect<
|
|
190
288
|
R,
|
|
191
289
|
E,
|
|
@@ -203,6 +301,7 @@ export class RepositoryBaseC3<
|
|
|
203
301
|
R
|
|
204
302
|
>
|
|
205
303
|
): Effect<Pick<PM, U>[], E, R>
|
|
304
|
+
/** @deprecated use q2 */
|
|
206
305
|
projectEffect<
|
|
207
306
|
R,
|
|
208
307
|
E,
|
|
@@ -222,14 +321,16 @@ export class RepositoryBaseC3<
|
|
|
222
321
|
>
|
|
223
322
|
): Effect<S[], E, R> {
|
|
224
323
|
// TODO: a projection that gets sent to the db instead.
|
|
225
|
-
return
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
324
|
+
return Effect.flatMap(map, (f) =>
|
|
325
|
+
Effect.map(
|
|
326
|
+
this
|
|
327
|
+
.utils
|
|
328
|
+
.filter(f),
|
|
329
|
+
(_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown as S[]
|
|
330
|
+
))
|
|
231
331
|
}
|
|
232
332
|
|
|
333
|
+
/** @deprecated use q2 */
|
|
233
334
|
project<S = PM>(
|
|
234
335
|
map: {
|
|
235
336
|
filter?: Filter<PM>
|
|
@@ -238,6 +339,7 @@ export class RepositoryBaseC3<
|
|
|
238
339
|
skip?: number
|
|
239
340
|
}
|
|
240
341
|
): Effect<S[]>
|
|
342
|
+
/** @deprecated use q2 */
|
|
241
343
|
project<U extends keyof PM>(
|
|
242
344
|
map: {
|
|
243
345
|
filter?: Q.QueryBuilder<PM>
|
|
@@ -246,6 +348,7 @@ export class RepositoryBaseC3<
|
|
|
246
348
|
skip?: number
|
|
247
349
|
}
|
|
248
350
|
): Effect<Pick<PM, U>[]>
|
|
351
|
+
/** @deprecated use q2 */
|
|
249
352
|
project<
|
|
250
353
|
U extends keyof PM,
|
|
251
354
|
S = Pick<PM, U>
|
|
@@ -261,12 +364,7 @@ export class RepositoryBaseC3<
|
|
|
261
364
|
return this.projectEffect(Effect.sync(() => map))
|
|
262
365
|
}
|
|
263
366
|
|
|
264
|
-
|
|
265
|
-
return this
|
|
266
|
-
.projectEffect(Effect.sync(() => ({ filter })))
|
|
267
|
-
.map((_) => NonNegativeInt(_.length))
|
|
268
|
-
}
|
|
269
|
-
|
|
367
|
+
/** @deprecated use q2 */
|
|
270
368
|
queryEffect<
|
|
271
369
|
R,
|
|
272
370
|
E,
|
|
@@ -275,17 +373,20 @@ export class RepositoryBaseC3<
|
|
|
275
373
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
276
374
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
277
375
|
) {
|
|
278
|
-
return
|
|
376
|
+
return Effect.flatMap(map, (f) =>
|
|
279
377
|
(f.filter ? this.utils.filter(f) : this.utils.all)
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
|
|
378
|
+
.pipe(
|
|
379
|
+
Effect.flatMap((_) => this.utils.parseMany(_)),
|
|
380
|
+
Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown[] as S[])
|
|
381
|
+
))
|
|
283
382
|
}
|
|
284
383
|
|
|
384
|
+
/** @deprecated use q2 */
|
|
285
385
|
queryOneEffect<R, E>(
|
|
286
386
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
287
387
|
map: Effect<{ filter?: Filter<PM> }, E, R>
|
|
288
388
|
): Effect<T, E | NotFoundError<ItemType>, R>
|
|
389
|
+
/** @deprecated use q2 */
|
|
289
390
|
queryOneEffect<
|
|
290
391
|
R,
|
|
291
392
|
E,
|
|
@@ -294,6 +395,7 @@ export class RepositoryBaseC3<
|
|
|
294
395
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
295
396
|
map: Effect<{ filter?: Filter<PM>; collect: (t: T) => Option<S> }, E, R>
|
|
296
397
|
): Effect<S, E | NotFoundError<ItemType>, R>
|
|
398
|
+
/** @deprecated use q2 */
|
|
297
399
|
queryOneEffect<
|
|
298
400
|
R,
|
|
299
401
|
E,
|
|
@@ -302,18 +404,26 @@ export class RepositoryBaseC3<
|
|
|
302
404
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
303
405
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S> }, E, R>
|
|
304
406
|
): Effect<S, E | NotFoundError<ItemType>, R> {
|
|
305
|
-
return
|
|
407
|
+
return Effect.flatMap(map, (f) =>
|
|
306
408
|
(f.filter ? this.utils.filter({ filter: f.filter, limit: 1 }) : this.utils.all)
|
|
307
|
-
.
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
409
|
+
.pipe(
|
|
410
|
+
Effect.flatMap((_) => this.utils.parseMany(_)),
|
|
411
|
+
Effect
|
|
412
|
+
.flatMap((_) =>
|
|
413
|
+
toNonEmptyArray(
|
|
414
|
+
f.collect
|
|
415
|
+
? ReadonlyArray.filterMap(_, f.collect)
|
|
416
|
+
: _ as unknown[] as S[]
|
|
417
|
+
)
|
|
418
|
+
.pipe(
|
|
419
|
+
Effect.mapError(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter })),
|
|
420
|
+
Effect.map((_) => _[0])
|
|
421
|
+
)
|
|
422
|
+
)
|
|
423
|
+
))
|
|
315
424
|
}
|
|
316
425
|
|
|
426
|
+
/** @deprecated use q2 */
|
|
317
427
|
queryLegacy<S = T>(
|
|
318
428
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
319
429
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }
|
|
@@ -321,24 +431,29 @@ export class RepositoryBaseC3<
|
|
|
321
431
|
return this.queryEffect(Effect.sync(() => map))
|
|
322
432
|
}
|
|
323
433
|
|
|
434
|
+
/** @deprecated use q2 */
|
|
324
435
|
query(
|
|
325
436
|
b: (fn: Q.FilterTest<PM>, fields: Q.Filter<PM, never>) => Q.QueryBuilder<PM>
|
|
326
437
|
) {
|
|
327
438
|
return this.queryEffect(Effect.sync(() => ({ filter: anyQb((_, fields) => b(_, fields as any)) })))
|
|
328
439
|
}
|
|
329
440
|
|
|
441
|
+
/** @deprecated use q2 */
|
|
330
442
|
queryOne<S = T>(
|
|
331
443
|
map: { filter?: Filter<PM>; collect: (t: T) => Option<S> }
|
|
332
444
|
): Effect<S, NotFoundError<ItemType>>
|
|
445
|
+
/** @deprecated use q2 */
|
|
333
446
|
queryOne(
|
|
334
447
|
map: { filter?: Filter<PM> }
|
|
335
448
|
): Effect<T, NotFoundError<ItemType>>
|
|
449
|
+
/** @deprecated use q2 */
|
|
336
450
|
queryOne<S = T>(
|
|
337
451
|
map: { filter?: Filter<PM>; collect?: (t: T) => Option<S> }
|
|
338
452
|
) {
|
|
339
453
|
return this.queryOneEffect(Effect.sync(() => map))
|
|
340
454
|
}
|
|
341
455
|
|
|
456
|
+
/** @deprecated */
|
|
342
457
|
queryAndSaveOnePureEffect<
|
|
343
458
|
R,
|
|
344
459
|
E,
|
|
@@ -355,6 +470,7 @@ export class RepositoryBaseC3<
|
|
|
355
470
|
env: PureEnv<Evt, S, S2>
|
|
356
471
|
}>
|
|
357
472
|
>
|
|
473
|
+
/** @deprecated */
|
|
358
474
|
queryAndSaveOnePureEffect<
|
|
359
475
|
R,
|
|
360
476
|
E
|
|
@@ -370,14 +486,13 @@ export class RepositoryBaseC3<
|
|
|
370
486
|
env: PureEnv<Evt, T, T2>
|
|
371
487
|
}>
|
|
372
488
|
>
|
|
489
|
+
/** @deprecated */
|
|
373
490
|
queryAndSaveOnePureEffect(
|
|
374
491
|
map: any
|
|
375
492
|
) {
|
|
376
|
-
return (pure: any) =>
|
|
377
|
-
queryOneEffect(this, map)
|
|
378
|
-
.flatMap((_) => saveWithPure_(this, _, pure))
|
|
493
|
+
return (pure: any) => Effect.flatMap(queryOneEffect(this, map), (_) => saveWithPure_(this, _, pure))
|
|
379
494
|
}
|
|
380
|
-
|
|
495
|
+
/** @deprecated */
|
|
381
496
|
queryAndSaveOnePure<
|
|
382
497
|
S extends T = T
|
|
383
498
|
>(
|
|
@@ -389,6 +504,7 @@ export class RepositoryBaseC3<
|
|
|
389
504
|
env: PureEnv<Evt, S, S2>
|
|
390
505
|
}>
|
|
391
506
|
>
|
|
507
|
+
/** @deprecated */
|
|
392
508
|
queryAndSaveOnePure(
|
|
393
509
|
map: { filter: Filter<PM> }
|
|
394
510
|
): <R2, A, E2, T2>(pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>) => Effect<
|
|
@@ -398,12 +514,13 @@ export class RepositoryBaseC3<
|
|
|
398
514
|
env: PureEnv<Evt, T, T2>
|
|
399
515
|
}>
|
|
400
516
|
>
|
|
517
|
+
/** @deprecated */
|
|
401
518
|
queryAndSaveOnePure<S = T>(
|
|
402
519
|
map: { filter: Filter<PM>; collect: (t: T) => Option<S> }
|
|
403
520
|
) {
|
|
404
521
|
return this.queryAndSaveOnePureEffect(Effect.sync(() => map))
|
|
405
522
|
}
|
|
406
|
-
|
|
523
|
+
/** @deprecated */
|
|
407
524
|
queryAndSavePureEffect<
|
|
408
525
|
R,
|
|
409
526
|
E,
|
|
@@ -411,11 +528,10 @@ export class RepositoryBaseC3<
|
|
|
411
528
|
>(
|
|
412
529
|
map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
413
530
|
) {
|
|
414
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
|
|
415
|
-
queryEffect(this, map)
|
|
416
|
-
.flatMap((_) => this.saveManyWithPure_(_, pure))
|
|
531
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
|
|
532
|
+
Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPure(_, pure))
|
|
417
533
|
}
|
|
418
|
-
|
|
534
|
+
/** @deprecated */
|
|
419
535
|
queryAndSavePure<
|
|
420
536
|
S extends T = T
|
|
421
537
|
>(
|
|
@@ -424,95 +540,7 @@ export class RepositoryBaseC3<
|
|
|
424
540
|
return this.queryAndSavePureEffect(Effect.sync(() => map))
|
|
425
541
|
}
|
|
426
542
|
|
|
427
|
-
|
|
428
|
-
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>) =>
|
|
429
|
-
(items: Iterable<S1>) => saveManyWithPure_(this, items, pure)
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
byIdAndSaveWithPure(
|
|
433
|
-
id: T["id"]
|
|
434
|
-
): <R, A, E, S2 extends T>(
|
|
435
|
-
pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
|
|
436
|
-
) => Effect<
|
|
437
|
-
A,
|
|
438
|
-
InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
|
|
439
|
-
Exclude<R, {
|
|
440
|
-
env: PureEnv<Evt, T, S2>
|
|
441
|
-
}>
|
|
442
|
-
>
|
|
443
|
-
byIdAndSaveWithPure<R, A, E, S2 extends T>(
|
|
444
|
-
id: T["id"],
|
|
445
|
-
pure: Effect<A, E, FixEnv<R, Evt, T, S2>>
|
|
446
|
-
): Effect<
|
|
447
|
-
A,
|
|
448
|
-
InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
|
|
449
|
-
Exclude<R, {
|
|
450
|
-
env: PureEnv<Evt, T, S2>
|
|
451
|
-
}>
|
|
452
|
-
>
|
|
453
|
-
byIdAndSaveWithPure<R, A, E, S2 extends T>(id: T["id"], pure?: Effect<A, E, FixEnv<R, Evt, T, S2>>) {
|
|
454
|
-
if (pure) return get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
|
|
455
|
-
return (pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) =>
|
|
456
|
-
get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
|
|
461
|
-
*/
|
|
462
|
-
get handleByIdAndSaveWithPure() {
|
|
463
|
-
return <Req extends { id: T["id"] }, Context, R, A, E, S2 extends T>(
|
|
464
|
-
pure: (req: Req, ctx: Context) => Effect<A, E, FixEnv<R, Evt, T, S2>>
|
|
465
|
-
) =>
|
|
466
|
-
(req: Req, ctx: Context) => byIdAndSaveWithPure(this, req.id)(pure(req, ctx))
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
saveManyWithPure_<
|
|
470
|
-
R,
|
|
471
|
-
A,
|
|
472
|
-
E,
|
|
473
|
-
S1 extends T,
|
|
474
|
-
S2 extends T
|
|
475
|
-
>(
|
|
476
|
-
items: Iterable<S1>,
|
|
477
|
-
pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>
|
|
478
|
-
) {
|
|
479
|
-
return saveAllWithEffectInt(
|
|
480
|
-
this,
|
|
481
|
-
runTerm(pure, [...items])
|
|
482
|
-
)
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
saveWithPure_<
|
|
486
|
-
R,
|
|
487
|
-
A,
|
|
488
|
-
E,
|
|
489
|
-
S1 extends T,
|
|
490
|
-
S2 extends T
|
|
491
|
-
>(
|
|
492
|
-
item: S1,
|
|
493
|
-
pure: Effect<A, E, FixEnv<R, Evt, S1, S2>>
|
|
494
|
-
) {
|
|
495
|
-
return saveAllWithEffectInt(
|
|
496
|
-
this,
|
|
497
|
-
runTerm(pure, item)
|
|
498
|
-
.map(([item, events, a]) => [[item], events, a])
|
|
499
|
-
)
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
saveAllWithEffectInt<
|
|
503
|
-
P extends T,
|
|
504
|
-
R,
|
|
505
|
-
E,
|
|
506
|
-
A
|
|
507
|
-
>(
|
|
508
|
-
gen: Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
|
|
509
|
-
) {
|
|
510
|
-
return gen
|
|
511
|
-
.flatMap(
|
|
512
|
-
([items, events, a]) => this.saveAndPublish(items, events).map(() => a)
|
|
513
|
-
)
|
|
514
|
-
}
|
|
515
|
-
|
|
543
|
+
/** @deprecated use q2 */
|
|
516
544
|
queryAndSavePureEffectBatched<
|
|
517
545
|
R,
|
|
518
546
|
E,
|
|
@@ -522,11 +550,11 @@ export class RepositoryBaseC3<
|
|
|
522
550
|
map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>,
|
|
523
551
|
batchSize = 100
|
|
524
552
|
) {
|
|
525
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
|
|
526
|
-
queryEffect(this, map)
|
|
527
|
-
.flatMap((_) => this.saveManyWithPureBatched_(_, pure, batchSize))
|
|
553
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, readonly S[], readonly S2[]>>) =>
|
|
554
|
+
Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPureBatched(_, pure, batchSize))
|
|
528
555
|
}
|
|
529
556
|
|
|
557
|
+
/** @deprecated use q2 */
|
|
530
558
|
queryAndSavePureBatched<
|
|
531
559
|
S extends T = T
|
|
532
560
|
>(
|
|
@@ -537,12 +565,8 @@ export class RepositoryBaseC3<
|
|
|
537
565
|
return this.queryAndSavePureEffectBatched(Effect.sync(() => map), batchSize)
|
|
538
566
|
}
|
|
539
567
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
(items: Iterable<S1>) => saveManyWithPureBatched_(this, items, pure, batchSize)
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
saveManyWithPureBatched_<
|
|
568
|
+
/** @deprecated use q2 */
|
|
569
|
+
saveManyWithPureBatched<
|
|
546
570
|
R,
|
|
547
571
|
A,
|
|
548
572
|
E,
|
|
@@ -550,25 +574,18 @@ export class RepositoryBaseC3<
|
|
|
550
574
|
S2 extends T
|
|
551
575
|
>(
|
|
552
576
|
items: Iterable<S1>,
|
|
553
|
-
pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>,
|
|
577
|
+
pure: Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>,
|
|
554
578
|
batchSize = 100
|
|
555
579
|
) {
|
|
556
|
-
return
|
|
557
|
-
.
|
|
558
|
-
|
|
580
|
+
return Effect.forEach(
|
|
581
|
+
ReadonlyArray.chunk_(items, batchSize),
|
|
582
|
+
(batch) =>
|
|
559
583
|
saveAllWithEffectInt(
|
|
560
584
|
this,
|
|
561
585
|
runTerm(pure, batch)
|
|
562
586
|
)
|
|
563
|
-
|
|
587
|
+
)
|
|
564
588
|
}
|
|
565
|
-
|
|
566
|
-
readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
|
|
567
|
-
|
|
568
|
-
readonly saveWithEvents = (
|
|
569
|
-
events: Iterable<Evt>
|
|
570
|
-
) =>
|
|
571
|
-
(...items: NonEmptyArray<T>) => this.saveAndPublish(items, events)
|
|
572
589
|
}
|
|
573
590
|
|
|
574
591
|
type Exact<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false
|
|
@@ -624,188 +641,214 @@ export function makeRepo<
|
|
|
624
641
|
}
|
|
625
642
|
}
|
|
626
643
|
) {
|
|
627
|
-
return
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
get
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
644
|
+
return Effect
|
|
645
|
+
.gen(function*($) {
|
|
646
|
+
const rctx = yield* $(Effect.context<R>())
|
|
647
|
+
const encode = flow(S.encode(schema), Effect.provide(rctx))
|
|
648
|
+
const decode = flow(S.decode(schema), Effect.provide(rctx))
|
|
649
|
+
|
|
650
|
+
const store = yield* $(mkStore(args.makeInitial, args.config))
|
|
651
|
+
const { get } = yield* $(ContextMapContainer)
|
|
652
|
+
const cms = Effect.andThen(get, (_) => ({
|
|
653
|
+
get: (id: string) => _.get(`${name}.${id}`),
|
|
654
|
+
set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
|
|
655
|
+
}))
|
|
656
|
+
|
|
657
|
+
const pubCfg = yield* $(Effect.context<R2>())
|
|
658
|
+
const pub = "publishEvents" in args
|
|
659
|
+
? flow(args.publishEvents, Effect.provide(pubCfg))
|
|
660
|
+
: () => Effect.unit
|
|
661
|
+
const changeFeed = yield* $(PubSub.unbounded<[T[], "save" | "remove"]>())
|
|
662
|
+
|
|
663
|
+
const allE = store.all.pipe(Effect.flatMap((items) =>
|
|
664
|
+
Effect.gen(function*($) {
|
|
665
|
+
const { set } = yield* $(cms)
|
|
666
|
+
return items.map((_) => mapReverse(_, set))
|
|
667
|
+
})
|
|
668
|
+
))
|
|
669
|
+
|
|
670
|
+
const all = Effect.flatMap(
|
|
671
|
+
allE,
|
|
672
|
+
(_) => Effect.forEach(_, (_) => decode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
|
|
673
|
+
)
|
|
653
674
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
.ast
|
|
664
|
-
._tag === "Transform"
|
|
665
|
-
? (S
|
|
666
|
-
.make(
|
|
667
|
-
_
|
|
675
|
+
const structSchema = schema as unknown as { struct: typeof schema }
|
|
676
|
+
const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
|
|
677
|
+
_.ast._tag === "Union"
|
|
678
|
+
// we need to get the TypeLiteral, incase of class it's behind a transform...
|
|
679
|
+
? S.union(..._.ast.types.map((_) =>
|
|
680
|
+
(S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
|
|
681
|
+
.pipe(S.pick("id"))
|
|
682
|
+
))
|
|
683
|
+
: _
|
|
668
684
|
.ast
|
|
669
|
-
.
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
685
|
+
._tag === "Transform"
|
|
686
|
+
? (S
|
|
687
|
+
.make(
|
|
688
|
+
_
|
|
689
|
+
.ast
|
|
690
|
+
.from
|
|
691
|
+
) as unknown as Schema<T, From>)
|
|
692
|
+
.pipe(S
|
|
693
|
+
.pick("id"))
|
|
694
|
+
: _
|
|
695
|
+
.pipe(S
|
|
696
|
+
.pick("id"))
|
|
697
|
+
)
|
|
698
|
+
const encodeId = flow(S.encode(i), Effect.provide(rctx))
|
|
699
|
+
function findEId(id: From["id"]) {
|
|
700
|
+
return Effect.flatMap(
|
|
701
|
+
store.find(id),
|
|
702
|
+
(item) =>
|
|
703
|
+
Effect.gen(function*($) {
|
|
704
|
+
const { set } = yield* $(cms)
|
|
705
|
+
return item.pipe(Option.map((_) => mapReverse(_, set)))
|
|
706
|
+
})
|
|
686
707
|
)
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
function find(id: T["id"]) {
|
|
696
|
-
return findE(id).flatMapOpt((_) => decode(_).orDie)
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
const saveAllE = (a: Iterable<From>) =>
|
|
700
|
-
Effect
|
|
701
|
-
.sync(() => a.toNonEmptyArray)
|
|
702
|
-
.flatMapOpt((a) =>
|
|
703
|
-
Do(($) => {
|
|
704
|
-
const { get, set } = $(cms)
|
|
705
|
-
const items = a.map((_) => mapToPersistenceModel(_, get))
|
|
706
|
-
const ret = $(store.batchSet(items))
|
|
707
|
-
ret.forEach((_) => set(_.id, _._etag))
|
|
708
|
-
})
|
|
708
|
+
}
|
|
709
|
+
function findE(id: T["id"]) {
|
|
710
|
+
return pipe(
|
|
711
|
+
encodeId({ id }),
|
|
712
|
+
Effect.orDie,
|
|
713
|
+
Effect.map((_) => _.id),
|
|
714
|
+
Effect.flatMap(findEId)
|
|
709
715
|
)
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
const saveAll = (a: Iterable<T>) =>
|
|
713
|
-
a.toChunk.forEachEffect((_) => encode(_), { concurrency: "inherit", batching: true }).orDie.andThen(saveAllE)
|
|
714
|
-
|
|
715
|
-
const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
|
|
716
|
-
const it = items.toChunk
|
|
717
|
-
return saveAll(it)
|
|
718
|
-
.andThen(Effect.sync(() => events.toNonEmptyArray))
|
|
719
|
-
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
720
|
-
.flatMapOpt(pub)
|
|
721
|
-
.andThen(changeFeed
|
|
722
|
-
.publish([it.toArray, "save"]))
|
|
723
|
-
.asUnit
|
|
724
|
-
}
|
|
716
|
+
}
|
|
725
717
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
718
|
+
function find(id: T["id"]) {
|
|
719
|
+
return Effect.flatMapOption(findE(id), (_) => Effect.orDie(decode(_)))
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
const saveAllE = (a: Iterable<From>) =>
|
|
723
|
+
Effect
|
|
724
|
+
.flatMapOption(
|
|
725
|
+
Effect
|
|
726
|
+
.sync(() => toNonEmptyArray([...a])),
|
|
727
|
+
(a) =>
|
|
728
|
+
Effect.gen(function*($) {
|
|
729
|
+
const { get, set } = yield* $(cms)
|
|
730
|
+
const items = a.map((_) => mapToPersistenceModel(_, get))
|
|
731
|
+
const ret = yield* $(store.batchSet(items))
|
|
732
|
+
ret.forEach((_) => set(_.id, _._etag))
|
|
733
|
+
})
|
|
734
|
+
)
|
|
735
|
+
.pipe(Effect.asUnit)
|
|
736
|
+
|
|
737
|
+
const saveAll = (a: Iterable<T>) =>
|
|
738
|
+
Effect
|
|
739
|
+
.forEach(
|
|
740
|
+
Array.from(a),
|
|
741
|
+
(_) => encode(_),
|
|
742
|
+
{ concurrency: "inherit", batching: true }
|
|
743
|
+
)
|
|
744
|
+
.pipe(
|
|
745
|
+
Effect.orDie,
|
|
746
|
+
Effect.andThen(saveAllE)
|
|
747
|
+
)
|
|
748
|
+
|
|
749
|
+
const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
|
|
750
|
+
const it = Chunk.fromIterable(items)
|
|
751
|
+
return saveAll(it)
|
|
752
|
+
.pipe(
|
|
753
|
+
Effect.andThen(Effect.sync(() => toNonEmptyArray([...events]))),
|
|
739
754
|
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
740
|
-
.
|
|
741
|
-
|
|
755
|
+
(_) => Effect.flatMapOption(_, pub),
|
|
756
|
+
Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"])),
|
|
757
|
+
Effect.asUnit
|
|
758
|
+
)
|
|
759
|
+
}
|
|
742
760
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
761
|
+
function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
|
|
762
|
+
return Effect.gen(function*($) {
|
|
763
|
+
const { get, set } = yield* $(cms)
|
|
764
|
+
const it = [...a]
|
|
765
|
+
const items = yield* $(
|
|
766
|
+
Effect.forEach(it, (_) => encode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
|
|
767
|
+
)
|
|
768
|
+
// TODO: we should have a batchRemove on store so the adapter can actually batch...
|
|
769
|
+
for (const e of items) {
|
|
770
|
+
yield* $(store.remove(mapToPersistenceModel(e, get)))
|
|
771
|
+
set(e.id, undefined)
|
|
772
|
+
}
|
|
773
|
+
yield* $(
|
|
774
|
+
Effect
|
|
775
|
+
.sync(() => toNonEmptyArray([...events]))
|
|
776
|
+
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
777
|
+
.pipe((_) => Effect.flatMapOption(_, pub))
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
yield* $(changeFeed.publish([it, "remove"]))
|
|
781
|
+
})
|
|
782
|
+
}
|
|
746
783
|
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
)
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
784
|
+
const r: Repository<T, PM, Evt, ItemType> = {
|
|
785
|
+
/**
|
|
786
|
+
* @internal
|
|
787
|
+
*/
|
|
788
|
+
utils: {
|
|
789
|
+
parseMany: (items) =>
|
|
790
|
+
Effect.flatMap(cms, (cm) =>
|
|
791
|
+
Effect
|
|
792
|
+
.forEach(items, (_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
|
|
793
|
+
.pipe(Effect.orDie)),
|
|
794
|
+
parseMany2: (items, schema) =>
|
|
795
|
+
Effect.flatMap(cms, (cm) =>
|
|
796
|
+
Effect
|
|
797
|
+
.forEach(items, (_) => S.decode(schema)(mapReverse(_, cm.set) as any), {
|
|
798
|
+
concurrency: "inherit",
|
|
799
|
+
batching: true
|
|
800
|
+
})
|
|
801
|
+
.pipe(Effect.orDie)),
|
|
802
|
+
filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
|
|
803
|
+
store
|
|
804
|
+
.filter(args)
|
|
805
|
+
.pipe(Effect.tap((items) =>
|
|
806
|
+
args.select
|
|
807
|
+
? Effect.unit
|
|
808
|
+
: Effect.map(cms, ({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
|
|
809
|
+
)),
|
|
810
|
+
all: Effect.tap(
|
|
811
|
+
store.all,
|
|
812
|
+
(items) => Effect.map(cms, ({ set }) => items.forEach((_) => set(_.id, _._etag)))
|
|
813
|
+
)
|
|
814
|
+
},
|
|
815
|
+
mapped: <A, R>(schema: S.Schema<A, any, R>) => {
|
|
816
|
+
// const enc = S.encode(schema)
|
|
817
|
+
const dec = S.decode(schema)
|
|
818
|
+
const encMany = S.encode(S.array(schema))
|
|
819
|
+
const decMany = S.decode(S.array(schema))
|
|
820
|
+
return {
|
|
821
|
+
all: cms
|
|
822
|
+
.pipe(
|
|
823
|
+
Effect.flatMap((cm) => Effect.map(r.utils.all, (_) => _.map((_) => mapReverse(_, cm.set)))),
|
|
824
|
+
Effect.flatMap(decMany),
|
|
825
|
+
Effect.map((_) => _ as any[])
|
|
826
|
+
),
|
|
827
|
+
find: (id: PM["id"]) => flatMapOption(findE(id), dec),
|
|
828
|
+
query: (b: any) =>
|
|
829
|
+
r
|
|
830
|
+
.utils
|
|
831
|
+
.filter({ filter: b })
|
|
832
|
+
.pipe(
|
|
833
|
+
Effect.flatMap(decMany),
|
|
834
|
+
Effect.map((_) => _ as any[])
|
|
835
|
+
),
|
|
836
|
+
save: (...xes: any[]) => Effect.flatMap(encMany(xes), (_) => saveAllE(_))
|
|
837
|
+
}
|
|
838
|
+
},
|
|
839
|
+
changeFeed,
|
|
840
|
+
itemType: name,
|
|
841
|
+
find,
|
|
842
|
+
all,
|
|
843
|
+
saveAndPublish,
|
|
844
|
+
removeAndPublish,
|
|
845
|
+
q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
|
|
846
|
+
}
|
|
847
|
+
return r
|
|
848
|
+
})
|
|
849
|
+
.pipe(Effect
|
|
850
|
+
// .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
|
|
851
|
+
.withLogSpan("Repository.make: " + name))
|
|
809
852
|
}
|
|
810
853
|
|
|
811
854
|
return {
|
|
@@ -829,7 +872,7 @@ export function removeById<
|
|
|
829
872
|
self: Repository<T, PM, Evt, ItemType>,
|
|
830
873
|
id: T["id"]
|
|
831
874
|
) {
|
|
832
|
-
return
|
|
875
|
+
return get(self, id).pipe(Effect.flatMap((_) => self.removeAndPublish([_])))
|
|
833
876
|
}
|
|
834
877
|
|
|
835
878
|
export function makeWhere<PM extends { id: string; _etag: string | undefined }>() {
|
|
@@ -880,10 +923,10 @@ export function makeStore<
|
|
|
880
923
|
function encodeToPM() {
|
|
881
924
|
const getEtag = () => undefined
|
|
882
925
|
return (t: T) =>
|
|
883
|
-
schema
|
|
884
|
-
.
|
|
885
|
-
.
|
|
886
|
-
|
|
926
|
+
S.encode(schema)(t).pipe(
|
|
927
|
+
Effect.orDie,
|
|
928
|
+
Effect.map((_) => mapToPersistenceModel(_, getEtag))
|
|
929
|
+
)
|
|
887
930
|
}
|
|
888
931
|
|
|
889
932
|
function mapToPersistenceModel(
|
|
@@ -899,18 +942,20 @@ export function makeStore<
|
|
|
899
942
|
partitionValue?: (a: PM) => string
|
|
900
943
|
}
|
|
901
944
|
) {
|
|
902
|
-
return
|
|
903
|
-
const { make } = $(StoreMaker)
|
|
945
|
+
return Effect.gen(function*($) {
|
|
946
|
+
const { make } = yield* $(StoreMaker)
|
|
904
947
|
|
|
905
|
-
const store = $(
|
|
948
|
+
const store = yield* $(
|
|
906
949
|
make<PM, string, R | RInitial, EInitial>(
|
|
907
950
|
pluralize(name),
|
|
908
951
|
makeInitial
|
|
909
|
-
?
|
|
910
|
-
.
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
952
|
+
? makeInitial
|
|
953
|
+
.pipe(
|
|
954
|
+
Effect.flatMap(Effect.forEach(encodeToPM())),
|
|
955
|
+
Effect.withSpan("Repository.makeInitial [effect-app/infra]", {
|
|
956
|
+
attributes: { "repository.model_name": name }
|
|
957
|
+
})
|
|
958
|
+
)
|
|
914
959
|
: undefined,
|
|
915
960
|
{
|
|
916
961
|
...config,
|
|
@@ -988,6 +1033,7 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
|
|
|
988
1033
|
save: (...items: T[]) => Effect<void, InvalidStateError | OptimisticConcurrencyException, Service>
|
|
989
1034
|
get: (id: T["id"]) => Effect<T, NotFoundError<ItemType>, Service>
|
|
990
1035
|
|
|
1036
|
+
/** @deprecated use q2 */
|
|
991
1037
|
query: (b: (fn: Q.FilterTest<PM>, fields: Q.Filter<PM, never>) => Q.QueryBuilder<PM>) => Effect<T[], never, Service>
|
|
992
1038
|
queryLegacy: <S = T>(map: {
|
|
993
1039
|
filter?: Filter<PM>
|
|
@@ -996,8 +1042,64 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
|
|
|
996
1042
|
skip?: number
|
|
997
1043
|
}) => Effect<S[], never, Service>
|
|
998
1044
|
|
|
1045
|
+
/** @deprecated use q2 */
|
|
999
1046
|
mapped: MM<Service, PM, Omit<PM, "_etag">>
|
|
1000
1047
|
|
|
1048
|
+
byIdAndSaveWithPure: {
|
|
1049
|
+
<R, A, E, S2 extends T>(
|
|
1050
|
+
id: T["id"],
|
|
1051
|
+
pure: Effect<A, E, FixEnv<R, never, T, S2>>
|
|
1052
|
+
): Effect<
|
|
1053
|
+
A,
|
|
1054
|
+
InvalidStateError | OptimisticConcurrencyException | E | NotFoundError<ItemType>,
|
|
1055
|
+
| Service
|
|
1056
|
+
| Exclude<R, {
|
|
1057
|
+
env: PureEnv<never, T, S2>
|
|
1058
|
+
}>
|
|
1059
|
+
>
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
q2AndSaveOnePure: {
|
|
1063
|
+
<
|
|
1064
|
+
R2,
|
|
1065
|
+
A,
|
|
1066
|
+
E2,
|
|
1067
|
+
T2 extends T
|
|
1068
|
+
>(
|
|
1069
|
+
q: (initial: Query<Omit<PM, "_etag">>) =>
|
|
1070
|
+
| Query<Omit<PM, "_etag">>
|
|
1071
|
+
| QueryWhere<Omit<PM, "_etag">>,
|
|
1072
|
+
pure: Effect<A, E2, FixEnv<R2, Evt, T, T2>>
|
|
1073
|
+
): Effect<
|
|
1074
|
+
A,
|
|
1075
|
+
InvalidStateError | OptimisticConcurrencyException | E2 | NotFoundError<ItemType>,
|
|
1076
|
+
| Service
|
|
1077
|
+
| Exclude<R2, {
|
|
1078
|
+
env: PureEnv<Evt, T, T2>
|
|
1079
|
+
}>
|
|
1080
|
+
>
|
|
1081
|
+
}
|
|
1082
|
+
q2AndSavePure: {
|
|
1083
|
+
<
|
|
1084
|
+
R2,
|
|
1085
|
+
A,
|
|
1086
|
+
E2,
|
|
1087
|
+
T2 extends T
|
|
1088
|
+
>(
|
|
1089
|
+
q: (initial: Query<Omit<PM, "_etag">>) =>
|
|
1090
|
+
| Query<Omit<PM, "_etag">>
|
|
1091
|
+
| QueryWhere<Omit<PM, "_etag">>,
|
|
1092
|
+
pure: Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>
|
|
1093
|
+
): Effect<
|
|
1094
|
+
A,
|
|
1095
|
+
InvalidStateError | OptimisticConcurrencyException | E2,
|
|
1096
|
+
| Service
|
|
1097
|
+
| Exclude<R2, {
|
|
1098
|
+
env: PureEnv<Evt, readonly T[], readonly T2[]>
|
|
1099
|
+
}>
|
|
1100
|
+
>
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1001
1103
|
readonly q2: {
|
|
1002
1104
|
<A, R, From extends FieldValues>(
|
|
1003
1105
|
q: (initial: Query<Omit<PM, "_etag">>) => QueryProjection<Omit<PM, "_etag"> extends From ? From : never, A, R>
|
|
@@ -1015,14 +1117,39 @@ export interface RepoFunctions<T extends { id: unknown }, PM extends { id: strin
|
|
|
1015
1117
|
|
|
1016
1118
|
const makeRepoFunctions = (tag: any) => {
|
|
1017
1119
|
const { all } = Effect.serviceConstants(tag) as any
|
|
1018
|
-
const {
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1120
|
+
const {
|
|
1121
|
+
byIdAndSaveWithPure,
|
|
1122
|
+
find,
|
|
1123
|
+
get,
|
|
1124
|
+
q2,
|
|
1125
|
+
q2AndSaveOnePure,
|
|
1126
|
+
q2AndSavePure,
|
|
1127
|
+
query,
|
|
1128
|
+
queryLegacy,
|
|
1129
|
+
removeAndPublish,
|
|
1130
|
+
removeById,
|
|
1131
|
+
save,
|
|
1132
|
+
saveAndPublish
|
|
1133
|
+
} = Effect.serviceFunctions(tag) as any
|
|
1022
1134
|
|
|
1023
1135
|
const mapped = (s: any) => tag.map((_: any) => _.mapped(s))
|
|
1024
1136
|
|
|
1025
|
-
return {
|
|
1137
|
+
return {
|
|
1138
|
+
all,
|
|
1139
|
+
byIdAndSaveWithPure,
|
|
1140
|
+
find,
|
|
1141
|
+
removeById,
|
|
1142
|
+
saveAndPublish,
|
|
1143
|
+
removeAndPublish,
|
|
1144
|
+
save,
|
|
1145
|
+
get,
|
|
1146
|
+
query,
|
|
1147
|
+
queryLegacy,
|
|
1148
|
+
q2,
|
|
1149
|
+
mapped,
|
|
1150
|
+
q2AndSaveOnePure,
|
|
1151
|
+
q2AndSavePure
|
|
1152
|
+
}
|
|
1026
1153
|
}
|
|
1027
1154
|
|
|
1028
1155
|
export const RepositoryBaseImpl = <Service>() => {
|
|
@@ -1036,7 +1163,7 @@ export const RepositoryBaseImpl = <Service>() => {
|
|
|
1036
1163
|
jitM?: (pm: From) => From
|
|
1037
1164
|
): Exact<PM, From & { _etag: string | undefined }> extends true ?
|
|
1038
1165
|
& (abstract new() => RepositoryBaseC1<T, PM, Evt, ItemType>)
|
|
1039
|
-
& Tag<Service, Service>
|
|
1166
|
+
& Context.Tag<Service, Service>
|
|
1040
1167
|
& Repos<
|
|
1041
1168
|
T,
|
|
1042
1169
|
PM,
|
|
@@ -1058,7 +1185,7 @@ export const RepositoryBaseImpl = <Service>() => {
|
|
|
1058
1185
|
super(itemType)
|
|
1059
1186
|
}
|
|
1060
1187
|
static readonly make = mkRepo.make
|
|
1061
|
-
static readonly makeWith = ((a: any, b: any) => mkRepo.make(a)
|
|
1188
|
+
static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
|
|
1062
1189
|
|
|
1063
1190
|
static readonly Where = makeWhere<PM>()
|
|
1064
1191
|
static readonly Query = Q.QueryBuilder.make<PM>()
|
|
@@ -1082,7 +1209,7 @@ export const RepositoryDefaultImpl = <Service>() => {
|
|
|
1082
1209
|
& (abstract new(
|
|
1083
1210
|
impl: Repository<T, PM, Evt, ItemType>
|
|
1084
1211
|
) => RepositoryBaseC3<T, PM, Evt, ItemType>)
|
|
1085
|
-
& Tag<Service, Service>
|
|
1212
|
+
& Context.Tag<Service, Service>
|
|
1086
1213
|
& Repos<
|
|
1087
1214
|
T,
|
|
1088
1215
|
PM,
|
|
@@ -1106,7 +1233,7 @@ export const RepositoryDefaultImpl = <Service>() => {
|
|
|
1106
1233
|
super(itemType, impl)
|
|
1107
1234
|
}
|
|
1108
1235
|
static readonly make = mkRepo.make
|
|
1109
|
-
static readonly makeWith = ((a: any, b: any) => mkRepo.make(a)
|
|
1236
|
+
static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
|
|
1110
1237
|
|
|
1111
1238
|
static readonly Where = makeWhere<PM>()
|
|
1112
1239
|
static readonly Query = Q.QueryBuilder.make<PM>()
|