@things-factory/dataset 5.0.12 → 6.0.0-alpha.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/README.md +20 -0
- package/assets/data-report.jpg +0 -0
- package/assets/glue-table-indices.png +0 -0
- package/client/pages/data-key-set/data-key-set-importer.js +4 -6
- package/client/pages/data-key-set/data-key-set-list-page.js +97 -2
- package/client/pages/data-report/data-report-embed-page.js +16 -12
- package/client/pages/data-report/data-report-list-page.js +16 -13
- package/client/pages/data-report/data-report-samples-page.js +186 -0
- package/client/pages/data-set/data-set-importer.js +1 -1
- package/client/pages/data-set/data-set-list-page.js +8 -0
- package/client/route.js +16 -12
- package/config/config.development.js +10 -0
- package/config/config.production.js +21 -11
- package/dist-server/controllers/create-data-sample.js +3 -1
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/controllers/jasper-report.js +17 -12
- package/dist-server/controllers/jasper-report.js.map +1 -1
- package/dist-server/controllers/shiny-report.js +44 -0
- package/dist-server/controllers/shiny-report.js.map +1 -0
- package/dist-server/routes.js +8 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-mutation.js +4 -4
- package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-query.js +9 -11
- package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set-type.js +17 -0
- package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -1
- package/dist-server/service/data-key-set/data-key-set.js +14 -4
- package/dist-server/service/data-key-set/data-key-set.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js +1 -1
- package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +9 -11
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-subscription.js +1 -2
- package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-type.js +2 -3
- package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc.js +4 -5
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +12 -14
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-type.js +1 -2
- package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +3 -4
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-mutation.js +4 -4
- package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +9 -11
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-type.js +4 -5
- package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor.js +4 -5
- package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
- package/dist-server/service/data-set/data-item-type.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +5 -4
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +29 -34
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +6 -7
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +7 -6
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history-query.js +14 -16
- package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
- package/dist-server/service/data-set-history/data-set-history.js +5 -6
- package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
- package/dist-server/service/index.js +0 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/server/controllers/create-data-sample.ts +4 -0
- package/server/controllers/jasper-report.ts +17 -12
- package/server/controllers/shiny-report.ts +63 -0
- package/server/routes.ts +10 -0
- package/server/service/data-key-set/data-key-set-mutation.ts +16 -13
- package/server/service/data-key-set/data-key-set-query.ts +8 -9
- package/server/service/data-key-set/data-key-set-type.ts +13 -0
- package/server/service/data-key-set/data-key-set.ts +9 -0
- package/server/service/data-ooc/data-ooc-mutation.ts +12 -8
- package/server/service/data-ooc/data-ooc-query.ts +8 -9
- package/server/service/data-ooc/data-ooc-subscription.ts +1 -2
- package/server/service/data-sample/data-sample-mutation.ts +4 -1
- package/server/service/data-sample/data-sample-query.ts +10 -11
- package/server/service/data-sensor/data-sensor-mutation.ts +15 -9
- package/server/service/data-sensor/data-sensor-query.ts +9 -10
- package/server/service/data-set/data-item-type.ts +1 -1
- package/server/service/data-set/data-set-mutation.ts +16 -11
- package/server/service/data-set/data-set-query.ts +22 -26
- package/server/service/data-set/data-set.ts +3 -1
- package/server/service/data-set-history/data-set-history-query.ts +13 -14
- package/server/service/index.ts +0 -2
- package/things-factory.config.js +19 -15
- package/translations/en.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
- package/dist-server/service/data-item/data-item.js +0 -155
- package/dist-server/service/data-item/data-item.js.map +0 -1
- package/dist-server/service/data-item/index.js +0 -6
- package/dist-server/service/data-item/index.js.map +0 -1
- package/server/service/data-item/data-item.ts +0 -136
- package/server/service/data-item/index.ts +0 -3
package/package.json
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/dataset",
|
3
|
-
"version": "
|
3
|
+
"version": "6.0.0-alpha.0",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "client/index.js",
|
6
6
|
"things-factory": true,
|
7
7
|
"license": "MIT",
|
8
|
-
"author": "heartyoh",
|
8
|
+
"author": "heartyoh <heartyoh@hatiolab.com>",
|
9
9
|
"description": "module for handling data collection",
|
10
10
|
"publishConfig": {
|
11
11
|
"access": "public",
|
@@ -34,14 +34,14 @@
|
|
34
34
|
"@operato/shell": "^1.0.1",
|
35
35
|
"@operato/styles": "^1.0.0",
|
36
36
|
"@operato/utils": "^1.0.1",
|
37
|
-
"@things-factory/auth-base": "^
|
38
|
-
"@things-factory/aws-base": "^
|
39
|
-
"@things-factory/board-service": "^
|
40
|
-
"@things-factory/env": "^
|
41
|
-
"@things-factory/shell": "^
|
42
|
-
"@things-factory/work-shift": "^
|
37
|
+
"@things-factory/auth-base": "^6.0.0-alpha.0",
|
38
|
+
"@things-factory/aws-base": "^6.0.0-alpha.0",
|
39
|
+
"@things-factory/board-service": "^6.0.0-alpha.0",
|
40
|
+
"@things-factory/env": "^6.0.0-alpha.0",
|
41
|
+
"@things-factory/shell": "^6.0.0-alpha.0",
|
42
|
+
"@things-factory/work-shift": "^6.0.0-alpha.0",
|
43
43
|
"cron-parser": "^4.3.0",
|
44
44
|
"moment-timezone": "^0.5.34"
|
45
45
|
},
|
46
|
-
"gitHead": "
|
46
|
+
"gitHead": "e5b9823ab3ebc5d6ae5bcb4b5aa60c1306e4dd7e"
|
47
47
|
}
|
@@ -11,6 +11,9 @@ import { NewDataSample } from '../service/data-sample/data-sample-type'
|
|
11
11
|
import { DataSet } from '../service/data-set/data-set'
|
12
12
|
import { DataUseCase } from './data-use-case'
|
13
13
|
|
14
|
+
// See README.md at ## Data Samples
|
15
|
+
process.env.TZ = 'UTC'
|
16
|
+
|
14
17
|
const fillDataKeys = (dataKeySet, data) => {
|
15
18
|
const keys = dataKeySet?.dataKeyItems || []
|
16
19
|
return keys.reduce((sum, key, index) => {
|
@@ -93,6 +96,7 @@ export async function createDataSample(
|
|
93
96
|
name: dataSet.name,
|
94
97
|
description: dataSet.description,
|
95
98
|
useCase: dataSet.useCase,
|
99
|
+
type: dataSet.type,
|
96
100
|
...dataSample,
|
97
101
|
...dataKeys,
|
98
102
|
dataSetVersion: dataSet.version,
|
@@ -104,20 +104,23 @@ function parseJsonDataField(rows) {
|
|
104
104
|
const athenaClient = new AthenaController()
|
105
105
|
|
106
106
|
async function queryAthena(params) {
|
107
|
-
const { table, domain,
|
107
|
+
const { table, domain, datasetId, startDate, endDate, workShift, timezone } = params
|
108
108
|
const queryData = {
|
109
|
-
sql: `SELECT name, description, data, spec, workdate, workshift,
|
109
|
+
sql: `SELECT ds.name, ds.description, ds.data, dsh.data_items as spec, ds.workdate, ds.workshift,
|
110
110
|
DATE_FORMAT(
|
111
111
|
FROM_UNIXTIME(collected_at / 1000 / 1000) AT TIME ZONE '${timezone || 'UTC'}',
|
112
112
|
'%Y-%m-%d %H:%i:%s'
|
113
|
-
) AS
|
114
|
-
FROM ${table}
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
113
|
+
) AS dscollected_at
|
114
|
+
FROM ${table} ds
|
115
|
+
JOIN data_set_histories dsh
|
116
|
+
ON (ds.datasetid = dsh.original_id
|
117
|
+
and ds.data_set_version = dsh.version)
|
118
|
+
WHERE ds.domain='${domain}'
|
119
|
+
AND ds.datasetid = '${datasetId}'
|
120
|
+
AND ds.workdate >= '${startDate}'
|
121
|
+
AND ds.workdate <= '${endDate}'
|
122
|
+
${workShift ? "AND ds.workshift = '" + workShift + "'" : ''}
|
123
|
+
ORDER BY ds.collected_at`,
|
121
124
|
db: DATABASE
|
122
125
|
}
|
123
126
|
// and json_extract_scalar(data, '$.dauid') = 'A8032AD81730'
|
@@ -131,7 +134,7 @@ export async function renderJasperReport(context: any) {
|
|
131
134
|
query
|
132
135
|
} = context
|
133
136
|
|
134
|
-
const template = await STORAGE.readFile(query['
|
137
|
+
const template = await STORAGE.readFile(query['reportTemplate'] || 'dynamic_header_sample.jrxml', 'utf-8')
|
135
138
|
let templateType = query['templateType'] || 'crosstab'
|
136
139
|
let parsedData = []
|
137
140
|
|
@@ -169,7 +172,9 @@ export async function renderJasperReport(context: any) {
|
|
169
172
|
formData.append('jsonString', JSON.stringify(parsedData))
|
170
173
|
formData.append('parameters', JSON.stringify(parameters))
|
171
174
|
|
172
|
-
const
|
175
|
+
const { reportView } = query
|
176
|
+
const subpath = reportView ? reportView.split('/').filter(x => x).join('/') : ''
|
177
|
+
const reportUrl = `${PROTOCOL || 'http'}://${HOST}:${PORT}/${subpath}`
|
173
178
|
const response = await fetch(reportUrl, {
|
174
179
|
method: 'POST',
|
175
180
|
body: formData
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import FormData from 'form-data'
|
2
|
+
import fetch from 'node-fetch'
|
3
|
+
import { config } from '@things-factory/env'
|
4
|
+
|
5
|
+
const querystring = require('querystring')
|
6
|
+
const debug = require('debug')('things-factory:dataset:shiny-report')
|
7
|
+
const dataReportConfig = config.get('dataReport')
|
8
|
+
const {
|
9
|
+
shiny: {
|
10
|
+
endpoint: { protocol: PROTOCOL, host: HOST, port: PORT },
|
11
|
+
datasource: { database: DATABASE }
|
12
|
+
}
|
13
|
+
} = Object.assign({
|
14
|
+
shiny: {
|
15
|
+
endpoint: {},
|
16
|
+
datasource: {}
|
17
|
+
}}, dataReportConfig)
|
18
|
+
|
19
|
+
|
20
|
+
export async function renderShinyReport(context: any) {
|
21
|
+
debug('render:context', context)
|
22
|
+
|
23
|
+
try {
|
24
|
+
const { access_token: token } = querystring.parse(context.header.cookie, ';')
|
25
|
+
const {
|
26
|
+
state: { domain },
|
27
|
+
query,
|
28
|
+
response,
|
29
|
+
} = context
|
30
|
+
|
31
|
+
const urlParams = querystring.stringify({
|
32
|
+
token,
|
33
|
+
...query,
|
34
|
+
...{ database: DATABASE,
|
35
|
+
domain: domain?.subdomain }
|
36
|
+
})
|
37
|
+
|
38
|
+
// const jsonParams = JSON.stringify({
|
39
|
+
// ...query,
|
40
|
+
// ...{ database: DATABASE,
|
41
|
+
// domain: domain?.subdomain }
|
42
|
+
// })
|
43
|
+
|
44
|
+
const protocol = `${PROTOCOL || 'http'}://`
|
45
|
+
const host = `${HOST}:${PORT}/`
|
46
|
+
const subpath = query?.reportView || ''
|
47
|
+
|
48
|
+
if (!subpath) {
|
49
|
+
return context.body = ''
|
50
|
+
}
|
51
|
+
|
52
|
+
// filter not empty and join '/'
|
53
|
+
const url = host.split('/').concat(subpath.split('/'))
|
54
|
+
.filter(x => x).join('/')
|
55
|
+
// const reportUrl = `${protocol}${url}/?params=${jsonParams}`
|
56
|
+
const reportUrl = `${protocol}${url}/?${urlParams}`
|
57
|
+
|
58
|
+
response.redirect(reportUrl)
|
59
|
+
} catch(ex) {
|
60
|
+
context.body = `Error: ${ex.message} || ''`
|
61
|
+
}
|
62
|
+
|
63
|
+
}
|
package/server/routes.ts
CHANGED
@@ -4,6 +4,7 @@ import { User } from '@things-factory/auth-base'
|
|
4
4
|
|
5
5
|
import { createDataSample } from './controllers/create-data-sample'
|
6
6
|
import { renderJasperReport } from './controllers/jasper-report'
|
7
|
+
import { renderShinyReport } from './controllers/shiny-report'
|
7
8
|
import { DataSensor } from './service/data-sensor/data-sensor'
|
8
9
|
|
9
10
|
process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
|
@@ -89,4 +90,13 @@ process.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRo
|
|
89
90
|
domainPrivateRouter.get('/data-report/jasper', async (context, next) => {
|
90
91
|
context.body = await renderJasperReport(context)
|
91
92
|
})
|
93
|
+
|
94
|
+
domainPrivateRouter.get('/data-report/shiny', async (context, next) => {
|
95
|
+
await renderShinyReport(context)
|
96
|
+
})
|
97
|
+
|
98
|
+
domainPrivateRouter.get('/data-report/:reportType', async (context, next) => {
|
99
|
+
let { reportType } = context.params
|
100
|
+
context.body = `${reportType} Not Implemented.`
|
101
|
+
})
|
92
102
|
})
|
@@ -1,16 +1,19 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
2
|
+
import { In } from 'typeorm'
|
3
3
|
|
4
4
|
import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
|
5
5
|
|
6
6
|
import { DataKeySet } from './data-key-set'
|
7
|
-
import {
|
7
|
+
import { DataKeySetPatch, NewDataKeySet } from './data-key-set-type'
|
8
8
|
|
9
9
|
@Resolver(DataKeySet)
|
10
10
|
export class DataKeySetMutation {
|
11
11
|
@Directive('@transaction')
|
12
12
|
@Mutation(returns => DataKeySet, { description: 'To create new DataKeySet' })
|
13
|
-
async createDataKeySet(
|
13
|
+
async createDataKeySet(
|
14
|
+
@Arg('dataKeySet') dataKeySet: NewDataKeySet,
|
15
|
+
@Ctx() context: ResolverContext
|
16
|
+
): Promise<DataKeySet> {
|
14
17
|
const { domain, user, tx } = context.state
|
15
18
|
|
16
19
|
const result = await tx.getRepository(DataKeySet).save({
|
@@ -42,13 +45,13 @@ export class DataKeySetMutation {
|
|
42
45
|
async updateDataKeySet(
|
43
46
|
@Arg('id') id: string,
|
44
47
|
@Arg('patch') patch: DataKeySetPatch,
|
45
|
-
@Ctx() context:
|
48
|
+
@Ctx() context: ResolverContext
|
46
49
|
): Promise<DataKeySet> {
|
47
50
|
const { domain, user, tx } = context.state
|
48
51
|
|
49
52
|
const repository = tx.getRepository(DataKeySet)
|
50
53
|
const dataKeySet = await repository.findOne({
|
51
|
-
where: { domain, id }
|
54
|
+
where: { domain: { id: domain.id }, id }
|
52
55
|
})
|
53
56
|
|
54
57
|
const result = await repository.save({
|
@@ -79,7 +82,7 @@ export class DataKeySetMutation {
|
|
79
82
|
@Mutation(returns => [DataKeySet], { description: "To modify multiple DataKeySets' information" })
|
80
83
|
async updateMultipleDataKeySet(
|
81
84
|
@Arg('patches', type => [DataKeySetPatch]) patches: DataKeySetPatch[],
|
82
|
-
@Ctx() context:
|
85
|
+
@Ctx() context: ResolverContext
|
83
86
|
): Promise<DataKeySet[]> {
|
84
87
|
const { domain, user, tx } = context.state
|
85
88
|
|
@@ -120,7 +123,7 @@ export class DataKeySetMutation {
|
|
120
123
|
if (_updateRecords.length > 0) {
|
121
124
|
for (let i = 0; i < _updateRecords.length; i++) {
|
122
125
|
const updateRecord = _updateRecords[i]
|
123
|
-
const dataKeySet = await dataKeySetRepo.
|
126
|
+
const dataKeySet = await dataKeySetRepo.findOneBy({ id: updateRecord.id })
|
124
127
|
|
125
128
|
const result = await dataKeySetRepo.save({
|
126
129
|
...dataKeySet,
|
@@ -152,10 +155,10 @@ export class DataKeySetMutation {
|
|
152
155
|
|
153
156
|
@Directive('@transaction')
|
154
157
|
@Mutation(returns => Boolean, { description: 'To delete DataKeySet' })
|
155
|
-
async deleteDataKeySet(@Arg('id') id: string, @Ctx() context:
|
158
|
+
async deleteDataKeySet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
156
159
|
const { domain, tx } = context.state
|
157
160
|
|
158
|
-
await tx.getRepository(DataKeySet).delete({ domain, id })
|
161
|
+
await tx.getRepository(DataKeySet).delete({ domain: { id: domain.id }, id })
|
159
162
|
await deleteAttachmentsByRef(null, { refBys: [id] }, context)
|
160
163
|
|
161
164
|
return true
|
@@ -165,12 +168,12 @@ export class DataKeySetMutation {
|
|
165
168
|
@Mutation(returns => Boolean, { description: 'To delete multiple DataKeySets' })
|
166
169
|
async deleteDataKeySets(
|
167
170
|
@Arg('ids', type => [String]) ids: string[],
|
168
|
-
@Ctx() context:
|
171
|
+
@Ctx() context: ResolverContext
|
169
172
|
): Promise<boolean> {
|
170
173
|
const { domain, tx } = context.state
|
171
174
|
|
172
175
|
await tx.getRepository(DataKeySet).delete({
|
173
|
-
domain,
|
176
|
+
domain: { id: domain.id },
|
174
177
|
id: In(ids)
|
175
178
|
})
|
176
179
|
|
@@ -183,7 +186,7 @@ export class DataKeySetMutation {
|
|
183
186
|
@Mutation(returns => Boolean, { description: 'To import multiple DataKeySets' })
|
184
187
|
async importDataKeySets(
|
185
188
|
@Arg('dataKeySets', type => [DataKeySetPatch]) dataKeySets: DataKeySetPatch[],
|
186
|
-
@Ctx() context:
|
189
|
+
@Ctx() context: ResolverContext
|
187
190
|
): Promise<boolean> {
|
188
191
|
const { domain, tx } = context.state
|
189
192
|
|
@@ -1,9 +1,8 @@
|
|
1
1
|
import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
2
|
-
import { getRepository } from 'typeorm'
|
3
2
|
|
4
3
|
import { Attachment } from '@things-factory/attachment-base'
|
5
4
|
import { User } from '@things-factory/auth-base'
|
6
|
-
import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
|
5
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
7
6
|
|
8
7
|
import { DataKeySet } from './data-key-set'
|
9
8
|
import { DataKeySetList } from './data-key-set-type'
|
@@ -11,16 +10,16 @@ import { DataKeySetList } from './data-key-set-type'
|
|
11
10
|
@Resolver(DataKeySet)
|
12
11
|
export class DataKeySetQuery {
|
13
12
|
@Query(returns => DataKeySet!, { nullable: true, description: 'To fetch a DataKeySet' })
|
14
|
-
async dataKeySet(@Arg('id') id: string, @Ctx() context:
|
13
|
+
async dataKeySet(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataKeySet> {
|
15
14
|
const { domain } = context.state
|
16
15
|
|
17
16
|
return await getRepository(DataKeySet).findOne({
|
18
|
-
where: { domain, id }
|
17
|
+
where: { domain: { id: domain.id }, id }
|
19
18
|
})
|
20
19
|
}
|
21
20
|
|
22
21
|
@Query(returns => DataKeySetList, { description: 'To fetch multiple DataKeySets' })
|
23
|
-
async dataKeySets(@Args() params: ListParam, @Ctx() context:
|
22
|
+
async dataKeySets(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataKeySetList> {
|
24
23
|
const { domain } = context.state
|
25
24
|
|
26
25
|
const queryBuilder = getQueryBuilderFromListParams({
|
@@ -39,7 +38,7 @@ export class DataKeySetQuery {
|
|
39
38
|
async thumbnail(@Root() dataKeySet: DataKeySet): Promise<string | undefined> {
|
40
39
|
const attachment: Attachment = await getRepository(Attachment).findOne({
|
41
40
|
where: {
|
42
|
-
domain: dataKeySet.domainId,
|
41
|
+
domain: { id: dataKeySet.domainId },
|
43
42
|
refType: DataKeySet.name,
|
44
43
|
refBy: dataKeySet.id
|
45
44
|
}
|
@@ -50,16 +49,16 @@ export class DataKeySetQuery {
|
|
50
49
|
|
51
50
|
@FieldResolver(type => Domain)
|
52
51
|
async domain(@Root() dataKeySet: DataKeySet): Promise<Domain> {
|
53
|
-
return await getRepository(Domain).
|
52
|
+
return await getRepository(Domain).findOneBy({ id: dataKeySet.domainId })
|
54
53
|
}
|
55
54
|
|
56
55
|
@FieldResolver(type => User)
|
57
56
|
async updater(@Root() dataKeySet: DataKeySet): Promise<User> {
|
58
|
-
return await getRepository(User).
|
57
|
+
return await getRepository(User).findOneBy({ id: dataKeySet.updaterId })
|
59
58
|
}
|
60
59
|
|
61
60
|
@FieldResolver(type => User)
|
62
61
|
async creator(@Root() dataKeySet: DataKeySet): Promise<User> {
|
63
|
-
return await getRepository(User).
|
62
|
+
return await getRepository(User).findOneBy({ id: dataKeySet.creatorId })
|
64
63
|
}
|
65
64
|
}
|
@@ -4,6 +4,7 @@ import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
|
|
4
4
|
|
5
5
|
import { DataKeyItemPatch } from './data-key-item-type'
|
6
6
|
import { DataKeySet } from './data-key-set'
|
7
|
+
import { DataSetReportType } from '../data-set/data-set'
|
7
8
|
|
8
9
|
@InputType()
|
9
10
|
export class NewDataKeySet {
|
@@ -16,6 +17,12 @@ export class NewDataKeySet {
|
|
16
17
|
@Field({ nullable: true })
|
17
18
|
active?: boolean
|
18
19
|
|
20
|
+
@Field({ nullable: true })
|
21
|
+
reportType?: DataSetReportType
|
22
|
+
|
23
|
+
@Field({ nullable: true })
|
24
|
+
reportView?: string
|
25
|
+
|
19
26
|
@Field(type => [DataKeyItemPatch], { nullable: true })
|
20
27
|
dataKeyItems?: DataKeyItemPatch[]
|
21
28
|
|
@@ -37,6 +44,12 @@ export class DataKeySetPatch {
|
|
37
44
|
@Field({ nullable: true })
|
38
45
|
active?: boolean
|
39
46
|
|
47
|
+
@Field({ nullable: true })
|
48
|
+
reportType?: DataSetReportType
|
49
|
+
|
50
|
+
@Field({ nullable: true })
|
51
|
+
reportView?: string
|
52
|
+
|
40
53
|
@Field(type => [DataKeyItemPatch], { nullable: true })
|
41
54
|
dataKeyItems?: DataKeyItemPatch[]
|
42
55
|
|
@@ -14,6 +14,7 @@ import { User } from '@things-factory/auth-base'
|
|
14
14
|
import { Domain } from '@things-factory/shell'
|
15
15
|
|
16
16
|
import { DataKeyItem } from './data-key-item-type'
|
17
|
+
import { DataSetReportType } from '../data-set/data-set'
|
17
18
|
|
18
19
|
@Entity()
|
19
20
|
@Index('ix_data_key_set_0', (dataKeySet: DataKeySet) => [dataKeySet.domain, dataKeySet.name], { unique: true })
|
@@ -46,6 +47,14 @@ export class DataKeySet {
|
|
46
47
|
@Field({ nullable: true })
|
47
48
|
active?: boolean
|
48
49
|
|
50
|
+
@Column({ nullable: true })
|
51
|
+
@Field({ nullable: true })
|
52
|
+
reportType?: DataSetReportType
|
53
|
+
|
54
|
+
@Column({ nullable: true })
|
55
|
+
@Field({ nullable: true })
|
56
|
+
reportView?: string
|
57
|
+
|
49
58
|
@Column('simple-json', { nullable: true })
|
50
59
|
@Field(type => [DataKeyItem], { nullable: true })
|
51
60
|
dataKeyItems: DataKeyItem[]
|
@@ -8,7 +8,7 @@ export class DataOocMutation {
|
|
8
8
|
@Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
|
9
9
|
@Directive('@transaction')
|
10
10
|
@Mutation(returns => DataOoc, { description: 'To create new DataOoc' })
|
11
|
-
async createDataOoc(@Arg('dataOoc') dataOoc: NewDataOoc, @Ctx() context:
|
11
|
+
async createDataOoc(@Arg('dataOoc') dataOoc: NewDataOoc, @Ctx() context: ResolverContext): Promise<DataOoc> {
|
12
12
|
const { domain, user, tx } = context.state
|
13
13
|
|
14
14
|
const state = dataOoc.state || DataOocStatus.CREATED
|
@@ -36,12 +36,16 @@ export class DataOocMutation {
|
|
36
36
|
@Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
|
37
37
|
@Directive('@transaction')
|
38
38
|
@Mutation(returns => DataOoc, { description: 'To modify DataOoc information' })
|
39
|
-
async updateDataOoc(
|
39
|
+
async updateDataOoc(
|
40
|
+
@Arg('id') id: string,
|
41
|
+
@Arg('patch') patch: DataOocPatch,
|
42
|
+
@Ctx() context: ResolverContext
|
43
|
+
): Promise<DataOoc> {
|
40
44
|
const { domain, user, tx } = context.state
|
41
45
|
|
42
46
|
const repository = tx.getRepository(DataOoc)
|
43
47
|
const dataOoc = await repository.findOne({
|
44
|
-
where: { domain, id }
|
48
|
+
where: { domain: { id: domain.id }, id }
|
45
49
|
})
|
46
50
|
|
47
51
|
const state = patch.state || dataOoc.state
|
@@ -82,7 +86,7 @@ export class DataOocMutation {
|
|
82
86
|
// @Mutation(returns => [DataOoc], { description: "To modify multiple DataOoc' information" })
|
83
87
|
// async updateMultipleDataOoc(
|
84
88
|
// @Arg('patches', type => [DataOocPatch]) patches: DataOocPatch[],
|
85
|
-
// @Ctx() context:
|
89
|
+
// @Ctx() context: ResolverContext
|
86
90
|
// ): Promise<DataOoc[]> {
|
87
91
|
// const { domain, user, tx } = context.state
|
88
92
|
|
@@ -109,7 +113,7 @@ export class DataOocMutation {
|
|
109
113
|
// if (_updateRecords.length > 0) {
|
110
114
|
// for (let i = 0; i < _updateRecords.length; i++) {
|
111
115
|
// const newRecord = _updateRecords[i]
|
112
|
-
// const dataOoc = await dataOocRepo.
|
116
|
+
// const dataOoc = await dataOocRepo.findOneBy({id: newRecord.id})
|
113
117
|
|
114
118
|
// const result = await dataOocRepo.save({
|
115
119
|
// ...dataOoc,
|
@@ -127,17 +131,17 @@ export class DataOocMutation {
|
|
127
131
|
// @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
|
128
132
|
// @Directive('@transaction')
|
129
133
|
// @Mutation(returns => Boolean, { description: 'To delete DataOoc' })
|
130
|
-
// async deleteDataOoc(@Arg('id') id: string, @Ctx() context:
|
134
|
+
// async deleteDataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
131
135
|
// const { domain, tx } = context.state
|
132
136
|
|
133
|
-
// await tx.getRepository(DataOoc).delete({ domain, id })
|
137
|
+
// await tx.getRepository(DataOoc).delete({ domain: { id: domain.id }, id })
|
134
138
|
// return true
|
135
139
|
// }
|
136
140
|
|
137
141
|
// @Directive('@privilege(category: "data-ooc", privilege: "mutation", domainOwnerGranted: true)')
|
138
142
|
// @Directive('@transaction')
|
139
143
|
// @Mutation(returns => Boolean, { description: 'To delete multiple dataOocs' })
|
140
|
-
// async deleteDataOocs(@Arg('ids', type => [String]) ids: string[], @Ctx() context:
|
144
|
+
// async deleteDataOocs(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
|
141
145
|
// const { domain, tx } = context.state
|
142
146
|
|
143
147
|
// await tx.getRepository(DataOoc).delete({
|
@@ -1,8 +1,7 @@
|
|
1
1
|
import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
2
|
-
import { getRepository } from 'typeorm'
|
3
2
|
|
4
3
|
import { User } from '@things-factory/auth-base'
|
5
|
-
import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
|
4
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
6
5
|
|
7
6
|
import { DataSetHistory } from '../data-set-history/data-set-history'
|
8
7
|
import { DataItem } from '../data-set/data-item-type'
|
@@ -14,17 +13,17 @@ import { DataOocList } from './data-ooc-type'
|
|
14
13
|
export class DataOocQuery {
|
15
14
|
@Directive('@privilege(category: "data-ooc", privilege: "query", domainOwnerGranted: true)')
|
16
15
|
@Query(returns => DataOoc, { description: 'To fetch a DataOoc' })
|
17
|
-
async dataOoc(@Arg('id') id: string, @Ctx() context:
|
16
|
+
async dataOoc(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataOoc> {
|
18
17
|
const { domain } = context.state
|
19
18
|
|
20
19
|
return await getRepository(DataOoc).findOne({
|
21
|
-
where: { domain, id }
|
20
|
+
where: { domain: { id: domain.id }, id }
|
22
21
|
})
|
23
22
|
}
|
24
23
|
|
25
24
|
@Directive('@privilege(category: "data-ooc", privilege: "query", domainOwnerGranted: true)')
|
26
25
|
@Query(returns => DataOocList, { description: 'To fetch multiple DataOoc' })
|
27
|
-
async dataOocs(@Args() params: ListParam, @Ctx() context:
|
26
|
+
async dataOocs(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataOocList> {
|
28
27
|
const { domain } = context.state
|
29
28
|
|
30
29
|
const queryBuilder = getQueryBuilderFromListParams({
|
@@ -52,23 +51,23 @@ export class DataOocQuery {
|
|
52
51
|
|
53
52
|
@FieldResolver(type => DataSet)
|
54
53
|
async dataSet(@Root() dataOoc: DataOoc): Promise<DataSet> {
|
55
|
-
return await getRepository(DataSet).
|
54
|
+
return await getRepository(DataSet).findOneBy({
|
56
55
|
id: dataOoc.dataSetId
|
57
56
|
})
|
58
57
|
}
|
59
58
|
|
60
59
|
@FieldResolver(type => Domain)
|
61
60
|
async domain(@Root() dataOoc: DataOoc): Promise<Domain> {
|
62
|
-
return await getRepository(Domain).
|
61
|
+
return await getRepository(Domain).findOneBy({ id: dataOoc.domainId })
|
63
62
|
}
|
64
63
|
|
65
64
|
@FieldResolver(type => User)
|
66
65
|
async updater(@Root() dataOoc: DataOoc): Promise<User> {
|
67
|
-
return await getRepository(User).
|
66
|
+
return await getRepository(User).findOneBy({ id: dataOoc.updaterId })
|
68
67
|
}
|
69
68
|
|
70
69
|
@FieldResolver(type => User)
|
71
70
|
async creator(@Root() dataOoc: DataOoc): Promise<User> {
|
72
|
-
return await getRepository(User).
|
71
|
+
return await getRepository(User).findOneBy({ id: dataOoc.creatorId })
|
73
72
|
}
|
74
73
|
}
|
@@ -1,9 +1,8 @@
|
|
1
1
|
import { withFilter } from 'graphql-subscriptions'
|
2
2
|
import { Resolver, Root, Subscription } from 'type-graphql'
|
3
|
-
import { getRepository } from 'typeorm'
|
4
3
|
|
5
4
|
import { User } from '@things-factory/auth-base'
|
6
|
-
import { pubsub } from '@things-factory/shell'
|
5
|
+
import { getRepository, pubsub } from '@things-factory/shell'
|
7
6
|
|
8
7
|
import { DataOoc } from './data-ooc'
|
9
8
|
|
@@ -9,7 +9,10 @@ export class DataSampleMutation {
|
|
9
9
|
@Directive('@privilege(category: "data-sample", privilege: "mutation", domainOwnerGranted: true)')
|
10
10
|
@Directive('@transaction')
|
11
11
|
@Mutation(returns => DataSample, { description: 'To create new data sample' })
|
12
|
-
async createDataSample(
|
12
|
+
async createDataSample(
|
13
|
+
@Arg('dataSample') dataSample: NewDataSample,
|
14
|
+
@Ctx() context: ResolverContext
|
15
|
+
): Promise<DataSample> {
|
13
16
|
return await createDataSample(dataSample, context)
|
14
17
|
}
|
15
18
|
}
|
@@ -1,8 +1,7 @@
|
|
1
1
|
import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
2
|
-
import { getRepository } from 'typeorm'
|
3
2
|
|
4
3
|
import { User } from '@things-factory/auth-base'
|
5
|
-
import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
|
4
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
6
5
|
|
7
6
|
import { DataKeySet } from '../data-key-set/data-key-set'
|
8
7
|
import { DataSetHistory } from '../data-set-history/data-set-history'
|
@@ -15,17 +14,17 @@ import { DataSampleList } from './data-sample-type'
|
|
15
14
|
export class DataSampleQuery {
|
16
15
|
@Directive('@privilege(category: "data-sample", privilege: "query", domainOwnerGranted: true)')
|
17
16
|
@Query(returns => DataSample, { description: 'To fetch a data sample' })
|
18
|
-
async dataSample(@Arg('id') id: string, @Ctx() context:
|
17
|
+
async dataSample(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DataSample> {
|
19
18
|
const { domain } = context.state
|
20
19
|
|
21
20
|
return await getRepository(DataSample).findOne({
|
22
|
-
where: { domain, id }
|
21
|
+
where: { domain: { id: domain.id }, id }
|
23
22
|
})
|
24
23
|
}
|
25
24
|
|
26
25
|
@Directive('@privilege(category: "data-sample", privilege: "query", domainOwnerGranted: true)')
|
27
26
|
@Query(returns => DataSampleList, { description: 'To fetch multiple data samples' })
|
28
|
-
async dataSamples(@Args() params: ListParam, @Ctx() context:
|
27
|
+
async dataSamples(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataSampleList> {
|
29
28
|
const { domain } = context.state
|
30
29
|
|
31
30
|
const queryBuilder = getQueryBuilderFromListParams({
|
@@ -45,11 +44,11 @@ export class DataSampleQuery {
|
|
45
44
|
async dataSamplesByDataKeySet(
|
46
45
|
@Arg('dataKeySetId') dataKeySetId: string,
|
47
46
|
@Args() params: ListParam,
|
48
|
-
@Ctx() context:
|
47
|
+
@Ctx() context: ResolverContext
|
49
48
|
): Promise<DataSampleList> {
|
50
49
|
const { domain } = context.state
|
51
50
|
|
52
|
-
const dataKeySet = await getRepository(DataKeySet).
|
51
|
+
const dataKeySet = await getRepository(DataKeySet).findOneBy({ id: dataKeySetId })
|
53
52
|
const dataKeyItems = dataKeySet?.dataKeyItems || []
|
54
53
|
const searchables = dataKeyItems.map((item, index) => `key0${index + 1}`)
|
55
54
|
|
@@ -81,21 +80,21 @@ export class DataSampleQuery {
|
|
81
80
|
|
82
81
|
@FieldResolver(type => DataSet)
|
83
82
|
async dataSet(@Root() dataSample: DataSample): Promise<DataSet> {
|
84
|
-
return await getRepository(DataSet).
|
83
|
+
return await getRepository(DataSet).findOneBy({ id: dataSample.dataSetId })
|
85
84
|
}
|
86
85
|
|
87
86
|
@FieldResolver(type => Domain)
|
88
87
|
async domain(@Root() dataSample: DataSample): Promise<Domain> {
|
89
|
-
return await getRepository(Domain).
|
88
|
+
return await getRepository(Domain).findOneBy({ id: dataSample.domainId })
|
90
89
|
}
|
91
90
|
|
92
91
|
@FieldResolver(type => User)
|
93
92
|
async updater(@Root() dataSample: DataSample): Promise<User> {
|
94
|
-
return await getRepository(User).
|
93
|
+
return await getRepository(User).findOneBy({ id: dataSample.updaterId })
|
95
94
|
}
|
96
95
|
|
97
96
|
@FieldResolver(type => User)
|
98
97
|
async creator(@Root() dataSample: DataSample): Promise<User> {
|
99
|
-
return await getRepository(User).
|
98
|
+
return await getRepository(User).findOneBy({ id: dataSample.creatorId })
|
100
99
|
}
|
101
100
|
}
|