UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

109 lines (108 loc) 5 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TransactionNumberRepo = void 0; const cdigit = require("cdigit"); const moment = require("moment-timezone"); // tslint:disable-next-line:no-require-imports no-var-requires const fpe = require('node-fpe'); const setting_1 = require("./mongoose/schemas/setting"); const transactionNumber_1 = require("./mongoose/schemas/transactionNumber"); const transactionNumberCounter_1 = require("./transactionNumberCounter"); /** * 取引番号リポジトリ */ class TransactionNumberRepo { constructor(params) { const { connection } = params; this.settingModel = connection.model(setting_1.modelName, (0, setting_1.createSchema)()); this.counterRepo = new transactionNumberCounter_1.TransactionNumberCounterRepo(params); } // private static createKey(params: { // startDate: Date; // timestamp: string; // }): string { // return util.format( // '%s:%s', // TransactionNumberRepo.REDIS_KEY_PREFIX, // params.timestamp // ); // } /** * タイムスタンプから発行する */ publishByTimestamp(params) { return __awaiter(this, void 0, void 0, function* () { const timestamp = moment(params.startDate) .valueOf() .toString(); let dataFeedExpires; const dataFeedIdentifier = timestamp; let incrReply; const useMongoBySettings = yield this.useMongoBySettings(params); if (useMongoBySettings) { dataFeedExpires = moment(params.startDate) .add(1, 'minute') // ミリ秒でカウントしていくので、予約日時後1分で十分 .toDate(); incrReply = yield this.counterRepo.incrementByMongo({ identifier: dataFeedIdentifier, includedInDataCatalog: { identifier: transactionNumber_1.DataCatalogIdentifier.transactionNumber }, expires: dataFeedExpires }); } else { dataFeedExpires = moment(params.startDate) .add(1, 'minute') // ミリ秒でカウントしていくので、予約日時後1分で十分 .toDate(); incrReply = yield this.counterRepo.incrementByRedis({ identifier: dataFeedIdentifier, includedInDataCatalog: { identifier: transactionNumber_1.DataCatalogIdentifier.transactionNumber }, expires: dataFeedExpires }); } let transactionNumber = `${timestamp}${incrReply}`; // checkdigit const cd = cdigit.luhn.compute(transactionNumber); transactionNumber = fpe({ password: cd }) .encrypt(transactionNumber); transactionNumber = `${cd}${transactionNumber}`; return { transactionNumber }; }); } /** * DB移行時のみに使用目的の設定更新 */ setUseMongo4transactionNumberFrom(params) { return __awaiter(this, void 0, void 0, function* () { const { useMongo4transactionNumberFrom } = params; return this.settingModel.findOneAndUpdate({ 'project.id': { $eq: '*' } }, { $set: { useMongo4transactionNumberFrom } }, { projection: { _id: 0, useMongo4transactionNumberFrom: 1 } }) .lean() .exec(); }); } useMongoBySettings(params) { return __awaiter(this, void 0, void 0, function* () { const setting = yield this.settingModel.findOne({ 'project.id': { $eq: '*' } }, { _id: 0, useMongo4transactionNumberFrom: 1 }) .lean() .exec(); const useMongo4transactionNumberFrom = setting === null || setting === void 0 ? void 0 : setting.useMongo4transactionNumberFrom; return useMongo4transactionNumberFrom instanceof Date && moment(params.startDate) .isSameOrAfter(moment(useMongo4transactionNumberFrom)); }); } } exports.TransactionNumberRepo = TransactionNumberRepo;