@chevre/domain 25.2.0-alpha.55 → 25.2.0-alpha.56
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.
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Connection } from 'mongoose';
|
|
2
|
+
import { factory } from '../factory';
|
|
3
|
+
import { IModel } from './mongoose/schemas/task';
|
|
4
|
+
type ICreatingTaskKeys = 'data' | 'executionResults' | 'name' | 'numberOfTried' | 'project' | 'remainingNumberOfTries' | 'runsAt' | 'status' | 'identifier' | 'description';
|
|
5
|
+
/**
|
|
6
|
+
* リトライ可能なタスク作成属性
|
|
7
|
+
*/
|
|
8
|
+
type ICreatingTask = Pick<factory.task.importEventCapacitiesFromCOA.IAttributes, ICreatingTaskKeys> | Pick<factory.task.importEventsFromCOA.IAttributes, ICreatingTaskKeys>;
|
|
9
|
+
/**
|
|
10
|
+
* 予定タスクリポジトリ
|
|
11
|
+
*/
|
|
12
|
+
export declare class ScheduledTaskRepo {
|
|
13
|
+
readonly taskModel: IModel;
|
|
14
|
+
constructor(connection: Connection);
|
|
15
|
+
addScheduledTasks(taskAttributes: ICreatingTask[]): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
}[]>;
|
|
18
|
+
countPotentiallyRunningScheduledTasks(params: {
|
|
19
|
+
name: {
|
|
20
|
+
$eq: factory.taskName;
|
|
21
|
+
};
|
|
22
|
+
runsAt: {
|
|
23
|
+
$lt: Date;
|
|
24
|
+
};
|
|
25
|
+
limit?: number;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
count: number;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* 実行日時を一定期間過ぎたReadyタスクについて、Runningスタータスに変更した上で、Runningイベントを発生させる
|
|
31
|
+
*/
|
|
32
|
+
emitRunningScheduledTaskIfExists(params: {
|
|
33
|
+
/**
|
|
34
|
+
* 必ずタスク名指定で実行する
|
|
35
|
+
*/
|
|
36
|
+
name: {
|
|
37
|
+
$eq: factory.taskName;
|
|
38
|
+
};
|
|
39
|
+
runsAt: {
|
|
40
|
+
$lt: Date;
|
|
41
|
+
};
|
|
42
|
+
sort: {
|
|
43
|
+
numberOfTried?: factory.sortType;
|
|
44
|
+
runsAt?: factory.sortType;
|
|
45
|
+
};
|
|
46
|
+
executor: {
|
|
47
|
+
name: string;
|
|
48
|
+
};
|
|
49
|
+
nameFilterBeforeRunsAt: boolean;
|
|
50
|
+
}): Promise<Pick<factory.task.ITask<factory.taskName>, 'id' | 'name'> | null>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScheduledTaskRepo = void 0;
|
|
4
|
+
const task_1 = require("../eventEmitter/task");
|
|
5
|
+
const factory_1 = require("../factory");
|
|
6
|
+
const settings_1 = require("../settings");
|
|
7
|
+
const task_2 = require("./mongoose/schemas/task");
|
|
8
|
+
/**
|
|
9
|
+
* 予定タスクリポジトリ
|
|
10
|
+
*/
|
|
11
|
+
class ScheduledTaskRepo {
|
|
12
|
+
taskModel;
|
|
13
|
+
constructor(connection) {
|
|
14
|
+
this.taskModel = connection.model(task_2.modelName, (0, task_2.createSchema)());
|
|
15
|
+
}
|
|
16
|
+
async addScheduledTasks(taskAttributes) {
|
|
17
|
+
if (taskAttributes.length > 0) {
|
|
18
|
+
// resolve uniqueness of identifier(2025-03-27~)
|
|
19
|
+
const creatingTasks = taskAttributes.map(({ identifier, ...creatingTask }) => creatingTask); // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
20
|
+
const result = await this.taskModel.insertMany(creatingTasks, { ordered: false, rawResult: true });
|
|
21
|
+
if (result.insertedCount !== taskAttributes.length) {
|
|
22
|
+
throw new factory_1.factory.errors.Internal('all tasks not saved');
|
|
23
|
+
}
|
|
24
|
+
const savedTasks = Object.values(result.insertedIds)
|
|
25
|
+
.map((objectId) => {
|
|
26
|
+
return { id: objectId.toHexString() };
|
|
27
|
+
});
|
|
28
|
+
// イベントは発火しない
|
|
29
|
+
// if (emitImmediately) {
|
|
30
|
+
// savedTasks.forEach((savedTask) => {
|
|
31
|
+
// taskEventEmitter.emitTaskStatusChanged({
|
|
32
|
+
// id: savedTask.id,
|
|
33
|
+
// status: factory.taskStatus.Ready
|
|
34
|
+
// });
|
|
35
|
+
// });
|
|
36
|
+
// }
|
|
37
|
+
return savedTasks;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async countPotentiallyRunningScheduledTasks(params) {
|
|
44
|
+
const { runsAt, limit, name } = params;
|
|
45
|
+
const nameEq = name.$eq;
|
|
46
|
+
if (!(runsAt.$lt instanceof Date)) {
|
|
47
|
+
throw new factory_1.factory.errors.Argument('runsAt.$lt', 'must be Date');
|
|
48
|
+
}
|
|
49
|
+
const query = this.taskModel.countDocuments({
|
|
50
|
+
status: { $eq: factory_1.factory.taskStatus.Ready },
|
|
51
|
+
runsAt: { $lt: params.runsAt.$lt },
|
|
52
|
+
name: { $eq: nameEq }
|
|
53
|
+
});
|
|
54
|
+
if (typeof limit === 'number' && limit >= 0) {
|
|
55
|
+
query.limit(limit);
|
|
56
|
+
}
|
|
57
|
+
const count = await query.setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
58
|
+
.exec();
|
|
59
|
+
return { count };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 実行日時を一定期間過ぎたReadyタスクについて、Runningスタータスに変更した上で、Runningイベントを発生させる
|
|
63
|
+
*/
|
|
64
|
+
async emitRunningScheduledTaskIfExists(params) {
|
|
65
|
+
if (!(params.runsAt.$lt instanceof Date)) {
|
|
66
|
+
throw new factory_1.factory.errors.Argument('runsAt.$lt', 'must be Date');
|
|
67
|
+
}
|
|
68
|
+
const projection = {
|
|
69
|
+
_id: 0,
|
|
70
|
+
id: { $toString: '$_id' },
|
|
71
|
+
name: 1
|
|
72
|
+
};
|
|
73
|
+
const nameEq = params.name.$eq;
|
|
74
|
+
const { nameFilterBeforeRunsAt } = params;
|
|
75
|
+
const filter = {
|
|
76
|
+
status: { $eq: factory_1.factory.taskStatus.Ready },
|
|
77
|
+
...(nameFilterBeforeRunsAt) ? { name: params.name } : undefined,
|
|
78
|
+
runsAt: { $lt: params.runsAt.$lt },
|
|
79
|
+
...(!nameFilterBeforeRunsAt) ? { name: params.name } : undefined
|
|
80
|
+
};
|
|
81
|
+
const doc = await this.taskModel.findOneAndUpdate(filter, {
|
|
82
|
+
$set: {
|
|
83
|
+
status: factory_1.factory.taskStatus.Running, // 実行中に変更
|
|
84
|
+
lastTriedAt: new Date(),
|
|
85
|
+
executor: params.executor
|
|
86
|
+
},
|
|
87
|
+
$inc: {
|
|
88
|
+
remainingNumberOfTries: -1, // 残りトライ可能回数減らす
|
|
89
|
+
numberOfTried: 1 // トライ回数増やす
|
|
90
|
+
}
|
|
91
|
+
}, {
|
|
92
|
+
new: true,
|
|
93
|
+
projection,
|
|
94
|
+
...(typeof params.sort.numberOfTried === 'number' || typeof params.sort.runsAt === 'number')
|
|
95
|
+
? { sort: params.sort }
|
|
96
|
+
: undefined
|
|
97
|
+
})
|
|
98
|
+
.setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
|
|
99
|
+
.lean()
|
|
100
|
+
.exec();
|
|
101
|
+
if (doc === null) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const changedTask = {
|
|
105
|
+
id: doc.id,
|
|
106
|
+
status: factory_1.factory.taskStatus.Running,
|
|
107
|
+
name: nameEq
|
|
108
|
+
};
|
|
109
|
+
task_1.taskEventEmitter.emitTaskStatusChanged(changedTask);
|
|
110
|
+
return doc;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.ScheduledTaskRepo = ScheduledTaskRepo;
|
|
@@ -88,6 +88,7 @@ import type { MemberSettingRepo } from './repo/setting/member';
|
|
|
88
88
|
import type { RateLimitSettingRepo } from './repo/setting/rateLimit';
|
|
89
89
|
import type { WaiterSettingRepo } from './repo/setting/waiter';
|
|
90
90
|
import type { StockHolderRepo } from './repo/stockHolder';
|
|
91
|
+
import type { ScheduledTaskRepo } from './repo/scheduledTask';
|
|
91
92
|
import type { TaskRepo } from './repo/task';
|
|
92
93
|
import type { TicketRepo } from './repo/ticket';
|
|
93
94
|
import type { TransactionRepo } from './repo/transaction';
|
|
@@ -477,6 +478,10 @@ export type StockHolder = StockHolderRepo;
|
|
|
477
478
|
export declare namespace StockHolder {
|
|
478
479
|
function createInstance(...params: ConstructorParameters<typeof StockHolderRepo>): Promise<StockHolderRepo>;
|
|
479
480
|
}
|
|
481
|
+
export type ScheduledTask = ScheduledTaskRepo;
|
|
482
|
+
export declare namespace ScheduledTask {
|
|
483
|
+
function createInstance(...params: ConstructorParameters<typeof ScheduledTaskRepo>): Promise<ScheduledTaskRepo>;
|
|
484
|
+
}
|
|
480
485
|
export type Task = TaskRepo;
|
|
481
486
|
export declare namespace Task {
|
|
482
487
|
function createInstance(...params: ConstructorParameters<typeof TaskRepo>): Promise<TaskRepo>;
|
package/lib/chevre/repository.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PendingReservation = exports.PaymentServiceProvider = exports.PaymentServiceChannel = exports.PaymentService = exports.Passport = exports.OwnershipInfo = exports.OrderNumber = exports.OrderInTransaction = exports.Order = exports.Offer = exports.OfferItemCondition = exports.OfferCatalogItem = exports.OfferCatalog = exports.NoteAboutOrder = exports.Note = exports.MovieTicketType = exports.Message = exports.MerchantReturnPolicy = exports.MemberProgram = exports.Member = exports.Issuer = exports.IdentityProvider = exports.Identity = exports.EventSeries = exports.EventSellerMakesOffer = exports.EventOffer = exports.Event = exports.EmailMessage = exports.CustomerType = exports.Customer = exports.Credentials = exports.CreativeWork = exports.ConfirmationNumber = exports.Authorization = exports.CategoryCode = exports.assetTransaction = exports.AssetTransaction = exports.Aggregation = exports.AggregateReservation = exports.AggregateOrder = exports.AggregateOffer = exports.AggregateTask = exports.AggregateAction = exports.AdminTask = exports.AdditionalProperty = exports.action = exports.Action = exports.AccountTitle = exports.AccountingReport = exports.AcceptedOffer = void 0;
|
|
4
|
-
exports.WebSite = exports.rateLimit = exports.TransactionProcess = exports.TransactionNumber = exports.transaction = exports.Transaction = exports.Ticket = exports.AsyncAction = exports.Task = exports.StockHolder = exports.setting = exports.Setting = exports.ServiceAvailableHour = exports.SellerReturnPolicy = exports.SellerPaymentAccepted = exports.SellerMakesOffer = exports.Seller = exports.Schedule = exports.Role = exports.ReserveInterface = exports.Reservation = exports.ProjectMakesOffer = exports.Project = exports.ProductHasOfferCatalog = exports.Product = exports.PriceSpecification = exports.PotentialAction = exports.place = exports.Person = void 0;
|
|
4
|
+
exports.WebSite = exports.rateLimit = exports.TransactionProcess = exports.TransactionNumber = exports.transaction = exports.Transaction = exports.Ticket = exports.AsyncAction = exports.Task = exports.ScheduledTask = exports.StockHolder = exports.setting = exports.Setting = exports.ServiceAvailableHour = exports.SellerReturnPolicy = exports.SellerPaymentAccepted = exports.SellerMakesOffer = exports.Seller = exports.Schedule = exports.Role = exports.ReserveInterface = exports.Reservation = exports.ProjectMakesOffer = exports.Project = exports.ProductHasOfferCatalog = exports.Product = exports.PriceSpecification = exports.PotentialAction = exports.place = exports.Person = void 0;
|
|
5
5
|
var AcceptedOffer;
|
|
6
6
|
(function (AcceptedOffer) {
|
|
7
7
|
let repo;
|
|
@@ -1000,6 +1000,17 @@ var StockHolder;
|
|
|
1000
1000
|
}
|
|
1001
1001
|
StockHolder.createInstance = createInstance;
|
|
1002
1002
|
})(StockHolder || (exports.StockHolder = StockHolder = {}));
|
|
1003
|
+
var ScheduledTask;
|
|
1004
|
+
(function (ScheduledTask) {
|
|
1005
|
+
let repo;
|
|
1006
|
+
async function createInstance(...params) {
|
|
1007
|
+
if (repo === undefined) {
|
|
1008
|
+
repo = (await import('./repo/scheduledTask.js')).ScheduledTaskRepo;
|
|
1009
|
+
}
|
|
1010
|
+
return new repo(...params);
|
|
1011
|
+
}
|
|
1012
|
+
ScheduledTask.createInstance = createInstance;
|
|
1013
|
+
})(ScheduledTask || (exports.ScheduledTask = ScheduledTask = {}));
|
|
1003
1014
|
var Task;
|
|
1004
1015
|
(function (Task) {
|
|
1005
1016
|
let repo;
|
package/package.json
CHANGED