@things-factory/i18n-base 7.0.0-alpha.8 → 7.0.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/client/bootstrap.ts +16 -0
- package/client/{index.js → index.ts} +0 -2
- package/client/page/terminology-page.ts +406 -0
- package/client/route.ts +7 -0
- package/config/config.development.js +29 -0
- package/config/config.production.js +29 -0
- package/dist-client/bootstrap.d.ts +6 -0
- package/dist-client/bootstrap.js +10 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +5 -0
- package/dist-client/index.js +6 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/page/terminology-page.d.ts +79 -0
- package/dist-client/page/terminology-page.js +395 -0
- package/dist-client/page/terminology-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +8 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/apis/index.d.ts +1 -0
- package/dist-server/apis/t.d.ts +6 -0
- package/dist-server/apis/t.js +1 -2
- package/dist-server/apis/t.js.map +1 -1
- package/dist-server/controllers/clear-cache-for-translation.d.ts +1 -0
- package/dist-server/controllers/clear-cache-for-translation.js +17 -0
- package/dist-server/controllers/clear-cache-for-translation.js.map +1 -0
- package/dist-server/index.d.ts +5 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/middlewares/index.d.ts +1 -0
- package/dist-server/middlewares/index.js +1 -2
- package/dist-server/middlewares/index.js.map +1 -1
- package/dist-server/middlewares/koa-i18next/detect.d.ts +1 -0
- package/dist-server/middlewares/koa-i18next/detect.js +1 -1
- package/dist-server/middlewares/koa-i18next/detect.js.map +1 -1
- package/dist-server/middlewares/koa-i18next/index.d.ts +6 -0
- package/dist-server/middlewares/koa-i18next/index.js +1 -1
- package/dist-server/middlewares/koa-i18next/index.js.map +1 -1
- package/dist-server/middlewares/translations.d.ts +1 -0
- package/dist-server/middlewares/translations.js +1 -2
- package/dist-server/middlewares/translations.js.map +1 -1
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/routes.js +66 -1
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +7 -0
- package/dist-server/service/index.js +8 -3
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/terminology/index.d.ts +6 -0
- package/dist-server/service/terminology/index.js +2 -1
- package/dist-server/service/terminology/index.js.map +1 -1
- package/dist-server/service/terminology/terminology-mutation.d.ts +11 -0
- package/dist-server/service/terminology/terminology-mutation.js +41 -4
- package/dist-server/service/terminology/terminology-mutation.js.map +1 -1
- package/dist-server/service/terminology/terminology-query.d.ts +11 -0
- package/dist-server/service/terminology/terminology-query.js +24 -3
- package/dist-server/service/terminology/terminology-query.js.map +1 -1
- package/dist-server/service/terminology/terminology-type.d.ts +21 -0
- package/dist-server/service/terminology/terminology-type.js +9 -9
- package/dist-server/service/terminology/terminology-type.js.map +1 -1
- package/dist-server/service/terminology/terminology.d.ts +18 -0
- package/dist-server/service/terminology/terminology.js +23 -6
- package/dist-server/service/terminology/terminology.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -9
- package/server/controllers/clear-cache-for-translation.ts +18 -0
- package/server/index.ts +1 -0
- package/server/routes.ts +85 -1
- package/server/service/index.ts +15 -6
- package/server/service/terminology/index.ts +1 -0
- package/server/service/terminology/terminology-mutation.ts +46 -2
- package/server/service/terminology/terminology-query.ts +12 -1
- package/server/service/terminology/terminology-type.ts +6 -6
- package/server/service/terminology/terminology.ts +31 -9
- package/things-factory.config.js +10 -2
- package/translations/en.json +8 -0
- package/translations/ja.json +8 -0
- package/translations/ko.json +8 -0
- package/translations/ms.json +8 -0
- package/translations/zh.json +8 -0
- package/client/bootstrap.js +0 -10
- package/client/components/i18n-msg.js +0 -9
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/i18n-base",
|
|
3
|
-
"version": "7.0.0
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
|
-
"browser": "client/index.js",
|
|
5
|
+
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
7
7
|
"author": "heartyoh <heartyoh@hatiolab.com>",
|
|
8
8
|
"description": "Server side for handling translation.",
|
|
@@ -17,15 +17,19 @@
|
|
|
17
17
|
"directory": "packages/i18n-base"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"build": "
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
20
|
+
"build": "npm run build:server && npm run build:client",
|
|
21
|
+
"copy:files": "copyfiles -e \"./client/**/*.{ts,js,json}\" -u 1 \"./client/**/*\" dist-client",
|
|
22
|
+
"build:client": "npm run copy:files && npx tsc --p ./client/tsconfig.json",
|
|
23
|
+
"build:server": "npx tsc --p ./server/tsconfig.json",
|
|
24
|
+
"clean:client": "npx rimraf dist-client",
|
|
25
|
+
"clean:server": "npx rimraf dist-server",
|
|
26
|
+
"clean": "npm run clean:server && npm run clean:client",
|
|
24
27
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
|
25
28
|
},
|
|
26
29
|
"dependencies": {
|
|
27
|
-
"@operato/i18n": "^
|
|
28
|
-
"@things-factory/
|
|
30
|
+
"@operato/i18n": "^7.0.0",
|
|
31
|
+
"@things-factory/auth-base": "^7.0.0",
|
|
32
|
+
"@things-factory/shell": "^7.0.0"
|
|
29
33
|
},
|
|
30
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "00f3917ca132679e3571f3f4fd16f4caf84f488e"
|
|
31
35
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { config } from '@things-factory/env'
|
|
2
|
+
|
|
3
|
+
const disableCustomTerminologyFeature = config.get('i18n/disableCustomTerminologyFeature')
|
|
4
|
+
|
|
5
|
+
const path = require('path')
|
|
6
|
+
var fs = require('fs')
|
|
7
|
+
|
|
8
|
+
export function clearTranslationCacheForCertainDomain(subdomain: string) {
|
|
9
|
+
if (disableCustomTerminologyFeature) {
|
|
10
|
+
return
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const cacheFileFolder = path.join('cache', 'translations', subdomain)
|
|
14
|
+
|
|
15
|
+
if (fs.existsSync(cacheFileFolder)) {
|
|
16
|
+
fs.rmSync(cacheFileFolder, { recursive: true })
|
|
17
|
+
}
|
|
18
|
+
}
|
package/server/index.ts
CHANGED
package/server/routes.ts
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
import i18next from 'i18next'
|
|
2
|
+
import { ILike } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { getRepository } from '@things-factory/shell'
|
|
5
|
+
import { config } from '@things-factory/env'
|
|
6
|
+
|
|
7
|
+
const disableCustomTerminologyFeature = config.get('i18n/disableCustomTerminologyFeature')
|
|
8
|
+
|
|
9
|
+
import { Terminology } from './service/terminology/terminology'
|
|
10
|
+
|
|
11
|
+
const path = require('path')
|
|
12
|
+
const cacheFS = require('fs')
|
|
13
|
+
var fs = require('fs')
|
|
14
|
+
|
|
15
|
+
process.on('client-rebuilt' as any, (app, compilerFileSystem) => {
|
|
16
|
+
/* change filesystem whenever webpacking assets done. only for development mode. */
|
|
17
|
+
fs = compilerFileSystem
|
|
18
|
+
|
|
19
|
+
const cacheFileFolder = path.join('cache', 'translations')
|
|
20
|
+
|
|
21
|
+
if (cacheFS.existsSync(cacheFileFolder)) {
|
|
22
|
+
cacheFS.rmSync(cacheFileFolder, { recursive: true })
|
|
23
|
+
}
|
|
24
|
+
})
|
|
2
25
|
|
|
3
26
|
process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
|
|
4
27
|
globalPublicRouter.get('/translations/translate/:lng/:key', async (context, next) => {
|
|
@@ -9,10 +32,71 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
|
|
|
9
32
|
})
|
|
10
33
|
|
|
11
34
|
globalPublicRouter.get('/translations/translate/:key', async (context, next) => {
|
|
12
|
-
const { lng } = context.state
|
|
13
35
|
const { key } = context.params
|
|
14
36
|
const translated = context.t(key)
|
|
15
37
|
|
|
16
38
|
context.body = translated
|
|
17
39
|
})
|
|
18
40
|
})
|
|
41
|
+
|
|
42
|
+
process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {
|
|
43
|
+
domainPublicRouter.get('/domain/:subdomain/translations/:filename', async (context, next) => {
|
|
44
|
+
const { subdomain, filename } = context.params
|
|
45
|
+
const { domain } = context.state
|
|
46
|
+
|
|
47
|
+
const locale = (filename || 'en.json').split('.')[0]
|
|
48
|
+
|
|
49
|
+
// context.set('Cache-Control', 'public, max-age=31536000') // 캐시 기간 설정 : 1년
|
|
50
|
+
// context.set('Expires', new Date(Date.now() + 31536000000).toUTCString()) // 캐시 만료일 설정
|
|
51
|
+
|
|
52
|
+
if (disableCustomTerminologyFeature) {
|
|
53
|
+
var file = fs.readFileSync(path.resolve(path.join('dist-app', 'translations', filename)))
|
|
54
|
+
|
|
55
|
+
context.type = 'application/json'
|
|
56
|
+
context.body = file
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const cacheFileFolder = path.join('cache', 'translations', subdomain)
|
|
61
|
+
const cacheFilePath = path.join(cacheFileFolder, filename)
|
|
62
|
+
|
|
63
|
+
if (cacheFS.existsSync(cacheFilePath)) {
|
|
64
|
+
var file = cacheFS.readFileSync(cacheFilePath)
|
|
65
|
+
} else {
|
|
66
|
+
var file = fs.readFileSync(path.resolve(path.join('dist-app', 'translations', filename)))
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const terminologies = await getRepository(Terminology).find({
|
|
70
|
+
where: { domain: { id: domain.id }, locale: ILike(locale + '%') }
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
const json = JSON.parse(file)
|
|
74
|
+
|
|
75
|
+
terminologies.forEach(term => {
|
|
76
|
+
const { name, category, display } = term
|
|
77
|
+
json[`${category}.${name}`] = display
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
if (!cacheFS.existsSync(cacheFileFolder)) {
|
|
82
|
+
cacheFS.mkdirSync(cacheFileFolder, { recursive: true })
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
cacheFS.writeFileSync(cacheFilePath, JSON.stringify(json))
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.error(err)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
context.type = 'application/json'
|
|
91
|
+
context.body = json
|
|
92
|
+
|
|
93
|
+
return
|
|
94
|
+
} catch (err) {
|
|
95
|
+
console.error(err)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
context.type = 'application/json'
|
|
100
|
+
context.body = file
|
|
101
|
+
})
|
|
102
|
+
})
|
package/server/service/index.ts
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
/* EXPORT ENTITY TYPES */
|
|
2
2
|
export * from './terminology/terminology'
|
|
3
|
+
export * from './terminology/terminology-type'
|
|
3
4
|
|
|
4
5
|
/* IMPORT ENTITIES AND RESOLVERS */
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
entities as TerminologyEntities,
|
|
8
|
+
resolvers as TerminologyResolvers,
|
|
9
|
+
subscribers as TerminologySubscribers
|
|
10
|
+
} from './terminology'
|
|
6
11
|
|
|
7
|
-
export const entities = [
|
|
12
|
+
export const entities = [
|
|
8
13
|
/* ENTITIES */
|
|
9
|
-
|
|
10
|
-
]
|
|
14
|
+
...TerminologyEntities
|
|
15
|
+
]
|
|
11
16
|
|
|
17
|
+
export const subscribers = [
|
|
18
|
+
/* SUBSCRIBERS */
|
|
19
|
+
...TerminologySubscribers
|
|
20
|
+
]
|
|
12
21
|
|
|
13
22
|
export const schema = {
|
|
14
23
|
resolverClasses: [
|
|
15
24
|
/* RESOLVER CLASSES */
|
|
16
|
-
|
|
17
|
-
]
|
|
25
|
+
...TerminologyResolvers
|
|
26
|
+
]
|
|
18
27
|
}
|
|
@@ -4,22 +4,39 @@ import { In } from 'typeorm'
|
|
|
4
4
|
import { Terminology } from './terminology'
|
|
5
5
|
import { NewTerminology, TerminologyPatch } from './terminology-type'
|
|
6
6
|
|
|
7
|
+
import { clearTranslationCacheForCertainDomain } from '../../controllers/clear-cache-for-translation'
|
|
8
|
+
|
|
9
|
+
function clearCache(subdomain: string) {
|
|
10
|
+
/** multiple update/delete시 모든 엔티티에 대해서 subscription 이 걸리므로, EventSubscriber를 사용하지 않음. */
|
|
11
|
+
try {
|
|
12
|
+
clearTranslationCacheForCertainDomain(subdomain)
|
|
13
|
+
} catch (err) {
|
|
14
|
+
console.error('Failed to delete the translations cache directory:', err)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
7
18
|
@Resolver(Terminology)
|
|
8
19
|
export class TerminologyMutation {
|
|
9
20
|
@Directive('@transaction')
|
|
21
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
10
22
|
@Mutation(returns => Terminology, { description: 'To create new Terminology' })
|
|
11
23
|
async createTerminology(@Arg('terminology') terminology: NewTerminology, @Ctx() context: any): Promise<Terminology> {
|
|
12
24
|
const { domain, user, tx } = context.state
|
|
13
25
|
|
|
14
|
-
|
|
26
|
+
const result = await tx.getRepository(Terminology).save({
|
|
15
27
|
...terminology,
|
|
16
28
|
domain,
|
|
17
29
|
creator: user,
|
|
18
30
|
updater: user
|
|
19
31
|
})
|
|
32
|
+
|
|
33
|
+
clearCache(domain.subdomain)
|
|
34
|
+
|
|
35
|
+
return result
|
|
20
36
|
}
|
|
21
37
|
|
|
22
38
|
@Directive('@transaction')
|
|
39
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
23
40
|
@Mutation(returns => Terminology, { description: 'To modify Terminology information' })
|
|
24
41
|
async updateTerminology(
|
|
25
42
|
@Arg('id') id: string,
|
|
@@ -33,14 +50,19 @@ export class TerminologyMutation {
|
|
|
33
50
|
where: { domain: { id: domain.id }, id }
|
|
34
51
|
})
|
|
35
52
|
|
|
36
|
-
|
|
53
|
+
const result = await repository.save({
|
|
37
54
|
...terminology,
|
|
38
55
|
...patch,
|
|
39
56
|
updater: user
|
|
40
57
|
})
|
|
58
|
+
|
|
59
|
+
clearCache(domain.subdomain)
|
|
60
|
+
|
|
61
|
+
return result
|
|
41
62
|
}
|
|
42
63
|
|
|
43
64
|
@Directive('@transaction')
|
|
65
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
44
66
|
@Mutation(returns => [Terminology], { description: "To modify multiple Terminologies' information" })
|
|
45
67
|
async updateMultipleTerminologies(
|
|
46
68
|
@Arg('patches', type => [TerminologyPatch]) patches: TerminologyPatch[],
|
|
@@ -83,19 +105,36 @@ export class TerminologyMutation {
|
|
|
83
105
|
}
|
|
84
106
|
}
|
|
85
107
|
|
|
108
|
+
clearCache(domain.subdomain)
|
|
109
|
+
|
|
86
110
|
return results
|
|
87
111
|
}
|
|
88
112
|
|
|
89
113
|
@Directive('@transaction')
|
|
114
|
+
@Mutation(returns => Boolean, { description: 'To clear translations cache' })
|
|
115
|
+
async clearTranslationsCache(@Ctx() context: any): Promise<boolean> {
|
|
116
|
+
const { domain, tx } = context.state
|
|
117
|
+
|
|
118
|
+
clearCache(domain.subdomain)
|
|
119
|
+
|
|
120
|
+
return true
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@Directive('@transaction')
|
|
124
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
90
125
|
@Mutation(returns => Boolean, { description: 'To delete Terminology' })
|
|
91
126
|
async deleteTerminology(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
|
|
92
127
|
const { domain, tx } = context.state
|
|
93
128
|
|
|
94
129
|
await tx.getRepository(Terminology).delete({ domain: { id: domain.id }, id })
|
|
130
|
+
|
|
131
|
+
clearCache(domain.subdomain)
|
|
132
|
+
|
|
95
133
|
return true
|
|
96
134
|
}
|
|
97
135
|
|
|
98
136
|
@Directive('@transaction')
|
|
137
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
99
138
|
@Mutation(returns => Boolean, { description: 'To delete multiple Terminologies' })
|
|
100
139
|
async deleteTerminologies(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
|
|
101
140
|
const { domain, tx } = context.state
|
|
@@ -105,10 +144,13 @@ export class TerminologyMutation {
|
|
|
105
144
|
id: In(ids)
|
|
106
145
|
})
|
|
107
146
|
|
|
147
|
+
clearCache(domain.subdomain)
|
|
148
|
+
|
|
108
149
|
return true
|
|
109
150
|
}
|
|
110
151
|
|
|
111
152
|
@Directive('@transaction')
|
|
153
|
+
@Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
|
|
112
154
|
@Mutation(returns => Boolean, { description: 'To import multiple Terminologies' })
|
|
113
155
|
async importTerminologies(
|
|
114
156
|
@Arg('terminologies', type => [TerminologyPatch]) terminologies: TerminologyPatch[],
|
|
@@ -122,6 +164,8 @@ export class TerminologyMutation {
|
|
|
122
164
|
})
|
|
123
165
|
)
|
|
124
166
|
|
|
167
|
+
clearCache(domain.subdomain)
|
|
168
|
+
|
|
125
169
|
return true
|
|
126
170
|
}
|
|
127
171
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
2
|
|
|
3
3
|
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
|
4
|
+
import { User } from '@things-factory/auth-base'
|
|
4
5
|
|
|
5
6
|
import { Terminology } from './terminology'
|
|
6
7
|
import { TerminologyList } from './terminology-type'
|
|
@@ -17,7 +18,7 @@ export class TerminologyQuery {
|
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
@Query(returns => TerminologyList, { description: 'To fetch multiple Terminologies' })
|
|
20
|
-
async terminologies(@Args() params: ListParam, @Ctx() context: any): Promise<TerminologyList> {
|
|
21
|
+
async terminologies(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<TerminologyList> {
|
|
21
22
|
const { domain } = context.state
|
|
22
23
|
|
|
23
24
|
const queryBuilder = getQueryBuilderFromListParams({
|
|
@@ -36,4 +37,14 @@ export class TerminologyQuery {
|
|
|
36
37
|
async domain(@Root() terminology: Terminology): Promise<Domain> {
|
|
37
38
|
return await getRepository(Domain).findOneBy({ id: terminology.domainId })
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
@FieldResolver(type => User)
|
|
42
|
+
async updater(@Root() terminology: Terminology): Promise<User> {
|
|
43
|
+
return await getRepository(User).findOneBy({ id: terminology.updaterId })
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@FieldResolver(type => User)
|
|
47
|
+
async creator(@Root() terminology: Terminology): Promise<User> {
|
|
48
|
+
return await getRepository(User).findOneBy({ id: terminology.creatorId })
|
|
49
|
+
}
|
|
39
50
|
}
|
|
@@ -31,14 +31,14 @@ export class TerminologyPatch {
|
|
|
31
31
|
@Field({ nullable: true })
|
|
32
32
|
description?: string
|
|
33
33
|
|
|
34
|
-
@Field()
|
|
35
|
-
locale
|
|
34
|
+
@Field({ nullable: true })
|
|
35
|
+
locale?: string
|
|
36
36
|
|
|
37
|
-
@Field()
|
|
38
|
-
category
|
|
37
|
+
@Field({ nullable: true })
|
|
38
|
+
category?: string
|
|
39
39
|
|
|
40
|
-
@Field()
|
|
41
|
-
display
|
|
40
|
+
@Field({ nullable: true })
|
|
41
|
+
display?: string
|
|
42
42
|
|
|
43
43
|
@Field({ nullable: true })
|
|
44
44
|
cuFlag?: string
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { Field, ID, ObjectType } from 'type-graphql'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Column,
|
|
4
|
+
CreateDateColumn,
|
|
5
|
+
Entity,
|
|
6
|
+
Index,
|
|
7
|
+
ManyToOne,
|
|
8
|
+
PrimaryGeneratedColumn,
|
|
9
|
+
RelationId,
|
|
10
|
+
UpdateDateColumn
|
|
11
|
+
} from 'typeorm'
|
|
3
12
|
|
|
4
13
|
import { Domain } from '@things-factory/shell'
|
|
14
|
+
import { User } from '@things-factory/auth-base'
|
|
5
15
|
|
|
6
16
|
@Entity()
|
|
7
17
|
@ObjectType({ description: 'Entity for Terminology' })
|
|
@@ -15,7 +25,7 @@ export class Terminology {
|
|
|
15
25
|
readonly id: string
|
|
16
26
|
|
|
17
27
|
@ManyToOne(type => Domain)
|
|
18
|
-
@Field(
|
|
28
|
+
@Field(type => Domain)
|
|
19
29
|
domain?: Domain
|
|
20
30
|
|
|
21
31
|
@RelationId((terminology: Terminology) => terminology.domain)
|
|
@@ -23,25 +33,23 @@ export class Terminology {
|
|
|
23
33
|
|
|
24
34
|
@Column()
|
|
25
35
|
@Field()
|
|
26
|
-
name
|
|
36
|
+
name?: string
|
|
27
37
|
|
|
28
|
-
@Column({
|
|
29
|
-
nullable: true
|
|
30
|
-
})
|
|
38
|
+
@Column({ nullable: true })
|
|
31
39
|
@Field({ nullable: true })
|
|
32
40
|
description?: string
|
|
33
41
|
|
|
34
42
|
@Field()
|
|
35
43
|
@Column({ length: 20 })
|
|
36
|
-
locale
|
|
44
|
+
locale?: string
|
|
37
45
|
|
|
38
46
|
@Field()
|
|
39
47
|
@Column({ length: 20 })
|
|
40
|
-
category
|
|
48
|
+
category?: string
|
|
41
49
|
|
|
42
50
|
@Field()
|
|
43
51
|
@Column()
|
|
44
|
-
display
|
|
52
|
+
display?: string
|
|
45
53
|
|
|
46
54
|
@CreateDateColumn()
|
|
47
55
|
@Field({ nullable: true })
|
|
@@ -50,4 +58,18 @@ export class Terminology {
|
|
|
50
58
|
@UpdateDateColumn()
|
|
51
59
|
@Field({ nullable: true })
|
|
52
60
|
updatedAt?: Date
|
|
61
|
+
|
|
62
|
+
@ManyToOne(type => User, { nullable: true })
|
|
63
|
+
@Field(type => User, { nullable: true })
|
|
64
|
+
creator?: User
|
|
65
|
+
|
|
66
|
+
@RelationId((terminology: Terminology) => terminology.creator)
|
|
67
|
+
creatorId?: string
|
|
68
|
+
|
|
69
|
+
@ManyToOne(type => User, { nullable: true })
|
|
70
|
+
@Field(type => User, { nullable: true })
|
|
71
|
+
updater?: User
|
|
72
|
+
|
|
73
|
+
@RelationId((terminology: Terminology) => terminology.updater)
|
|
74
|
+
updaterId?: string
|
|
53
75
|
}
|
package/things-factory.config.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import bootstrap from './client/bootstrap'
|
|
1
|
+
import bootstrap from './dist-client/bootstrap'
|
|
2
|
+
import route from './dist-client/route'
|
|
2
3
|
|
|
3
4
|
export default {
|
|
4
|
-
bootstrap
|
|
5
|
+
bootstrap,
|
|
6
|
+
route,
|
|
7
|
+
routes: [
|
|
8
|
+
{
|
|
9
|
+
tagname: 'terminology-page',
|
|
10
|
+
page: 'terminology-page'
|
|
11
|
+
}
|
|
12
|
+
]
|
|
5
13
|
}
|
package/client/bootstrap.js
DELETED