@effect-app/infra 0.198.2 → 0.199.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -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 +171 -169
- 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 +8 -10
- 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 +41 -47
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +182 -194
- 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 +12 -8
- package/src/services/Repository/ext.ts +52 -44
- package/src/services/RepositoryBase.ts +278 -240
- 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,11 +17,16 @@ 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
32
|
import { make as makeQuery, type QAll, type Query, query, type QueryProjection } from "./query.js"
|
|
@@ -67,7 +72,7 @@ export abstract class RepositoryBaseC<
|
|
|
67
72
|
ItemType extends string
|
|
68
73
|
> {
|
|
69
74
|
abstract readonly itemType: ItemType
|
|
70
|
-
abstract readonly find: (id: T["id"]) => Effect<
|
|
75
|
+
abstract readonly find: (id: T["id"]) => Effect<Option<T>>
|
|
71
76
|
abstract readonly all: Effect<T[]>
|
|
72
77
|
abstract readonly saveAndPublish: (
|
|
73
78
|
items: Iterable<T>,
|
|
@@ -83,7 +88,7 @@ export abstract class RepositoryBaseC<
|
|
|
83
88
|
filter: FilterFunc<PM>
|
|
84
89
|
// count: (filter?: Filter<PM>) => Effect<never, never, NonNegativeInt>
|
|
85
90
|
}
|
|
86
|
-
abstract readonly changeFeed: PubSub<[T[], "save" | "remove"]>
|
|
91
|
+
abstract readonly changeFeed: PubSub.PubSub<[T[], "save" | "remove"]>
|
|
87
92
|
abstract readonly removeAndPublish: (
|
|
88
93
|
items: Iterable<T>,
|
|
89
94
|
events?: Iterable<Evt>
|
|
@@ -158,15 +163,17 @@ export class RepositoryBaseC3<
|
|
|
158
163
|
ItemType extends string
|
|
159
164
|
> extends RepositoryBaseC2<T, PM, Evt, ItemType> {
|
|
160
165
|
get(id: T["id"]) {
|
|
161
|
-
return
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
return Effect.andThen(
|
|
167
|
+
this
|
|
168
|
+
.find(id),
|
|
169
|
+
(_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: this.itemType, id }))
|
|
170
|
+
)
|
|
164
171
|
}
|
|
165
172
|
|
|
166
173
|
readonly log = (evt: Evt) => AnyPureDSL.log(evt)
|
|
167
174
|
|
|
168
175
|
removeById(id: T["id"]) {
|
|
169
|
-
return this.get(id)
|
|
176
|
+
return Effect.andThen(this.get(id), (_) => this.removeAndPublish([_]))
|
|
170
177
|
}
|
|
171
178
|
|
|
172
179
|
// TODO: project inside the db.
|
|
@@ -222,12 +229,13 @@ export class RepositoryBaseC3<
|
|
|
222
229
|
>
|
|
223
230
|
): Effect<S[], E, R> {
|
|
224
231
|
// TODO: a projection that gets sent to the db instead.
|
|
225
|
-
return
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
232
|
+
return Effect.flatMap(map, (f) =>
|
|
233
|
+
Effect.map(
|
|
234
|
+
this
|
|
235
|
+
.utils
|
|
236
|
+
.filter(f),
|
|
237
|
+
(_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown as S[]
|
|
238
|
+
))
|
|
231
239
|
}
|
|
232
240
|
|
|
233
241
|
project<S = PM>(
|
|
@@ -262,9 +270,10 @@ export class RepositoryBaseC3<
|
|
|
262
270
|
}
|
|
263
271
|
|
|
264
272
|
count(filter?: Filter<PM>) {
|
|
265
|
-
return
|
|
266
|
-
.projectEffect(Effect.sync(() => ({ filter })))
|
|
267
|
-
|
|
273
|
+
return Effect.map(
|
|
274
|
+
this.projectEffect(Effect.sync(() => ({ filter }))),
|
|
275
|
+
(_) => NonNegativeInt(_.length)
|
|
276
|
+
)
|
|
268
277
|
}
|
|
269
278
|
|
|
270
279
|
queryEffect<
|
|
@@ -275,11 +284,12 @@ export class RepositoryBaseC3<
|
|
|
275
284
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
276
285
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
277
286
|
) {
|
|
278
|
-
return
|
|
287
|
+
return Effect.flatMap(map, (f) =>
|
|
279
288
|
(f.filter ? this.utils.filter(f) : this.utils.all)
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
|
|
289
|
+
.pipe(
|
|
290
|
+
Effect.flatMap((_) => this.utils.parseMany(_)),
|
|
291
|
+
Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown[] as S[])
|
|
292
|
+
))
|
|
283
293
|
}
|
|
284
294
|
|
|
285
295
|
queryOneEffect<R, E>(
|
|
@@ -302,16 +312,23 @@ export class RepositoryBaseC3<
|
|
|
302
312
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
303
313
|
map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S> }, E, R>
|
|
304
314
|
): Effect<S, E | NotFoundError<ItemType>, R> {
|
|
305
|
-
return
|
|
315
|
+
return Effect.flatMap(map, (f) =>
|
|
306
316
|
(f.filter ? this.utils.filter({ filter: f.filter, limit: 1 }) : this.utils.all)
|
|
307
|
-
.
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
317
|
+
.pipe(
|
|
318
|
+
Effect.flatMap((_) => this.utils.parseMany(_)),
|
|
319
|
+
Effect
|
|
320
|
+
.flatMap((_) =>
|
|
321
|
+
toNonEmptyArray(
|
|
322
|
+
f.collect
|
|
323
|
+
? ReadonlyArray.filterMap(_, f.collect)
|
|
324
|
+
: _ as unknown[] as S[]
|
|
325
|
+
)
|
|
326
|
+
.pipe(
|
|
327
|
+
Effect.mapError(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter })),
|
|
328
|
+
Effect.map((_) => _[0])
|
|
329
|
+
)
|
|
330
|
+
)
|
|
331
|
+
))
|
|
315
332
|
}
|
|
316
333
|
|
|
317
334
|
queryLegacy<S = T>(
|
|
@@ -373,9 +390,7 @@ export class RepositoryBaseC3<
|
|
|
373
390
|
queryAndSaveOnePureEffect(
|
|
374
391
|
map: any
|
|
375
392
|
) {
|
|
376
|
-
return (pure: any) =>
|
|
377
|
-
queryOneEffect(this, map)
|
|
378
|
-
.flatMap((_) => saveWithPure_(this, _, pure))
|
|
393
|
+
return (pure: any) => Effect.flatMap(queryOneEffect(this, map), (_) => saveWithPure_(this, _, pure))
|
|
379
394
|
}
|
|
380
395
|
|
|
381
396
|
queryAndSaveOnePure<
|
|
@@ -412,8 +427,7 @@ export class RepositoryBaseC3<
|
|
|
412
427
|
map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
|
|
413
428
|
) {
|
|
414
429
|
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))
|
|
430
|
+
Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPure_(_, pure))
|
|
417
431
|
}
|
|
418
432
|
|
|
419
433
|
queryAndSavePure<
|
|
@@ -451,9 +465,9 @@ export class RepositoryBaseC3<
|
|
|
451
465
|
}>
|
|
452
466
|
>
|
|
453
467
|
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))
|
|
468
|
+
if (pure) return get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
|
|
455
469
|
return (pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) =>
|
|
456
|
-
get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
|
|
470
|
+
get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
|
|
457
471
|
}
|
|
458
472
|
|
|
459
473
|
/**
|
|
@@ -495,7 +509,7 @@ export class RepositoryBaseC3<
|
|
|
495
509
|
return saveAllWithEffectInt(
|
|
496
510
|
this,
|
|
497
511
|
runTerm(pure, item)
|
|
498
|
-
.map(([item, events, a]) => [[item], events, a])
|
|
512
|
+
.pipe(Effect.map(([item, events, a]) => [[item], events, a]))
|
|
499
513
|
)
|
|
500
514
|
}
|
|
501
515
|
|
|
@@ -507,10 +521,7 @@ export class RepositoryBaseC3<
|
|
|
507
521
|
>(
|
|
508
522
|
gen: Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
|
|
509
523
|
) {
|
|
510
|
-
return gen
|
|
511
|
-
.flatMap(
|
|
512
|
-
([items, events, a]) => this.saveAndPublish(items, events).map(() => a)
|
|
513
|
-
)
|
|
524
|
+
return Effect.flatMap(gen, ([items, events, a]) => Effect.map(this.saveAndPublish(items, events), () => a))
|
|
514
525
|
}
|
|
515
526
|
|
|
516
527
|
queryAndSavePureEffectBatched<
|
|
@@ -523,8 +534,7 @@ export class RepositoryBaseC3<
|
|
|
523
534
|
batchSize = 100
|
|
524
535
|
) {
|
|
525
536
|
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))
|
|
537
|
+
Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPureBatched_(_, pure, batchSize))
|
|
528
538
|
}
|
|
529
539
|
|
|
530
540
|
queryAndSavePureBatched<
|
|
@@ -553,14 +563,14 @@ export class RepositoryBaseC3<
|
|
|
553
563
|
pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>,
|
|
554
564
|
batchSize = 100
|
|
555
565
|
) {
|
|
556
|
-
return
|
|
557
|
-
.
|
|
558
|
-
|
|
566
|
+
return Effect.forEach(
|
|
567
|
+
ReadonlyArray.chunk_(items, batchSize),
|
|
568
|
+
(batch) =>
|
|
559
569
|
saveAllWithEffectInt(
|
|
560
570
|
this,
|
|
561
571
|
runTerm(pure, batch)
|
|
562
572
|
)
|
|
563
|
-
|
|
573
|
+
)
|
|
564
574
|
}
|
|
565
575
|
|
|
566
576
|
readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
|
|
@@ -624,188 +634,214 @@ export function makeRepo<
|
|
|
624
634
|
}
|
|
625
635
|
}
|
|
626
636
|
) {
|
|
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
|
-
|
|
637
|
+
return Effect
|
|
638
|
+
.gen(function*($) {
|
|
639
|
+
const rctx = yield* $(Effect.context<R>())
|
|
640
|
+
const encode = flow(S.encode(schema), Effect.provide(rctx))
|
|
641
|
+
const decode = flow(S.decode(schema), Effect.provide(rctx))
|
|
642
|
+
|
|
643
|
+
const store = yield* $(mkStore(args.makeInitial, args.config))
|
|
644
|
+
const { get } = yield* $(ContextMapContainer)
|
|
645
|
+
const cms = Effect.andThen(get, (_) => ({
|
|
646
|
+
get: (id: string) => _.get(`${name}.${id}`),
|
|
647
|
+
set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
|
|
648
|
+
}))
|
|
649
|
+
|
|
650
|
+
const pubCfg = yield* $(Effect.context<R2>())
|
|
651
|
+
const pub = "publishEvents" in args
|
|
652
|
+
? flow(args.publishEvents, Effect.provide(pubCfg))
|
|
653
|
+
: () => Effect.unit
|
|
654
|
+
const changeFeed = yield* $(PubSub.unbounded<[T[], "save" | "remove"]>())
|
|
655
|
+
|
|
656
|
+
const allE = store.all.pipe(Effect.flatMap((items) =>
|
|
657
|
+
Effect.gen(function*($) {
|
|
658
|
+
const { set } = yield* $(cms)
|
|
659
|
+
return items.map((_) => mapReverse(_, set))
|
|
660
|
+
})
|
|
661
|
+
))
|
|
662
|
+
|
|
663
|
+
const all = Effect.flatMap(
|
|
664
|
+
allE,
|
|
665
|
+
(_) => Effect.forEach(_, (_) => decode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
|
|
666
|
+
)
|
|
653
667
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
.ast
|
|
664
|
-
._tag === "Transform"
|
|
665
|
-
? (S
|
|
666
|
-
.make(
|
|
667
|
-
_
|
|
668
|
+
const structSchema = schema as unknown as { struct: typeof schema }
|
|
669
|
+
const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
|
|
670
|
+
_.ast._tag === "Union"
|
|
671
|
+
// we need to get the TypeLiteral, incase of class it's behind a transform...
|
|
672
|
+
? S.union(..._.ast.types.map((_) =>
|
|
673
|
+
(S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
|
|
674
|
+
.pipe(S.pick("id"))
|
|
675
|
+
))
|
|
676
|
+
: _
|
|
668
677
|
.ast
|
|
669
|
-
.
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
678
|
+
._tag === "Transform"
|
|
679
|
+
? (S
|
|
680
|
+
.make(
|
|
681
|
+
_
|
|
682
|
+
.ast
|
|
683
|
+
.from
|
|
684
|
+
) as unknown as Schema<T, From>)
|
|
685
|
+
.pipe(S
|
|
686
|
+
.pick("id"))
|
|
687
|
+
: _
|
|
688
|
+
.pipe(S
|
|
689
|
+
.pick("id"))
|
|
690
|
+
)
|
|
691
|
+
const encodeId = flow(S.encode(i), Effect.provide(rctx))
|
|
692
|
+
function findEId(id: From["id"]) {
|
|
693
|
+
return Effect.flatMap(
|
|
694
|
+
store.find(id),
|
|
695
|
+
(item) =>
|
|
696
|
+
Effect.gen(function*($) {
|
|
697
|
+
const { set } = yield* $(cms)
|
|
698
|
+
return item.pipe(Option.map((_) => mapReverse(_, set)))
|
|
699
|
+
})
|
|
686
700
|
)
|
|
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
|
-
})
|
|
701
|
+
}
|
|
702
|
+
function findE(id: T["id"]) {
|
|
703
|
+
return pipe(
|
|
704
|
+
encodeId({ id }),
|
|
705
|
+
Effect.orDie,
|
|
706
|
+
Effect.map((_) => _.id),
|
|
707
|
+
Effect.flatMap(findEId)
|
|
709
708
|
)
|
|
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
|
-
}
|
|
709
|
+
}
|
|
725
710
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
711
|
+
function find(id: T["id"]) {
|
|
712
|
+
return Effect.flatMapOption(findE(id), (_) => Effect.orDie(decode(_)))
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
const saveAllE = (a: Iterable<From>) =>
|
|
716
|
+
Effect
|
|
717
|
+
.flatMapOption(
|
|
718
|
+
Effect
|
|
719
|
+
.sync(() => toNonEmptyArray([...a])),
|
|
720
|
+
(a) =>
|
|
721
|
+
Effect.gen(function*($) {
|
|
722
|
+
const { get, set } = yield* $(cms)
|
|
723
|
+
const items = a.map((_) => mapToPersistenceModel(_, get))
|
|
724
|
+
const ret = yield* $(store.batchSet(items))
|
|
725
|
+
ret.forEach((_) => set(_.id, _._etag))
|
|
726
|
+
})
|
|
727
|
+
)
|
|
728
|
+
.pipe(Effect.asUnit)
|
|
729
|
+
|
|
730
|
+
const saveAll = (a: Iterable<T>) =>
|
|
731
|
+
Effect
|
|
732
|
+
.forEach(
|
|
733
|
+
Array.from(a),
|
|
734
|
+
(_) => encode(_),
|
|
735
|
+
{ concurrency: "inherit", batching: true }
|
|
736
|
+
)
|
|
737
|
+
.pipe(
|
|
738
|
+
Effect.orDie,
|
|
739
|
+
Effect.andThen(saveAllE)
|
|
740
|
+
)
|
|
741
|
+
|
|
742
|
+
const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
|
|
743
|
+
const it = Chunk.fromIterable(items)
|
|
744
|
+
return saveAll(it)
|
|
745
|
+
.pipe(
|
|
746
|
+
Effect.andThen(Effect.sync(() => toNonEmptyArray([...events]))),
|
|
739
747
|
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
740
|
-
.
|
|
741
|
-
|
|
748
|
+
(_) => Effect.flatMapOption(_, pub),
|
|
749
|
+
Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"])),
|
|
750
|
+
Effect.asUnit
|
|
751
|
+
)
|
|
752
|
+
}
|
|
742
753
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
754
|
+
function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
|
|
755
|
+
return Effect.gen(function*($) {
|
|
756
|
+
const { get, set } = yield* $(cms)
|
|
757
|
+
const it = [...a]
|
|
758
|
+
const items = yield* $(
|
|
759
|
+
Effect.forEach(it, (_) => encode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
|
|
760
|
+
)
|
|
761
|
+
// TODO: we should have a batchRemove on store so the adapter can actually batch...
|
|
762
|
+
for (const e of items) {
|
|
763
|
+
yield* $(store.remove(mapToPersistenceModel(e, get)))
|
|
764
|
+
set(e.id, undefined)
|
|
765
|
+
}
|
|
766
|
+
yield* $(
|
|
767
|
+
Effect
|
|
768
|
+
.sync(() => toNonEmptyArray([...events]))
|
|
769
|
+
// TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
|
|
770
|
+
.pipe((_) => Effect.flatMapOption(_, pub))
|
|
771
|
+
)
|
|
772
|
+
|
|
773
|
+
yield* $(changeFeed.publish([it, "remove"]))
|
|
774
|
+
})
|
|
775
|
+
}
|
|
746
776
|
|
|
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
|
-
|
|
777
|
+
const r: Repository<T, PM, Evt, ItemType> = {
|
|
778
|
+
/**
|
|
779
|
+
* @internal
|
|
780
|
+
*/
|
|
781
|
+
utils: {
|
|
782
|
+
parseMany: (items) =>
|
|
783
|
+
Effect.flatMap(cms, (cm) =>
|
|
784
|
+
Effect
|
|
785
|
+
.forEach(items, (_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
|
|
786
|
+
.pipe(Effect.orDie)),
|
|
787
|
+
parseMany2: (items, schema) =>
|
|
788
|
+
Effect.flatMap(cms, (cm) =>
|
|
789
|
+
Effect
|
|
790
|
+
.forEach(items, (_) => S.decode(schema)(mapReverse(_, cm.set) as any), {
|
|
791
|
+
concurrency: "inherit",
|
|
792
|
+
batching: true
|
|
793
|
+
})
|
|
794
|
+
.pipe(Effect.orDie)),
|
|
795
|
+
filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
|
|
796
|
+
store
|
|
797
|
+
.filter(args)
|
|
798
|
+
.pipe(Effect.tap((items) =>
|
|
799
|
+
args.select
|
|
800
|
+
? Effect.unit
|
|
801
|
+
: Effect.map(cms, ({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
|
|
802
|
+
)),
|
|
803
|
+
all: Effect.tap(
|
|
804
|
+
store.all,
|
|
805
|
+
(items) => Effect.map(cms, ({ set }) => items.forEach((_) => set(_.id, _._etag)))
|
|
806
|
+
)
|
|
807
|
+
},
|
|
808
|
+
mapped: <A, R>(schema: S.Schema<A, any, R>) => {
|
|
809
|
+
// const enc = S.encode(schema)
|
|
810
|
+
const dec = S.decode(schema)
|
|
811
|
+
const encMany = S.encode(S.array(schema))
|
|
812
|
+
const decMany = S.decode(S.array(schema))
|
|
813
|
+
return {
|
|
814
|
+
all: cms
|
|
815
|
+
.pipe(
|
|
816
|
+
Effect.flatMap((cm) => Effect.map(r.utils.all, (_) => _.map((_) => mapReverse(_, cm.set)))),
|
|
817
|
+
Effect.flatMap(decMany),
|
|
818
|
+
Effect.map((_) => _ as any[])
|
|
819
|
+
),
|
|
820
|
+
find: (id: PM["id"]) => flatMapOption(findE(id), dec),
|
|
821
|
+
query: (b: any) =>
|
|
822
|
+
r
|
|
823
|
+
.utils
|
|
824
|
+
.filter({ filter: b })
|
|
825
|
+
.pipe(
|
|
826
|
+
Effect.flatMap(decMany),
|
|
827
|
+
Effect.map((_) => _ as any[])
|
|
828
|
+
),
|
|
829
|
+
save: (...xes: any[]) => Effect.flatMap(encMany(xes), (_) => saveAllE(_))
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
changeFeed,
|
|
833
|
+
itemType: name,
|
|
834
|
+
find,
|
|
835
|
+
all,
|
|
836
|
+
saveAndPublish,
|
|
837
|
+
removeAndPublish,
|
|
838
|
+
q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
|
|
839
|
+
}
|
|
840
|
+
return r
|
|
841
|
+
})
|
|
842
|
+
.pipe(Effect
|
|
843
|
+
// .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
|
|
844
|
+
.withLogSpan("Repository.make: " + name))
|
|
809
845
|
}
|
|
810
846
|
|
|
811
847
|
return {
|
|
@@ -829,7 +865,7 @@ export function removeById<
|
|
|
829
865
|
self: Repository<T, PM, Evt, ItemType>,
|
|
830
866
|
id: T["id"]
|
|
831
867
|
) {
|
|
832
|
-
return
|
|
868
|
+
return get(self, id).pipe(Effect.flatMap((_) => self.removeAndPublish([_])))
|
|
833
869
|
}
|
|
834
870
|
|
|
835
871
|
export function makeWhere<PM extends { id: string; _etag: string | undefined }>() {
|
|
@@ -880,10 +916,10 @@ export function makeStore<
|
|
|
880
916
|
function encodeToPM() {
|
|
881
917
|
const getEtag = () => undefined
|
|
882
918
|
return (t: T) =>
|
|
883
|
-
schema
|
|
884
|
-
.
|
|
885
|
-
.
|
|
886
|
-
|
|
919
|
+
S.encode(schema)(t).pipe(
|
|
920
|
+
Effect.orDie,
|
|
921
|
+
Effect.map((_) => mapToPersistenceModel(_, getEtag))
|
|
922
|
+
)
|
|
887
923
|
}
|
|
888
924
|
|
|
889
925
|
function mapToPersistenceModel(
|
|
@@ -899,18 +935,20 @@ export function makeStore<
|
|
|
899
935
|
partitionValue?: (a: PM) => string
|
|
900
936
|
}
|
|
901
937
|
) {
|
|
902
|
-
return
|
|
903
|
-
const { make } = $(StoreMaker)
|
|
938
|
+
return Effect.gen(function*($) {
|
|
939
|
+
const { make } = yield* $(StoreMaker)
|
|
904
940
|
|
|
905
|
-
const store = $(
|
|
941
|
+
const store = yield* $(
|
|
906
942
|
make<PM, string, R | RInitial, EInitial>(
|
|
907
943
|
pluralize(name),
|
|
908
944
|
makeInitial
|
|
909
|
-
?
|
|
910
|
-
.
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
945
|
+
? makeInitial
|
|
946
|
+
.pipe(
|
|
947
|
+
Effect.flatMap(Effect.forEach(encodeToPM())),
|
|
948
|
+
Effect.withSpan("Repository.makeInitial [effect-app/infra]", {
|
|
949
|
+
attributes: { "repository.model_name": name }
|
|
950
|
+
})
|
|
951
|
+
)
|
|
914
952
|
: undefined,
|
|
915
953
|
{
|
|
916
954
|
...config,
|
|
@@ -1036,7 +1074,7 @@ export const RepositoryBaseImpl = <Service>() => {
|
|
|
1036
1074
|
jitM?: (pm: From) => From
|
|
1037
1075
|
): Exact<PM, From & { _etag: string | undefined }> extends true ?
|
|
1038
1076
|
& (abstract new() => RepositoryBaseC1<T, PM, Evt, ItemType>)
|
|
1039
|
-
& Tag<Service, Service>
|
|
1077
|
+
& Context.Tag<Service, Service>
|
|
1040
1078
|
& Repos<
|
|
1041
1079
|
T,
|
|
1042
1080
|
PM,
|
|
@@ -1058,7 +1096,7 @@ export const RepositoryBaseImpl = <Service>() => {
|
|
|
1058
1096
|
super(itemType)
|
|
1059
1097
|
}
|
|
1060
1098
|
static readonly make = mkRepo.make
|
|
1061
|
-
static readonly makeWith = ((a: any, b: any) => mkRepo.make(a)
|
|
1099
|
+
static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
|
|
1062
1100
|
|
|
1063
1101
|
static readonly Where = makeWhere<PM>()
|
|
1064
1102
|
static readonly Query = Q.QueryBuilder.make<PM>()
|
|
@@ -1082,7 +1120,7 @@ export const RepositoryDefaultImpl = <Service>() => {
|
|
|
1082
1120
|
& (abstract new(
|
|
1083
1121
|
impl: Repository<T, PM, Evt, ItemType>
|
|
1084
1122
|
) => RepositoryBaseC3<T, PM, Evt, ItemType>)
|
|
1085
|
-
& Tag<Service, Service>
|
|
1123
|
+
& Context.Tag<Service, Service>
|
|
1086
1124
|
& Repos<
|
|
1087
1125
|
T,
|
|
1088
1126
|
PM,
|
|
@@ -1106,7 +1144,7 @@ export const RepositoryDefaultImpl = <Service>() => {
|
|
|
1106
1144
|
super(itemType, impl)
|
|
1107
1145
|
}
|
|
1108
1146
|
static readonly make = mkRepo.make
|
|
1109
|
-
static readonly makeWith = ((a: any, b: any) => mkRepo.make(a)
|
|
1147
|
+
static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
|
|
1110
1148
|
|
|
1111
1149
|
static readonly Where = makeWhere<PM>()
|
|
1112
1150
|
static readonly Query = Q.QueryBuilder.make<PM>()
|