@things-factory/board-service 6.2.40 → 6.2.42
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/dist-server/service/board/board-query.js +53 -2
- package/dist-server/service/board/board-query.js.map +1 -1
- package/dist-server/service/index.js +2 -10
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/permission/board-permission-subscriber.js +14 -39
- package/dist-server/service/permission/board-permission-subscriber.js.map +1 -1
- package/dist-server/service/permission/domain-permission-subscriber.js +5 -35
- package/dist-server/service/permission/domain-permission-subscriber.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/server/service/board/board-query.ts +58 -2
- package/server/service/index.ts +2 -10
- package/server/service/permission/board-permission-subscriber.ts +18 -48
- package/server/service/permission/domain-permission-subscriber.ts +7 -40
- package/dist-server/service/board-secret/board-resolver.js +0 -156
- package/dist-server/service/board-secret/board-resolver.js.map +0 -1
- package/dist-server/service/board-secret/board-secret.js +0 -55
- package/dist-server/service/board-secret/board-secret.js.map +0 -1
- package/dist-server/service/board-secret/index.js +0 -8
- package/dist-server/service/board-secret/index.js.map +0 -1
- package/dist-server/service/domain-secret/domain-resolver.js +0 -46
- package/dist-server/service/domain-secret/domain-resolver.js.map +0 -1
- package/dist-server/service/domain-secret/domain-secret.js +0 -49
- package/dist-server/service/domain-secret/domain-secret.js.map +0 -1
- package/dist-server/service/domain-secret/index.js +0 -8
- package/dist-server/service/domain-secret/index.js.map +0 -1
- package/server/service/board-secret/board-resolver.ts +0 -148
- package/server/service/board-secret/board-secret.ts +0 -38
- package/server/service/board-secret/index.ts +0 -5
- package/server/service/domain-secret/domain-resolver.ts +0 -46
- package/server/service/domain-secret/domain-secret.ts +0 -34
- package/server/service/domain-secret/index.ts +0 -5
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DomainSecret = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const typeorm_1 = require("typeorm");
|
|
6
|
-
const shell_1 = require("@things-factory/shell");
|
|
7
|
-
const auth_base_1 = require("@things-factory/auth-base");
|
|
8
|
-
let DomainSecret = class DomainSecret {
|
|
9
|
-
};
|
|
10
|
-
tslib_1.__decorate([
|
|
11
|
-
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
12
|
-
tslib_1.__metadata("design:type", String)
|
|
13
|
-
], DomainSecret.prototype, "id", void 0);
|
|
14
|
-
tslib_1.__decorate([
|
|
15
|
-
(0, typeorm_1.ManyToOne)(type => shell_1.Domain),
|
|
16
|
-
tslib_1.__metadata("design:type", shell_1.Domain)
|
|
17
|
-
], DomainSecret.prototype, "domain", void 0);
|
|
18
|
-
tslib_1.__decorate([
|
|
19
|
-
(0, typeorm_1.Column)(),
|
|
20
|
-
tslib_1.__metadata("design:type", String)
|
|
21
|
-
], DomainSecret.prototype, "secret", void 0);
|
|
22
|
-
tslib_1.__decorate([
|
|
23
|
-
(0, typeorm_1.CreateDateColumn)(),
|
|
24
|
-
tslib_1.__metadata("design:type", Date)
|
|
25
|
-
], DomainSecret.prototype, "createdAt", void 0);
|
|
26
|
-
tslib_1.__decorate([
|
|
27
|
-
(0, typeorm_1.UpdateDateColumn)(),
|
|
28
|
-
tslib_1.__metadata("design:type", Date)
|
|
29
|
-
], DomainSecret.prototype, "updatedAt", void 0);
|
|
30
|
-
tslib_1.__decorate([
|
|
31
|
-
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, {
|
|
32
|
-
nullable: true
|
|
33
|
-
}),
|
|
34
|
-
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
35
|
-
], DomainSecret.prototype, "creator", void 0);
|
|
36
|
-
tslib_1.__decorate([
|
|
37
|
-
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, {
|
|
38
|
-
nullable: true
|
|
39
|
-
}),
|
|
40
|
-
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
41
|
-
], DomainSecret.prototype, "updater", void 0);
|
|
42
|
-
DomainSecret = tslib_1.__decorate([
|
|
43
|
-
(0, typeorm_1.Entity)(),
|
|
44
|
-
(0, typeorm_1.Index)('ix_domain_secret_0', (domainSecret) => [domainSecret.domain, domainSecret.secret], {
|
|
45
|
-
unique: true
|
|
46
|
-
})
|
|
47
|
-
], DomainSecret);
|
|
48
|
-
exports.DomainSecret = DomainSecret;
|
|
49
|
-
//# sourceMappingURL=domain-secret.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"domain-secret.js","sourceRoot":"","sources":["../../../server/service/domain-secret/domain-secret.ts"],"names":[],"mappings":";;;;AAAA,qCAAsH;AACtH,iDAA8C;AAC9C,yDAAgD;AAMzC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAyBxB,CAAA;AAxBC;IAAC,IAAA,gCAAsB,EAAC,MAAM,CAAC;sCAC3B,MAAM;wCAAA;AAEV;IAAC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;sCAClB,cAAM;4CAAA;AAEd;IAAC,IAAA,gBAAM,GAAE;sCACD,MAAM;4CAAA;AAEd;IAAC,IAAA,0BAAgB,GAAE;sCACR,IAAI;+CAAA;AAEf;IAAC,IAAA,0BAAgB,GAAE;sCACR,IAAI;+CAAA;AAEf;IAAC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC;sCACO,gBAAI;6CAAA;AAEb;IAAC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC;sCACO,gBAAI;6CAAA;AAxBF,YAAY;IAJxB,IAAA,gBAAM,GAAE;IACR,IAAA,eAAK,EAAC,oBAAoB,EAAE,CAAC,YAA0B,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE;QACvG,MAAM,EAAE,IAAI;KACb,CAAC;GACW,YAAY,CAyBxB;AAzBY,oCAAY","sourcesContent":["import { CreateDateColumn, UpdateDateColumn, Entity, Index, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n@Entity()\n@Index('ix_domain_secret_0', (domainSecret: DomainSecret) => [domainSecret.domain, domainSecret.secret], {\n unique: true\n})\nexport class DomainSecret {\n @PrimaryGeneratedColumn('uuid')\n id: String\n\n @ManyToOne(type => Domain)\n domain: Domain\n\n @Column()\n secret: String\n\n @CreateDateColumn()\n createdAt: Date\n\n @UpdateDateColumn()\n updatedAt: Date\n\n @ManyToOne(type => User, {\n nullable: true\n })\n creator: User\n\n @ManyToOne(type => User, {\n nullable: true\n })\n updater: User\n}\n"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolvers = exports.entities = void 0;
|
|
4
|
-
const domain_secret_1 = require("./domain-secret");
|
|
5
|
-
const domain_resolver_1 = require("./domain-resolver");
|
|
6
|
-
exports.entities = [domain_secret_1.DomainSecret];
|
|
7
|
-
exports.resolvers = [domain_resolver_1.DomainResolver];
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/domain-secret/index.ts"],"names":[],"mappings":";;;AAAA,mDAA8C;AAC9C,uDAAkD;AAErC,QAAA,QAAQ,GAAG,CAAC,4BAAY,CAAC,CAAA;AACzB,QAAA,SAAS,GAAG,CAAC,gCAAc,CAAC,CAAA","sourcesContent":["import { DomainSecret } from './domain-secret'\nimport { DomainResolver } from './domain-resolver'\n\nexport const entities = [DomainSecret]\nexport const resolvers = [DomainResolver]\n"]}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { In } from 'typeorm'
|
|
2
|
-
import { Arg, Ctx, Directive, Query, Resolver } from 'type-graphql'
|
|
3
|
-
|
|
4
|
-
import { checkTarget, doSomething, getPermission } from '@things-factory/operato-license-checker'
|
|
5
|
-
import { getRepository } from '@things-factory/shell'
|
|
6
|
-
import { User } from '@things-factory/auth-base'
|
|
7
|
-
|
|
8
|
-
import { LicenseError } from '../../errors/license-error'
|
|
9
|
-
import { Board } from '../board/board'
|
|
10
|
-
import { DomainSecret } from '../domain-secret/domain-secret'
|
|
11
|
-
import { BoardSecret } from './board-secret'
|
|
12
|
-
|
|
13
|
-
const crypto = require('crypto')
|
|
14
|
-
|
|
15
|
-
@Resolver(Board)
|
|
16
|
-
export class BoardResolver {
|
|
17
|
-
@Query(returns => [String], { description: 'Board Usage Permissions' })
|
|
18
|
-
async boardPermissions(@Ctx() context: ResolverContext): Promise<string[]> {
|
|
19
|
-
const { user, domain } = context.state
|
|
20
|
-
|
|
21
|
-
const licensedPermissions = (getPermission('Permissions For Board Usage') || 'Modeller, Viewer')
|
|
22
|
-
.split(',')
|
|
23
|
-
.map(p => p.trim())
|
|
24
|
-
|
|
25
|
-
var permissions = []
|
|
26
|
-
|
|
27
|
-
licensedPermissions.includes('Modeller') &&
|
|
28
|
-
(await User.hasPrivilege('mutation', 'board', domain, user)) &&
|
|
29
|
-
permissions.push('Modeller')
|
|
30
|
-
|
|
31
|
-
licensedPermissions.includes('Viewer') &&
|
|
32
|
-
(await User.hasPrivilege('query', 'board', domain, user)) &&
|
|
33
|
-
permissions.push('Viewer')
|
|
34
|
-
|
|
35
|
-
return permissions
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@Directive('@privilege(category: "board", privilege: "query", domainOwnerGranted: true)')
|
|
39
|
-
@Query(returns => Board, { description: 'To fetch a board' })
|
|
40
|
-
async board(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Board> {
|
|
41
|
-
const { domain } = context.state
|
|
42
|
-
|
|
43
|
-
var board = await getRepository(Board).findOne({
|
|
44
|
-
where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id }
|
|
45
|
-
})
|
|
46
|
-
if (domain) {
|
|
47
|
-
// 1. check domainSecret is over limit quantity or not
|
|
48
|
-
var count =
|
|
49
|
-
(await getRepository(DomainSecret)
|
|
50
|
-
.manager.createQueryBuilder()
|
|
51
|
-
.select('board')
|
|
52
|
-
.from(DomainSecret, 'secret')
|
|
53
|
-
.where('"id" = :domainId', { domainId: domain.id })
|
|
54
|
-
.getCount()) + 1
|
|
55
|
-
|
|
56
|
-
if (!checkTarget(count)) {
|
|
57
|
-
throw new LicenseError({
|
|
58
|
-
errorCode: context.t(LicenseError.ERROR_CODES.OVER_LIMIT)
|
|
59
|
-
})
|
|
60
|
-
} else {
|
|
61
|
-
var domainSecret: DomainSecret = await getRepository(DomainSecret).findOne({
|
|
62
|
-
where: { domain: { id: domain.id } }
|
|
63
|
-
})
|
|
64
|
-
// 2. if there's no domainSecret then create it
|
|
65
|
-
if (!domainSecret) {
|
|
66
|
-
var domainSecret: DomainSecret = new DomainSecret()
|
|
67
|
-
domainSecret.id = crypto.randomUUID()
|
|
68
|
-
domainSecret.domain = domain
|
|
69
|
-
var hash = doSomething({ secId: domainSecret.id, id: domain.id })
|
|
70
|
-
domainSecret.secret = hash
|
|
71
|
-
|
|
72
|
-
await getRepository(DomainSecret).save(domainSecret)
|
|
73
|
-
// 3. if there's domainSecret then check it
|
|
74
|
-
} else {
|
|
75
|
-
var domainRepo = getRepository(DomainSecret)
|
|
76
|
-
var domainSecret: DomainSecret = await domainRepo.findOne({
|
|
77
|
-
where: { domain: { id: domain.id } }
|
|
78
|
-
})
|
|
79
|
-
if (domainSecret) {
|
|
80
|
-
var hash = doSomething({ secId: domainSecret.id, id: domain.id })
|
|
81
|
-
if (domainSecret.secret !== hash) {
|
|
82
|
-
throw new LicenseError({
|
|
83
|
-
errorCode: context.t(LicenseError.ERROR_CODES.VERIFICATION_ERROR)
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
} else {
|
|
87
|
-
throw new LicenseError({
|
|
88
|
-
errorCode: context.t(LicenseError.ERROR_CODES.VERIFICATION_ERROR)
|
|
89
|
-
})
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (board) {
|
|
95
|
-
// 1. check boardSecret is over limit quantity or not
|
|
96
|
-
var count =
|
|
97
|
-
(await getRepository(BoardSecret)
|
|
98
|
-
.manager.createQueryBuilder()
|
|
99
|
-
.select('board')
|
|
100
|
-
.from(BoardSecret, 'secret')
|
|
101
|
-
.where('"domain_id" = :domainId', { domainId: domain.id })
|
|
102
|
-
.getCount()) + 1
|
|
103
|
-
|
|
104
|
-
if (!checkTarget(count)) {
|
|
105
|
-
throw new LicenseError({
|
|
106
|
-
errorCode: context.t(LicenseError.ERROR_CODES.OVER_LIMIT)
|
|
107
|
-
})
|
|
108
|
-
} else {
|
|
109
|
-
var boardSecret: BoardSecret = await getRepository(BoardSecret).findOne({
|
|
110
|
-
where: { targetId: id }
|
|
111
|
-
})
|
|
112
|
-
// 2. if there's no boardSecret then create it
|
|
113
|
-
if (!boardSecret) {
|
|
114
|
-
var boardSecret: BoardSecret = new BoardSecret()
|
|
115
|
-
boardSecret.id = crypto.randomUUID()
|
|
116
|
-
boardSecret.targetId = id
|
|
117
|
-
boardSecret.targetType = 'board'
|
|
118
|
-
boardSecret.domain = domain
|
|
119
|
-
|
|
120
|
-
var hash = doSomething({ secId: boardSecret.id, id: id })
|
|
121
|
-
boardSecret.secret = hash
|
|
122
|
-
|
|
123
|
-
await getRepository(BoardSecret).save(boardSecret)
|
|
124
|
-
// 3. if there's boardSecret then check it
|
|
125
|
-
} else {
|
|
126
|
-
var repogitory = getRepository(BoardSecret)
|
|
127
|
-
var boardSecret: BoardSecret = await repogitory.findOne({
|
|
128
|
-
where: { targetId: id }
|
|
129
|
-
})
|
|
130
|
-
if (boardSecret) {
|
|
131
|
-
var hash = doSomething({ secId: boardSecret.id, id: id })
|
|
132
|
-
if (boardSecret.secret !== hash) {
|
|
133
|
-
throw new LicenseError({
|
|
134
|
-
errorCode: context.t(LicenseError.ERROR_CODES.VERIFICATION_ERROR)
|
|
135
|
-
})
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
throw new LicenseError({
|
|
139
|
-
errorCode: context.t(LicenseError.ERROR_CODES.VERIFICATION_ERROR)
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return board
|
|
147
|
-
}
|
|
148
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { CreateDateColumn, UpdateDateColumn, Entity, Index, Column, OneToMany, ManyToOne, PrimaryColumn } from 'typeorm'
|
|
2
|
-
import { Domain } from '@things-factory/shell'
|
|
3
|
-
import { User } from '@things-factory/auth-base'
|
|
4
|
-
|
|
5
|
-
@Entity()
|
|
6
|
-
@Index('ix_board_secret_0', (boardSecret: BoardSecret) => [boardSecret.domain, boardSecret.secret], { unique: true })
|
|
7
|
-
export class BoardSecret {
|
|
8
|
-
@PrimaryColumn('uuid')
|
|
9
|
-
id: string
|
|
10
|
-
|
|
11
|
-
@ManyToOne(type => Domain)
|
|
12
|
-
domain: Domain
|
|
13
|
-
|
|
14
|
-
@Column()
|
|
15
|
-
secret: string
|
|
16
|
-
|
|
17
|
-
@Column()
|
|
18
|
-
targetType: string
|
|
19
|
-
|
|
20
|
-
@Column('uuid')
|
|
21
|
-
targetId: string
|
|
22
|
-
|
|
23
|
-
@CreateDateColumn()
|
|
24
|
-
createdAt: Date
|
|
25
|
-
|
|
26
|
-
@UpdateDateColumn()
|
|
27
|
-
updatedAt: Date
|
|
28
|
-
|
|
29
|
-
@ManyToOne(type => User, {
|
|
30
|
-
nullable: true
|
|
31
|
-
})
|
|
32
|
-
creator: User
|
|
33
|
-
|
|
34
|
-
@ManyToOne(type => User, {
|
|
35
|
-
nullable: true
|
|
36
|
-
})
|
|
37
|
-
updater: User
|
|
38
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Arg, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
-
import { Repository } from 'typeorm'
|
|
3
|
-
|
|
4
|
-
import { Domain, DomainPatch, getRepository } from '@things-factory/shell'
|
|
5
|
-
import { slugger } from '@things-factory/utils'
|
|
6
|
-
|
|
7
|
-
@Resolver(Domain)
|
|
8
|
-
export class DomainResolver {
|
|
9
|
-
@Directive('@privilege(category: "system", privilege: "mutation", superUserGranted: true)')
|
|
10
|
-
@Mutation(returns => Boolean, { description: 'To update multiple domains' })
|
|
11
|
-
async updateDomains(@Arg('patches', type => [DomainPatch]) patches: DomainPatch[]): Promise<boolean> {
|
|
12
|
-
const domainRepo: Repository<Domain> = getRepository(Domain)
|
|
13
|
-
|
|
14
|
-
const _createRecords = patches.filter((patch: any) => !patch.id)
|
|
15
|
-
const _updateRecords = patches.filter((patch: any) => patch.id)
|
|
16
|
-
|
|
17
|
-
if (_createRecords.length > 0) {
|
|
18
|
-
_createRecords.forEach(async createRecord => {
|
|
19
|
-
const subdomain: string = slugger(createRecord.name)
|
|
20
|
-
|
|
21
|
-
await domainRepo.save({ ...createRecord, subdomain } as any)
|
|
22
|
-
})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (_updateRecords.length > 0) {
|
|
26
|
-
_updateRecords.forEach(async updateRecord => {
|
|
27
|
-
const domain: Domain = await domainRepo.findOne({ where: { id: updateRecord.id } })
|
|
28
|
-
|
|
29
|
-
if (updateRecord.name) {
|
|
30
|
-
updateRecord.subdomain = slugger(updateRecord.name)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (updateRecord.parent && updateRecord.parent.id == domain.id) {
|
|
34
|
-
delete updateRecord.parent
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
await domainRepo.save({
|
|
38
|
-
...domain,
|
|
39
|
-
...updateRecord
|
|
40
|
-
} as any)
|
|
41
|
-
})
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return true
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { CreateDateColumn, UpdateDateColumn, Entity, Index, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
|
|
2
|
-
import { Domain } from '@things-factory/shell'
|
|
3
|
-
import { User } from '@things-factory/auth-base'
|
|
4
|
-
|
|
5
|
-
@Entity()
|
|
6
|
-
@Index('ix_domain_secret_0', (domainSecret: DomainSecret) => [domainSecret.domain, domainSecret.secret], {
|
|
7
|
-
unique: true
|
|
8
|
-
})
|
|
9
|
-
export class DomainSecret {
|
|
10
|
-
@PrimaryGeneratedColumn('uuid')
|
|
11
|
-
id: String
|
|
12
|
-
|
|
13
|
-
@ManyToOne(type => Domain)
|
|
14
|
-
domain: Domain
|
|
15
|
-
|
|
16
|
-
@Column()
|
|
17
|
-
secret: String
|
|
18
|
-
|
|
19
|
-
@CreateDateColumn()
|
|
20
|
-
createdAt: Date
|
|
21
|
-
|
|
22
|
-
@UpdateDateColumn()
|
|
23
|
-
updatedAt: Date
|
|
24
|
-
|
|
25
|
-
@ManyToOne(type => User, {
|
|
26
|
-
nullable: true
|
|
27
|
-
})
|
|
28
|
-
creator: User
|
|
29
|
-
|
|
30
|
-
@ManyToOne(type => User, {
|
|
31
|
-
nullable: true
|
|
32
|
-
})
|
|
33
|
-
updater: User
|
|
34
|
-
}
|