@things-factory/setting-base 8.0.0-beta.9 → 8.0.2
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/client/actions/setting.ts +3 -0
- package/client/bootstrap.ts +8 -0
- package/client/index.ts +2 -0
- package/client/layout/settinglet.ts +43 -0
- package/client/reducers/setting.ts +33 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/server/index.ts +2 -0
- package/server/migrations/index.ts +9 -0
- package/server/service/index.ts +25 -0
- package/server/service/partner-setting/index.ts +6 -0
- package/server/service/partner-setting/partner-setting-mutation.ts +98 -0
- package/server/service/partner-setting/partner-setting-query.ts +123 -0
- package/server/service/partner-setting/partner-setting-type.ts +42 -0
- package/server/service/partner-setting/partner-setting.ts +109 -0
- package/server/service/setting/index.ts +6 -0
- package/server/service/setting/setting-mutation.ts +118 -0
- package/server/service/setting/setting-query.ts +88 -0
- package/server/service/setting/setting-type.ts +48 -0
- package/server/service/setting/setting.ts +86 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/setting-base",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.2",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create ./server/migrations/migration"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@things-factory/auth-base": "^8.0.
|
|
31
|
-
"@things-factory/code-base": "^8.0.
|
|
30
|
+
"@things-factory/auth-base": "^8.0.2",
|
|
31
|
+
"@things-factory/code-base": "^8.0.2"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "39d60f56e142561233ddf6d47b539c637971357c"
|
|
34
34
|
}
|
package/server/index.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const glob = require('glob')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
|
|
4
|
+
export var migrations = []
|
|
5
|
+
|
|
6
|
+
glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
|
|
7
|
+
if (file.indexOf('index.js') !== -1) return
|
|
8
|
+
migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
|
|
9
|
+
})
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* IMPORT ENTITIES AND RESOLVERS */
|
|
2
|
+
import { entities as PartnerSettingEntities, resolvers as PartnerSettingResolvers } from './partner-setting'
|
|
3
|
+
import { entities as SettingEntities, resolvers as SettingResolvers } from './setting'
|
|
4
|
+
|
|
5
|
+
/* EXPORT ENTITY TYPES */
|
|
6
|
+
export * from './partner-setting/partner-setting'
|
|
7
|
+
export * from './setting/setting'
|
|
8
|
+
|
|
9
|
+
/* EXPORT TYPES */
|
|
10
|
+
export * from './partner-setting/partner-setting-type'
|
|
11
|
+
export * from './setting/setting-type'
|
|
12
|
+
|
|
13
|
+
export const entities = [
|
|
14
|
+
/* ENTITIES */
|
|
15
|
+
...PartnerSettingEntities,
|
|
16
|
+
...SettingEntities
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
export const schema = {
|
|
20
|
+
resolverClasses: [
|
|
21
|
+
/* RESOLVER CLASSES */
|
|
22
|
+
...PartnerSettingResolvers,
|
|
23
|
+
...SettingResolvers
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PartnerSetting } from './partner-setting'
|
|
2
|
+
import { PartnerSettingQuery } from './partner-setting-query'
|
|
3
|
+
import { PartnerSettingMutation } from './partner-setting-mutation'
|
|
4
|
+
|
|
5
|
+
export const entities = [PartnerSetting]
|
|
6
|
+
export const resolvers = [PartnerSettingQuery, PartnerSettingMutation]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
+
import { In, Repository } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { Domain, getRepository } from '@things-factory/shell'
|
|
5
|
+
|
|
6
|
+
import { Setting } from '../setting/setting'
|
|
7
|
+
import { PartnerSetting } from './partner-setting'
|
|
8
|
+
import { PartnerSettingPatch } from './partner-setting-type'
|
|
9
|
+
|
|
10
|
+
@Resolver(PartnerSetting)
|
|
11
|
+
export class PartnerSettingMutation {
|
|
12
|
+
@Directive('@transaction')
|
|
13
|
+
@Mutation(returns => [PartnerSetting], { description: "To modify multiple PartnerSettings' information" })
|
|
14
|
+
async updateMultiplePartnerSetting(
|
|
15
|
+
@Arg('patches', type => [PartnerSettingPatch]) patches: PartnerSettingPatch[],
|
|
16
|
+
@Ctx() context: ResolverContext
|
|
17
|
+
): Promise<PartnerSetting[]> {
|
|
18
|
+
const { tx, domain, user } = context.state
|
|
19
|
+
const partnerSettingRepo: Repository<PartnerSetting> =
|
|
20
|
+
tx?.getRepository(PartnerSetting) || getRepository(PartnerSetting)
|
|
21
|
+
const domainRepo: Repository<Domain> = tx?.getRepository(Domain) || getRepository(Domain)
|
|
22
|
+
const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
|
|
23
|
+
|
|
24
|
+
const { createRecords, updateRecords } = patches.reduce(
|
|
25
|
+
(records, patch) => {
|
|
26
|
+
if (patch.cuFlag === '+') records.createRecords.push(patch)
|
|
27
|
+
if (patch.cuFlag.toUpperCase() === 'M') records.updateRecords.push(patch)
|
|
28
|
+
|
|
29
|
+
return records
|
|
30
|
+
},
|
|
31
|
+
{ createRecords: [], updateRecords: [] }
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
let results: PartnerSetting[] = []
|
|
35
|
+
|
|
36
|
+
if (createRecords?.length) {
|
|
37
|
+
await Promise.all(
|
|
38
|
+
createRecords.map(async (record: PartnerSetting) => {
|
|
39
|
+
const partnerDomain: Domain = await domainRepo.findOneBy({ id: record.partnerDomain.id })
|
|
40
|
+
const setting: Setting = await settingRepo.findOneBy({ id: record.setting.id })
|
|
41
|
+
|
|
42
|
+
const result: PartnerSetting = await partnerSettingRepo.save({
|
|
43
|
+
domain,
|
|
44
|
+
creator: user,
|
|
45
|
+
updater: user,
|
|
46
|
+
...record,
|
|
47
|
+
name: setting.name,
|
|
48
|
+
description: setting.description,
|
|
49
|
+
category: setting.category,
|
|
50
|
+
partnerDomain,
|
|
51
|
+
setting
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
results.push(result)
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (updateRecords?.length) {
|
|
60
|
+
await Promise.all(
|
|
61
|
+
updateRecords.map(async (record: PartnerSetting) => {
|
|
62
|
+
const partnerDomain: Domain = await domainRepo.findOneBy({ id: record.partnerDomain.id })
|
|
63
|
+
const setting: Setting = await settingRepo.findOneBy({ id: record.setting.id })
|
|
64
|
+
|
|
65
|
+
const partnerSetting: PartnerSetting = await partnerSettingRepo.findOneBy({ id: setting.id })
|
|
66
|
+
if (!record.id) throw new Error('Cannot update record without its ID')
|
|
67
|
+
|
|
68
|
+
const result = await partnerSettingRepo.save({
|
|
69
|
+
...partnerSetting,
|
|
70
|
+
...record,
|
|
71
|
+
name: setting.name,
|
|
72
|
+
description: setting.description,
|
|
73
|
+
category: setting.category,
|
|
74
|
+
updater: user,
|
|
75
|
+
partnerDomain,
|
|
76
|
+
setting
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
results.push(result)
|
|
80
|
+
})
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return results
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@Directive('@transaction')
|
|
88
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple partnerSettings' })
|
|
89
|
+
async deletePartnerSettings(
|
|
90
|
+
@Arg('ids', type => [String]) ids: string[],
|
|
91
|
+
@Ctx() context: ResolverContext
|
|
92
|
+
): Promise<boolean> {
|
|
93
|
+
const { domain, tx } = context.state
|
|
94
|
+
|
|
95
|
+
await tx.getRepository(PartnerSetting).delete({ id: In(ids), domain: { id: domain.id } })
|
|
96
|
+
return true
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
+
import { SelectQueryBuilder } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { User } from '@things-factory/auth-base'
|
|
5
|
+
import {
|
|
6
|
+
Domain,
|
|
7
|
+
Filter,
|
|
8
|
+
getRepository,
|
|
9
|
+
ObjectRef,
|
|
10
|
+
Pagination,
|
|
11
|
+
Sorting,
|
|
12
|
+
getQueryBuilderFromListParams
|
|
13
|
+
} from '@things-factory/shell'
|
|
14
|
+
|
|
15
|
+
import { Setting } from '../setting/setting'
|
|
16
|
+
import { PartnerSetting } from './partner-setting'
|
|
17
|
+
import { PartnerSettingList } from './partner-setting-type'
|
|
18
|
+
|
|
19
|
+
@Resolver(PartnerSetting)
|
|
20
|
+
export class PartnerSettingQuery {
|
|
21
|
+
@Query(returns => PartnerSetting, { description: 'To fetch a PartnerSetting' })
|
|
22
|
+
async partnerSetting(
|
|
23
|
+
@Arg('name') name: string,
|
|
24
|
+
@Arg('partnerDomainId') partnerDomainId: string,
|
|
25
|
+
@Ctx() context: ResolverContext
|
|
26
|
+
): Promise<PartnerSetting> {
|
|
27
|
+
const { domain } = context.state
|
|
28
|
+
const setting: Setting = await getRepository(Setting).findOne({ where: { domain: { id: domain.id }, name } })
|
|
29
|
+
|
|
30
|
+
const partnerSetting: PartnerSetting = await getRepository(PartnerSetting).findOne({
|
|
31
|
+
where: { domain: { id: domain.id }, setting: { id: setting.id }, partnerDomain: { id: partnerDomainId } }
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
if (!partnerSetting) throw new Error(`${name} setting is not found`)
|
|
35
|
+
|
|
36
|
+
return partnerSetting || (setting as PartnerSetting)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@Query(returns => PartnerSettingList, { description: 'To fetch multiple PartnerSettings' })
|
|
40
|
+
async partnerSettings(
|
|
41
|
+
@Arg('filters', type => [Filter]) filters: Filter[],
|
|
42
|
+
@Arg('pagination', type => Pagination) pagination: Pagination,
|
|
43
|
+
@Arg('sortings', type => [Sorting]) sortings: Sorting[],
|
|
44
|
+
@Arg('partnerDomain', type => ObjectRef) partnerDomain: ObjectRef,
|
|
45
|
+
@Ctx() context: ResolverContext
|
|
46
|
+
): Promise<PartnerSettingList> {
|
|
47
|
+
const { domain } = context.state
|
|
48
|
+
const qb: SelectQueryBuilder<PartnerSetting> = await getQueryBuilderFromListParams({
|
|
49
|
+
repository: getRepository(PartnerSetting),
|
|
50
|
+
alias: 'ps',
|
|
51
|
+
params: { filters, pagination, sortings },
|
|
52
|
+
domain,
|
|
53
|
+
searchables: ['name', 'description'],
|
|
54
|
+
filtersMap: {
|
|
55
|
+
name: {
|
|
56
|
+
relationColumn: 'setting',
|
|
57
|
+
columnName: 'name'
|
|
58
|
+
},
|
|
59
|
+
description: {
|
|
60
|
+
relationColumn: 'setting',
|
|
61
|
+
columnName: 'description'
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
qb.leftJoinAndSelect('ps.setting', 'Setting').andWhere('ps.partner_domain_id = :partnerDomainId', {
|
|
67
|
+
partnerDomainId: partnerDomain.id
|
|
68
|
+
})
|
|
69
|
+
const [items, total] = await qb.getManyAndCount()
|
|
70
|
+
|
|
71
|
+
return { items, total }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@FieldResolver(type => Domain)
|
|
75
|
+
async partnerDomain(@Root() partnerSetting: PartnerSetting): Promise<Domain> {
|
|
76
|
+
return await getRepository(Domain).findOneBy({ id: partnerSetting.partnerDomainId })
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@FieldResolver(type => Setting)
|
|
80
|
+
async setting(@Root() partnerSetting: PartnerSetting): Promise<Setting> {
|
|
81
|
+
return await getRepository(Setting).findOneBy({ id: partnerSetting.settingId })
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@FieldResolver(type => String)
|
|
85
|
+
async name(@Root() partnerSetting: PartnerSetting): Promise<string> {
|
|
86
|
+
if (partnerSetting.setting?.name) {
|
|
87
|
+
return partnerSetting.setting.name
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return (await getRepository(Setting).findOneBy({ id: partnerSetting.settingId }))?.name
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async description(@Root() partnerSetting: PartnerSetting): Promise<string> {
|
|
94
|
+
if (partnerSetting.setting?.description) {
|
|
95
|
+
return partnerSetting.setting.description
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return (await getRepository(Setting).findOneBy({ id: partnerSetting.settingId }))?.description
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async category(@Root() partnerSetting: PartnerSetting): Promise<string> {
|
|
102
|
+
if (partnerSetting.setting?.category) {
|
|
103
|
+
return partnerSetting.setting.category
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return (await getRepository(Setting).findOneBy({ id: partnerSetting.settingId }))?.category
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@FieldResolver(type => Domain)
|
|
110
|
+
async domain(@Root() partnerSetting: PartnerSetting): Promise<Domain> {
|
|
111
|
+
return await getRepository(Domain).findOneBy({ id: partnerSetting.domainId })
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@FieldResolver(type => User)
|
|
115
|
+
async updater(@Root() partnerSetting: PartnerSetting): Promise<User> {
|
|
116
|
+
return await getRepository(User).findOneBy({ id: partnerSetting.updaterId })
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@FieldResolver(type => User)
|
|
120
|
+
async creator(@Root() partnerSetting: PartnerSetting): Promise<User> {
|
|
121
|
+
return await getRepository(User).findOneBy({ id: partnerSetting.creatorId })
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
|
|
2
|
+
import { ObjectRef } from '@things-factory/shell'
|
|
3
|
+
import { PartnerSetting } from './partner-setting'
|
|
4
|
+
|
|
5
|
+
@InputType()
|
|
6
|
+
export class NewPartnerSetting {
|
|
7
|
+
@Field(type => ObjectRef)
|
|
8
|
+
partnerDomain: ObjectRef
|
|
9
|
+
|
|
10
|
+
@Field(type => ObjectRef, { nullable: true })
|
|
11
|
+
setting: ObjectRef
|
|
12
|
+
|
|
13
|
+
@Field({ nullable: true })
|
|
14
|
+
value?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@InputType()
|
|
18
|
+
export class PartnerSettingPatch {
|
|
19
|
+
@Field(type => ID, { nullable: true })
|
|
20
|
+
id?: string
|
|
21
|
+
|
|
22
|
+
@Field(type => ObjectRef, { nullable: true })
|
|
23
|
+
partnerDomain: ObjectRef
|
|
24
|
+
|
|
25
|
+
@Field(type => ObjectRef, { nullable: true })
|
|
26
|
+
setting: ObjectRef
|
|
27
|
+
|
|
28
|
+
@Field({ nullable: true })
|
|
29
|
+
value?: string
|
|
30
|
+
|
|
31
|
+
@Field()
|
|
32
|
+
cuFlag: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@ObjectType()
|
|
36
|
+
export class PartnerSettingList {
|
|
37
|
+
@Field(type => [PartnerSetting])
|
|
38
|
+
items: PartnerSetting[]
|
|
39
|
+
|
|
40
|
+
@Field(type => Int)
|
|
41
|
+
total: number
|
|
42
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Field, ID, ObjectType } from 'type-graphql'
|
|
2
|
+
import {
|
|
3
|
+
Column,
|
|
4
|
+
CreateDateColumn,
|
|
5
|
+
Entity,
|
|
6
|
+
EntityManager,
|
|
7
|
+
getRepository,
|
|
8
|
+
Index,
|
|
9
|
+
ManyToOne,
|
|
10
|
+
PrimaryGeneratedColumn,
|
|
11
|
+
RelationId,
|
|
12
|
+
Repository,
|
|
13
|
+
UpdateDateColumn
|
|
14
|
+
} from 'typeorm'
|
|
15
|
+
|
|
16
|
+
import { User } from '@things-factory/auth-base'
|
|
17
|
+
import { Domain } from '@things-factory/shell'
|
|
18
|
+
|
|
19
|
+
import { Setting } from '../setting/setting'
|
|
20
|
+
|
|
21
|
+
@Entity()
|
|
22
|
+
@Index(
|
|
23
|
+
'ix_partner_setting_0',
|
|
24
|
+
partnerSetting => [partnerSetting.domain, partnerSetting.partnerDomain, partnerSetting.setting],
|
|
25
|
+
{ unique: true }
|
|
26
|
+
)
|
|
27
|
+
@ObjectType({ description: 'Entity for PartnerSetting' })
|
|
28
|
+
export class PartnerSetting {
|
|
29
|
+
@PrimaryGeneratedColumn('uuid')
|
|
30
|
+
@Field(type => ID)
|
|
31
|
+
readonly id: string
|
|
32
|
+
|
|
33
|
+
@ManyToOne(type => Domain)
|
|
34
|
+
@Field(type => Domain)
|
|
35
|
+
domain?: Domain
|
|
36
|
+
|
|
37
|
+
@RelationId((partnerSetting: PartnerSetting) => partnerSetting.domain)
|
|
38
|
+
domainId?: string
|
|
39
|
+
|
|
40
|
+
@ManyToOne(type => Domain, { nullable: false })
|
|
41
|
+
@Field(type => Domain, { nullable: true })
|
|
42
|
+
partnerDomain: Domain
|
|
43
|
+
|
|
44
|
+
@RelationId((partnerSetting: PartnerSetting) => partnerSetting.partnerDomain)
|
|
45
|
+
@Field({ nullable: true })
|
|
46
|
+
partnerDomainId?: string
|
|
47
|
+
|
|
48
|
+
@ManyToOne(type => Setting)
|
|
49
|
+
@Field({ nullable: true })
|
|
50
|
+
setting: Setting
|
|
51
|
+
|
|
52
|
+
@RelationId((partnerSetting: PartnerSetting) => partnerSetting.setting)
|
|
53
|
+
@Field({ nullable: true })
|
|
54
|
+
settingId?: string
|
|
55
|
+
|
|
56
|
+
@Column({
|
|
57
|
+
nullable: true
|
|
58
|
+
})
|
|
59
|
+
@Field({ nullable: true })
|
|
60
|
+
value?: string
|
|
61
|
+
|
|
62
|
+
@Field({ nullable: true })
|
|
63
|
+
name?: string
|
|
64
|
+
|
|
65
|
+
@Field({ nullable: true })
|
|
66
|
+
description?: string
|
|
67
|
+
|
|
68
|
+
@Field({ nullable: true })
|
|
69
|
+
category?: string
|
|
70
|
+
|
|
71
|
+
@CreateDateColumn()
|
|
72
|
+
@Field({ nullable: true })
|
|
73
|
+
createdAt?: Date
|
|
74
|
+
|
|
75
|
+
@UpdateDateColumn()
|
|
76
|
+
@Field({ nullable: true })
|
|
77
|
+
updatedAt?: Date
|
|
78
|
+
|
|
79
|
+
@ManyToOne(type => User, { nullable: true })
|
|
80
|
+
@Field(type => User, { nullable: true })
|
|
81
|
+
creator?: User
|
|
82
|
+
|
|
83
|
+
@RelationId((partnerSetting: PartnerSetting) => partnerSetting.creator)
|
|
84
|
+
creatorId?: string
|
|
85
|
+
|
|
86
|
+
@ManyToOne(type => User, { nullable: true })
|
|
87
|
+
@Field(type => User, { nullable: true })
|
|
88
|
+
updater?: User
|
|
89
|
+
|
|
90
|
+
@RelationId((partnerSetting: PartnerSetting) => partnerSetting.updater)
|
|
91
|
+
updaterId?: string
|
|
92
|
+
|
|
93
|
+
static async get(domain: Domain, partnerDomain: Domain, name: string, tx?: EntityManager): Promise<string> {
|
|
94
|
+
const partnerSettingRepo: Repository<PartnerSetting> =
|
|
95
|
+
tx?.getRepository(PartnerSetting) || getRepository(PartnerSetting)
|
|
96
|
+
const settingRepo: Repository<Setting> = tx?.getRepository(Setting) || getRepository(Setting)
|
|
97
|
+
const setting: Setting = await settingRepo.findOneBy({ domain: { id: domain.id }, name })
|
|
98
|
+
|
|
99
|
+
if (!setting) throw new Error(`No setting found has '${name}' as its name`)
|
|
100
|
+
|
|
101
|
+
const domainSetting: PartnerSetting = await partnerSettingRepo.findOneBy({
|
|
102
|
+
domain: { id: domain.id },
|
|
103
|
+
partnerDomain: { id: partnerDomain.id },
|
|
104
|
+
setting: { id: setting.id }
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
return domainSetting?.value || setting?.value
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
+
import { In } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { Setting } from './setting'
|
|
5
|
+
import { NewSetting, SettingPatch } from './setting-type'
|
|
6
|
+
|
|
7
|
+
@Resolver(Setting)
|
|
8
|
+
export class SettingMutation {
|
|
9
|
+
@Directive('@transaction')
|
|
10
|
+
@Directive('@privilege(category: "setting", privilege: "mutation")')
|
|
11
|
+
@Mutation(returns => Setting, { description: 'To create new Setting' })
|
|
12
|
+
async createSetting(@Arg('setting') setting: NewSetting, @Ctx() context: ResolverContext): Promise<Setting> {
|
|
13
|
+
const { tx, domain, user } = context.state
|
|
14
|
+
return await tx.getRepository(Setting).save({
|
|
15
|
+
domain,
|
|
16
|
+
...setting,
|
|
17
|
+
creator: user,
|
|
18
|
+
updater: user
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Directive('@transaction')
|
|
23
|
+
@Directive('@privilege(category: "setting", privilege: "mutation")')
|
|
24
|
+
@Mutation(returns => Setting, { description: 'To modify Setting information' })
|
|
25
|
+
async updateSetting(
|
|
26
|
+
@Arg('name') name: string,
|
|
27
|
+
@Arg('patch') patch: SettingPatch,
|
|
28
|
+
@Ctx() context: ResolverContext
|
|
29
|
+
): Promise<Setting> {
|
|
30
|
+
const { tx, domain, user } = context.state
|
|
31
|
+
|
|
32
|
+
const repository = tx.getRepository(Setting)
|
|
33
|
+
const setting = await repository.findOneBy({ domain: { id: domain.id }, name })
|
|
34
|
+
|
|
35
|
+
return await repository.save({
|
|
36
|
+
name,
|
|
37
|
+
creater: user,
|
|
38
|
+
...setting,
|
|
39
|
+
...patch,
|
|
40
|
+
domain,
|
|
41
|
+
updater: user
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Directive('@transaction')
|
|
46
|
+
@Directive('@privilege(category: "setting", privilege: "mutation")')
|
|
47
|
+
@Mutation(returns => [Setting], { description: "To modify multiple Settings' information" })
|
|
48
|
+
async updateMultipleSetting(
|
|
49
|
+
@Arg('patches', type => [SettingPatch]) patches: SettingPatch[],
|
|
50
|
+
@Ctx() context: ResolverContext
|
|
51
|
+
): Promise<Setting[]> {
|
|
52
|
+
const { tx, domain, user } = context.state
|
|
53
|
+
|
|
54
|
+
let results = []
|
|
55
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag === '+')
|
|
56
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
57
|
+
const settingRepo = tx.getRepository(Setting)
|
|
58
|
+
|
|
59
|
+
if (_createRecords.length > 0) {
|
|
60
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
61
|
+
const newRecord = _createRecords[i]
|
|
62
|
+
|
|
63
|
+
const result = await settingRepo.save({
|
|
64
|
+
domain: { id: domain.id },
|
|
65
|
+
creator: user,
|
|
66
|
+
updater: user,
|
|
67
|
+
...newRecord
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
results.push({ ...result, cuFlag: '+' })
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (_updateRecords.length > 0) {
|
|
75
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
76
|
+
const newRecord = _updateRecords[i]
|
|
77
|
+
const setting = await settingRepo.findOneBy({ id: newRecord.id })
|
|
78
|
+
|
|
79
|
+
const result = await settingRepo.save({
|
|
80
|
+
...setting,
|
|
81
|
+
...newRecord,
|
|
82
|
+
updater: user
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
results.push({ ...result, cuFlag: 'M' })
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return results
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@Directive('@transaction')
|
|
93
|
+
@Directive('@privilege(category: "setting", privilege: "mutation")')
|
|
94
|
+
@Mutation(returns => Boolean, { description: 'To delete Setting' })
|
|
95
|
+
async deleteSetting(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
|
96
|
+
const { tx, domain } = context.state
|
|
97
|
+
|
|
98
|
+
await tx.getRepository(Setting).delete({ domain: { id: domain.id }, name })
|
|
99
|
+
return true
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@Directive('@transaction')
|
|
103
|
+
@Directive('@privilege(category: "setting", privilege: "mutation")')
|
|
104
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple settings' })
|
|
105
|
+
async deleteSettings(
|
|
106
|
+
@Arg('names', type => [String]) names: string[],
|
|
107
|
+
@Ctx() context: ResolverContext
|
|
108
|
+
): Promise<boolean> {
|
|
109
|
+
const { tx, domain } = context.state
|
|
110
|
+
|
|
111
|
+
await tx.getRepository(Setting).delete({
|
|
112
|
+
domain: { id: domain.id },
|
|
113
|
+
name: In(names)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
return true
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { Domain, getRepository, ListParam, getQueryBuilderFromListParams } from '@things-factory/shell'
|
|
5
|
+
|
|
6
|
+
import { PartnerSetting } from '../partner-setting/partner-setting'
|
|
7
|
+
import { Setting } from './setting'
|
|
8
|
+
import { SettingList } from './setting-type'
|
|
9
|
+
|
|
10
|
+
@Resolver(Setting)
|
|
11
|
+
export class SettingQuery {
|
|
12
|
+
@Directive('@privilege(category: "setting", privilege: "query", domainOwnerGranted: true)')
|
|
13
|
+
@Query(returns => Setting, { description: 'To fetch a Setting' })
|
|
14
|
+
async setting(
|
|
15
|
+
@Arg('name') name: string,
|
|
16
|
+
@Arg('partnerDomainId', { nullable: true }) partnerDomainId: string,
|
|
17
|
+
@Ctx() context: ResolverContext
|
|
18
|
+
): Promise<Setting> {
|
|
19
|
+
const { domain } = context.state
|
|
20
|
+
|
|
21
|
+
let setting: Setting = await getRepository(Setting).findOne({ where: { domain: { id: domain.id }, name } })
|
|
22
|
+
if (!setting) throw new Error(`${name} setting not found`)
|
|
23
|
+
|
|
24
|
+
if (partnerDomainId) {
|
|
25
|
+
const partnerDomain: Domain = await getRepository(Domain).findOneBy({ id: partnerDomainId })
|
|
26
|
+
const partnerSetting: PartnerSetting = await getRepository(PartnerSetting).findOneBy({
|
|
27
|
+
setting: { id: setting.id },
|
|
28
|
+
domain: { id: domain.id },
|
|
29
|
+
partnerDomain: { id: partnerDomain.id }
|
|
30
|
+
})
|
|
31
|
+
if (partnerSetting) setting.value = partnerSetting.value
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return setting
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@Directive('@privilege(category: "setting", privilege: "query", domainOwnerGranted: true)')
|
|
38
|
+
@Query(returns => SettingList, { description: 'To fetch multiple Settings' })
|
|
39
|
+
async settings(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<SettingList> {
|
|
40
|
+
const { domain } = context.state
|
|
41
|
+
const queryBuilder = getQueryBuilderFromListParams({
|
|
42
|
+
repository: getRepository(Setting),
|
|
43
|
+
params,
|
|
44
|
+
domain,
|
|
45
|
+
searchables: ['name', 'description', 'category']
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const [items, total] = await queryBuilder.getManyAndCount()
|
|
49
|
+
return { items, total }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// @FieldResolver(type => Domain)
|
|
53
|
+
// async value(@Root() setting: Setting, @Ctx() context: ResolverContext) {
|
|
54
|
+
// const { user, domain } = context.state
|
|
55
|
+
// const userDomains: Domain[] = user.domains
|
|
56
|
+
// let value: string = setting.value
|
|
57
|
+
|
|
58
|
+
// const partner: Partner = await getRepository(Partner).findOne({
|
|
59
|
+
// where: { domain: { id: domain.id }, partnerDomain: { id: In(userDomains.map((userDomain: Domain) => userDomain.id)) } },
|
|
60
|
+
// relations: ['partnerDomain']
|
|
61
|
+
// })
|
|
62
|
+
// if (partner?.partnerDomain) {
|
|
63
|
+
// const partnerSetting: PartnerSetting = await getRepository(PartnerSetting).findOne({
|
|
64
|
+
// setting,
|
|
65
|
+
// domain,
|
|
66
|
+
// partnerDomain: partner.partnerDomain
|
|
67
|
+
// })
|
|
68
|
+
// if (partnerSetting) value = partnerSetting.value
|
|
69
|
+
// }
|
|
70
|
+
|
|
71
|
+
// return value
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
@FieldResolver(type => Domain)
|
|
75
|
+
async domain(@Root() setting: Setting) {
|
|
76
|
+
return await getRepository(Domain).findOneBy({ id: setting.domainId })
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@FieldResolver(type => User)
|
|
80
|
+
async updater(@Root() setting: Setting): Promise<User> {
|
|
81
|
+
return await getRepository(User).findOneBy({ id: setting.updaterId })
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@FieldResolver(type => User)
|
|
85
|
+
async creator(@Root() setting: Setting): Promise<User> {
|
|
86
|
+
return await getRepository(User).findOneBy({ id: setting.creatorId })
|
|
87
|
+
}
|
|
88
|
+
}
|