@chevre/domain
Version:
Chevre Domain Library for Node.js
239 lines (238 loc) • 11.1 kB
JavaScript
"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.PaymentServiceProviderRepo = void 0;
const mongoose_1 = require("mongoose");
const paymentService_1 = require("./mongoose/schemas/paymentService");
const factory = require("../factory");
const settings_1 = require("../settings");
/**
* 決済サービスプロバイダーリポジトリ
*/
class PaymentServiceProviderRepo {
constructor(connection) {
this.paymentServiceModel = connection.model(paymentService_1.modelName, (0, paymentService_1.createSchema)());
}
/**
* 決済サービスプロバイダー検索
*/
search(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d, _e;
const matchStages = [];
const projectIdEq = (_b = (_a = params.project) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.$eq;
if (typeof projectIdEq === 'string') {
matchStages.push({ $match: { 'project.id': { $eq: projectIdEq } } });
}
const idEq = (_c = params.id) === null || _c === void 0 ? void 0 : _c.$eq;
if (typeof idEq === 'string') {
matchStages.push({ $match: { _id: { $eq: new mongoose_1.Types.ObjectId(idEq) } } });
}
const providerIdEq = (_e = (_d = params.provider) === null || _d === void 0 ? void 0 : _d.id) === null || _e === void 0 ? void 0 : _e.$eq;
if (typeof providerIdEq === 'string') {
matchStages.push({ $match: { 'provider.id': { $exists: true, $eq: providerIdEq } } });
}
const aggregate = this.paymentServiceModel.aggregate([
{ $sort: { productID: factory.sortType.Ascending } },
{
$unwind: {
path: '$provider'
}
},
...matchStages,
{
$project: {
_id: 0,
provider: {
id: '$provider.id',
// name廃止(2023-12-21~)
// name: '$provider.name',
credentials: '$provider.credentials'
},
id: { $toString: '$_id' },
name: '$name',
typeOf: '$typeOf'
}
}
]);
if (typeof params.limit === 'number' && params.limit > 0) {
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
aggregate.limit(params.limit * page)
.skip(params.limit * (page - 1));
}
return aggregate.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
.exec();
});
}
/**
* 販売者の提供決済サービス(公開情報のみ)検索
*/
searchPublicPaymentServicesByProvider(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f;
const matchStages = [];
const projectIdEq = (_b = (_a = params.project) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.$eq;
if (typeof projectIdEq === 'string') {
matchStages.push({ $match: { 'project.id': { $eq: projectIdEq } } });
}
const typeOfEq = (_c = params.typeOf) === null || _c === void 0 ? void 0 : _c.$eq;
if (typeof typeOfEq === 'string') {
matchStages.push({ $match: { typeOf: { $eq: typeOfEq } } });
}
const providerIdEq = (_e = (_d = params.provider) === null || _d === void 0 ? void 0 : _d.id) === null || _e === void 0 ? void 0 : _e.$eq;
if (typeof providerIdEq === 'string') {
matchStages.push({ $match: { 'provider.id': { $exists: true, $eq: providerIdEq } } });
}
const aggregate = this.paymentServiceModel.aggregate([
...(typeof ((_f = params.sort) === null || _f === void 0 ? void 0 : _f.productID) === 'number')
? [{ $sort: { productID: params.sort.productID } }]
: [],
{
$unwind: {
path: '$provider'
}
},
...matchStages,
{
$project: {
_id: 0,
typeOf: '$typeOf',
productID: '$productID',
description: '$description',
name: '$name',
additionalProperty: '$additionalProperty',
serviceOutput: '$serviceOutput',
serviceType: '$serviceType',
id: { $toString: '$_id' },
// ↓セキュアな情報を隠蔽するように
provider: {
credentials: {
shopId: '$provider.credentials.shopId',
tokenizationCode: '$provider.credentials.tokenizationCode',
paymentUrl: {
expiresInSeconds: '$provider.credentials.paymentUrl.expiresInSeconds',
useCallback: '$provider.credentials.paymentUrl.useCallback',
useWebhook: '$provider.credentials.paymentUrl.useWebhook',
use3DS: '$provider.credentials.paymentUrl.use3DS'
}
}
}
}
}
]);
if (typeof params.limit === 'number' && params.limit > 0) {
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
aggregate.limit(params.limit * page)
.skip(params.limit * (page - 1));
}
return aggregate.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
.exec();
});
}
create(params) {
return __awaiter(this, void 0, void 0, function* () {
// 決済サービス存在確認
let doc = yield this.paymentServiceModel.findOne({
typeOf: { $eq: params.providesPaymentService.typeOf },
'project.id': { $eq: params.project.id },
_id: { $eq: params.providesPaymentService.id }
}, { _id: 1, typeOf: 1 })
.exec();
if (doc === null) {
throw new factory.errors.NotFound(params.providesPaymentService.typeOf);
}
const creatingProvider = {
credentials: params.credentials,
id: params.id,
// name廃止(2023-12-21~)
// name: params.name,
typeOf: params.typeOf
};
doc = yield this.paymentServiceModel.findOneAndUpdate({
typeOf: { $eq: params.providesPaymentService.typeOf },
'project.id': { $eq: params.project.id },
_id: { $eq: params.providesPaymentService.id },
'provider.id': { $ne: params.id }
}, {
$push: { provider: creatingProvider }
}, {
new: true,
projection: { _id: 1 }
})
.exec();
// 存在しなければプロバイダーID重複
if (doc === null) {
throw new factory.errors.AlreadyInUse('provider', ['id']);
}
return doc.toObject();
});
}
update(params) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.paymentServiceModel.findOneAndUpdate({
typeOf: { $eq: params.providesPaymentService.typeOf },
'project.id': { $eq: params.project.id },
_id: { $eq: params.providesPaymentService.id },
'provider.id': { $eq: params.id }
}, Object.assign({ 'provider.$[seller].id': params.id }, (params.credentials !== undefined && params.credentials !== null)
? { 'provider.$[seller].credentials': params.credentials }
: undefined), {
new: true,
arrayFilters: [
{ 'seller.id': { $eq: params.id } }
],
projection: { _id: 1 }
})
.exec();
if (doc === null) {
throw new factory.errors.NotFound(params.providesPaymentService.typeOf);
}
return doc.toObject();
});
}
deleteOne(params) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.paymentServiceModel.findOneAndUpdate({
typeOf: { $eq: params.providesPaymentService.typeOf },
'project.id': { $eq: params.project.id },
_id: { $eq: params.providesPaymentService.id },
'provider.id': { $eq: params.id }
}, {
$pull: { provider: { id: params.id } }
}, {
projection: { _id: 1 }
})
.exec();
if (doc === null) {
throw new factory.errors.NotFound(params.providesPaymentService.typeOf);
}
return doc.toObject();
});
}
deleteManyByProviderId(params) {
return __awaiter(this, void 0, void 0, function* () {
return this.paymentServiceModel.updateMany({
'project.id': { $eq: params.project.id },
'provider.id': { $eq: params.id }
}, {
$pull: { provider: { id: params.id } }
})
.exec();
});
}
unsetUnnecessaryFields(params) {
return __awaiter(this, void 0, void 0, function* () {
return this.paymentServiceModel.updateMany(params.filter, { $unset: params.$unset }, { timestamps: false })
.exec();
});
}
}
exports.PaymentServiceProviderRepo = PaymentServiceProviderRepo;