@things-factory/menu-base 8.0.0 → 9.0.0-beta.3
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/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/server/index.ts +0 -1
- package/server/service/index.ts +0 -37
- package/server/service/menu/index.ts +0 -6
- package/server/service/menu/menu-mutation.ts +0 -244
- package/server/service/menu/menu-query.ts +0 -249
- package/server/service/menu/menu-type.ts +0 -78
- package/server/service/menu/menu.ts +0 -183
- package/server/service/menu-button/index.ts +0 -6
- package/server/service/menu-button/menu-button-mutation.ts +0 -142
- package/server/service/menu-button/menu-button-query.ts +0 -59
- package/server/service/menu-button/menu-button-type.ts +0 -31
- package/server/service/menu-button/menu-button.ts +0 -86
- package/server/service/menu-column/index.ts +0 -6
- package/server/service/menu-column/menu-column-mutation.ts +0 -143
- package/server/service/menu-column/menu-column-query.ts +0 -59
- package/server/service/menu-column/menu-column-type.ts +0 -92
- package/server/service/menu-column/menu-column.ts +0 -200
- package/server/service/menu-detail/index.ts +0 -6
- package/server/service/menu-detail/menu-detail-mutation.ts +0 -142
- package/server/service/menu-detail/menu-detail-query.ts +0 -75
- package/server/service/menu-detail/menu-detail-type.ts +0 -46
- package/server/service/menu-detail/menu-detail.ts +0 -111
- package/server/service/menu-detail-button/index.ts +0 -6
- package/server/service/menu-detail-button/menu-detail-button-mutation.ts +0 -143
- package/server/service/menu-detail-button/menu-detail-button-query.ts +0 -61
- package/server/service/menu-detail-button/menu-detail-button-type.ts +0 -34
- package/server/service/menu-detail-button/menu-detail-button.ts +0 -86
- package/server/service/menu-detail-column/index.ts +0 -6
- package/server/service/menu-detail-column/menu-detail-column-mutation.ts +0 -145
- package/server/service/menu-detail-column/menu-detail-column-query.ts +0 -61
- package/server/service/menu-detail-column/menu-detail-column-type.ts +0 -92
- package/server/service/menu-detail-column/menu-detail-column.ts +0 -205
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/menu-base",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0-beta.3",
|
|
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": "^
|
|
27
|
+
"@things-factory/auth-base": "^9.0.0-beta.3"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "1d7e0dd4c88f3c3f3bd311c00e4b1d1542d53634"
|
|
30
30
|
}
|
package/server/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './service'
|
package/server/service/index.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/* EXPORT ENTITY TYPES */
|
|
2
|
-
export * from './menu-detail-column/menu-detail-column'
|
|
3
|
-
export * from './menu-detail-button/menu-detail-button'
|
|
4
|
-
export * from './menu-column/menu-column'
|
|
5
|
-
export * from './menu-button/menu-button'
|
|
6
|
-
export * from './menu-detail/menu-detail'
|
|
7
|
-
export * from './menu/menu'
|
|
8
|
-
|
|
9
|
-
/* IMPORT ENTITIES AND RESOLVERS */
|
|
10
|
-
import { entities as MenuDetailColumnEntities, resolvers as MenuDetailColumnResolvers } from './menu-detail-column'
|
|
11
|
-
import { entities as MenuDetailButtonEntities, resolvers as MenuDetailButtonResolvers } from './menu-detail-button'
|
|
12
|
-
import { entities as MenuColumnEntities, resolvers as MenuColumnResolvers } from './menu-column'
|
|
13
|
-
import { entities as MenuButtonEntities, resolvers as MenuButtonResolvers } from './menu-button'
|
|
14
|
-
import { entities as MenuDetailEntities, resolvers as MenuDetailResolvers } from './menu-detail'
|
|
15
|
-
import { entities as MenuEntities, resolvers as MenuResolvers } from './menu'
|
|
16
|
-
|
|
17
|
-
export const entities = [
|
|
18
|
-
/* ENTITIES */
|
|
19
|
-
...MenuDetailColumnEntities,
|
|
20
|
-
...MenuDetailButtonEntities,
|
|
21
|
-
...MenuColumnEntities,
|
|
22
|
-
...MenuButtonEntities,
|
|
23
|
-
...MenuDetailEntities,
|
|
24
|
-
...MenuEntities
|
|
25
|
-
]
|
|
26
|
-
|
|
27
|
-
export const schema = {
|
|
28
|
-
resolverClasses: [
|
|
29
|
-
/* RESOLVER CLASSES */
|
|
30
|
-
...MenuDetailColumnResolvers,
|
|
31
|
-
...MenuDetailButtonResolvers,
|
|
32
|
-
...MenuColumnResolvers,
|
|
33
|
-
...MenuButtonResolvers,
|
|
34
|
-
...MenuDetailResolvers,
|
|
35
|
-
...MenuResolvers
|
|
36
|
-
]
|
|
37
|
-
}
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
-
import { In, Repository } from 'typeorm'
|
|
3
|
-
|
|
4
|
-
import { Role } from '@things-factory/auth-base'
|
|
5
|
-
|
|
6
|
-
import { Menu } from './menu'
|
|
7
|
-
import { MenuPatch, NewMenu } from './menu-type'
|
|
8
|
-
|
|
9
|
-
async function appendRoleToMenu(roleRepo, roles, targetRole) {
|
|
10
|
-
let roleIds: string[] = roles.map(role => role.id)
|
|
11
|
-
roleIds = Array.from(new Set([...roleIds, targetRole.id]))
|
|
12
|
-
|
|
13
|
-
return await roleRepo.findByIds(roleIds)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function removeRoleToMenu(roles, targetRole) {
|
|
17
|
-
return roles.filter(role => targetRole.id !== role.id)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@Resolver(Menu)
|
|
21
|
-
export class MenuMutation {
|
|
22
|
-
@Directive('@transaction')
|
|
23
|
-
@Mutation(returns => Menu, { description: 'To create new Menu' })
|
|
24
|
-
async createMenu(@Arg('menu') menu: NewMenu, @Ctx() context: ResolverContext): Promise<Menu> {
|
|
25
|
-
const { domain, user, tx } = context.state
|
|
26
|
-
const menuRepo = tx?.getRepository(Menu)
|
|
27
|
-
|
|
28
|
-
if (menu?.parent?.id) {
|
|
29
|
-
menu.parent = await menuRepo.findOneBy({
|
|
30
|
-
domain: { id: domain.id },
|
|
31
|
-
id: menu.parent.id
|
|
32
|
-
})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return await tx.getRepository(Menu).save({
|
|
36
|
-
...menu,
|
|
37
|
-
domain,
|
|
38
|
-
creator: user,
|
|
39
|
-
updater: user
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@Directive('@transaction')
|
|
44
|
-
@Mutation(returns => Menu, { description: 'To modify Menu information' })
|
|
45
|
-
async updateMenu(
|
|
46
|
-
@Arg('id') id: string,
|
|
47
|
-
@Arg('patch') patch: MenuPatch,
|
|
48
|
-
@Ctx() context: ResolverContext
|
|
49
|
-
): Promise<Menu> {
|
|
50
|
-
const { domain, user, tx } = context.state
|
|
51
|
-
|
|
52
|
-
const menuRepo = tx.getRepository(Menu)
|
|
53
|
-
|
|
54
|
-
const menu: Menu = await menuRepo.findOne({
|
|
55
|
-
where: { domain: { id: domain.id }, id },
|
|
56
|
-
relations: ['children', 'parent']
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
if (patch?.parent?.id) {
|
|
60
|
-
patch.parent = await menuRepo.findOneBy({ id: patch.parent.id })
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (patch?.children?.length) {
|
|
64
|
-
const childrenIds: string[] = patch.children.map((children: Menu) => children.id)
|
|
65
|
-
patch.children = await menuRepo.findByIds(childrenIds)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return await menuRepo.save({
|
|
69
|
-
...menu,
|
|
70
|
-
...patch,
|
|
71
|
-
updater: user
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
@Directive('@transaction')
|
|
76
|
-
@Mutation(returns => [Menu], { description: "To modify multiple Menus' information" })
|
|
77
|
-
async updateMultipleMenu(
|
|
78
|
-
@Arg('patches', type => [MenuPatch]) patches: MenuPatch[],
|
|
79
|
-
@Ctx() context: ResolverContext
|
|
80
|
-
): Promise<Menu[]> {
|
|
81
|
-
const { domain, user, tx } = context.state
|
|
82
|
-
|
|
83
|
-
let results = []
|
|
84
|
-
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
85
|
-
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
86
|
-
const menuRepo = tx.getRepository(Menu)
|
|
87
|
-
|
|
88
|
-
if (_createRecords.length > 0) {
|
|
89
|
-
for (let i = 0; i < _createRecords.length; i++) {
|
|
90
|
-
const newRecord = _createRecords[i]
|
|
91
|
-
|
|
92
|
-
if (newRecord?.parent?.id) {
|
|
93
|
-
newRecord.parent = await menuRepo.findOneBy({
|
|
94
|
-
domain: { id: domain.id },
|
|
95
|
-
id: newRecord.parent.id
|
|
96
|
-
})
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const result = await menuRepo.save({
|
|
100
|
-
...newRecord,
|
|
101
|
-
domain,
|
|
102
|
-
creator: user,
|
|
103
|
-
updater: user
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
results.push({ ...result, cuFlag: '+' })
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (_updateRecords.length > 0) {
|
|
111
|
-
for (let i = 0; i < _updateRecords.length; i++) {
|
|
112
|
-
const updateRecord = _updateRecords[i]
|
|
113
|
-
const { id } = updateRecord
|
|
114
|
-
|
|
115
|
-
const menu: Menu = await menuRepo.findOne({
|
|
116
|
-
where: { domain: { id: domain.id }, id },
|
|
117
|
-
relations: ['children', 'parent']
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
if (updateRecord?.parent?.id) {
|
|
121
|
-
updateRecord.parent = await menuRepo.findOneBy({ id: updateRecord.parent.id })
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (updateRecord?.children?.length) {
|
|
125
|
-
const childrenIds: string[] = updateRecord.children.map((children: Menu) => children.id)
|
|
126
|
-
updateRecord.children = await menuRepo.findBy({ id: In(childrenIds) })
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const result = await menuRepo.save({
|
|
130
|
-
...menu,
|
|
131
|
-
...updateRecord,
|
|
132
|
-
updater: user
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
results.push({ ...result, cuFlag: 'M' })
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return results
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
@Directive('@transaction')
|
|
143
|
-
@Mutation(returns => Boolean, { description: 'To delete Menu' })
|
|
144
|
-
async deleteMenu(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
|
145
|
-
const { domain, tx } = context.state
|
|
146
|
-
|
|
147
|
-
await tx.getRepository(Menu).delete({ domain: { id: domain.id }, id })
|
|
148
|
-
return true
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
@Directive('@transaction')
|
|
152
|
-
@Mutation(returns => Boolean, { description: 'To delete multiple Menus' })
|
|
153
|
-
async deleteMenus(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
|
|
154
|
-
const { domain, tx } = context.state
|
|
155
|
-
|
|
156
|
-
await tx.getRepository(Menu).delete({
|
|
157
|
-
domain: { id: domain.id },
|
|
158
|
-
id: In(ids)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
return true
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
@Directive('@transaction')
|
|
165
|
-
@Mutation(returns => Menu, { description: 'To update role Menu' })
|
|
166
|
-
async updateRoleMenu(
|
|
167
|
-
@Arg('roleId') roleId: string,
|
|
168
|
-
@Arg('targetMenuId') targetMenuId: string,
|
|
169
|
-
@Arg('isCheckedMenu') isCheckedMenu: boolean,
|
|
170
|
-
@Ctx() context: ResolverContext
|
|
171
|
-
): Promise<Menu> {
|
|
172
|
-
const { domain, tx } = context.state
|
|
173
|
-
|
|
174
|
-
const menuRepo: Repository<Menu> = tx?.getRepository(Menu)
|
|
175
|
-
const roleRepo: Repository<Role> = tx?.getRepository(Role)
|
|
176
|
-
|
|
177
|
-
const menu: Menu = await menuRepo.findOne({
|
|
178
|
-
where: { domain: { id: domain.id }, id: targetMenuId },
|
|
179
|
-
relations: ['roles']
|
|
180
|
-
})
|
|
181
|
-
const targetRole: Role = await roleRepo.findOne({ where: { domain: { id: domain.id }, id: roleId } })
|
|
182
|
-
|
|
183
|
-
if (isCheckedMenu) {
|
|
184
|
-
menu.roles = await appendRoleToMenu(roleRepo, menu.roles, targetRole)
|
|
185
|
-
} else {
|
|
186
|
-
menu.roles = removeRoleToMenu(menu.roles, targetRole)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return await menuRepo.save({
|
|
190
|
-
...menu
|
|
191
|
-
})
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
@Directive('@transaction')
|
|
195
|
-
@Mutation(returns => [Menu], { description: 'To update role Menu' })
|
|
196
|
-
async updateRoleMenus(
|
|
197
|
-
@Arg('roleId') roleId: string,
|
|
198
|
-
@Arg('parentMenuId') parentMenuId: string,
|
|
199
|
-
@Arg('isCheckedAll') isCheckedAll: boolean,
|
|
200
|
-
@Ctx() context: ResolverContext
|
|
201
|
-
): Promise<Menu[]> {
|
|
202
|
-
const { domain, tx } = context.state
|
|
203
|
-
|
|
204
|
-
const menuRepo: Repository<Menu> = tx?.getRepository(Menu)
|
|
205
|
-
const roleRepo: Repository<Role> = tx?.getRepository(Role)
|
|
206
|
-
|
|
207
|
-
const targetParentMenu: Menu = await menuRepo.findOne({
|
|
208
|
-
where: { domain: { id: domain.id }, id: parentMenuId },
|
|
209
|
-
relations: ['children', 'children.roles']
|
|
210
|
-
})
|
|
211
|
-
let childMenus: Menu[] = targetParentMenu.children
|
|
212
|
-
|
|
213
|
-
const targetRole: Role = await roleRepo.findOne({ where: { domain: { id: domain.id }, id: roleId } })
|
|
214
|
-
|
|
215
|
-
if (isCheckedAll) {
|
|
216
|
-
childMenus.forEach(async child => {
|
|
217
|
-
child.roles = await appendRoleToMenu(roleRepo, child.roles, targetRole)
|
|
218
|
-
})
|
|
219
|
-
} else {
|
|
220
|
-
childMenus.forEach(child => {
|
|
221
|
-
child.roles = removeRoleToMenu(child.roles, targetRole)
|
|
222
|
-
})
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return await menuRepo.save([...childMenus])
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
@Directive('@transaction')
|
|
229
|
-
@Mutation(returns => Boolean, { description: 'To import multiple Menus' })
|
|
230
|
-
async importMenus(
|
|
231
|
-
@Arg('menus', type => [MenuPatch]) menus: MenuPatch[],
|
|
232
|
-
@Ctx() context: ResolverContext
|
|
233
|
-
): Promise<boolean> {
|
|
234
|
-
const { domain, tx } = context.state
|
|
235
|
-
|
|
236
|
-
await Promise.all(
|
|
237
|
-
menus.map(async (menu: MenuPatch) => {
|
|
238
|
-
const createdMenu: Menu = await tx.getRepository(Menu).save({ domain, ...menu })
|
|
239
|
-
})
|
|
240
|
-
)
|
|
241
|
-
|
|
242
|
-
return true
|
|
243
|
-
}
|
|
244
|
-
}
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
-
import { In, Repository, Brackets, SelectQueryBuilder } from 'typeorm'
|
|
3
|
-
|
|
4
|
-
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
|
5
|
-
import { Role, User } from '@things-factory/auth-base'
|
|
6
|
-
|
|
7
|
-
import { MenuButton } from '../menu-button/menu-button'
|
|
8
|
-
import { MenuColumn } from '../menu-column/menu-column'
|
|
9
|
-
import { Menu } from './menu'
|
|
10
|
-
import { MenuList } from './menu-type'
|
|
11
|
-
|
|
12
|
-
async function getNonRestrictedMenus(domain: Domain): Promise<Menu[]> {
|
|
13
|
-
const menus: Menu[] = await getRepository(Menu).find({
|
|
14
|
-
where: { domain: { id: domain.id }, hiddenFlag: false, menuType: 'MENU' },
|
|
15
|
-
relations: ['parent', 'children', 'children.roles'],
|
|
16
|
-
order: { rank: 'ASC' }
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
menus.forEach(menu => {
|
|
20
|
-
menu.children = menu.children.filter(child => !child.roles?.length)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
return menus
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async function getRestrictedMenus(roleIds: string[], domain: Domain): Promise<Menu[]> {
|
|
27
|
-
const menus: Menu[] = await getRepository(Menu).find({
|
|
28
|
-
where: { domain: { id: domain.id }, hiddenFlag: false, menuType: 'MENU' },
|
|
29
|
-
relations: ['parent', 'children', 'children.roles'],
|
|
30
|
-
order: { rank: 'ASC' }
|
|
31
|
-
})
|
|
32
|
-
const userRoles: Role[] = await getRepository(Role).find({ where: { domain: { id: domain.id }, id: In(roleIds) } })
|
|
33
|
-
|
|
34
|
-
menus.forEach(menu => {
|
|
35
|
-
menu.children = menu.children.filter(child => {
|
|
36
|
-
const childRoleIds = child.roles?.map(role => role.id) || []
|
|
37
|
-
|
|
38
|
-
return userRoles.find(role => childRoleIds.includes(role.id)) || false
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
return menus
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@Resolver(Menu)
|
|
46
|
-
export class MenuQuery {
|
|
47
|
-
@Query(returns => Menu, { description: 'To fetch a Menu' })
|
|
48
|
-
async menu(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Menu> {
|
|
49
|
-
const { domain } = context.state
|
|
50
|
-
|
|
51
|
-
return await getRepository(Menu).findOne({
|
|
52
|
-
where: { domain: { id: domain.id }, id },
|
|
53
|
-
relations: ['roles']
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
@Query(returns => Menu, { description: 'To fetch a Menu by routing' })
|
|
58
|
-
async menuByRouting(@Arg('routing') routing: string, context) {
|
|
59
|
-
const { domain } = context.state
|
|
60
|
-
|
|
61
|
-
return await getRepository(Menu).findOne({
|
|
62
|
-
where: { domain: { id: domain.id }, routing }
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@Query(returns => MenuList, { description: 'To fetch multiple Menus' })
|
|
67
|
-
async menus(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<MenuList> {
|
|
68
|
-
const { domain } = context.state
|
|
69
|
-
|
|
70
|
-
const queryBuilder = getQueryBuilderFromListParams({
|
|
71
|
-
domain,
|
|
72
|
-
params,
|
|
73
|
-
repository: await getRepository(Menu),
|
|
74
|
-
searchables: ['name', 'description']
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
const [items, total] = await queryBuilder.getManyAndCount()
|
|
78
|
-
|
|
79
|
-
return { items, total }
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
@Query(returns => MenuList, { description: 'To fetch my own Menus' })
|
|
83
|
-
async myMenus(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<MenuList> {
|
|
84
|
-
const { domain, user } = context.state
|
|
85
|
-
|
|
86
|
-
const me = await getRepository(User).findOne({
|
|
87
|
-
where: { id: user.id },
|
|
88
|
-
relations: ['roles']
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
const roles = me.roles
|
|
92
|
-
.filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
|
|
93
|
-
.map(role => role.id)
|
|
94
|
-
|
|
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()
|
|
109
|
-
|
|
110
|
-
return { items, total }
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
@Query(returns => MenuList, { description: 'To fetch Menus by role' })
|
|
114
|
-
async roleMenus(@Arg('roleId') roleId: string, @Ctx() context: ResolverContext) {
|
|
115
|
-
const { domain } = context.state
|
|
116
|
-
|
|
117
|
-
const menuRepo: Repository<Menu> = getRepository(Menu)
|
|
118
|
-
const menus: Menu[] = await menuRepo.find({
|
|
119
|
-
where: { domain: { id: domain.id } },
|
|
120
|
-
relations: ['parent', 'roles']
|
|
121
|
-
})
|
|
122
|
-
const role: Role = await getRepository(Role).findOne({ where: { domain: { id: domain.id }, id: roleId } })
|
|
123
|
-
|
|
124
|
-
let newChildMenus: Menu[] = []
|
|
125
|
-
|
|
126
|
-
menus.forEach(menu => {
|
|
127
|
-
if (menu.roles) {
|
|
128
|
-
const menuRoleIds = menu.roles.map(role => role.id)
|
|
129
|
-
|
|
130
|
-
if (menuRoleIds.includes(role.id)) {
|
|
131
|
-
newChildMenus.push(menu)
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
return { items: newChildMenus, total: newChildMenus.length }
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
@Query(returns => [Menu], { description: 'To fetch Menus by role' })
|
|
140
|
-
async userMenus(@Ctx() context: ResolverContext): Promise<Menu[]> {
|
|
141
|
-
const { domain, user } = context.state
|
|
142
|
-
|
|
143
|
-
var menus: Menu[] = []
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
const qb: SelectQueryBuilder<User> = getRepository(User).createQueryBuilder('USER')
|
|
147
|
-
const user: User = await qb
|
|
148
|
-
.leftJoinAndSelect('USER.roles', 'ROLES')
|
|
149
|
-
.leftJoinAndSelect('ROLES.domain', 'ROLES_DOMAIN')
|
|
150
|
-
.where('USER.id = :userId', { userId: context.state.user.id })
|
|
151
|
-
.andWhere('ROLES_DOMAIN.id = :domainId', { domainId: context.state.domain.id })
|
|
152
|
-
.getOne()
|
|
153
|
-
|
|
154
|
-
// get menus which are non-restricted by any role.
|
|
155
|
-
menus.push(...(await getNonRestrictedMenus(context.state.domain)))
|
|
156
|
-
|
|
157
|
-
const userRoleIds: string[] = user.roles.map((role: Role) => role.id)
|
|
158
|
-
let restrictedMenus: Menu[] = []
|
|
159
|
-
if (userRoleIds?.length) {
|
|
160
|
-
// get menus which are restricted by role ()
|
|
161
|
-
restrictedMenus = [...(await getRestrictedMenus(userRoleIds, context.state.domain))]
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const restrictedMenuIds: string[] = restrictedMenus.map((restrictedMenu: Menu) => restrictedMenu.id)
|
|
165
|
-
menus.forEach(menu => {
|
|
166
|
-
const idx = restrictedMenuIds.indexOf(menu.id)
|
|
167
|
-
if (idx !== -1) {
|
|
168
|
-
menu.children = Array.from(new Set([...restrictedMenus[idx].children, ...menu.children]))
|
|
169
|
-
}
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
return menus.filter((groupMenu: Menu) => groupMenu?.children?.length)
|
|
173
|
-
} catch (e) {
|
|
174
|
-
throw e
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
@FieldResolver(type => [Menu])
|
|
179
|
-
async children(
|
|
180
|
-
@Root() menu: Menu,
|
|
181
|
-
@Arg('permittedOnly', { defaultValue: false }) permittedOnly: boolean,
|
|
182
|
-
@Ctx() context: ResolverContext
|
|
183
|
-
): Promise<Menu[]> {
|
|
184
|
-
if (!permittedOnly) {
|
|
185
|
-
return (
|
|
186
|
-
menu.children ||
|
|
187
|
-
(await getRepository(Menu).findBy({
|
|
188
|
-
parent: { id: menu.id }
|
|
189
|
-
}))
|
|
190
|
-
)
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const { domain, user } = context.state
|
|
194
|
-
|
|
195
|
-
const me = await getRepository(User).findOne({
|
|
196
|
-
where: { id: user.id },
|
|
197
|
-
relations: ['roles']
|
|
198
|
-
})
|
|
199
|
-
|
|
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()
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
@FieldResolver(type => [MenuButton])
|
|
217
|
-
async buttons(@Root() menu: Menu): Promise<MenuButton[]> {
|
|
218
|
-
return await getRepository(MenuButton).findBy({
|
|
219
|
-
menu: { id: menu.id }
|
|
220
|
-
})
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
@FieldResolver(type => [MenuColumn])
|
|
224
|
-
async columns(@Root() menu: Menu): Promise<MenuColumn[]> {
|
|
225
|
-
return await getRepository(MenuColumn).findBy({
|
|
226
|
-
menu: { id: menu.id }
|
|
227
|
-
})
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
@FieldResolver(type => Role)
|
|
231
|
-
async role(@Root() menu: Menu) {
|
|
232
|
-
return menu.roleId && (await getRepository(Role).findOneBy({ id: menu.roleId }))
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
@FieldResolver(type => Domain)
|
|
236
|
-
async domain(@Root() menu: Menu): Promise<Domain> {
|
|
237
|
-
return await getRepository(Domain).findOneBy({ id: menu.domainId })
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
@FieldResolver(type => User)
|
|
241
|
-
async updater(@Root() menu: Menu): Promise<User> {
|
|
242
|
-
return await getRepository(User).findOneBy({ id: menu.updaterId })
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
@FieldResolver(type => User)
|
|
246
|
-
async creator(@Root() menu: Menu): Promise<User> {
|
|
247
|
-
return await getRepository(User).findOneBy({ id: menu.creatorId })
|
|
248
|
-
}
|
|
249
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
|
|
2
|
-
|
|
3
|
-
import { ObjectRef } from '@things-factory/shell'
|
|
4
|
-
|
|
5
|
-
import { Menu } from './menu'
|
|
6
|
-
|
|
7
|
-
@InputType()
|
|
8
|
-
export class NewMenu {
|
|
9
|
-
@Field() name: string
|
|
10
|
-
@Field() menuType: string
|
|
11
|
-
|
|
12
|
-
@Field({ nullable: true }) description?: string
|
|
13
|
-
@Field({ nullable: true }) category: string
|
|
14
|
-
@Field(type => Int, { nullable: true }) rank?: number
|
|
15
|
-
@Field({ nullable: true }) routing?: string
|
|
16
|
-
@Field({ nullable: true }) routingType?: string
|
|
17
|
-
@Field({ nullable: true }) resourceType?: string
|
|
18
|
-
@Field({ nullable: true }) resourceId?: string
|
|
19
|
-
@Field({ nullable: true }) resourceUrl?: string
|
|
20
|
-
@Field({ nullable: true }) resourceName?: string
|
|
21
|
-
@Field({ nullable: true }) idField?: string
|
|
22
|
-
@Field({ nullable: true }) titleField?: string
|
|
23
|
-
@Field({ nullable: true }) gridSaveUrl?: string
|
|
24
|
-
@Field({ nullable: true }) pagination?: boolean
|
|
25
|
-
@Field({ nullable: true }) detailFormId?: string
|
|
26
|
-
@Field({ nullable: true }) detailLayout?: string
|
|
27
|
-
@Field({ nullable: true }) template?: string
|
|
28
|
-
@Field({ nullable: true }) hiddenFlag?: boolean
|
|
29
|
-
@Field({ nullable: true }) itemsProp?: string
|
|
30
|
-
@Field({ nullable: true }) totalProp?: string
|
|
31
|
-
@Field(type => Int, { nullable: true }) fixedColumns?: number
|
|
32
|
-
@Field({ nullable: true }) iconPath?: string
|
|
33
|
-
@Field({ nullable: true }) role?: ObjectRef
|
|
34
|
-
@Field({ nullable: true }) parent?: ObjectRef
|
|
35
|
-
@Field(type => [ObjectRef], { nullable: true }) children?: ObjectRef[]
|
|
36
|
-
@Field(type => [ObjectRef], { nullable: true }) buttons?: ObjectRef[]
|
|
37
|
-
@Field(type => [ObjectRef], { nullable: true }) columns?: ObjectRef[]
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
@InputType()
|
|
41
|
-
export class MenuPatch {
|
|
42
|
-
@Field(type => ID, { nullable: true }) id?: string
|
|
43
|
-
@Field({ nullable: true }) category?: string
|
|
44
|
-
@Field({ nullable: true }) name?: string
|
|
45
|
-
@Field({ nullable: true }) description?: string
|
|
46
|
-
@Field({ nullable: true }) menuType?: string
|
|
47
|
-
@Field(type => Int, { nullable: true }) rank?: number
|
|
48
|
-
@Field({ nullable: true }) routing?: string
|
|
49
|
-
@Field({ nullable: true }) routingType?: string
|
|
50
|
-
@Field({ nullable: true }) resourceType?: string
|
|
51
|
-
@Field({ nullable: true }) resourceId?: string
|
|
52
|
-
@Field({ nullable: true }) resourceUrl?: string
|
|
53
|
-
@Field({ nullable: true }) resourceName?: string
|
|
54
|
-
@Field({ nullable: true }) idField?: string
|
|
55
|
-
@Field({ nullable: true }) titleField?: string
|
|
56
|
-
@Field({ nullable: true }) gridSaveUrl?: string
|
|
57
|
-
@Field({ nullable: true }) pagination?: boolean
|
|
58
|
-
@Field({ nullable: true }) detailFormId?: string
|
|
59
|
-
@Field({ nullable: true }) detailLayout?: string
|
|
60
|
-
@Field({ nullable: true }) template?: string
|
|
61
|
-
@Field({ nullable: true }) hiddenFlag?: boolean
|
|
62
|
-
@Field({ nullable: true }) itemsProp?: string
|
|
63
|
-
@Field({ nullable: true }) totalProp?: string
|
|
64
|
-
@Field(type => Int, { nullable: true }) fixedColumns?: number
|
|
65
|
-
@Field({ nullable: true }) iconPath?: string
|
|
66
|
-
@Field({ nullable: true }) role?: ObjectRef
|
|
67
|
-
@Field({ nullable: true }) parent?: ObjectRef
|
|
68
|
-
@Field(type => [ObjectRef], { nullable: true }) children?: ObjectRef[]
|
|
69
|
-
@Field(type => [ObjectRef], { nullable: true }) buttons?: ObjectRef[]
|
|
70
|
-
@Field(type => [ObjectRef], { nullable: true }) columns?: ObjectRef[]
|
|
71
|
-
@Field({ nullable: true }) cuFlag?: string
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@ObjectType()
|
|
75
|
-
export class MenuList {
|
|
76
|
-
@Field(type => [Menu]) items: Menu[]
|
|
77
|
-
@Field(type => Int) total: number
|
|
78
|
-
}
|