@chevre/domain 26.0.0-alpha.20 → 26.0.0-alpha.22
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.
|
@@ -2,20 +2,23 @@ import type { AnyKeys, Connection, FilterQuery, ProjectionType } from 'mongoose'
|
|
|
2
2
|
import { factory } from '../factory';
|
|
3
3
|
import { IDocType } from './mongoose/schemas/task';
|
|
4
4
|
type IKeyOfProjection = keyof factory.task.ITask<factory.taskName>;
|
|
5
|
+
type IFindParams = factory.task.ISearchConditions & {
|
|
6
|
+
data?: never;
|
|
7
|
+
};
|
|
5
8
|
/**
|
|
6
9
|
* タスク管理リポジトリ
|
|
7
10
|
*/
|
|
8
11
|
export declare class AdminTaskRepo {
|
|
9
12
|
private readonly taskModel;
|
|
10
13
|
constructor(connection: Connection);
|
|
11
|
-
static CREATE_MONGO_CONDITIONS(params:
|
|
12
|
-
countTasks(params:
|
|
14
|
+
static CREATE_MONGO_CONDITIONS(params: IFindParams): FilterQuery<import("@chevre/factory/lib/chevre/task").ITask | import("@chevre/factory/lib/chevre/task/confirmPayTransaction").ITask | import("@chevre/factory/lib/chevre/task/confirmReserveTransaction").ITask | import("@chevre/factory/lib/chevre/task/createAccountingReport").ITask | import("@chevre/factory/lib/chevre/task/onAssetTransactionStatusChanged").ITask | import("@chevre/factory/lib/chevre/task/onAuthorizationCreated").ITask | import("@chevre/factory/lib/chevre/task/onEventChanged").ITask | import("@chevre/factory/lib/chevre/task/onResourceDeleted").ITask | import("@chevre/factory/lib/chevre/task/onResourceUpdated").ITask | import("@chevre/factory/lib/chevre/task/onOrderPaymentCompleted").ITask | import("@chevre/factory/lib/chevre/task/placeOrder").ITask | import("@chevre/factory/lib/chevre/task/returnOrder").ITask | import("@chevre/factory/lib/chevre/task/returnPayTransaction").ITask | import("@chevre/factory/lib/chevre/task/returnReserveTransaction").ITask | import("@chevre/factory/lib/chevre/task/sendEmailMessage").ITask | import("@chevre/factory/lib/chevre/task/sendOrder").ITask | import("@chevre/factory/lib/chevre/task/triggerWebhook").ITask | import("@chevre/factory/lib/chevre/task/useReservation").ITask | import("@chevre/factory/lib/chevre/task/voidPayTransaction").ITask>[];
|
|
15
|
+
countTasks(params: IFindParams): Promise<{
|
|
13
16
|
count: number;
|
|
14
17
|
}>;
|
|
15
18
|
/**
|
|
16
19
|
* 検索する
|
|
17
20
|
*/
|
|
18
|
-
findTasks(params:
|
|
21
|
+
findTasks(params: IFindParams, inclusion: IKeyOfProjection[]): Promise<factory.task.ITask<factory.taskName>[]>;
|
|
19
22
|
/**
|
|
20
23
|
* cron:notifyLatency専用
|
|
21
24
|
*/
|
|
@@ -82,26 +82,6 @@ class AdminTaskRepo {
|
|
|
82
82
|
if (dateAbortedLte instanceof Date) {
|
|
83
83
|
andConditions.push({ dateAborted: { $type: 'date', $lte: dateAbortedLte } });
|
|
84
84
|
}
|
|
85
|
-
const objectIdEq = params.data?.object?.id?.$eq;
|
|
86
|
-
if (typeof objectIdEq === 'string') {
|
|
87
|
-
andConditions.push({ 'data.object.id': { $exists: true, $eq: objectIdEq } });
|
|
88
|
-
}
|
|
89
|
-
const objectOrderNumberEq = params.data?.object?.orderNumber?.$eq;
|
|
90
|
-
if (typeof objectOrderNumberEq === 'string') {
|
|
91
|
-
andConditions.push({ 'data.object.orderNumber': { $exists: true, $eq: objectOrderNumberEq } });
|
|
92
|
-
}
|
|
93
|
-
const objectTransactionNumberEq = params.data?.object?.transactionNumber?.$eq;
|
|
94
|
-
if (typeof objectTransactionNumberEq === 'string') {
|
|
95
|
-
andConditions.push({ 'data.object.transactionNumber': { $exists: true, $eq: objectTransactionNumberEq } });
|
|
96
|
-
}
|
|
97
|
-
const objectPurposeIdEq = params.data?.purpose?.id?.$eq;
|
|
98
|
-
if (typeof objectPurposeIdEq === 'string') {
|
|
99
|
-
andConditions.push({ 'data.purpose.id': { $exists: true, $eq: objectPurposeIdEq } });
|
|
100
|
-
}
|
|
101
|
-
const objectPurposeOrderNumberEq = params.data?.purpose?.orderNumber?.$eq;
|
|
102
|
-
if (typeof objectPurposeOrderNumberEq === 'string') {
|
|
103
|
-
andConditions.push({ 'data.purpose.orderNumber': { $exists: true, $eq: objectPurposeOrderNumberEq } });
|
|
104
|
-
}
|
|
105
85
|
const identifierRegex = params.identifier?.$regex;
|
|
106
86
|
if (typeof identifierRegex === 'string' && identifierRegex.length > 0) {
|
|
107
87
|
andConditions.push({ identifier: { $exists: true, $regex: new RegExp(identifierRegex) } });
|
|
@@ -4,6 +4,7 @@ exports.modelName = exports.indexes = void 0;
|
|
|
4
4
|
exports.createSchema = createSchema;
|
|
5
5
|
const mongoose_1 = require("mongoose");
|
|
6
6
|
const writeConcern_1 = require("../writeConcern");
|
|
7
|
+
const factory_1 = require("../../../factory");
|
|
7
8
|
const settings_1 = require("../../../settings");
|
|
8
9
|
const modelName = 'Task';
|
|
9
10
|
exports.modelName = modelName;
|
|
@@ -65,16 +66,17 @@ const indexes = [
|
|
|
65
66
|
{ runsAt: -1 },
|
|
66
67
|
{ name: 'searchByRunsAt-v2' }
|
|
67
68
|
],
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
69
|
+
// identifierはユニークインデックス有なので不要(2026-08-07~)
|
|
70
|
+
// [
|
|
71
|
+
// // identifier追加(2023-09-01~)
|
|
72
|
+
// { identifier: 1, runsAt: -1 },
|
|
73
|
+
// {
|
|
74
|
+
// name: 'searchByIdentifier',
|
|
75
|
+
// partialFilterExpression: {
|
|
76
|
+
// identifier: { $exists: true }
|
|
77
|
+
// }
|
|
78
|
+
// }
|
|
79
|
+
// ],
|
|
78
80
|
[
|
|
79
81
|
{ dateAborted: 1, runsAt: -1 },
|
|
80
82
|
{
|
|
@@ -93,64 +95,11 @@ const indexes = [
|
|
|
93
95
|
}
|
|
94
96
|
}
|
|
95
97
|
],
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
{ 'data.agent.id': 1, runsAt: -1 },
|
|
102
|
-
{
|
|
103
|
-
name: 'searchByDataAgentId',
|
|
104
|
-
partialFilterExpression: {
|
|
105
|
-
'data.agent.id': { $exists: true }
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
],
|
|
109
|
-
[
|
|
110
|
-
{ 'data.object.orderNumber': 1, runsAt: -1 },
|
|
111
|
-
{
|
|
112
|
-
name: 'searchByDataObjectOrderNumber',
|
|
113
|
-
partialFilterExpression: {
|
|
114
|
-
'data.object.orderNumber': { $exists: true }
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
],
|
|
118
|
-
[
|
|
119
|
-
{ 'data.object.transactionNumber': 1, runsAt: -1 },
|
|
120
|
-
{
|
|
121
|
-
name: 'searchByDataObjectTransactionNumber',
|
|
122
|
-
partialFilterExpression: {
|
|
123
|
-
'data.object.transactionNumber': { $exists: true }
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
],
|
|
127
|
-
[
|
|
128
|
-
{ 'data.object.id': 1, runsAt: -1 },
|
|
129
|
-
{
|
|
130
|
-
name: 'searchByDataObjectId',
|
|
131
|
-
partialFilterExpression: {
|
|
132
|
-
'data.object.id': { $exists: true }
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
],
|
|
136
|
-
[
|
|
137
|
-
{ 'data.purpose.id': 1, runsAt: -1 },
|
|
138
|
-
{
|
|
139
|
-
name: 'searchByDataPurposeId',
|
|
140
|
-
partialFilterExpression: {
|
|
141
|
-
'data.purpose.id': { $exists: true }
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
],
|
|
145
|
-
[
|
|
146
|
-
{ 'data.purpose.orderNumber': 1, runsAt: -1 },
|
|
147
|
-
{
|
|
148
|
-
name: 'searchByDataPurposeOrderNumber',
|
|
149
|
-
partialFilterExpression: {
|
|
150
|
-
'data.purpose.orderNumber': { $exists: true }
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
],
|
|
98
|
+
// discontinue(2026-08-08~)
|
|
99
|
+
// [
|
|
100
|
+
// { remainingNumberOfTries: 1, runsAt: -1 },
|
|
101
|
+
// { name: 'searchByRemainingNumberOfTries-v2' }
|
|
102
|
+
// ],
|
|
154
103
|
[
|
|
155
104
|
{ 'data.id': 1, runsAt: -1 },
|
|
156
105
|
{
|
|
@@ -160,10 +109,11 @@ const indexes = [
|
|
|
160
109
|
}
|
|
161
110
|
}
|
|
162
111
|
],
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
112
|
+
// 遅延タスク実行時のソート条件をrunsAtのみに統一したため、numberOfTriedを含めたインデックスはもう不要(2026-08-08~)
|
|
113
|
+
// [
|
|
114
|
+
// { status: 1, name: 1, numberOfTried: 1, runsAt: 1 },
|
|
115
|
+
// { name: 'executeOneByName' }
|
|
116
|
+
// ],
|
|
167
117
|
[
|
|
168
118
|
{ status: 1, runsAt: 1, name: 1 },
|
|
169
119
|
{ name: 'executeOneByNameIfExists' } // add(2025-03-08~)
|
|
@@ -216,8 +166,84 @@ const indexes = [
|
|
|
216
166
|
// }
|
|
217
167
|
// }
|
|
218
168
|
// ],
|
|
169
|
+
// ペイロード特定検索用はひとまず廃止(2026-08-07~)
|
|
170
|
+
// [
|
|
171
|
+
// { 'data.agent.id': 1, runsAt: -1 },
|
|
172
|
+
// {
|
|
173
|
+
// name: 'searchByDataAgentId',
|
|
174
|
+
// partialFilterExpression: {
|
|
175
|
+
// 'data.agent.id': { $exists: true }
|
|
176
|
+
// }
|
|
177
|
+
// }
|
|
178
|
+
// ],
|
|
179
|
+
// [
|
|
180
|
+
// { 'data.object.orderNumber': 1, runsAt: -1 },
|
|
181
|
+
// {
|
|
182
|
+
// name: 'searchByDataObjectOrderNumber',
|
|
183
|
+
// partialFilterExpression: {
|
|
184
|
+
// 'data.object.orderNumber': { $exists: true }
|
|
185
|
+
// }
|
|
186
|
+
// }
|
|
187
|
+
// ],
|
|
188
|
+
// [
|
|
189
|
+
// { 'data.object.transactionNumber': 1, runsAt: -1 },
|
|
190
|
+
// {
|
|
191
|
+
// name: 'searchByDataObjectTransactionNumber',
|
|
192
|
+
// partialFilterExpression: {
|
|
193
|
+
// 'data.object.transactionNumber': { $exists: true }
|
|
194
|
+
// }
|
|
195
|
+
// }
|
|
196
|
+
// ],
|
|
197
|
+
// [
|
|
198
|
+
// { 'data.object.id': 1, runsAt: -1 },
|
|
199
|
+
// {
|
|
200
|
+
// name: 'searchByDataObjectId',
|
|
201
|
+
// partialFilterExpression: {
|
|
202
|
+
// 'data.object.id': { $exists: true }
|
|
203
|
+
// }
|
|
204
|
+
// }
|
|
205
|
+
// ],
|
|
206
|
+
// [
|
|
207
|
+
// { 'data.purpose.id': 1, runsAt: -1 },
|
|
208
|
+
// {
|
|
209
|
+
// name: 'searchByDataPurposeId',
|
|
210
|
+
// partialFilterExpression: {
|
|
211
|
+
// 'data.purpose.id': { $exists: true }
|
|
212
|
+
// }
|
|
213
|
+
// }
|
|
214
|
+
// ],
|
|
215
|
+
// [
|
|
216
|
+
// { 'data.purpose.orderNumber': 1, runsAt: -1 },
|
|
217
|
+
// {
|
|
218
|
+
// name: 'searchByDataPurposeOrderNumber',
|
|
219
|
+
// partialFilterExpression: {
|
|
220
|
+
// 'data.purpose.orderNumber': { $exists: true }
|
|
221
|
+
// }
|
|
222
|
+
// }
|
|
223
|
+
// ],
|
|
219
224
|
];
|
|
220
225
|
exports.indexes = indexes;
|
|
226
|
+
const EXPIRE_AFTER_SECONDS = typeof process.env.TASK_EXPIRE_AFTER_SECONDS === 'string'
|
|
227
|
+
? Number(process.env.TASK_EXPIRE_AFTER_SECONDS)
|
|
228
|
+
: undefined;
|
|
229
|
+
// 0より大きい数値が設定されている場合のみ ttlインデックスを追加
|
|
230
|
+
if (typeof EXPIRE_AFTER_SECONDS === 'number' && EXPIRE_AFTER_SECONDS > 0) {
|
|
231
|
+
indexes.push([
|
|
232
|
+
{ runsAt: 1 },
|
|
233
|
+
{
|
|
234
|
+
name: 'ttlByRunsAt',
|
|
235
|
+
expireAfterSeconds: EXPIRE_AFTER_SECONDS,
|
|
236
|
+
partialFilterExpression: {
|
|
237
|
+
status: {
|
|
238
|
+
$in: [
|
|
239
|
+
factory_1.factory.taskStatus.Aborted,
|
|
240
|
+
factory_1.factory.taskStatus.Executed
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
]);
|
|
246
|
+
}
|
|
221
247
|
/**
|
|
222
248
|
* タスクスキーマ
|
|
223
249
|
*/
|
|
@@ -43,10 +43,6 @@ export declare class TaskDelayedRepo {
|
|
|
43
43
|
runsAt: {
|
|
44
44
|
$lt: Date;
|
|
45
45
|
};
|
|
46
|
-
sort: {
|
|
47
|
-
numberOfTried?: factory.sortType;
|
|
48
|
-
runsAt?: factory.sortType;
|
|
49
|
-
};
|
|
50
46
|
executor: {
|
|
51
47
|
name: string;
|
|
52
48
|
};
|
|
@@ -69,15 +65,6 @@ export declare class TaskDelayedRepo {
|
|
|
69
65
|
retryTasks(params: {
|
|
70
66
|
intervalInMinutes: number;
|
|
71
67
|
}): Promise<UpdateWriteOpResult>;
|
|
72
|
-
/**
|
|
73
|
-
* $lte:0をReadyにする(特定のタスクを除いて) -> Readyにすれば自動的にAbortedになる
|
|
74
|
-
*/
|
|
75
|
-
retryAbortingTasksByName(params: {
|
|
76
|
-
intervalInMinutes: number;
|
|
77
|
-
name: {
|
|
78
|
-
$in?: factory.taskName[];
|
|
79
|
-
};
|
|
80
|
-
}): Promise<UpdateWriteOpResult>;
|
|
81
68
|
/**
|
|
82
69
|
* $lte:0をReadyにする -> Readyにすれば自動的にAbortedになる
|
|
83
70
|
*/
|
|
@@ -70,9 +70,9 @@ class TaskDelayedRepo {
|
|
|
70
70
|
}, {
|
|
71
71
|
new: true,
|
|
72
72
|
projection,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
sort: {
|
|
74
|
+
runsAt: factory_1.factory.sortType.Ascending // ソートはrunsAtで固定化(2026-08-07~)
|
|
75
|
+
}
|
|
76
76
|
})
|
|
77
77
|
.setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
78
78
|
.lean()
|
|
@@ -85,7 +85,7 @@ class TaskDelayedRepo {
|
|
|
85
85
|
if (!(params.runsAt.$lt instanceof Date)) {
|
|
86
86
|
throw new factory_1.factory.errors.Argument('runsAt.$lt', 'must be Date');
|
|
87
87
|
}
|
|
88
|
-
// インデックスについては、name指定であれば'
|
|
88
|
+
// インデックスについては、name指定であれば'runDelayedTaskByName'を想定
|
|
89
89
|
const filter = {
|
|
90
90
|
status: { $eq: factory_1.factory.taskStatus.Ready },
|
|
91
91
|
name: params.name,
|
|
@@ -93,7 +93,6 @@ class TaskDelayedRepo {
|
|
|
93
93
|
};
|
|
94
94
|
const doc = await this.runDelayedTask({
|
|
95
95
|
filter,
|
|
96
|
-
sort: params.sort,
|
|
97
96
|
executor: params.executor
|
|
98
97
|
});
|
|
99
98
|
if (doc === null) {
|
|
@@ -132,9 +131,6 @@ class TaskDelayedRepo {
|
|
|
132
131
|
};
|
|
133
132
|
const doc = await this.runDelayedTask({
|
|
134
133
|
filter,
|
|
135
|
-
sort: {
|
|
136
|
-
runsAt: factory_1.factory.sortType.Ascending // ソートはrunsAtのみにしてみる(2026-08-04~)
|
|
137
|
-
},
|
|
138
134
|
executor: params.executor
|
|
139
135
|
});
|
|
140
136
|
if (doc === null) {
|
|
@@ -171,31 +167,6 @@ class TaskDelayedRepo {
|
|
|
171
167
|
})
|
|
172
168
|
.exec();
|
|
173
169
|
}
|
|
174
|
-
/**
|
|
175
|
-
* $lte:0をReadyにする(特定のタスクを除いて) -> Readyにすれば自動的にAbortedになる
|
|
176
|
-
*/
|
|
177
|
-
async retryAbortingTasksByName(params) {
|
|
178
|
-
const lastTriedAtShoudBeLessThan = (0, moment_1.default)()
|
|
179
|
-
.add(-params.intervalInMinutes, 'minutes')
|
|
180
|
-
.toDate();
|
|
181
|
-
return this.taskModel.updateMany(
|
|
182
|
-
// name: 'retry'のindexと連動しているので、条件の順序などには注意すること
|
|
183
|
-
// @see schemas/task
|
|
184
|
-
{
|
|
185
|
-
status: { $eq: factory_1.factory.taskStatus.Running },
|
|
186
|
-
lastTriedAt: {
|
|
187
|
-
$type: 'date',
|
|
188
|
-
$lt: lastTriedAtShoudBeLessThan
|
|
189
|
-
},
|
|
190
|
-
remainingNumberOfTries: { $lte: 0 },
|
|
191
|
-
...(Array.isArray(params.name.$in)) ? { name: { $in: params.name.$in } } : undefined
|
|
192
|
-
}, {
|
|
193
|
-
$set: {
|
|
194
|
-
status: factory_1.factory.taskStatus.Ready // 実行前に変更
|
|
195
|
-
}
|
|
196
|
-
})
|
|
197
|
-
.exec();
|
|
198
|
-
}
|
|
199
170
|
/**
|
|
200
171
|
* $lte:0をReadyにする -> Readyにすれば自動的にAbortedになる
|
|
201
172
|
*/
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@aws-sdk/client-cognito-identity-provider": "3.1090.0",
|
|
13
13
|
"@aws-sdk/credential-providers": "3.1090.0",
|
|
14
|
-
"@chevre/factory": "10.
|
|
14
|
+
"@chevre/factory": "10.3.0-alpha.0",
|
|
15
15
|
"@motionpicture/coa-service": "10.0.0",
|
|
16
16
|
"@motionpicture/gmo-service": "6.1.0-alpha.0",
|
|
17
17
|
"@sendgrid/client": "8.1.4",
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"postversion": "git push origin --tags",
|
|
89
89
|
"prepublishOnly": "npm run clean && npm run build"
|
|
90
90
|
},
|
|
91
|
-
"version": "26.0.0-alpha.
|
|
91
|
+
"version": "26.0.0-alpha.22"
|
|
92
92
|
}
|