UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

71 lines (70 loc) 3.39 kB
"use strict"; 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 createDebug = require("debug"); const moment = require("moment-timezone"); const util = require("util"); const factory = require("../factory"); const debug = createDebug('chevre-domain:repo'); /** * Redisリポジトリー */ class RedisRepository { constructor(redisClient) { this.redisClient = redisClient; } /** * 発行する */ publish(params) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { // 番号接頭辞は日付と販売者枝番号 const prefix = util.format('%s-%s', // tslint:disable-next-line:no-magic-numbers params.sellerBranchCode, moment(params.reserveDate).tz('Asia/Tokyo').format('YYMMDD')); const now = moment(); // 一日ごとにカウントアップするので、データ保管期間は一日あれば十分 const TTL = moment(now).add(1, 'day').diff(now, 'seconds'); debug(`TTL:${TTL} seconds`); const key = util.format('%s:%s', RedisRepository.REDIS_KEY_PREFIX, prefix); this.redisClient.multi() .incr(key, debug) .expire(key, TTL) .exec((err, results) => { debug('results:', results); // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore if: please write tests */ if (err instanceof Error) { reject(err); } else { // tslint:disable-next-line:no-single-line-block-comment /* istanbul ignore else: please write tests */ if (Number.isInteger(results[0])) { const no = results[0]; debug('no incremented.', no); resolve(util.format('%s-%s', prefix, // tslint:disable-next-line:no-magic-numbers (`000000${no}`).slice(-6) // 一販売者につき一日あたり最大1000000件以内の予約想定 )); } else { // 基本的にありえないフロー reject(new factory.errors.ServiceUnavailable('Reservation number not published')); } } }); }); }); } } RedisRepository.REDIS_KEY_PREFIX = 'chevre:reservationNumber'; exports.RedisRepository = RedisRepository;