@chevre/domain
Version:
Chevre Domain Library for Node.js
91 lines (90 loc) • 3.63 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const moment = require("moment");
const task_1 = require("./mongoose/model/task");
const factory = require("../factory");
/**
* タスク実行時のソート条件
*/
const sortOrder4executionOfTasks = {
numberOfTried: 1,
runsAt: 1 // 実行予定日時の早さ優先
};
/**
* タスクリポジトリ
*/
class MongoRepository {
constructor(connection) {
this.taskModel = connection.model(task_1.default.modelName);
}
save(taskAttributes) {
return __awaiter(this, void 0, void 0, function* () {
return this.taskModel.create(taskAttributes).then((doc) => doc.toObject());
});
}
executeOneByName(taskName) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.taskModel.findOneAndUpdate({
status: factory.taskStatus.Ready,
runsAt: { $lt: new Date() },
name: taskName
}, {
status: factory.taskStatus.Running,
lastTriedAt: new Date(),
$inc: {
remainingNumberOfTries: -1,
numberOfTried: 1 // トライ回数増やす
}
}, { new: true }).sort(sortOrder4executionOfTasks).exec();
if (doc === null) {
return null;
}
return doc.toObject();
});
}
retry(intervalInMinutes) {
return __awaiter(this, void 0, void 0, function* () {
const lastTriedAtShoudBeLessThan = moment().add(-intervalInMinutes, 'minutes').toDate();
yield this.taskModel.update({
status: factory.taskStatus.Running,
lastTriedAt: { $lt: lastTriedAtShoudBeLessThan },
remainingNumberOfTries: { $gt: 0 }
}, {
status: factory.taskStatus.Ready // 実行前に変更
}, { multi: true }).exec();
});
}
abortOne(intervalInMinutes) {
return __awaiter(this, void 0, void 0, function* () {
const lastTriedAtShoudBeLessThan = moment().add(-intervalInMinutes, 'minutes').toDate();
const doc = yield this.taskModel.findOneAndUpdate({
status: factory.taskStatus.Running,
lastTriedAt: { $lt: lastTriedAtShoudBeLessThan },
remainingNumberOfTries: 0
}, {
status: factory.taskStatus.Aborted
}, { new: true }).exec();
if (doc === null) {
return null;
}
return doc.toObject();
});
}
pushExecutionResultById(id, status, executionResult) {
return __awaiter(this, void 0, void 0, function* () {
yield this.taskModel.findByIdAndUpdate(id, {
status: status,
$push: { executionResults: executionResult }
}).exec();
});
}
}
exports.MongoRepository = MongoRepository;
;