UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

122 lines (121 loc) 5.48 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.OrderNumberRepo = 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"); const ORDER_NUMBER_SEPARATOR = '-'; /** * 注文番号リポジトリ */ class OrderNumberRepo { 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: { // orderDate: Date; // projectPrefix: string; // timestamp: string; // }): string { // return util.format( // '%s:%s:%s', // OrderNumberRepo.REDIS_KEY_PREFIX, // params.projectPrefix, // params.timestamp // ); // } /** * タイムスタンプから発行する */ publishByTimestamp(params) { return __awaiter(this, void 0, void 0, function* () { const timestamp = moment(params.orderDate) .valueOf() .toString(); const projectPrefix = params.project.alternateName .toUpperCase(); let dataFeedExpires; const dataFeedIdentifier = `${projectPrefix}:${timestamp}`; let incrReply; const useMongoBySettings = yield this.useMongoBySettings(params); if (useMongoBySettings) { dataFeedExpires = moment(params.orderDate) .add(1, 'minute') // ミリ秒でカウントしていくので、注文日時後1分で十分 .toDate(); incrReply = yield this.counterRepo.incrementByMongo({ identifier: dataFeedIdentifier, includedInDataCatalog: { identifier: transactionNumber_1.DataCatalogIdentifier.orderNumber }, expires: dataFeedExpires }); } else { dataFeedExpires = moment(params.orderDate) .add(1, 'minute') // ミリ秒でカウントしていくので、注文日時後1分で十分 .toDate(); incrReply = yield this.counterRepo.incrementByRedis({ identifier: dataFeedIdentifier, includedInDataCatalog: { identifier: transactionNumber_1.DataCatalogIdentifier.orderNumber }, expires: dataFeedExpires }); } let orderNumber = `${timestamp}${incrReply}`; // checkdigit const cd = cdigit.luhn.compute(orderNumber); orderNumber = fpe({ password: cd }) .encrypt(orderNumber); orderNumber = `${projectPrefix}${cd}${orderNumber}`; orderNumber = `${[ // tslint:disable-next-line:no-magic-numbers orderNumber.slice(0, 4), // tslint:disable-next-line:no-magic-numbers orderNumber.slice(4, 11), // tslint:disable-next-line:no-magic-numbers orderNumber.slice(11) ].join(ORDER_NUMBER_SEPARATOR)}`; return orderNumber; }); } /** * DB移行時のみに使用目的の設定更新 */ setUseMongo4orderNumberFrom(params) { return __awaiter(this, void 0, void 0, function* () { const { useMongo4orderNumberFrom } = params; return this.settingModel.findOneAndUpdate({ 'project.id': { $eq: '*' } }, { $set: { useMongo4orderNumberFrom } }, { projection: { _id: 0, useMongo4orderNumberFrom: 1 } }) .lean() .exec(); }); } useMongoBySettings(params) { return __awaiter(this, void 0, void 0, function* () { const setting = yield this.settingModel.findOne({ 'project.id': { $eq: '*' } }, { _id: 0, useMongo4orderNumberFrom: 1 }) .lean() .exec(); const useMongo4orderNumberFrom = setting === null || setting === void 0 ? void 0 : setting.useMongo4orderNumberFrom; return useMongo4orderNumberFrom instanceof Date && moment(params.orderDate) .isSameOrAfter(moment(useMongo4orderNumberFrom)); }); } } exports.OrderNumberRepo = OrderNumberRepo;