@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: factory.task.ISearchConditions): 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>[];
12
- countTasks(params: factory.task.ISearchConditions): Promise<{
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: factory.task.ISearchConditions, inclusion: IKeyOfProjection[]): Promise<factory.task.ITask<factory.taskName>[]>;
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
- // identifier追加(2023-09-01~)
70
- { identifier: 1, runsAt: -1 },
71
- {
72
- name: 'searchByIdentifier',
73
- partialFilterExpression: {
74
- identifier: { $exists: true }
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
- { remainingNumberOfTries: 1, runsAt: -1 },
98
- { name: 'searchByRemainingNumberOfTries-v2' }
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
- { status: 1, name: 1, numberOfTried: 1, runsAt: 1 },
165
- { name: 'executeOneByName' }
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
- ...(typeof params.sort.numberOfTried === 'number' || typeof params.sort.runsAt === 'number')
74
- ? { sort: params.sort }
75
- : undefined
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指定であれば'executeOneByName'あるいは'runDelayedTaskByName'を想定
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.2.0",
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.20"
91
+ "version": "26.0.0-alpha.22"
92
92
  }