@chevre/domain
Version:
Chevre Domain Library for Node.js
71 lines (70 loc) • 3.39 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 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;
;