@chevre/domain 21.4.0-alpha.24 → 21.4.0-alpha.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/example/src/chevre/migrateIAMMemberMemberOf.ts +59 -0
- package/example/src/chevre/migrateReservationProvider.ts +5 -3
- package/example/src/chevre/searchPermissions.ts +7 -15
- package/example/src/chevre/searchProjectIdsByMemberId.ts +32 -0
- package/lib/chevre/repo/member.d.ts +61 -1
- package/lib/chevre/repo/member.js +66 -20
- package/lib/chevre/repo/mongoose/schemas/member.d.ts +7 -7
- package/lib/chevre/repo/mongoose/schemas/member.js +12 -6
- package/lib/chevre/service/iam.d.ts +5 -0
- package/lib/chevre/service/iam.js +7 -19
- package/package.json +3 -3
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// tslint:disable:no-console
|
|
2
|
+
// import * as moment from 'moment';
|
|
3
|
+
import * as mongoose from 'mongoose';
|
|
4
|
+
|
|
5
|
+
import { chevre } from '../../../lib/index';
|
|
6
|
+
|
|
7
|
+
// const project = { id: String(process.env.PROJECT_ID) };
|
|
8
|
+
// const EXCLUDED_PROJECT_ID = process.env.EXCLUDED_PROJECT_ID;
|
|
9
|
+
|
|
10
|
+
// tslint:disable-next-line:max-func-body-length
|
|
11
|
+
async function main() {
|
|
12
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: true });
|
|
13
|
+
|
|
14
|
+
const memberRepo = new chevre.repository.Member(mongoose.connection);
|
|
15
|
+
|
|
16
|
+
const cursor = memberRepo.getCursor(
|
|
17
|
+
{},
|
|
18
|
+
{
|
|
19
|
+
// _id: 1,
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
console.log('members found');
|
|
23
|
+
|
|
24
|
+
let i = 0;
|
|
25
|
+
let updateCount = 0;
|
|
26
|
+
await cursor.eachAsync(async (doc) => {
|
|
27
|
+
i += 1;
|
|
28
|
+
const iamMember: chevre.factory.iam.IMember = doc.toObject();
|
|
29
|
+
|
|
30
|
+
const memberOfId = iamMember.member.memberOf?.id;
|
|
31
|
+
const alreadyMigrated = typeof memberOfId === 'string';
|
|
32
|
+
|
|
33
|
+
if (alreadyMigrated) {
|
|
34
|
+
console.log('already exist...', iamMember.project.id, iamMember.member.id, iamMember.member.typeOf, memberOfId, i);
|
|
35
|
+
} else {
|
|
36
|
+
console.log(
|
|
37
|
+
'updating reservation...', iamMember.project.id, iamMember.member.id, iamMember.member.typeOf, memberOfId, i);
|
|
38
|
+
await memberRepo.updateByMemberMemberOf({
|
|
39
|
+
project: { id: iamMember.project.id },
|
|
40
|
+
member: {
|
|
41
|
+
id: iamMember.member.id,
|
|
42
|
+
memberOf: {
|
|
43
|
+
id: iamMember.project.id,
|
|
44
|
+
typeOf: chevre.factory.organizationType.Project
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
updateCount += 1;
|
|
49
|
+
console.log('updated.', iamMember.project.id, iamMember.member.id, iamMember.member.typeOf, memberOfId, i);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
console.log(i, 'members checked');
|
|
54
|
+
console.log(updateCount, 'members updated');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
main()
|
|
58
|
+
.then()
|
|
59
|
+
.catch(console.error);
|
|
@@ -9,7 +9,7 @@ import { chevre } from '../../../lib/index';
|
|
|
9
9
|
|
|
10
10
|
// tslint:disable-next-line:max-func-body-length
|
|
11
11
|
async function main() {
|
|
12
|
-
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex:
|
|
12
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI, { autoIndex: false });
|
|
13
13
|
|
|
14
14
|
const reservationRepo = new chevre.repository.Reservation(mongoose.connection);
|
|
15
15
|
const placeRepo = new chevre.repository.Place(mongoose.connection);
|
|
@@ -22,9 +22,11 @@ async function main() {
|
|
|
22
22
|
]
|
|
23
23
|
},
|
|
24
24
|
// bookingTime: {
|
|
25
|
-
// $gte: moment('
|
|
25
|
+
// $gte: moment('2022-07-01T00:00:00Z')
|
|
26
|
+
// .toDate(),
|
|
27
|
+
// $lte: moment('2022-03-01T00:00:00Z')
|
|
26
28
|
// .toDate()
|
|
27
|
-
// }
|
|
29
|
+
// },
|
|
28
30
|
'provider.id': { $exists: false }
|
|
29
31
|
},
|
|
30
32
|
{
|
|
@@ -15,24 +15,16 @@ async function main() {
|
|
|
15
15
|
|
|
16
16
|
let now: Date;
|
|
17
17
|
|
|
18
|
-
// let now = new Date();
|
|
19
|
-
// const aggregateRoleNamesResult = await memberRepo.aggregateRoleNames({
|
|
20
|
-
// project: { id: { $eq: PROJECT_ID } },
|
|
21
|
-
// member: { id: { $eq: memberId } }
|
|
22
|
-
// });
|
|
23
|
-
|
|
24
|
-
// const aggregatePermissionsResult = await roleRepo.aggregatePermissions({
|
|
25
|
-
// roleName: {
|
|
26
|
-
// $in: aggregateRoleNamesResult.map((r) => r.roleName)
|
|
27
|
-
// }
|
|
28
|
-
// });
|
|
29
|
-
// console.log('time cost:', moment()
|
|
30
|
-
// .diff(now));
|
|
31
|
-
|
|
32
18
|
now = new Date();
|
|
33
19
|
const searchPermissionsResult = await chevre.service.iam.searchPermissions({
|
|
34
20
|
project: { id: PROJECT_ID },
|
|
35
|
-
member: {
|
|
21
|
+
member: {
|
|
22
|
+
id: memberId,
|
|
23
|
+
memberOf: {
|
|
24
|
+
id: PROJECT_ID,
|
|
25
|
+
typeOf: chevre.factory.organizationType.Project
|
|
26
|
+
}
|
|
27
|
+
}
|
|
36
28
|
})({
|
|
37
29
|
member: memberRepo,
|
|
38
30
|
role: roleRepo
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// tslint:disable:no-console
|
|
2
|
+
import * as mongoose from 'mongoose';
|
|
3
|
+
|
|
4
|
+
import { chevre } from '../../../lib/index';
|
|
5
|
+
|
|
6
|
+
// const PROJECT_ID = String(process.env.PROJECT_ID);
|
|
7
|
+
const memberId = 'xxx';
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
await mongoose.connect(<string>process.env.MONGOLAB_URI);
|
|
11
|
+
|
|
12
|
+
const memberRepo = new chevre.repository.Member(mongoose.connection);
|
|
13
|
+
|
|
14
|
+
const ids = await memberRepo.searchProjectIdsByMemberId({
|
|
15
|
+
member: {
|
|
16
|
+
id: memberId
|
|
17
|
+
},
|
|
18
|
+
project: {
|
|
19
|
+
id: {
|
|
20
|
+
// $regex: 'c'
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
limit: 3,
|
|
24
|
+
page: 1
|
|
25
|
+
|
|
26
|
+
});
|
|
27
|
+
console.log(ids);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
main()
|
|
31
|
+
.then(console.log)
|
|
32
|
+
.catch(console.error);
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
2
|
+
/// <reference types="mongoose/types/callback" />
|
|
3
|
+
/// <reference types="mongoose/types/collection" />
|
|
4
|
+
/// <reference types="mongoose/types/connection" />
|
|
5
|
+
/// <reference types="mongoose/types/cursor" />
|
|
6
|
+
/// <reference types="mongoose/types/document" />
|
|
7
|
+
/// <reference types="mongoose/types/error" />
|
|
8
|
+
/// <reference types="mongoose/types/expressions" />
|
|
9
|
+
/// <reference types="mongoose/types/helpers" />
|
|
10
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
11
|
+
/// <reference types="mongoose/types/indexes" />
|
|
12
|
+
/// <reference types="mongoose/types/models" />
|
|
13
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
14
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
15
|
+
/// <reference types="mongoose/types/populate" />
|
|
16
|
+
/// <reference types="mongoose/types/query" />
|
|
17
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
18
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
19
|
+
/// <reference types="mongoose/types/session" />
|
|
20
|
+
/// <reference types="mongoose/types/types" />
|
|
21
|
+
/// <reference types="mongoose/types/utility" />
|
|
22
|
+
/// <reference types="mongoose/types/validation" />
|
|
23
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
24
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
1
25
|
import { Connection } from 'mongoose';
|
|
2
26
|
import * as factory from '../factory';
|
|
3
27
|
/**
|
|
@@ -19,6 +43,14 @@ export declare class MongoRepository {
|
|
|
19
43
|
id: {
|
|
20
44
|
$eq: string;
|
|
21
45
|
};
|
|
46
|
+
memberOf: {
|
|
47
|
+
id: {
|
|
48
|
+
$eq: string;
|
|
49
|
+
};
|
|
50
|
+
typeOf: {
|
|
51
|
+
$eq: factory.organizationType.Project;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
22
54
|
};
|
|
23
55
|
}): Promise<{
|
|
24
56
|
roleName: string;
|
|
@@ -43,12 +75,31 @@ export declare class MongoRepository {
|
|
|
43
75
|
id: string;
|
|
44
76
|
};
|
|
45
77
|
member: {
|
|
46
|
-
hasRole?: factory.iam.IMemberHasRole;
|
|
47
78
|
id: string;
|
|
79
|
+
memberOf: {
|
|
80
|
+
id: string;
|
|
81
|
+
typeOf: factory.organizationType.Project;
|
|
82
|
+
};
|
|
83
|
+
hasRole?: factory.iam.IMemberHasRole;
|
|
48
84
|
image?: string;
|
|
49
85
|
name?: string;
|
|
50
86
|
};
|
|
51
87
|
}): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* 互換性維持プログラム専用
|
|
90
|
+
*/
|
|
91
|
+
updateByMemberMemberOf(params: {
|
|
92
|
+
project: {
|
|
93
|
+
id: string;
|
|
94
|
+
};
|
|
95
|
+
member: {
|
|
96
|
+
id: string;
|
|
97
|
+
memberOf: {
|
|
98
|
+
id: string;
|
|
99
|
+
typeOf: factory.organizationType.Project;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
}): Promise<void>;
|
|
52
103
|
/**
|
|
53
104
|
* メンバー削除
|
|
54
105
|
*/
|
|
@@ -58,6 +109,14 @@ export declare class MongoRepository {
|
|
|
58
109
|
};
|
|
59
110
|
member: {
|
|
60
111
|
id: string;
|
|
112
|
+
memberOf: {
|
|
113
|
+
id: {
|
|
114
|
+
$eq: string;
|
|
115
|
+
};
|
|
116
|
+
typeOf: {
|
|
117
|
+
$eq: factory.organizationType.Project;
|
|
118
|
+
};
|
|
119
|
+
};
|
|
61
120
|
};
|
|
62
121
|
}): Promise<void>;
|
|
63
122
|
/**
|
|
@@ -75,4 +134,5 @@ export declare class MongoRepository {
|
|
|
75
134
|
limit: number;
|
|
76
135
|
page: number;
|
|
77
136
|
}): Promise<string[]>;
|
|
137
|
+
getCursor(conditions: any, projection: any): import("mongoose").Cursor<any, import("mongoose").QueryOptions<any>>;
|
|
78
138
|
}
|
|
@@ -22,7 +22,7 @@ class MongoRepository {
|
|
|
22
22
|
}
|
|
23
23
|
// tslint:disable-next-line:cyclomatic-complexity max-func-body-length
|
|
24
24
|
static CREATE_MONGO_CONDITIONS(params) {
|
|
25
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
25
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
26
26
|
const andConditions = [];
|
|
27
27
|
// tslint:disable-next-line:no-single-line-block-comment
|
|
28
28
|
/* istanbul ignore else */
|
|
@@ -48,6 +48,14 @@ class MongoRepository {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
const memberMemberOfTypeOfEq = (_c = (_b = (_a = params.member) === null || _a === void 0 ? void 0 : _a.memberOf) === null || _b === void 0 ? void 0 : _b.typeOf) === null || _c === void 0 ? void 0 : _c.$eq;
|
|
52
|
+
if (typeof memberMemberOfTypeOfEq === 'string') {
|
|
53
|
+
andConditions.push({ 'member.memberOf.typeOf': { $eq: memberMemberOfTypeOfEq } });
|
|
54
|
+
}
|
|
55
|
+
const memberMemberOfIdEq = (_f = (_e = (_d = params.member) === null || _d === void 0 ? void 0 : _d.memberOf) === null || _e === void 0 ? void 0 : _e.id) === null || _f === void 0 ? void 0 : _f.$eq;
|
|
56
|
+
if (typeof memberMemberOfIdEq === 'string') {
|
|
57
|
+
andConditions.push({ 'member.memberOf.id': { $eq: memberMemberOfIdEq } });
|
|
58
|
+
}
|
|
51
59
|
// tslint:disable-next-line:no-single-line-block-comment
|
|
52
60
|
/* istanbul ignore else */
|
|
53
61
|
if (params.member !== undefined && params.member !== null) {
|
|
@@ -71,7 +79,7 @@ class MongoRepository {
|
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
|
-
const memberIdIn = (
|
|
82
|
+
const memberIdIn = (_h = (_g = params.member) === null || _g === void 0 ? void 0 : _g.id) === null || _h === void 0 ? void 0 : _h.$in;
|
|
75
83
|
if (Array.isArray(memberIdIn)) {
|
|
76
84
|
andConditions.push({
|
|
77
85
|
'member.id': {
|
|
@@ -79,7 +87,7 @@ class MongoRepository {
|
|
|
79
87
|
}
|
|
80
88
|
});
|
|
81
89
|
}
|
|
82
|
-
const memberNameRegex = (
|
|
90
|
+
const memberNameRegex = (_k = (_j = params.member) === null || _j === void 0 ? void 0 : _j.name) === null || _k === void 0 ? void 0 : _k.$regex;
|
|
83
91
|
if (typeof memberNameRegex === 'string' && memberNameRegex.length > 0) {
|
|
84
92
|
andConditions.push({
|
|
85
93
|
'member.name': {
|
|
@@ -88,7 +96,7 @@ class MongoRepository {
|
|
|
88
96
|
}
|
|
89
97
|
});
|
|
90
98
|
}
|
|
91
|
-
const memberHasRoleRoleNameEq = (
|
|
99
|
+
const memberHasRoleRoleNameEq = (_o = (_m = (_l = params.member) === null || _l === void 0 ? void 0 : _l.hasRole) === null || _m === void 0 ? void 0 : _m.roleName) === null || _o === void 0 ? void 0 : _o.$eq;
|
|
92
100
|
if (typeof memberHasRoleRoleNameEq === 'string') {
|
|
93
101
|
andConditions.push({
|
|
94
102
|
'member.hasRole.roleName': {
|
|
@@ -136,7 +144,9 @@ class MongoRepository {
|
|
|
136
144
|
return __awaiter(this, void 0, void 0, function* () {
|
|
137
145
|
const matchStages = [
|
|
138
146
|
{ $match: { 'project.id': { $eq: params.project.id.$eq } } },
|
|
139
|
-
{ $match: { 'member.id': { $eq: params.member.id.$eq } } }
|
|
147
|
+
{ $match: { 'member.id': { $eq: params.member.id.$eq } } },
|
|
148
|
+
{ $match: { 'member.memberOf.id': { $eq: params.member.memberOf.id.$eq } } },
|
|
149
|
+
{ $match: { 'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf.$eq } } }
|
|
140
150
|
];
|
|
141
151
|
const aggregate = this.memberModel.aggregate([
|
|
142
152
|
// ...(typeof params.sort?.productID === 'number')
|
|
@@ -215,7 +225,9 @@ class MongoRepository {
|
|
|
215
225
|
return __awaiter(this, void 0, void 0, function* () {
|
|
216
226
|
const doc = yield this.memberModel.findOneAndUpdate({
|
|
217
227
|
'project.id': { $eq: params.project.id },
|
|
218
|
-
'member.id': { $eq: params.member.id }
|
|
228
|
+
'member.id': { $eq: params.member.id },
|
|
229
|
+
'member.memberOf.id': { $eq: params.member.memberOf.id },
|
|
230
|
+
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf }
|
|
219
231
|
}, Object.assign(Object.assign(Object.assign({ updatedAt: new Date() }, (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))
|
|
220
232
|
.exec();
|
|
221
233
|
if (doc === null) {
|
|
@@ -223,6 +235,23 @@ class MongoRepository {
|
|
|
223
235
|
}
|
|
224
236
|
});
|
|
225
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* 互換性維持プログラム専用
|
|
240
|
+
*/
|
|
241
|
+
updateByMemberMemberOf(params) {
|
|
242
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
243
|
+
const doc = yield this.memberModel.findOneAndUpdate({
|
|
244
|
+
'project.id': { $eq: params.project.id },
|
|
245
|
+
'member.id': { $eq: params.member.id }
|
|
246
|
+
}, {
|
|
247
|
+
'member.memberOf': params.member.memberOf
|
|
248
|
+
})
|
|
249
|
+
.exec();
|
|
250
|
+
if (doc === null) {
|
|
251
|
+
throw new factory.errors.NotFound(this.memberModel.modelName);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
226
255
|
/**
|
|
227
256
|
* メンバー削除
|
|
228
257
|
*/
|
|
@@ -230,7 +259,9 @@ class MongoRepository {
|
|
|
230
259
|
return __awaiter(this, void 0, void 0, function* () {
|
|
231
260
|
const doc = yield this.memberModel.findOneAndDelete({
|
|
232
261
|
'project.id': { $eq: params.project.id },
|
|
233
|
-
'member.id': { $eq: params.member.id }
|
|
262
|
+
'member.id': { $eq: params.member.id },
|
|
263
|
+
'member.memberOf.id': { $eq: params.member.memberOf.id.$eq },
|
|
264
|
+
'member.memberOf.typeOf': { $eq: params.member.memberOf.typeOf.$eq }
|
|
234
265
|
})
|
|
235
266
|
.exec();
|
|
236
267
|
if (doc === null) {
|
|
@@ -244,22 +275,37 @@ class MongoRepository {
|
|
|
244
275
|
searchProjectIdsByMemberId(params) {
|
|
245
276
|
var _a, _b;
|
|
246
277
|
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
.skip(params.limit * (page - 1));
|
|
278
|
+
if (typeof params.limit !== 'number') {
|
|
279
|
+
throw new factory.errors.ArgumentNull('limit');
|
|
280
|
+
}
|
|
281
|
+
if (typeof params.page !== 'number') {
|
|
282
|
+
throw new factory.errors.ArgumentNull('page');
|
|
283
|
+
}
|
|
284
|
+
const matchStages = [{ $match: { 'member.id': { $eq: params.member.id } } }];
|
|
285
|
+
if (typeof ((_b = (_a = params.project) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.$regex) === 'string' && params.project.id.$regex.length > 0) {
|
|
286
|
+
matchStages.push({ $match: { 'project.id': { $regex: new RegExp(params.project.id.$regex) } } });
|
|
257
287
|
}
|
|
258
|
-
const
|
|
288
|
+
const page = (typeof params.page === 'number' && params.page > 0) ? params.page : 1;
|
|
289
|
+
const aggregate = this.memberModel.aggregate([
|
|
290
|
+
...matchStages,
|
|
291
|
+
{
|
|
292
|
+
$group: {
|
|
293
|
+
_id: '$project.id'
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
{ $sort: { _id: factory.sortType.Ascending } }
|
|
297
|
+
])
|
|
298
|
+
.limit(params.limit * page)
|
|
299
|
+
.skip(params.limit * (page - 1));
|
|
300
|
+
return aggregate
|
|
259
301
|
.exec()
|
|
260
|
-
.then((docs) => docs.map((doc) => doc.
|
|
261
|
-
return projectMembers.map((m) => m.project.id);
|
|
302
|
+
.then((docs) => docs.map((doc) => doc._id));
|
|
262
303
|
});
|
|
263
304
|
}
|
|
305
|
+
getCursor(conditions, projection) {
|
|
306
|
+
return this.memberModel.find(conditions, projection)
|
|
307
|
+
.sort({ 'member.id': factory.sortType.Ascending })
|
|
308
|
+
.cursor();
|
|
309
|
+
}
|
|
264
310
|
}
|
|
265
311
|
exports.MongoRepository = MongoRepository;
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import { Schema } from 'mongoose';
|
|
26
26
|
declare const modelName = "Member";
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* IAMメンバースキーマ
|
|
29
29
|
*/
|
|
30
30
|
declare const schema: Schema<any, import("mongoose").Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
31
31
|
collection: string;
|
|
@@ -53,16 +53,16 @@ declare const schema: Schema<any, import("mongoose").Model<any, any, any, any, a
|
|
|
53
53
|
};
|
|
54
54
|
}, {
|
|
55
55
|
typeOf: string;
|
|
56
|
-
project
|
|
57
|
-
member
|
|
56
|
+
project: any;
|
|
57
|
+
member: any;
|
|
58
58
|
}, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<{
|
|
59
59
|
typeOf: string;
|
|
60
|
-
project
|
|
61
|
-
member
|
|
60
|
+
project: any;
|
|
61
|
+
member: any;
|
|
62
62
|
}>> & Omit<import("mongoose").FlatRecord<{
|
|
63
63
|
typeOf: string;
|
|
64
|
-
project
|
|
65
|
-
member
|
|
64
|
+
project: any;
|
|
65
|
+
member: any;
|
|
66
66
|
}> & {
|
|
67
67
|
_id: import("mongoose").Types.ObjectId;
|
|
68
68
|
}, never>>;
|
|
@@ -6,15 +6,21 @@ const writeConcern_1 = require("../writeConcern");
|
|
|
6
6
|
const modelName = 'Member';
|
|
7
7
|
exports.modelName = modelName;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* IAMメンバースキーマ
|
|
10
10
|
*/
|
|
11
11
|
const schema = new mongoose_1.Schema({
|
|
12
|
-
project:
|
|
12
|
+
project: {
|
|
13
|
+
type: mongoose_1.SchemaTypes.Mixed,
|
|
14
|
+
required: true
|
|
15
|
+
},
|
|
13
16
|
typeOf: {
|
|
14
17
|
type: String,
|
|
15
18
|
required: true
|
|
16
19
|
},
|
|
17
|
-
member:
|
|
20
|
+
member: {
|
|
21
|
+
type: mongoose_1.SchemaTypes.Mixed,
|
|
22
|
+
required: true
|
|
23
|
+
}
|
|
18
24
|
}, {
|
|
19
25
|
collection: 'members',
|
|
20
26
|
id: true,
|
|
@@ -43,9 +49,7 @@ const schema = new mongoose_1.Schema({
|
|
|
43
49
|
exports.schema = schema;
|
|
44
50
|
schema.index({ createdAt: 1 }, { name: 'searchByCreatedAt' });
|
|
45
51
|
schema.index({ updatedAt: 1 }, { name: 'searchByUpdatedAt' });
|
|
46
|
-
schema.index({ 'member.id': 1 }, {
|
|
47
|
-
name: 'searchByMemberId'
|
|
48
|
-
});
|
|
52
|
+
schema.index({ 'member.id': 1 }, { name: 'searchByMemberId' });
|
|
49
53
|
schema.index({ 'project.id': 1, 'member.id': 1 }, {
|
|
50
54
|
name: 'uniqueProjectMember',
|
|
51
55
|
unique: true
|
|
@@ -62,3 +66,5 @@ schema.index({ 'member.hasRole.roleName': 1, 'member.id': 1 }, {
|
|
|
62
66
|
'member.hasRole.roleName': { $exists: true }
|
|
63
67
|
}
|
|
64
68
|
});
|
|
69
|
+
schema.index({ 'member.memberOf.typeOf': 1, 'member.id': 1 }, { name: 'searchByMemberMemberOfTypeOf' });
|
|
70
|
+
schema.index({ 'member.memberOf.id': 1, 'member.id': 1 }, { name: 'searchByMemberMemberOfId' });
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { MongoRepository as MemberRepo } from '../repo/member';
|
|
5
5
|
import { MongoRepository as RoleRepo } from '../repo/role';
|
|
6
|
+
import * as factory from '../factory';
|
|
6
7
|
export type IPermission = string;
|
|
7
8
|
/**
|
|
8
9
|
* プロジェクトメンバーの権限を検索する
|
|
@@ -13,6 +14,10 @@ export declare function searchPermissions(params: {
|
|
|
13
14
|
};
|
|
14
15
|
member: {
|
|
15
16
|
id: string;
|
|
17
|
+
memberOf: {
|
|
18
|
+
id: string;
|
|
19
|
+
typeOf: factory.organizationType.Project;
|
|
20
|
+
};
|
|
16
21
|
};
|
|
17
22
|
}): (repos: {
|
|
18
23
|
member: MemberRepo;
|
|
@@ -18,30 +18,18 @@ function searchPermissions(params) {
|
|
|
18
18
|
let permissions = [];
|
|
19
19
|
const hasRole = yield repos.member.aggregateRoleNames({
|
|
20
20
|
project: { id: { $eq: params.project.id } },
|
|
21
|
-
member: {
|
|
21
|
+
member: {
|
|
22
|
+
id: { $eq: params.member.id },
|
|
23
|
+
memberOf: {
|
|
24
|
+
id: { $eq: params.member.memberOf.id },
|
|
25
|
+
typeOf: { $eq: params.member.memberOf.typeOf }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
22
28
|
});
|
|
23
29
|
if (hasRole.length > 0) {
|
|
24
30
|
permissions = yield repos.role.aggregatePermissions({ roleName: { $in: hasRole.map((r) => r.roleName) } });
|
|
25
31
|
}
|
|
26
32
|
return { hasRole, permissions };
|
|
27
|
-
// let permissions: IPermission[] = [];
|
|
28
|
-
// const projectMembers = await repos.member.search({
|
|
29
|
-
// project: { id: { $eq: params.project.id } },
|
|
30
|
-
// member: { id: { $eq: params.member.id } }
|
|
31
|
-
// });
|
|
32
|
-
// // 持っているロールを検索
|
|
33
|
-
// const roleNames = projectMembers.reduce<string[]>(
|
|
34
|
-
// (a, b) => [...a, ...(Array.isArray(b.member.hasRole)) ? b.member.hasRole.map((r) => r.roleName) : []],
|
|
35
|
-
// []
|
|
36
|
-
// );
|
|
37
|
-
// const roles = await repos.role.search({ roleName: { $in: roleNames } });
|
|
38
|
-
// // 権限をまとめる
|
|
39
|
-
// permissions = roles.reduce<string[]>(
|
|
40
|
-
// (a, b) => [...a, ...b.permissions],
|
|
41
|
-
// []
|
|
42
|
-
// );
|
|
43
|
-
// permissions = [...new Set(permissions)];
|
|
44
|
-
// return { roleNames, permissions };
|
|
45
33
|
});
|
|
46
34
|
}
|
|
47
35
|
exports.searchPermissions = searchPermissions;
|
package/package.json
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
}
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@chevre/factory": "4.316.0-alpha.
|
|
13
|
-
"@cinerino/sdk": "3.
|
|
12
|
+
"@chevre/factory": "4.316.0-alpha.5",
|
|
13
|
+
"@cinerino/sdk": "3.162.0-alpha.1",
|
|
14
14
|
"@motionpicture/coa-service": "9.2.0",
|
|
15
15
|
"@motionpicture/gmo-service": "5.2.0",
|
|
16
16
|
"@sendgrid/mail": "6.4.0",
|
|
@@ -117,5 +117,5 @@
|
|
|
117
117
|
"postversion": "git push origin --tags",
|
|
118
118
|
"prepublishOnly": "npm run clean && npm run build && npm test && npm run doc"
|
|
119
119
|
},
|
|
120
|
-
"version": "21.4.0-alpha.
|
|
120
|
+
"version": "21.4.0-alpha.26"
|
|
121
121
|
}
|