Source: services/card.js

"use strict";
/**
 * カード決済インターフェース
 * @namespace services/card
 */
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 querystring = require("querystring");
const request = require("request-promise-native");
const badRequest_1 = require("../error/badRequest");
const debug = createDebug('gmo-service:services:card');
/**
 * 会員登録
 * @memberof services/member
 * @function saveMember
 * @param {ISaveMemberArgs} args 会員登録in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @param {string | undefined} args.memberName 会員名
 * @returns {Promise<ISaveMemberResult>} 会員登録out
 */
function saveMember(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/SaveMember.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId,
                MemberName: args.memberName
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            throw new badRequest_1.BadRequestError(body);
        }
        return {
            memberId: result.MemberID
        };
    });
}
exports.saveMember = saveMember;
/**
 * 会員更新
 * @memberof services/member
 * @function updateMember
 * @param {IUpdateMemberArgs} args 会員更新in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @param {string | undefined} args.memberName 会員名
 * @returns {Promise<IUpdateMemberResult>} 会員更新out
 */
function updateMember(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/UpdateMember.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId,
                MemberName: args.memberName
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            throw new badRequest_1.BadRequestError(body);
        }
        return {
            memberId: result.MemberID
        };
    });
}
exports.updateMember = updateMember;
/**
 * 会員削除
 * @memberof services/member
 * @function deleteMember
 * @param {ISaveMemberArgs} args 会員削除in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @returns {Promise<ISaveMemberResult>} 会員削除out
 */
function deleteMember(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/DeleteMember.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            throw new badRequest_1.BadRequestError(body);
        }
        return {
            memberId: result.MemberID
        };
    });
}
exports.deleteMember = deleteMember;
/**
 * 会員参照
 * @memberof services/member
 * @function searchMember
 * @param {ISearchMemberArgs} args 会員参照in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @returns {Promise<ISearchMemberResult>} 会員参照out
 */
function searchMember(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/SearchMember.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            const error = new badRequest_1.BadRequestError(body);
            // 指定されたサイトIDと会員IDの会員が存在しない場合、nullを返すように、特別扱い
            if (error.errors.length === 1 && error.errors[0].info === 'E01390002') {
                return null;
            }
            throw error;
        }
        return {
            memberId: result.MemberID,
            memberName: result.MemberName,
            deleteFlag: result.DeleteFlag
        };
    });
}
exports.searchMember = searchMember;
/**
 * カード登録・更新
 * @memberof services/card
 * @function saveCard
 * @param {ISaveCardArgs} args カード登録・更新in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @param {util.SeqMode} args.seqMode カード登録連番モード(0:論理モード(デフォルト)1:物理モード)
 * @param {number} args.cardSeq カード登録連番(登録時は、入力不可です。更新時は、更新する値を設定します。)
 * @param {string} args.defaultFlag 洗替・継続課金フラグ(0:継続課金対象としない(デフォルト)1:継続課金対象とする)
 * @param {string} args.cardName カード会社略称
 * @param {string} args.cardNo カード番号
 * @param {string} args.cardPass カードパスワード
 * @param {string} args.expire 有効期限
 * @param {string} args.holderName 名義人
 * @param {string} args.token トークン
 * @returns {Promise<ISaveCardResult>} カード登録・更新out
 */
function saveCard(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/SaveCard.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId,
                SeqMode: args.seqMode,
                CardSeq: args.cardSeq,
                DefaultFlag: args.defaultFlag,
                CardName: args.cardName,
                CardNo: args.cardNo,
                CardPass: args.cardPass,
                Expire: args.expire,
                HolderName: args.holderName,
                Token: args.token
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            throw new badRequest_1.BadRequestError(body);
        }
        return {
            cardSeq: result.CardSeq,
            cardNo: result.CardNo,
            forward: result.Forward
            // brand: result.Brand,
            // domesticFlag: result.DomesticFlag,
            // issuerCode: result.IssuerCode,
            // debitPrepaidFlag: result.DebitPrepaidFlag,
            // debitPrepaidIssuerName: result.DebitPrepaidIssuerName,
            // forwardFinal: result.ForwardFinal
        };
    });
}
exports.saveCard = saveCard;
/**
 * カード削除
 * @memberof services/card
 * @function deleteCard
 * @param {IDeleteCardArgs} args カード削除in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @param {util.SeqMode} args.seqMode カード登録連番モード(0:論理モード(デフォルト)1:物理モード)
 * @param {string} args.cardSeq カード登録連番
 * @returns {Promise<IDeleteCardResult>} カード削除out
 */
function deleteCard(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/DeleteCard.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId,
                SeqMode: args.seqMode,
                CardSeq: args.cardSeq
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            throw new badRequest_1.BadRequestError(body);
        }
        return {
            cardSeq: result.CardSeq
        };
    });
}
exports.deleteCard = deleteCard;
/**
 * カード参照
 * @memberof services/card
 * @function searchCard
 * @param {ISearchCardArgs} args カード参照in
 * @param {string} args.siteId サイトID
 * @param {string} args.sitePass サイトパスワード
 * @param {string} args.memberId 会員ID
 * @param {util.SeqMode} args.seqMode カード登録連番モード(0:論理モード1:物理モード)
 * @param {string} args.cardSeq カード登録連番
 * @returns {Promise<ISearchCardResult[]>} カード参照out
 */
function searchCard(args) {
    return __awaiter(this, void 0, void 0, function* () {
        debug('requesting...', args);
        const body = yield request.post({
            url: `${process.env.GMO_ENDPOINT}/payment/SearchCard.idPass`,
            form: {
                SiteID: args.siteId,
                SitePass: args.sitePass,
                MemberID: args.memberId,
                SeqMode: args.seqMode,
                CardSeq: args.cardSeq
            }
        }).promise();
        debug('request processed.', body);
        const result = querystring.parse(body);
        if (result.ErrCode !== undefined) {
            const error = new badRequest_1.BadRequestError(body);
            // 会員は存在してカードが存在しない場合、空配列を返すように、特別扱い
            if (error.errors.length === 1 && error.errors[0].info === 'E01240002') {
                return [];
            }
            throw error;
        }
        const cardSeqArry = result.CardSeq.split('|');
        const defaultFlagArry = result.DefaultFlag.split('|');
        const cardNameArry = result.CardName.split('|');
        const cardNoArry = result.CardNo.split('|');
        const expireArry = result.Expire.split('|');
        const holderNameArry = result.HolderName.split('|');
        const deleteFlagArry = result.DeleteFlag.split('|');
        return cardSeqArry.map((cardSeq, index) => {
            return {
                cardSeq: cardSeq,
                defaultFlag: defaultFlagArry[index],
                cardName: cardNameArry[index],
                cardNo: cardNoArry[index],
                expire: expireArry[index],
                holderName: holderNameArry[index],
                deleteFlag: deleteFlagArry[index]
            };
        });
    });
}
exports.searchCard = searchCard;