@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.
Files changed (103) hide show
  1. package/README.md +20 -0
  2. package/assets/data-report.jpg +0 -0
  3. package/assets/glue-table-indices.png +0 -0
  4. package/client/pages/data-key-set/data-key-set-importer.js +4 -6
  5. package/client/pages/data-key-set/data-key-set-list-page.js +97 -2
  6. package/client/pages/data-report/data-report-embed-page.js +16 -12
  7. package/client/pages/data-report/data-report-list-page.js +16 -13
  8. package/client/pages/data-report/data-report-samples-page.js +186 -0
  9. package/client/pages/data-set/data-set-importer.js +1 -1
  10. package/client/pages/data-set/data-set-list-page.js +8 -0
  11. package/client/route.js +16 -12
  12. package/config/config.development.js +10 -0
  13. package/config/config.production.js +21 -11
  14. package/dist-server/controllers/create-data-sample.js +3 -1
  15. package/dist-server/controllers/create-data-sample.js.map +1 -1
  16. package/dist-server/controllers/jasper-report.js +17 -12
  17. package/dist-server/controllers/jasper-report.js.map +1 -1
  18. package/dist-server/controllers/shiny-report.js +44 -0
  19. package/dist-server/controllers/shiny-report.js.map +1 -0
  20. package/dist-server/routes.js +8 -0
  21. package/dist-server/routes.js.map +1 -1
  22. package/dist-server/service/data-key-set/data-key-set-mutation.js +4 -4
  23. package/dist-server/service/data-key-set/data-key-set-mutation.js.map +1 -1
  24. package/dist-server/service/data-key-set/data-key-set-query.js +9 -11
  25. package/dist-server/service/data-key-set/data-key-set-query.js.map +1 -1
  26. package/dist-server/service/data-key-set/data-key-set-type.js +17 -0
  27. package/dist-server/service/data-key-set/data-key-set-type.js.map +1 -1
  28. package/dist-server/service/data-key-set/data-key-set.js +14 -4
  29. package/dist-server/service/data-key-set/data-key-set.js.map +1 -1
  30. package/dist-server/service/data-ooc/data-ooc-mutation.js +1 -1
  31. package/dist-server/service/data-ooc/data-ooc-mutation.js.map +1 -1
  32. package/dist-server/service/data-ooc/data-ooc-query.js +9 -11
  33. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  34. package/dist-server/service/data-ooc/data-ooc-subscription.js +1 -2
  35. package/dist-server/service/data-ooc/data-ooc-subscription.js.map +1 -1
  36. package/dist-server/service/data-ooc/data-ooc-type.js +2 -3
  37. package/dist-server/service/data-ooc/data-ooc-type.js.map +1 -1
  38. package/dist-server/service/data-ooc/data-ooc.js +4 -5
  39. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  40. package/dist-server/service/data-sample/data-sample-mutation.js.map +1 -1
  41. package/dist-server/service/data-sample/data-sample-query.js +12 -14
  42. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  43. package/dist-server/service/data-sample/data-sample-type.js +1 -2
  44. package/dist-server/service/data-sample/data-sample-type.js.map +1 -1
  45. package/dist-server/service/data-sample/data-sample.js +3 -4
  46. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  47. package/dist-server/service/data-sensor/data-sensor-mutation.js +4 -4
  48. package/dist-server/service/data-sensor/data-sensor-mutation.js.map +1 -1
  49. package/dist-server/service/data-sensor/data-sensor-query.js +9 -11
  50. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  51. package/dist-server/service/data-sensor/data-sensor-type.js +4 -5
  52. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
  53. package/dist-server/service/data-sensor/data-sensor.js +4 -5
  54. package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
  55. package/dist-server/service/data-set/data-item-type.js.map +1 -1
  56. package/dist-server/service/data-set/data-set-mutation.js +5 -4
  57. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  58. package/dist-server/service/data-set/data-set-query.js +29 -34
  59. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  60. package/dist-server/service/data-set/data-set-type.js +6 -7
  61. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  62. package/dist-server/service/data-set/data-set.js +7 -6
  63. package/dist-server/service/data-set/data-set.js.map +1 -1
  64. package/dist-server/service/data-set-history/data-set-history-query.js +14 -16
  65. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
  66. package/dist-server/service/data-set-history/data-set-history.js +5 -6
  67. package/dist-server/service/data-set-history/data-set-history.js.map +1 -1
  68. package/dist-server/service/index.js +0 -2
  69. package/dist-server/service/index.js.map +1 -1
  70. package/dist-server/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +9 -9
  72. package/server/controllers/create-data-sample.ts +4 -0
  73. package/server/controllers/jasper-report.ts +17 -12
  74. package/server/controllers/shiny-report.ts +63 -0
  75. package/server/routes.ts +10 -0
  76. package/server/service/data-key-set/data-key-set-mutation.ts +16 -13
  77. package/server/service/data-key-set/data-key-set-query.ts +8 -9
  78. package/server/service/data-key-set/data-key-set-type.ts +13 -0
  79. package/server/service/data-key-set/data-key-set.ts +9 -0
  80. package/server/service/data-ooc/data-ooc-mutation.ts +12 -8
  81. package/server/service/data-ooc/data-ooc-query.ts +8 -9
  82. package/server/service/data-ooc/data-ooc-subscription.ts +1 -2
  83. package/server/service/data-sample/data-sample-mutation.ts +4 -1
  84. package/server/service/data-sample/data-sample-query.ts +10 -11
  85. package/server/service/data-sensor/data-sensor-mutation.ts +15 -9
  86. package/server/service/data-sensor/data-sensor-query.ts +9 -10
  87. package/server/service/data-set/data-item-type.ts +1 -1
  88. package/server/service/data-set/data-set-mutation.ts +16 -11
  89. package/server/service/data-set/data-set-query.ts +22 -26
  90. package/server/service/data-set/data-set.ts +3 -1
  91. package/server/service/data-set-history/data-set-history-query.ts +13 -14
  92. package/server/service/index.ts +0 -2
  93. package/things-factory.config.js +19 -15
  94. package/translations/en.json +1 -0
  95. package/translations/ko.json +1 -0
  96. package/translations/ms.json +1 -0
  97. package/translations/zh.json +1 -0
  98. package/dist-server/service/data-item/data-item.js +0 -155
  99. package/dist-server/service/data-item/data-item.js.map +0 -1
  100. package/dist-server/service/data-item/index.js +0 -6
  101. package/dist-server/service/data-item/index.js.map +0 -1
  102. package/server/service/data-item/data-item.ts +0 -136
  103. 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": "5.0.12",
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": "^5.0.11",
38
- "@things-factory/aws-base": "^5.0.11",
39
- "@things-factory/board-service": "^5.0.11",
40
- "@things-factory/env": "^5.0.0",
41
- "@things-factory/shell": "^5.0.11",
42
- "@things-factory/work-shift": "^5.0.11",
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": "fc92c5a8449721503a893d67aae8e65ce21a7890"
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, dataSetId, fromWorkDate, toWorkDate, workShift, timezone } = params
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 collected_at
114
- FROM ${table}
115
- WHERE domain='${domain}'
116
- AND datasetid = '${dataSetId}'
117
- AND workdate >= '${fromWorkDate}'
118
- AND workdate <= '${toWorkDate}'
119
- ${workShift ? "AND workshift = '" + workShift + "'" : ''}
120
- ORDER BY collected_at`,
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['template'] || 'dynamic_header_sample.jrxml', 'utf-8')
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 reportUrl = `${PROTOCOL || 'http'}://${HOST}:${PORT}/rest/report/show_html`
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 { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
- import { getRepository, In } from 'typeorm'
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 { NewDataKeySet, DataKeySetPatch } from './data-key-set-type'
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(@Arg('dataKeySet') dataKeySet: NewDataKeySet, @Ctx() context: any): Promise<DataKeySet> {
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: any
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: any
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.findOne(updateRecord.id)
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: any): Promise<boolean> {
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: any
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: any
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: any): Promise<DataKeySet> {
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: any): Promise<DataKeySetList> {
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).findOne(dataKeySet.domainId)
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).findOne(dataKeySet.updaterId)
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).findOne(dataKeySet.creatorId)
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: any): Promise<DataOoc> {
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(@Arg('id') id: string, @Arg('patch') patch: DataOocPatch, @Ctx() context: any): Promise<DataOoc> {
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: any
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.findOne(newRecord.id)
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: any): Promise<boolean> {
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: any): Promise<boolean> {
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: any): Promise<DataOoc> {
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: any): Promise<DataOocList> {
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).findOne({
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).findOne(dataOoc.domainId)
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).findOne(dataOoc.updaterId)
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).findOne(dataOoc.creatorId)
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(@Arg('dataSample') dataSample: NewDataSample, @Ctx() context: any): Promise<DataSample> {
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: any): Promise<DataSample> {
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: any): Promise<DataSampleList> {
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: any
47
+ @Ctx() context: ResolverContext
49
48
  ): Promise<DataSampleList> {
50
49
  const { domain } = context.state
51
50
 
52
- const dataKeySet = await getRepository(DataKeySet).findOne(dataKeySetId)
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).findOne(dataSample.dataSetId)
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).findOne(dataSample.domainId)
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).findOne(dataSample.updaterId)
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).findOne(dataSample.creatorId)
98
+ return await getRepository(User).findOneBy({ id: dataSample.creatorId })
100
99
  }
101
100
  }