@things-factory/shell 5.0.15 → 6.0.0-alpha.12
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/bin/things-factory-migration +18 -9
- package/client/elements/custom-alert.js +3 -0
- package/config/config.development.js +31 -22
- package/dist-server/graphql-local-client.d.ts +28 -0
- package/dist-server/index.d.ts +9 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/initializers/database.d.ts +7 -0
- package/dist-server/initializers/database.js +40 -9
- package/dist-server/initializers/database.js.map +1 -1
- package/dist-server/initializers/naming-strategy.d.ts +6 -0
- package/dist-server/middlewares/domain-middleware.d.ts +1 -0
- package/dist-server/middlewares/index.d.ts +2 -0
- package/dist-server/migrations/1000000000000-SeedDomain.d.ts +5 -0
- package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
- package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
- package/dist-server/migrations/index.d.ts +1 -0
- package/dist-server/pubsub-log-transport.d.ts +8 -0
- package/dist-server/pubsub.d.ts +2 -0
- package/dist-server/routers/domain-router.d.ts +2 -0
- package/dist-server/routers/global-router.d.ts +2 -0
- package/dist-server/routers/index.d.ts +2 -0
- package/dist-server/schema.d.ts +2 -0
- package/dist-server/server-dev.d.ts +1 -0
- package/dist-server/server-dev.js +16 -12
- package/dist-server/server-dev.js.map +1 -1
- package/dist-server/server.d.ts +1 -0
- package/dist-server/server.js +9 -6
- package/dist-server/server.js.map +1 -1
- package/dist-server/service/common-types/index.d.ts +6 -0
- package/dist-server/service/common-types/list-param.d.ts +19 -0
- package/dist-server/service/common-types/list-param.js +1 -1
- package/dist-server/service/common-types/list-param.js.map +1 -1
- package/dist-server/service/common-types/log.d.ts +6 -0
- package/dist-server/service/common-types/log.js.map +1 -1
- package/dist-server/service/common-types/object-ref.d.ts +5 -0
- package/dist-server/service/common-types/object-ref.js.map +1 -1
- package/dist-server/service/common-types/scalar-any.d.ts +2 -0
- package/dist-server/service/common-types/scalar-date.d.ts +2 -0
- package/dist-server/service/common-types/scalar-object.d.ts +1 -0
- package/dist-server/service/directive-transaction/index.d.ts +1 -0
- package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
- package/dist-server/service/directive-transaction/transaction.js +2 -2
- package/dist-server/service/directive-transaction/transaction.js.map +1 -1
- package/dist-server/service/domain/domain-resolver.d.ts +17 -0
- package/dist-server/service/domain/domain-resolver.js +14 -13
- package/dist-server/service/domain/domain-resolver.js.map +1 -1
- package/dist-server/service/domain/domain-types.d.ts +21 -0
- package/dist-server/service/domain/domain-types.js.map +1 -1
- package/dist-server/service/domain/domain.d.ts +16 -0
- package/dist-server/service/domain/domain.js.map +1 -1
- package/dist-server/service/domain/index.d.ts +4 -0
- package/dist-server/service/index.d.ts +14 -0
- package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
- package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
- package/dist-server/service/subscription-data/data-types.d.ts +6 -0
- package/dist-server/service/subscription-data/data-types.js.map +1 -1
- package/dist-server/service/subscription-data/index.d.ts +3 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/condition-builder.d.ts +17 -0
- package/dist-server/utils/get-domain.d.ts +10 -0
- package/dist-server/utils/get-domain.js +2 -2
- package/dist-server/utils/get-domain.js.map +1 -1
- package/dist-server/utils/get-query-builder-from-list-params.d.ts +21 -0
- package/dist-server/utils/get-query-builder-from-list-params.js +26 -7
- package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
- package/dist-server/utils/index.d.ts +7 -0
- package/dist-server/utils/list-param-adjuster.d.ts +2 -0
- package/dist-server/utils/list-params-converter.d.ts +16 -0
- package/dist-server/utils/list-params-converter.js.map +1 -1
- package/dist-server/utils/list-query-builder.d.ts +7 -0
- package/dist-server/utils/publish-progress.d.ts +6 -0
- package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
- package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
- package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
- package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
- package/ormconfig.js +2 -3
- package/package.json +8 -7
- package/server/index.ts +1 -0
- package/server/initializers/database.ts +52 -10
- package/server/migrations/1000000000000-SeedDomain.ts +4 -2
- package/server/server-dev.ts +29 -16
- package/server/server.ts +8 -8
- package/server/service/common-types/list-param.ts +4 -3
- package/server/service/directive-transaction/transaction.ts +3 -2
- package/server/service/domain/domain-resolver.ts +7 -6
- package/server/utils/get-domain.ts +2 -2
- package/server/utils/get-query-builder-from-list-params.ts +30 -7
- package/server/utils/list-params-converter.ts +1 -1
package/server/server.ts
CHANGED
@@ -113,9 +113,13 @@ const bootstrap = async () => {
|
|
113
113
|
var { extra, connectionParams } = ctx
|
114
114
|
var { request } = extra
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
|
117
|
+
var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
|
118
|
+
var accessToken = url.searchParams.get('access_token')
|
119
|
+
if (accessToken) {
|
120
|
+
connectionParams['headers']['authorization'] = accessToken
|
121
|
+
}
|
122
|
+
}
|
119
123
|
|
120
124
|
request.headers = {
|
121
125
|
...request.headers,
|
@@ -198,11 +202,7 @@ const bootstrap = async () => {
|
|
198
202
|
app.use(koaBodyParser(bodyParserOption))
|
199
203
|
app.use(graphqlUploadKoa(fileUploadOption))
|
200
204
|
|
201
|
-
|
202
|
-
server.getMiddleware({
|
203
|
-
path: '/graphql'
|
204
|
-
})
|
205
|
-
)
|
205
|
+
server.applyMiddleware({ app, path: '/graphql' })
|
206
206
|
|
207
207
|
/* routers */
|
208
208
|
process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import { ArgsType,
|
1
|
+
import { ArgsType, Field, InputType, Int } from 'type-graphql'
|
2
|
+
|
2
3
|
import { ScalarAny } from './scalar-any'
|
3
4
|
|
4
5
|
@InputType()
|
@@ -27,8 +28,8 @@ export class Filter {
|
|
27
28
|
@Field()
|
28
29
|
operator: string
|
29
30
|
|
30
|
-
@Field(type => ScalarAny)
|
31
|
-
value
|
31
|
+
@Field(type => ScalarAny, { nullable: true })
|
32
|
+
value?: any
|
32
33
|
|
33
34
|
@Field({ nullable: true })
|
34
35
|
relation?: boolean
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { defaultFieldResolver, GraphQLSchema } from 'graphql'
|
2
2
|
import gql from 'graphql-tag'
|
3
|
-
import { getConnection } from 'typeorm'
|
4
3
|
|
5
4
|
import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
|
6
5
|
|
6
|
+
import { getDataSource } from '../../initializers/database'
|
7
|
+
|
7
8
|
const DIRECTIVE = 'transaction'
|
8
9
|
|
9
10
|
export const transactionDirectiveTypeDefs = gql`
|
@@ -17,7 +18,7 @@ export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
|
|
17
18
|
const { resolve = defaultFieldResolver } = fieldConfig
|
18
19
|
|
19
20
|
fieldConfig.resolve = async function (source, args, context, info) {
|
20
|
-
return await
|
21
|
+
return await getDataSource('tx').transaction(async tx => {
|
21
22
|
/* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
|
22
23
|
let wrap = context.app.createContext(context.req || {}, context.res || {})
|
23
24
|
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver } from 'type-graphql'
|
2
|
-
import {
|
2
|
+
import { In, Repository } from 'typeorm'
|
3
3
|
|
4
4
|
import { slugger } from '@things-factory/utils'
|
5
5
|
|
6
|
+
import { getRepository } from '../../initializers/database'
|
6
7
|
import { buildQuery } from '../../utils/list-query-builder'
|
7
8
|
import { ListParam } from '../common-types/list-param'
|
8
9
|
import { Domain } from './domain'
|
@@ -15,12 +16,12 @@ export class DomainResolver {
|
|
15
16
|
async domain(@Arg('id') id: string): Promise<Domain> {
|
16
17
|
const repository = getRepository(Domain)
|
17
18
|
|
18
|
-
return await repository.
|
19
|
+
return await repository.findOneBy({ id })
|
19
20
|
}
|
20
21
|
|
21
22
|
@Directive('@privilege(category: "system", privilege: "query", superUserGranted: true)')
|
22
23
|
@Query(returns => DomainList, { description: 'To fetch multiple domain' })
|
23
|
-
async domains(@Args() params: ListParam, @Ctx() context): Promise<DomainList> {
|
24
|
+
async domains(@Args() params: ListParam, @Ctx() context: any): Promise<DomainList> {
|
24
25
|
const queryBuilder = getRepository(Domain).createQueryBuilder()
|
25
26
|
|
26
27
|
buildQuery(queryBuilder, params || {}, context, {
|
@@ -37,7 +38,7 @@ export class DomainResolver {
|
|
37
38
|
const domainRepository: Repository<Domain> = getRepository(Domain)
|
38
39
|
const targetSubdomain: string = slugger(name)
|
39
40
|
|
40
|
-
const oldDomain = await domainRepository.
|
41
|
+
const oldDomain = await domainRepository.findOneBy({ subdomain: targetSubdomain })
|
41
42
|
if (oldDomain) {
|
42
43
|
throw new Error('domain is duplicated')
|
43
44
|
}
|
@@ -52,7 +53,7 @@ export class DomainResolver {
|
|
52
53
|
const domainRepo: Repository<Domain> = getRepository(Domain)
|
53
54
|
const subdomain: string = slugger(name)
|
54
55
|
|
55
|
-
const domain: Domain = await domainRepo.
|
56
|
+
const domain: Domain = await domainRepo.findOneBy({ subdomain })
|
56
57
|
if (domain) {
|
57
58
|
throw new Error('domain is duplicated')
|
58
59
|
}
|
@@ -79,7 +80,7 @@ export class DomainResolver {
|
|
79
80
|
@Mutation(returns => Domain, { description: 'To update domain' })
|
80
81
|
async updateDomain(@Arg('name') name: string, @Arg('patch', () => DomainPatch) patch: DomainPatch) {
|
81
82
|
const repository = getRepository(Domain)
|
82
|
-
const domain: Domain = await repository.
|
83
|
+
const domain: Domain = await repository.findOneBy({ name })
|
83
84
|
|
84
85
|
return await repository.save({
|
85
86
|
...domain,
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { getRepository } from 'typeorm'
|
2
1
|
import { URL } from 'url'
|
3
2
|
|
4
3
|
import { config } from '@things-factory/env'
|
5
4
|
import { getPathInfo } from '@things-factory/utils'
|
6
5
|
|
6
|
+
import { getRepository } from '../initializers/database'
|
7
7
|
import { Domain } from '../service/domain/domain'
|
8
8
|
|
9
9
|
const useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')
|
@@ -72,7 +72,7 @@ export async function getDomainFromURL(context: any): Promise<Domain> {
|
|
72
72
|
const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)
|
73
73
|
|
74
74
|
if (subdomain) {
|
75
|
-
return await getRepository(Domain).findOne({ subdomain },
|
75
|
+
return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })
|
76
76
|
}
|
77
77
|
}
|
78
78
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm'
|
2
|
+
import { RelationMetadata } from 'typeorm/metadata/RelationMetadata'
|
2
3
|
|
3
4
|
import { Filter, ListParam } from '../service/common-types/list-param'
|
4
5
|
import { Domain } from '../service/domain/domain'
|
@@ -105,7 +106,7 @@ function addCondition<T>(
|
|
105
106
|
): void {
|
106
107
|
const { name, operator, value } = filter
|
107
108
|
const values = value instanceof Array ? value : [value]
|
108
|
-
|
109
|
+
var entityAlias = selectQueryBuilder.alias
|
109
110
|
|
110
111
|
var { relationColumn, columnName } = filtersMap[name] || {}
|
111
112
|
/*
|
@@ -117,14 +118,36 @@ function addCondition<T>(
|
|
117
118
|
- 이 경우는 columnName 만 적용한다.
|
118
119
|
*/
|
119
120
|
if (relationColumn) {
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
121
|
+
const columns = relationColumn.split('.')
|
122
|
+
var entityMetadata: EntityMetadata
|
123
|
+
var relation: RelationMetadata
|
124
|
+
|
125
|
+
for (const rcolumn of columns) {
|
126
|
+
if (relation) {
|
127
|
+
const { propertyName } = relationColumnMeta
|
128
|
+
const property = `${entityAlias}.${propertyName}`
|
129
|
+
|
130
|
+
entityAlias = `${entityMetadata.tableName}-${entityMetadata.tableName}` as string
|
131
|
+
|
132
|
+
if (andCondition) {
|
133
|
+
selectQueryBuilder.innerJoin(property, entityAlias)
|
134
|
+
} else {
|
135
|
+
selectQueryBuilder.leftJoin(property, entityAlias)
|
136
|
+
}
|
137
|
+
} else {
|
138
|
+
entityMetadata = metadata
|
139
|
+
}
|
140
|
+
|
141
|
+
var relationColumnMeta = entityMetadata.columns.find(column => column.propertyName === rcolumn)
|
142
|
+
if (!relationColumnMeta) {
|
143
|
+
console.warn(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
|
144
|
+
return
|
145
|
+
}
|
146
|
+
|
147
|
+
relation = relationColumnMeta.relationMetadata
|
148
|
+
entityMetadata = relation.inverseEntityMetadata
|
124
149
|
}
|
125
150
|
|
126
|
-
var relation = relationColumnMeta.relationMetadata
|
127
|
-
var entityMetadata = relation.inverseEntityMetadata
|
128
151
|
var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))
|
129
152
|
if (!columnMeta) {
|
130
153
|
console.warn(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
|
@@ -29,7 +29,7 @@ const OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator
|
|
29
29
|
between: value => Between(value[0], value[1])
|
30
30
|
}
|
31
31
|
|
32
|
-
function getOperatorFunction({ operator, value }:
|
32
|
+
function getOperatorFunction({ operator, value }: Filter): FindOperator<any> {
|
33
33
|
return OPERATION_FUNCTION_MAP[operator](value)
|
34
34
|
}
|
35
35
|
|