@chevre/domain
Version:
Chevre Domain Library for Node.js
375 lines (374 loc) • 18.3 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.MemberRepo = void 0;
const factory = require("../factory");
const settings_1 = require("../settings");
const member_1 = require("./mongoose/schemas/member");
const AVAILABLE_PROJECT_FIELDS = [
'project',
'typeOf',
'member'
];
/**
* IAMメンバーリポジトリ
*/
class MemberRepo {
constructor(connection) {
this.memberModel = connection.model(member_1.modelName, (0, member_1.createSchema)());
}
// tslint:disable-next-line:cyclomatic-complexity max-func-body-length
static CREATE_MONGO_CONDITIONS(params) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
const andConditions = [];
const idEq = (_a = params.id) === null || _a === void 0 ? void 0 : _a.$eq;
if (typeof idEq === 'string') {
andConditions.push({ _id: { $eq: idEq } });
}
const projectIdEq = (_c = (_b = params.project) === null || _b === void 0 ? void 0 : _b.id) === null || _c === void 0 ? void 0 : _c.$eq;
if (typeof projectIdEq === 'string') {
andConditions.push({ 'project.id': { $eq: projectIdEq } });
}
const projectIdIn = (_e = (_d = params.project) === null || _d === void 0 ? void 0 : _d.id) === null || _e === void 0 ? void 0 : _e.$in;
if (Array.isArray(projectIdIn)) {
andConditions.push({ 'project.id': { $in: projectIdIn } });
}
const memberMemberOfTypeOfEq = (_h = (_g = (_f = params.member) === null || _f === void 0 ? void 0 : _f.memberOf) === null || _g === void 0 ? void 0 : _g.typeOf) === null || _h === void 0 ? void 0 : _h.$eq;
if (typeof memberMemberOfTypeOfEq === 'string') {
andConditions.push({ 'member.memberOf.typeOf': { $eq: memberMemberOfTypeOfEq } });
}
const memberMemberOfIdEq = (_l = (_k = (_j = params.member) === null || _j === void 0 ? void 0 : _j.memberOf) === null || _k === void 0 ? void 0 : _k.id) === null || _l === void 0 ? void 0 : _l.$eq;
if (typeof memberMemberOfIdEq === 'string') {
andConditions.push({ 'member.memberOf.id': { $eq: memberMemberOfIdEq } });
}
const memberTypeOfEq = (_o = (_m = params.member) === null || _m === void 0 ? void 0 : _m.typeOf) === null || _o === void 0 ? void 0 : _o.$eq;
if (typeof memberTypeOfEq === 'string') {
andConditions.push({ 'member.typeOf': { $exists: true, $eq: memberTypeOfEq } });
}
const memberIdEq = (_q = (_p = params.member) === null || _p === void 0 ? void 0 : _p.id) === null || _q === void 0 ? void 0 : _q.$eq;
if (typeof memberIdEq === 'string') {
andConditions.push({ 'member.id': { $eq: memberIdEq } });
}
const memberIdIn = (_s = (_r = params.member) === null || _r === void 0 ? void 0 : _r.id) === null || _s === void 0 ? void 0 : _s.$in;
if (Array.isArray(memberIdIn)) {
andConditions.push({ 'member.id': { $in: memberIdIn } });
}
const memberNameRegex = (_u = (_t = params.member) === null || _t === void 0 ? void 0 : _t.name) === null || _u === void 0 ? void 0 : _u.$regex;
if (typeof memberNameRegex === 'string' && memberNameRegex.length > 0) {
andConditions.push({
'member.name': {
$exists: true,
$regex: new RegExp(memberNameRegex)
}
});
}
const memberHasRoleRoleNameEq = (_x = (_w = (_v = params.member) === null || _v === void 0 ? void 0 : _v.hasRole) === null || _w === void 0 ? void 0 : _w.roleName) === null || _x === void 0 ? void 0 : _x.$eq;
if (typeof memberHasRoleRoleNameEq === 'string') {
andConditions.push({
'member.hasRole.roleName': {
$exists: true,
$eq: memberHasRoleRoleNameEq
}
});
}
const memberHasRoleRoleNameIn = (_0 = (_z = (_y = params.member) === null || _y === void 0 ? void 0 : _y.hasRole) === null || _z === void 0 ? void 0 : _z.roleName) === null || _0 === void 0 ? void 0 : _0.$in;
if (Array.isArray(memberHasRoleRoleNameIn)) {
andConditions.push({
'member.hasRole.roleName': {
$exists: true,
$in: memberHasRoleRoleNameIn
}
});
}
return andConditions;
}
/**
* プロジェクト指定で検索する
*/
projectFieldsByProjectId(project, conditions, inclusion) {
return __awaiter(this, void 0, void 0, function* () {
if (typeof project.id !== 'string' || project.id === '') {
throw new factory.errors.ArgumentNull('project.id');
}
return this.projectFields(Object.assign(Object.assign({}, conditions), { project: { id: { $eq: project.id } } }), inclusion);
});
}
/**
* 注文取引クライアントメンバーを検索する
* 全プロジェクトで利用可能なクライアントも考慮される
*/
searchCustomerMembers(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f, _g;
if (typeof params.project.id !== 'string' || params.project.id === '') {
throw new factory.errors.ArgumentNull('project.id');
}
const filterQueries = MemberRepo.CREATE_MONGO_CONDITIONS({
project: { id: { $in: [params.project.id, '*'] } }, // 全プロジェクトで利用可能なクライアントを考慮(2025-01-11~)
member: {
typeOf: { $eq: factory.creativeWorkType.WebApplication },
memberOf: { typeOf: { $eq: factory.organizationType.Project } }, // プロジェクトメンバーのはず
hasRole: {
roleName: {
$in: [
factory.role.organizationRole.RoleName.Customer,
factory.role.organizationRole.RoleName.POS
]
}
},
id: Object.assign(Object.assign({}, (typeof ((_b = (_a = params.member) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.$eq) === 'string') ? { $eq: params.member.id.$eq } : undefined), (Array.isArray((_d = (_c = params.member) === null || _c === void 0 ? void 0 : _c.id) === null || _d === void 0 ? void 0 : _d.$in)) ? { $in: params.member.id.$in } : undefined),
name: Object.assign({}, (typeof ((_f = (_e = params.member) === null || _e === void 0 ? void 0 : _e.name) === null || _f === void 0 ? void 0 : _f.$regex) === 'string') ? { $regex: params.member.name.$regex } : undefined)
}
});
const projection = {
_id: 0,
// id: { $toString: '$_id' },
member: {
// typeOf: 'WebApplication',
hasRole: '$member.hasRole',
id: '$member.id',
member: '$member.member',
memberOf: '$member.memberOf',
name: '$member.name'
}
};
const matchStages = [{ $match: { $and: filterQueries } }];
const aggregate = this.memberModel.aggregate([
...matchStages,
{
$group: {
_id: '$member.id',
member: { $first: '$member' }
}
},
{ $project: projection }
]);
if (typeof ((_g = params.sort) === null || _g === void 0 ? void 0 : _g['member.id']) === 'number') {
aggregate.sort(params.sort);
}
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
.exec();
});
}
aggregateRoleNames(params) {
return __awaiter(this, void 0, void 0, function* () {
const matchStages = [
{ $match: { 'project.id': { $eq: params.project.id.$eq } } },
{ $match: { 'member.id': { $eq: params.member.id.$eq } } },
{ $match: { 'member.memberOf.id': { $eq: params.member.memberOf.id.$eq } } },
{ $match: { 'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf.$eq } } }
];
const aggregate = this.memberModel.aggregate([
// ...(typeof params.sort?.productID === 'number')
// ? [{ $sort: { productID: params.sort.productID } }]
// : [],
...matchStages,
{
$unwind: {
path: '$member.hasRole'
}
},
{
$project: {
_id: 0,
roleName: '$member.hasRole.roleName'
}
}
]);
return aggregate.option({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
.exec();
});
}
deleteByProject(params) {
return __awaiter(this, void 0, void 0, function* () {
yield this.memberModel.deleteMany({
'project.id': { $eq: params.project.id }
})
.exec();
});
}
/**
* メンバー作成
*/
create(params) {
return __awaiter(this, void 0, void 0, function* () {
// let members: factory.iam.IMember[] = [];
if (params.length > 0) {
// const docs = await this.memberModel.insertMany(params.map((p) => {
yield this.memberModel.insertMany(params.map((p) => {
return {
project: p.project,
typeOf: p.typeOf,
member: p.member
};
}));
}
else {
// no op
}
// return members;
});
}
/**
* メンバー更新
*/
updateByMemberId(params) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.memberModel.findOneAndUpdate({
'project.id': { $eq: params.project.id },
'member.id': { $eq: params.member.id },
'member.memberOf.id': { $eq: params.member.memberOf.id },
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf }
}, {
$set: Object.assign(Object.assign(Object.assign({}, (Array.isArray(params.member.hasRole)) ? { 'member.hasRole': params.member.hasRole } : undefined), (typeof params.member.image === 'string') ? { 'member.image': params.member.image } : undefined), (typeof params.member.name === 'string') ? { 'member.name': params.member.name } : undefined
// discontinue(2025-01-14~)
// ...(Array.isArray(params.member.member)) ? { 'member.member': params.member.member } : undefined
),
$unset: {
'member.member': 1 // 廃止につき常にunset(2025-01-14~)
}
// ...(params.$unset['member.member'] === 1)
// ? {
// $unset: {
// 'member.member': 1
// }
// }
// : undefined
})
.exec();
if (doc === null) {
throw new factory.errors.NotFound(this.memberModel.modelName);
}
});
}
/**
* メンバー削除
*/
deleteByMemberId(params) {
return __awaiter(this, void 0, void 0, function* () {
const doc = yield this.memberModel.findOneAndDelete({
'project.id': { $eq: params.project.id },
'member.id': { $eq: params.member.id },
'member.memberOf.id': { $eq: params.member.memberOf.id.$eq },
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf.$eq }
})
.exec();
if (doc === null) {
throw new factory.errors.NotFound(this.memberModel.modelName);
}
});
}
deleteManyByMemberOfId(params) {
return __awaiter(this, void 0, void 0, function* () {
return this.memberModel.deleteMany({
'project.id': { $eq: params.project.id },
'member.memberOf.id': { $eq: params.member.memberOf.id.$eq },
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf.$eq }
})
.exec();
});
}
/**
* メンバーの権限を持つプロジェクト検索
*/
searchProjectIdsByMemberId(params) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
if (typeof params.limit !== 'number') {
throw new factory.errors.ArgumentNull('limit');
}
if (typeof params.page !== 'number') {
throw new factory.errors.ArgumentNull('page');
}
const matchStages = [{ $match: { 'member.id': { $eq: params.member.id } } }];
if (typeof ((_b = (_a = params.project) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.$eq) === 'string') {
matchStages.push({ $match: { 'project.id': { $eq: params.project.id.$eq } } });
}
if (typeof ((_d = (_c = params.project) === null || _c === void 0 ? void 0 : _c.id) === null || _d === void 0 ? void 0 : _d.$regex) === 'string' && params.project.id.$regex.length > 0) {
matchStages.push({ $match: { 'project.id': { $regex: new RegExp(params.project.id.$regex) } } });
}
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
const aggregate = this.memberModel.aggregate([
...matchStages,
{
$group: {
_id: '$project.id'
}
},
{ $sort: { _id: factory.sortType.Ascending } }
])
.limit(params.limit * page)
.skip(params.limit * (page - 1));
return aggregate
.exec()
.then((docs) => docs.map((doc) => doc._id));
});
}
/**
* member.memberOf.typeOfからmember.memberOf.idのリストを検索する
* 権限を持つ販売者IDの検索など
*/
searchMemberOfIdsByMemberId(params) {
return __awaiter(this, void 0, void 0, function* () {
const query = this.memberModel.distinct('member.memberOf.id', {
'project.id': { $eq: params.project.id },
'member.id': { $eq: params.member.id },
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf }
});
return query.setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
.exec();
});
}
getCursor(conditions, projection) {
return this.memberModel.find(conditions, projection)
.sort({ 'member.id': factory.sortType.Ascending })
.cursor();
}
unsetUnnecessaryFields(params) {
return __awaiter(this, void 0, void 0, function* () {
return this.memberModel.updateMany(params.filter, { $unset: params.$unset }, { timestamps: false })
.exec();
});
}
projectFields(params, inclusion) {
return __awaiter(this, void 0, void 0, function* () {
const conditions = MemberRepo.CREATE_MONGO_CONDITIONS(params);
let positiveProjectionFields = AVAILABLE_PROJECT_FIELDS;
if (Array.isArray(inclusion) && inclusion.length > 0) {
positiveProjectionFields = inclusion.filter((key) => AVAILABLE_PROJECT_FIELDS.includes(key));
}
else {
// no op
}
const projection = Object.assign({ _id: 0, id: { $toString: '$_id' } }, Object.fromEntries(positiveProjectionFields.map((key) => ([key, 1]))));
const query = this.memberModel.find((conditions.length > 0) ? { $and: conditions } : {}, projection);
if (typeof params.limit === 'number' && params.limit > 0) {
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
query.limit(params.limit)
.skip(params.limit * (page - 1));
}
if (params.sort !== undefined) {
query.sort(params.sort);
}
// const explainResult = await (<any>query).explain();
// console.log(explainResult[0].executionStats.allPlansExecution.map((e: any) => e.executionStages.inputStage));
return query.setOptions({ maxTimeMS: settings_1.MONGO_MAX_TIME_MS })
.lean()
.exec();
});
}
}
exports.MemberRepo = MemberRepo;