@things-factory/menu-base 8.0.0-alpha.8 → 8.0.0-beta.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/menu-base",
3
- "version": "8.0.0-alpha.8",
3
+ "version": "8.0.0-beta.0",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,7 +24,7 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create ./server/migrations/migration"
25
25
  },
26
26
  "dependencies": {
27
- "@things-factory/auth-base": "^8.0.0-alpha.8"
27
+ "@things-factory/auth-base": "^8.0.0-beta.0"
28
28
  },
29
- "gitHead": "0a9fb3ab431934982294b58c743d01b6f782a15f"
29
+ "gitHead": "add6fb8224b2cb19cbea47bed6a5ecb0424c9a28"
30
30
  }
@@ -1,8 +1,8 @@
1
1
  import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { In, Repository, SelectQueryBuilder } from 'typeorm'
2
+ import { In, Repository, Brackets, SelectQueryBuilder } from 'typeorm'
3
3
 
4
4
  import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
5
- import { checkPermission, Role, User } from '@things-factory/auth-base'
5
+ import { Role, User } from '@things-factory/auth-base'
6
6
 
7
7
  import { MenuButton } from '../menu-button/menu-button'
8
8
  import { MenuColumn } from '../menu-column/menu-column'
@@ -81,26 +81,33 @@ export class MenuQuery {
81
81
 
82
82
  @Query(returns => MenuList, { description: 'To fetch my own Menus' })
83
83
  async myMenus(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<MenuList> {
84
- const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
84
+ const { domain, user } = context.state
85
85
 
86
- const queryBuilder = getQueryBuilderFromListParams({
87
- domain,
88
- params,
89
- repository: await getRepository(Menu),
90
- searchables: ['name', 'description']
86
+ const me = await getRepository(User).findOne({
87
+ where: { id: user.id },
88
+ relations: ['roles']
91
89
  })
92
90
 
93
- const [items, total] = await queryBuilder.getManyAndCount()
94
-
95
- const filtered = []
91
+ const roles = me.roles
92
+ .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
93
+ .map(role => role.id)
96
94
 
97
- for (let item of items) {
98
- if (await checkPermission(item.privilege, user, domain, unsafeIP, prohibitedPrivileges)) {
99
- filtered.push(item)
100
- }
101
- }
95
+ const [items, total] = await getQueryBuilderFromListParams({
96
+ repository: getRepository(Menu),
97
+ params,
98
+ domain,
99
+ alias: 'menu',
100
+ searchables: ['name', 'description']
101
+ })
102
+ .andWhere(
103
+ new Brackets(qb => {
104
+ qb.where('menu.role IN (:...roles)').orWhere('menu.role is null')
105
+ })
106
+ )
107
+ .setParameter('roles', roles)
108
+ .getManyAndCount()
102
109
 
103
- return { items: filtered, total: filtered.length }
110
+ return { items, total }
104
111
  }
105
112
 
106
113
  @Query(returns => MenuList, { description: 'To fetch Menus by role' })
@@ -174,26 +181,36 @@ export class MenuQuery {
174
181
  @Arg('permittedOnly', { defaultValue: false }) permittedOnly: boolean,
175
182
  @Ctx() context: ResolverContext
176
183
  ): Promise<Menu[]> {
177
- var menus =
178
- menu.children ||
179
- (await getRepository(Menu).findBy({
180
- parent: { id: menu.id }
181
- }))
182
-
183
184
  if (!permittedOnly) {
184
- return menus
185
+ return (
186
+ menu.children ||
187
+ (await getRepository(Menu).findBy({
188
+ parent: { id: menu.id }
189
+ }))
190
+ )
185
191
  }
186
192
 
187
- const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
188
- const filtered = []
193
+ const { domain, user } = context.state
189
194
 
190
- for (let item of menus) {
191
- if (await checkPermission(item.privilege, user, domain, unsafeIP, prohibitedPrivileges)) {
192
- filtered.push(item)
193
- }
194
- }
195
+ const me = await getRepository(User).findOne({
196
+ where: { id: user.id },
197
+ relations: ['roles']
198
+ })
195
199
 
196
- return filtered
200
+ const roles = me.roles
201
+ .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
202
+ .map(role => role.id)
203
+
204
+ return await getRepository(Menu)
205
+ .createQueryBuilder('menu')
206
+ .where('menu.parent = :parentId', { parentId: menu.id })
207
+ .andWhere(
208
+ new Brackets(qb => {
209
+ qb.where('menu.role IN (:...roles)').orWhere('menu.role is null')
210
+ })
211
+ )
212
+ .setParameter('roles', roles)
213
+ .getMany()
197
214
  }
198
215
 
199
216
  @FieldResolver(type => [MenuButton])
@@ -210,6 +227,11 @@ export class MenuQuery {
210
227
  })
211
228
  }
212
229
 
230
+ @FieldResolver(type => Role)
231
+ async role(@Root() menu: Menu) {
232
+ return menu.roleId && (await getRepository(Role).findOneBy({ id: menu.roleId }))
233
+ }
234
+
213
235
  @FieldResolver(type => Domain)
214
236
  async domain(@Root() menu: Menu): Promise<Domain> {
215
237
  return await getRepository(Domain).findOneBy({ id: menu.domainId })
@@ -1,7 +1,6 @@
1
1
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
3
  import { ObjectRef } from '@things-factory/shell'
4
- import { PrivilegeInput } from '@things-factory/auth-base'
5
4
 
6
5
  import { Menu } from './menu'
7
6
 
@@ -32,7 +31,6 @@ export class NewMenu {
32
31
  @Field(type => Int, { nullable: true }) fixedColumns?: number
33
32
  @Field({ nullable: true }) iconPath?: string
34
33
  @Field({ nullable: true }) role?: ObjectRef
35
- @Field({ nullable: true }) privilege?: PrivilegeInput
36
34
  @Field({ nullable: true }) parent?: ObjectRef
37
35
  @Field(type => [ObjectRef], { nullable: true }) children?: ObjectRef[]
38
36
  @Field(type => [ObjectRef], { nullable: true }) buttons?: ObjectRef[]
@@ -66,7 +64,6 @@ export class MenuPatch {
66
64
  @Field(type => Int, { nullable: true }) fixedColumns?: number
67
65
  @Field({ nullable: true }) iconPath?: string
68
66
  @Field({ nullable: true }) role?: ObjectRef
69
- @Field({ nullable: true }) privilege?: PrivilegeInput
70
67
  @Field({ nullable: true }) parent?: ObjectRef
71
68
  @Field(type => [ObjectRef], { nullable: true }) children?: ObjectRef[]
72
69
  @Field(type => [ObjectRef], { nullable: true }) buttons?: ObjectRef[]
@@ -75,10 +75,6 @@ export class Menu {
75
75
  @Field(type => [Role], { nullable: true })
76
76
  roles?: Role[]
77
77
 
78
- @Column({ type: 'simple-json', nullable: true })
79
- @Field(type => PrivilegeObject, { nullable: true })
80
- privilege?: PrivilegeObject
81
-
82
78
  @Column('int', { nullable: true })
83
79
  @Field({ nullable: true })
84
80
  rank?: number