UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

375 lines (374 loc) 18.3 kB
"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;