@things-factory/dataset 7.1.34 → 7.1.38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/client/activities/activity-ooc-resolve-edit.ts +1 -1
  2. package/client/activities/activity-ooc-review-edit.ts +1 -1
  3. package/client/pages/data-entry/data-entry-list-page.ts +7 -0
  4. package/client/pages/data-set/data-set-list-page.ts +24 -15
  5. package/dist-client/activities/activity-ooc-resolve-edit.js +1 -1
  6. package/dist-client/activities/activity-ooc-resolve-edit.js.map +1 -1
  7. package/dist-client/activities/activity-ooc-review-edit.js +1 -1
  8. package/dist-client/activities/activity-ooc-review-edit.js.map +1 -1
  9. package/dist-client/pages/data-entry/data-entry-list-page.js +7 -0
  10. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
  11. package/dist-client/pages/data-set/data-set-list-page.js +24 -15
  12. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -1
  13. package/dist-client/tsconfig.tsbuildinfo +1 -1
  14. package/dist-server/activities/activity-data-collect.d.ts +1 -0
  15. package/dist-server/activities/activity-data-collect.js +1 -0
  16. package/dist-server/activities/activity-data-collect.js.map +1 -1
  17. package/dist-server/activities/activity-data-review.d.ts +1 -0
  18. package/dist-server/activities/activity-data-review.js +1 -0
  19. package/dist-server/activities/activity-data-review.js.map +1 -1
  20. package/dist-server/activities/activity-ooc-resolve.d.ts +1 -0
  21. package/dist-server/activities/activity-ooc-resolve.js +1 -0
  22. package/dist-server/activities/activity-ooc-resolve.js.map +1 -1
  23. package/dist-server/activities/activity-ooc-review.d.ts +1 -0
  24. package/dist-server/activities/activity-ooc-review.js +14 -5
  25. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  26. package/dist-server/controllers/create-data-sample.js +18 -12
  27. package/dist-server/controllers/create-data-sample.js.map +1 -1
  28. package/dist-server/controllers/issue-data-collection-task.d.ts +2 -0
  29. package/dist-server/controllers/{issue-collect-data.js → issue-data-collection-task.js} +13 -10
  30. package/dist-server/controllers/issue-data-collection-task.js.map +1 -0
  31. package/dist-server/engine/task/issue-collect-data.js +2 -2
  32. package/dist-server/engine/task/issue-collect-data.js.map +1 -1
  33. package/dist-server/routes.js +5 -3
  34. package/dist-server/routes.js.map +1 -1
  35. package/dist-server/service/data-ooc/index.d.ts +1 -1
  36. package/dist-server/service/data-sample/data-sample-query.d.ts +1 -1
  37. package/dist-server/service/data-sample/data-sample-query.js +3 -3
  38. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  39. package/dist-server/service/data-set/data-set-mutation.js +8 -65
  40. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  41. package/dist-server/service/data-set/data-set-query.d.ts +1 -0
  42. package/dist-server/service/data-set/data-set-query.js +15 -0
  43. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  44. package/dist-server/service/data-set/data-set-type.d.ts +4 -3
  45. package/dist-server/service/data-set/data-set-type.js +20 -6
  46. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  47. package/dist-server/service/data-set/data-set.d.ts +3 -0
  48. package/dist-server/service/data-set/data-set.js +20 -0
  49. package/dist-server/service/data-set/data-set.js.map +1 -1
  50. package/dist-server/service/data-set/index.d.ts +1 -1
  51. package/dist-server/service/index.d.ts +2 -2
  52. package/dist-server/tsconfig.tsbuildinfo +1 -1
  53. package/helps/dataset/task/issue-collect-data.ja.md +1 -1
  54. package/helps/dataset/task/issue-collect-data.ko.md +1 -1
  55. package/helps/dataset/task/issue-collect-data.md +1 -1
  56. package/helps/dataset/task/issue-collect-data.ms.md +1 -1
  57. package/helps/dataset/task/issue-collect-data.zh.md +1 -1
  58. package/package.json +3 -3
  59. package/server/activities/activity-data-collect.ts +12 -2
  60. package/server/activities/activity-data-review.ts +6 -1
  61. package/server/activities/activity-ooc-resolve.ts +1 -0
  62. package/server/activities/activity-ooc-review.ts +30 -8
  63. package/server/controllers/create-data-sample.ts +18 -12
  64. package/server/controllers/{issue-collect-data.ts → issue-data-collection-task.ts} +11 -8
  65. package/server/engine/task/issue-collect-data.ts +2 -2
  66. package/server/routes.ts +5 -3
  67. package/server/service/data-sample/data-sample-query.ts +4 -4
  68. package/server/service/data-set/data-set-mutation.ts +4 -75
  69. package/server/service/data-set/data-set-query.ts +12 -0
  70. package/server/service/data-set/data-set-type.ts +16 -5
  71. package/server/service/data-set/data-set.ts +17 -0
  72. package/translations/en.json +2 -0
  73. package/translations/ja.json +2 -0
  74. package/translations/ko.json +2 -0
  75. package/translations/ms.json +2 -0
  76. package/translations/zh.json +2 -0
  77. package/dist-server/controllers/issue-collect-data.d.ts +0 -2
  78. package/dist-server/controllers/issue-collect-data.js.map +0 -1
@@ -36,6 +36,7 @@ export declare const ActivityDataCollect: {
36
36
  reportType: string;
37
37
  reportSource: string;
38
38
  thumbnail: string;
39
+ standardTime: number;
39
40
  callback: typeof callback;
40
41
  };
41
42
  export {};
@@ -81,6 +81,7 @@ exports.ActivityDataCollect = {
81
81
  reportType: 'custom-element',
82
82
  reportSource: 'activity-data-collect-view',
83
83
  thumbnail: '/assets/images/data-collect.png',
84
+ standardTime: 24 * 60 * 60, // seconds
84
85
  callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
85
86
  };
86
87
  //# sourceMappingURL=activity-data-collect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-data-collect.js","sourceRoot":"","sources":["../../server/activities/activity-data-collect.ts"],"names":[],"mappings":";;;AAAA,qCAA4B;AAG5B,uDAAkI;AAElI,0EAAoE;AAEpE,KAAK,UAAU,QAAQ,CAAC,gBAAkC,EAAE,QAA6C,EAAE,OAAwB;IACjI,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAChE,IAAI,EAAE,cAAc;SACrB,CAAC,CAAa,CAAA;QAEf,2HAA2H;QAC3H,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAkB;gBAChC,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK,CAAC,SAAS;iBACpB;gBACD,IAAI;aACL,CAAA;YAED,MAAM,IAAA,qCAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAEY,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,4BAA4B;IACtC,QAAQ,EAAE,gBAAgB;IAC1B,UAAU,EAAE,4BAA4B;IACxC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,4BAA4B;IAC1C,SAAS,EAAE,iCAAiC;IAC5C,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { In } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Activity, ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'\nimport { NewDataSample } from 'service/data-sample/data-sample-type'\nimport { createDataSample } from '../controllers/create-data-sample'\n\nasync function callback(activityInstance: ActivityInstance, addendum: UpdateActivityInstanceStateAddendum, context: ResolverContext) {\n const { domain, tx } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n name: 'Collect Data'\n })) as Activity\n\n /* collect-data 액티비티는 한명의 assignee(thread)만 수행하는 multiple: false 액티비티이다. 따라서, output에는 assignee key가 없이, 순수한 data만 들어있다. */\n const data = output\n\n if (activity) {\n const dataSample: NewDataSample = {\n dataSet: {\n id: input.dataSetId\n },\n data\n }\n\n await createDataSample(dataSample, context)\n } else {\n console.error('Collect Data Activity not installed.')\n }\n }\n}\n\nexport const ActivityDataCollect = {\n name: 'Collect Data',\n description: 'Tasks assigned for data collection',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 1,\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-data-collect-edit',\n viewType: 'custom-element',\n viewSource: 'activity-data-collect-view',\n reportType: 'custom-element',\n reportSource: 'activity-data-collect-view',\n thumbnail: '/assets/images/data-collect.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
1
+ {"version":3,"file":"activity-data-collect.js","sourceRoot":"","sources":["../../server/activities/activity-data-collect.ts"],"names":[],"mappings":";;;AAAA,qCAA4B;AAG5B,uDAKiC;AAEjC,0EAAoE;AAEpE,KAAK,UAAU,QAAQ,CACrB,gBAAkC,EAClC,QAA6C,EAC7C,OAAwB;IAExB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAChE,IAAI,EAAE,cAAc;SACrB,CAAC,CAAa,CAAA;QAEf,2HAA2H;QAC3H,MAAM,IAAI,GAAG,MAAM,CAAA;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAkB;gBAChC,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK,CAAC,SAAS;iBACpB;gBACD,IAAI;aACL,CAAA;YAED,MAAM,IAAA,qCAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAEY,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,4BAA4B;IACtC,QAAQ,EAAE,gBAAgB;IAC1B,UAAU,EAAE,4BAA4B;IACxC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,4BAA4B;IAC1C,SAAS,EAAE,iCAAiC;IAC5C,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU;IACtC,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { In } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport {\n Activity,\n ActivityInstance,\n ActivityInstanceStatus,\n UpdateActivityInstanceStateAddendum\n} from '@things-factory/worklist'\nimport { NewDataSample } from 'service/data-sample/data-sample-type'\nimport { createDataSample } from '../controllers/create-data-sample'\n\nasync function callback(\n activityInstance: ActivityInstance,\n addendum: UpdateActivityInstanceStateAddendum,\n context: ResolverContext\n) {\n const { domain, tx } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n name: 'Collect Data'\n })) as Activity\n\n /* collect-data 액티비티는 한명의 assignee(thread)만 수행하는 multiple: false 액티비티이다. 따라서, output에는 assignee key가 없이, 순수한 data만 들어있다. */\n const data = output\n\n if (activity) {\n const dataSample: NewDataSample = {\n dataSet: {\n id: input.dataSetId\n },\n data\n }\n\n await createDataSample(dataSample, context)\n } else {\n console.error('Collect Data Activity not installed.')\n }\n }\n}\n\nexport const ActivityDataCollect = {\n name: 'Collect Data',\n description: 'Tasks assigned for data collection',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 1,\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-data-collect-edit',\n viewType: 'custom-element',\n viewSource: 'activity-data-collect-view',\n reportType: 'custom-element',\n reportSource: 'activity-data-collect-view',\n thumbnail: '/assets/images/data-collect.png',\n standardTime: 24 * 60 * 60, // seconds\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
@@ -36,6 +36,7 @@ export declare const ActivityDataReview: {
36
36
  reportType: string;
37
37
  reportSource: string;
38
38
  thumbnail: string;
39
+ standardTime: number;
39
40
  callback: typeof callback;
40
41
  };
41
42
  export {};
@@ -68,6 +68,7 @@ exports.ActivityDataReview = {
68
68
  reportType: 'custom-element',
69
69
  reportSource: 'activity-data-review-view',
70
70
  thumbnail: '/assets/images/data-collect.png',
71
+ standardTime: 24 * 60 * 60, // seconds
71
72
  callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
72
73
  };
73
74
  //# sourceMappingURL=activity-data-review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-data-review.js","sourceRoot":"","sources":["../../server/activities/activity-data-review.ts"],"names":[],"mappings":";;;AAAA,uDAAwH;AAExH,2DAA4D;AAC5D,oEAA+D;AAE/D,KAAK,UAAU,QAAQ,CAAC,gBAAkC,EAAE,QAA6C,EAAE,OAAwB;;IACjI,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,wBAAU,CAAC,CAAC,OAAO,CAAC;YAC1D,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,0CAAE,EAAE,EAAE;SAChE,CAAC,CAAA;QAEF,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,wBAAU,CAAC,CAAC,IAAI,iCAC/C,UAAU,KACb,MAAM,EACN,KAAK,EAAE,wBAAa,CAAC,QAAQ,IAC7B,CAAA;IACJ,CAAC;AACH,CAAC;AAEY,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,2BAA2B;IACrC,QAAQ,EAAE,gBAAgB;IAC1B,UAAU,EAAE,2BAA2B;IACvC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,2BAA2B;IACzC,SAAS,EAAE,iCAAiC;IAC5C,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'\n\nimport { DataOocStatus } from '../service/data-ooc/data-ooc'\nimport { DataSample } from '../service/data-sample/data-sample'\n\nasync function callback(activityInstance: ActivityInstance, addendum: UpdateActivityInstanceStateAddendum, context: ResolverContext) {\n const { domain, tx, user } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n var dataSample = await tx.getRepository(DataSample).findOne({\n where: { domain: { id: domain.id }, id: input?.dataSample?.id }\n })\n\n dataSample = await tx.getRepository(DataSample).save({\n ...dataSample,\n output,\n state: DataOocStatus.REVIEWED\n })\n }\n}\n\nexport const ActivityDataReview = {\n name: 'Data Review',\n description: 'Tasks for data review',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 1,\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-data-review-edit',\n viewType: 'custom-element',\n viewSource: 'activity-data-review-view',\n reportType: 'custom-element',\n reportSource: 'activity-data-review-view',\n thumbnail: '/assets/images/data-collect.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
1
+ {"version":3,"file":"activity-data-review.js","sourceRoot":"","sources":["../../server/activities/activity-data-review.ts"],"names":[],"mappings":";;;AAAA,uDAAwH;AAExH,2DAA4D;AAC5D,oEAA+D;AAE/D,KAAK,UAAU,QAAQ,CACrB,gBAAkC,EAClC,QAA6C,EAC7C,OAAwB;;IAExB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,wBAAU,CAAC,CAAC,OAAO,CAAC;YAC1D,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,0CAAE,EAAE,EAAE;SAChE,CAAC,CAAA;QAEF,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,wBAAU,CAAC,CAAC,IAAI,iCAC/C,UAAU,KACb,MAAM,EACN,KAAK,EAAE,wBAAa,CAAC,QAAQ,IAC7B,CAAA;IACJ,CAAC;AACH,CAAC;AAEY,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,2BAA2B;IACrC,QAAQ,EAAE,gBAAgB;IAC1B,UAAU,EAAE,2BAA2B;IACvC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,2BAA2B;IACzC,SAAS,EAAE,iCAAiC;IAC5C,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU;IACtC,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'\n\nimport { DataOocStatus } from '../service/data-ooc/data-ooc'\nimport { DataSample } from '../service/data-sample/data-sample'\n\nasync function callback(\n activityInstance: ActivityInstance,\n addendum: UpdateActivityInstanceStateAddendum,\n context: ResolverContext\n) {\n const { domain, tx, user } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n var dataSample = await tx.getRepository(DataSample).findOne({\n where: { domain: { id: domain.id }, id: input?.dataSample?.id }\n })\n\n dataSample = await tx.getRepository(DataSample).save({\n ...dataSample,\n output,\n state: DataOocStatus.REVIEWED\n })\n }\n}\n\nexport const ActivityDataReview = {\n name: 'Data Review',\n description: 'Tasks for data review',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 1,\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-data-review-edit',\n viewType: 'custom-element',\n viewSource: 'activity-data-review-view',\n reportType: 'custom-element',\n reportSource: 'activity-data-review-view',\n thumbnail: '/assets/images/data-collect.png',\n standardTime: 24 * 60 * 60, // seconds\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
@@ -36,6 +36,7 @@ export declare const ActivityOocResolve: {
36
36
  reportType: string;
37
37
  reportSource: string;
38
38
  thumbnail: string;
39
+ standardTime: number;
39
40
  callback: typeof callback;
40
41
  };
41
42
  export {};
@@ -98,6 +98,7 @@ exports.ActivityOocResolve = {
98
98
  reportType: 'custom-element',
99
99
  reportSource: 'data-ooc-report-page',
100
100
  thumbnail: '/assets/images/ooc.png',
101
+ standardTime: 24 * 60 * 60, // seconds
101
102
  callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
102
103
  };
103
104
  //# sourceMappingURL=activity-ooc-resolve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-ooc-resolve.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActivityInstance,\n ActivityInstanceStatus,\n ActivityThread,\n ActivityThreadStatus,\n UpdateActivityInstanceStateAddendum\n} from '@things-factory/worklist'\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(\n activityInstance: ActivityInstance,\n addendum: UpdateActivityInstanceStateAddendum,\n context: ResolverContext\n) {\n const { tx, user, domain } = context.state\n const { id, input, output, state, terminatedAt } = activityInstance\n const { causedBy } = addendum || {}\n\n /* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */\n if (state == ActivityInstanceStatus.Ended) {\n const activityThreads = await tx.getRepository(ActivityThread).find({\n where: {\n domain: { id: domain.id },\n activityInstance: { id },\n state: ActivityThreadStatus.Ended\n },\n relations: ['assignee']\n })\n\n const corrector = activityThreads[0]?.assignee\n\n const { dataOocId } = input\n const correctiveAction = output.action\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n correctedAt: terminatedAt,\n corrector: corrector,\n correctiveAction,\n updater: user,\n state: DataOocStatus.CORRECTED\n })\n }\n}\n\nexport const ActivityOocResolve = {\n name: 'OOC Resolve',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 3,\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'instruction',\n description: 'Instructions for resolving OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'in',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'action',\n description: 'Action Description',\n tag: 'action',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-resolve-edit',\n viewType: 'custom-element',\n viewSource: 'activity-ooc-resolve-view',\n reportType: 'custom-element',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
1
+ {"version":3,"file":"activity-ooc-resolve.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActivityInstance,\n ActivityInstanceStatus,\n ActivityThread,\n ActivityThreadStatus,\n UpdateActivityInstanceStateAddendum\n} from '@things-factory/worklist'\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(\n activityInstance: ActivityInstance,\n addendum: UpdateActivityInstanceStateAddendum,\n context: ResolverContext\n) {\n const { tx, user, domain } = context.state\n const { id, input, output, state, terminatedAt } = activityInstance\n const { causedBy } = addendum || {}\n\n /* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */\n if (state == ActivityInstanceStatus.Ended) {\n const activityThreads = await tx.getRepository(ActivityThread).find({\n where: {\n domain: { id: domain.id },\n activityInstance: { id },\n state: ActivityThreadStatus.Ended\n },\n relations: ['assignee']\n })\n\n const corrector = activityThreads[0]?.assignee\n\n const { dataOocId } = input\n const correctiveAction = output.action\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n correctedAt: terminatedAt,\n corrector: corrector,\n correctiveAction,\n updater: user,\n state: DataOocStatus.CORRECTED\n })\n }\n}\n\nexport const ActivityOocResolve = {\n name: 'OOC Resolve',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 3,\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'instruction',\n description: 'Instructions for resolving OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'in',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'action',\n description: 'Action Description',\n tag: 'action',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-resolve-edit',\n viewType: 'custom-element',\n viewSource: 'activity-ooc-resolve-view',\n reportType: 'custom-element',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n standardTime: 24 * 60 * 60, // seconds\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
@@ -36,6 +36,7 @@ export declare const ActivityOocReview: {
36
36
  reportType: string;
37
37
  reportSource: string;
38
38
  thumbnail: string;
39
+ standardTime: number;
39
40
  callback: typeof callback;
40
41
  };
41
42
  export {};
@@ -4,6 +4,7 @@ exports.ActivityOocReview = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const worklist_1 = require("@things-factory/worklist");
6
6
  const issue_1 = require("@things-factory/worklist/dist-server/controllers/activity-instance/issue");
7
+ const auth_base_1 = require("@things-factory/auth-base");
7
8
  const data_ooc_1 = require("../service/data-ooc/data-ooc");
8
9
  async function callback(activityInstance, addendum, context) {
9
10
  const { domain, user, tx } = context.state;
@@ -25,21 +26,28 @@ async function callback(activityInstance, addendum, context) {
25
26
  relations: ['dataSet']
26
27
  });
27
28
  const dataSet = dataOoc.dataSet;
28
- const { assignees, outlierApprovalLine } = dataSet;
29
+ const { resolverRoleId, outlierApprovalLine } = dataSet;
29
30
  /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
30
31
  dataOoc = await tx.getRepository(data_ooc_1.DataOoc).save(Object.assign(Object.assign({}, dataOoc), { reviewedAt: terminatedAt, reviewer: user, correctiveInstruction, state: data_ooc_1.DataOocStatus.REVIEWED }));
31
- /* 해당 dataset의 작업 담당자(assignees)에게 OOC 해결을 위한 태스크를 지시한다. */
32
- if (assignees && assignees instanceof Array && assignees.length > 0) {
32
+ const assigneeRole = resolverRoleId &&
33
+ (await tx.getRepository(auth_base_1.Role).findOneBy({
34
+ domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) },
35
+ id: resolverRoleId
36
+ }));
37
+ /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */
38
+ if (assigneeRole) {
33
39
  const activityInstance = {
34
40
  name: `[OOC 조치] ${dataSet.name}`,
35
41
  description: dataSet.description,
36
42
  activityId: activity.id,
37
- dueAt: new Date(terminatedAt.getTime() + 24 * 60 * 60 * 1000),
43
+ dueAt: new Date(terminatedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
38
44
  input: {
39
45
  dataOocId,
40
46
  instruction: correctiveInstruction
41
47
  },
42
- assignees,
48
+ assigneeRole,
49
+ threadsMin: 1,
50
+ threadsMax: 1,
43
51
  approvalLine: outlierApprovalLine
44
52
  };
45
53
  dataOoc.resolveActivityInstance = await (0, issue_1.issue)(activityInstance, context);
@@ -107,6 +115,7 @@ exports.ActivityOocReview = {
107
115
  reportType: 'custom-element',
108
116
  reportSource: 'data-ooc-report-page',
109
117
  thumbnail: '/assets/images/ooc.png',
118
+ standardTime: 24 * 60 * 60, // seconds
110
119
  callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
111
120
  };
112
121
  //# sourceMappingURL=activity-ooc-review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-ooc-review.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-review.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { Activity, ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'\n\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(activityInstance: ActivityInstance, addendum: UpdateActivityInstanceStateAddendum, context: ResolverContext) {\n const { domain, user, tx } = context.state\n const { input, output, state, terminatedAt } = activityInstance\n const { causedBy } = addendum || {}\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },\n name: 'OOC Resolve'\n })) as Activity\n\n if (activity) {\n const { dataOocId } = input\n const correctiveInstruction = output?.instruction\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n const dataSet = dataOoc.dataSet\n const { assignees, outlierApprovalLine } = dataSet\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n reviewedAt: terminatedAt,\n reviewer: user,\n correctiveInstruction,\n state: DataOocStatus.REVIEWED\n })\n\n /* 해당 dataset의 작업 담당자(assignees)에게 OOC 해결을 위한 태스크를 지시한다. */\n if (assignees && assignees instanceof Array && assignees.length > 0) {\n const activityInstance = {\n name: `[OOC 조치] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(terminatedAt.getTime() + 24 * 60 * 60 * 1000),\n input: {\n dataOocId,\n instruction: correctiveInstruction\n },\n assignees,\n approvalLine: outlierApprovalLine\n }\n\n dataOoc.resolveActivityInstance = await issue(activityInstance, context)\n await tx.getRepository(DataOoc).save(dataOoc)\n } else {\n console.error(`Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`)\n }\n } else {\n console.error('OOC Resolve Activity not installed.')\n }\n }\n}\n\nexport const ActivityOocReview = {\n name: 'OOC Review',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 2,\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'Instruction',\n description: 'Instructions for preventing OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-review-edit',\n viewType: 'custom-element',\n viewSource: 'activity-ooc-review-view',\n reportType: 'custom-element',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
1
+ {"version":3,"file":"activity-ooc-review.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-review.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport {\n Activity,\n ActivityInstance,\n ActivityInstanceStatus,\n UpdateActivityInstanceStateAddendum\n} from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'\nimport { Role } from '@things-factory/auth-base'\n\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(\n activityInstance: ActivityInstance,\n addendum: UpdateActivityInstanceStateAddendum,\n context: ResolverContext\n) {\n const { domain, user, tx } = context.state\n const { input, output, state, terminatedAt } = activityInstance\n const { causedBy } = addendum || {}\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: domain.parentId ? In([domain.id, domain.parentId]) : { id: domain.id },\n name: 'OOC Resolve'\n })) as Activity\n\n if (activity) {\n const { dataOocId } = input\n const correctiveInstruction = output?.instruction\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n const dataSet = dataOoc.dataSet\n const { resolverRoleId, outlierApprovalLine } = dataSet\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n reviewedAt: terminatedAt,\n reviewer: user,\n correctiveInstruction,\n state: DataOocStatus.REVIEWED\n })\n\n const assigneeRole =\n resolverRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: resolverRoleId\n }))\n\n /* 해당 dataset의 작업 담당자(resolverRole)에게 OOC 해결을 위한 태스크를 지시한다. */\n if (assigneeRole) {\n const activityInstance = {\n name: `[OOC 조치] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(terminatedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataOocId,\n instruction: correctiveInstruction\n },\n assigneeRole,\n threadsMin: 1,\n threadsMax: 1,\n approvalLine: outlierApprovalLine\n }\n\n dataOoc.resolveActivityInstance = await issue(activityInstance, context)\n await tx.getRepository(DataOoc).save(dataOoc)\n } else {\n console.error(\n `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`\n )\n }\n } else {\n console.error('OOC Resolve Activity not installed.')\n }\n }\n}\n\nexport const ActivityOocReview = {\n name: 'OOC Review',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n priority: 2,\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startingType: '',\n multiple: 'single',\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'Instruction',\n description: 'Instructions for preventing OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-review-edit',\n viewType: 'custom-element',\n viewSource: 'activity-ooc-review-view',\n reportType: 'custom-element',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n standardTime: 24 * 60 * 60, // seconds\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
@@ -202,23 +202,27 @@ async function createDataSample(newDataSample, context) {
202
202
  name: 'OOC Review'
203
203
  }));
204
204
  if (activity) {
205
- const assignee = dataSet.supervisoryRoleId &&
205
+ const assigneeRole = dataSet.supervisoryRoleId &&
206
206
  (await tx.getRepository(auth_base_1.Role).findOneBy({
207
207
  domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) },
208
208
  id: dataSet.supervisoryRoleId
209
209
  }));
210
- const assignees = dataSet.supervisoryRoleId ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }] : [];
210
+ // const assignees = dataSet.supervisoryRoleId
211
+ // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]
212
+ // : []
211
213
  /* 해당 dataset의 supervisor로 하여금, OOC를 리뷰하고 instruction을 작성해서, OOC 해결을 위한 태스크를 dataset assignees에게 지시하도록 한다. */
212
- if (assignees && assignees instanceof Array && assignees.length > 0) {
214
+ if (assigneeRole) {
213
215
  const activityInstance = {
214
216
  name: `[OOC 검토] ${dataSet.name}`,
215
217
  description: dataSet.description,
216
218
  activityId: activity.id,
217
- dueAt: new Date(collectedAt.getTime() + 24 * 60 * 60 * 1000),
219
+ dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
218
220
  input: {
219
221
  dataOocId: dataOoc.id
220
222
  },
221
- assignees,
223
+ assigneeRole,
224
+ threadsMin: 1,
225
+ threadsMax: 1,
222
226
  approvalLine: []
223
227
  };
224
228
  dataOoc.reviewActivityInstance = await (0, issue_1.issue)(activityInstance, context);
@@ -298,26 +302,28 @@ async function createDataSample(newDataSample, context) {
298
302
  name: 'Data Review'
299
303
  }));
300
304
  if (activity) {
301
- const assignee = dataSet.supervisoryRoleId &&
305
+ const assigneeRole = dataSet.supervisoryRoleId &&
302
306
  (await tx.getRepository(auth_base_1.Role).findOneBy({
303
307
  domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) },
304
308
  id: dataSet.supervisoryRoleId
305
309
  }));
306
- const assignees = dataSet.supervisoryRoleId
307
- ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }]
308
- : [];
310
+ // const assignees = dataSet.supervisoryRoleId
311
+ // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]
312
+ // : []
309
313
  /* 해당 dataset의 supervisor로 하여금, data를 리뷰하고 instruction을 작성해서, approvalLine을 이용해서 승인을 한다. */
310
- if (assignees && assignees instanceof Array && assignees.length > 0) {
314
+ if (assigneeRole) {
311
315
  dataSample.dataItems = dataItems;
312
316
  const activityInstance = {
313
317
  name: `[Data 검토] ${dataSet.name}`,
314
318
  description: dataSet.description,
315
319
  activityId: activity.id,
316
- dueAt: new Date(collectedAt.getTime() + 24 * 60 * 60 * 1000),
320
+ dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),
317
321
  input: {
318
322
  dataSampleId: dataSample.id
319
323
  },
320
- assignees,
324
+ assigneeRole,
325
+ threadsMin: 1,
326
+ threadsMax: 1,
321
327
  approvalLine: dataSet.reviewApprovalLine
322
328
  };
323
329
  dataSample.reviewActivityInstance = await (0, issue_1.issue)(activityInstance, context);
@@ -1 +1 @@
1
- {"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../server/controllers/create-data-sample.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\nimport { In } from 'typeorm'\n\nimport { Attachment, createAttachment } from '@things-factory/attachment-base'\nimport { Role } from '@things-factory/auth-base'\nimport { logger } from '@things-factory/env'\nimport { getRedirectSubdomainPath, pubsub } from '@things-factory/shell'\nimport { getWorkDateAndShift } from '@things-factory/work-shift'\nimport { Scenario, publishData } from '@things-factory/integration-base'\nimport { Activity } from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'\n\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\nimport { DataSample } from '../service/data-sample/data-sample'\nimport { NewDataSample } from '../service/data-sample/data-sample-type'\nimport { DataSet } from '../service/data-set/data-set'\nimport { DataUseCase } from './data-use-case'\n\n// See README.md at ## Data Samples\nprocess.env.TZ = 'UTC'\n\nconst fillDataKeys = (dataKeySet, data = {}) => {\n const keys = dataKeySet?.dataKeyItems || []\n return keys.reduce((sum, key, index) => {\n const value = data[key.dataKey]\n if (value != null) {\n sum[`key0${index + 1}`] = value instanceof Array ? value[0] : value\n }\n return sum\n }, {})\n}\n\n// parse variable javascript string pattern\nconst replaceVariables = (keys, dic) => {\n for (const k in keys) {\n const matches = keys[k].match(/\\$\\{\\w*\\}/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, dic[m.slice(2, -1)])\n })\n }\n return keys\n}\n\n// It is required UTC date for Partitioning File System like AWS S3 from Athena.\n// ex) %YYYY, %MM, %DD\nconst formatDate = (keys, _moment) => {\n for (const k in keys) {\n const matches = keys[k].match(/%\\w*/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, _moment.format(m.substr(1)))\n })\n }\n return keys\n}\n\nexport async function createDataSample(newDataSample: NewDataSample, context: ResolverContext): Promise<DataSample> {\n const { domain, user, tx } = context.state\n\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: newDataSample.dataSet.id },\n relations: ['dataKeySet']\n })\n\n const { dataItems = [], tag: publishTag, normalScenarioId, outlierScenarioId } = dataSet\n const collectedAt = newDataSample.collectedAt || new Date()\n\n const timezone = dataSet.timezone || domain.timezone || 'UTC'\n const format = 'YYYY-MM-DD'\n\n // workDate ex) 2022-04-04\n const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt, { timezone, format })\n\n // local time dataSet timezone or domain timezone or default 'UTC'\n\n const localDateTz = moment(collectedAt).tz(timezone)\n const defaultPartitionKeys = {\n domain: domain.subdomain,\n datasetid: newDataSample.dataSet.id /* It should not be 'data_set_id' as column name duplicated for Glue */,\n date: localDateTz.format(format) /* local time date */,\n workdate: workDate /* working date */,\n workshift: workShift\n }\n\n var partitionKeys = {\n ...defaultPartitionKeys,\n ...dataSet.partitionKeys\n }\n\n partitionKeys = formatDate(partitionKeys, localDateTz)\n partitionKeys = replaceVariables(partitionKeys, newDataSample.data)\n\n const dataKeys = fillDataKeys(dataSet?.dataKeySet, newDataSample.data)\n\n const { ooc, oos, judgment } = DataUseCase.evaluate(dataSet, dataItems, newDataSample.data) || {}\n\n const old = await tx.getRepository(DataSample).findOne({\n where: {\n domain: { id: domain.id },\n dataSet: { id: dataSet.id },\n collectedAt,\n ...dataKeys\n }\n })\n\n /* \n pre-processing for file attachment.\n currently only support type of [FileUpload].\n If [FileUpload[]] type needed, add 'files' type for dataset\n */\n\n const data = newDataSample.data\n const attachments = []\n\n for (let dataItem of dataItems) {\n if (dataItem.type == 'file') {\n const tag = dataItem.tag\n const filesArray = data[tag]\n\n if (tag && filesArray && filesArray.length > 0) {\n let pathsArray = []\n\n for (let files of filesArray) {\n let paths = []\n\n if (files instanceof Array) {\n for (let file of files) {\n if (file) {\n const attachment = await createAttachment(\n null,\n {\n attachment: {\n file: file.file,\n refType: DataSample.name\n }\n },\n context\n )\n\n const fetched = await tx.getRepository(Attachment).findOneBy({ id: attachment.id })\n if (fetched) {\n attachments.push(fetched)\n paths.push({\n id: fetched.id,\n mimetype: fetched.mimetype,\n name: fetched.name,\n fullpath: fetched.fullpath\n })\n } else {\n throw `Failed to save file(${attachment.name})`\n }\n } else {\n paths.push(null)\n }\n }\n }\n\n pathsArray.push(paths)\n }\n\n data[tag] = pathsArray\n }\n }\n }\n\n const dataSample = await tx.getRepository(DataSample).save({\n ...old,\n name: dataSet.name,\n description: dataSet.description,\n useCase: dataSet.useCase,\n type: dataSet.type,\n ...newDataSample,\n ...dataKeys,\n dataSetVersion: dataSet.version,\n domain,\n partitionKeys,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n creator: user,\n updater: user\n })\n\n if (publishTag) {\n publishData(publishTag, data, { domain, user })\n }\n\n /* post-process for for file attachment. */\n if (attachments.length > 0) {\n attachments.forEach(attachment => (attachment.refId = dataSample.id))\n tx.getRepository(Attachment).save(attachments)\n }\n\n if (ooc || oos) {\n const dataOoc = await tx.getRepository(DataOoc).save({\n ...dataSample,\n history: [\n {\n user: {\n id: user?.id,\n name: user?.name\n },\n state: DataOocStatus.ISSUED,\n timestamp: collectedAt\n }\n ],\n state: DataOocStatus.ISSUED,\n dataSample: dataSample\n })\n\n if (outlierScenarioId) {\n const scenario = await tx.getRepository(Scenario).findOne({\n where: {\n domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },\n id: outlierScenarioId\n },\n relations: ['domain', 'steps', 'updater']\n })\n\n if (scenario) {\n scenario.start({\n instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,\n domain,\n user,\n variables: {\n dataOocId: dataOoc.id,\n dataSampleId: dataSample.id,\n dataSet: dataSet.id,\n data,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n domain: {\n id: domain.id,\n subdomain: domain.subdomain,\n name: domain.name\n },\n updator: {\n id: user.id,\n email: user.email,\n name: user.name\n }\n }\n })\n } else {\n console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)\n }\n }\n\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },\n name: 'OOC Review'\n })) as Activity\n\n if (activity) {\n const assignee =\n dataSet.supervisoryRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: dataSet.supervisoryRoleId\n }))\n\n const assignees = dataSet.supervisoryRoleId ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }] : []\n\n /* 해당 dataset의 supervisor로 하여금, OOC를 리뷰하고 instruction을 작성해서, OOC 해결을 위한 태스크를 dataset assignees에게 지시하도록 한다. */\n if (assignees && assignees instanceof Array && assignees.length > 0) {\n const activityInstance = {\n name: `[OOC 검토] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(collectedAt.getTime() + 24 * 60 * 60 * 1000),\n input: {\n dataOocId: dataOoc.id\n },\n assignees,\n approvalLine: []\n }\n\n dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)\n await tx.getRepository(DataOoc).save(dataOoc)\n } else {\n console.error(\n `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`\n )\n }\n } else {\n console.warn('OOC Review Activity not installed.')\n }\n\n try {\n // pubsub.publish('data-ooc', {\n // dataOoc,\n // supervisoryRoleId: dataSet.supervisoryRoleId\n // })\n\n pubsub.publish('notification', {\n notification: {\n domain,\n type: 'error',\n title: `[OOC] ${dataSet.name}`,\n body: `Data OOC occurred on '${dataSet.name}'`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/data-ooc/${dataOoc.id}`),\n timestamp: collectedAt\n }\n })\n } catch (err) {\n logger.error('Notification', err)\n }\n } else {\n if (normalScenarioId) {\n const scenario = await tx.getRepository(Scenario).findOne({\n where: {\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: normalScenarioId\n },\n relations: ['domain', 'steps', 'updater']\n })\n\n if (scenario) {\n scenario.start({\n instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,\n domain,\n user,\n variables: {\n dataSampleId: dataSample.id,\n dataSet: dataSet.id,\n data,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n domain: {\n id: domain.id,\n subdomain: domain.subdomain,\n name: domain.name\n },\n updator: {\n id: user.id,\n email: user.email,\n name: user.name\n }\n }\n })\n } else {\n console.error(`Cannot find the set normal-scenario for the dataset(${dataSet.name}).`)\n }\n }\n\n if (dataSet.requiresReview) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n name: 'Data Review'\n })) as Activity\n\n if (activity) {\n const assignee =\n dataSet.supervisoryRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: dataSet.supervisoryRoleId\n }))\n\n const assignees = dataSet.supervisoryRoleId\n ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }]\n : []\n\n /* 해당 dataset의 supervisor로 하여금, data를 리뷰하고 instruction을 작성해서, approvalLine을 이용해서 승인을 한다. */\n if (assignees && assignees instanceof Array && assignees.length > 0) {\n dataSample.dataItems = dataItems\n const activityInstance = {\n name: `[Data 검토] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(collectedAt.getTime() + 24 * 60 * 60 * 1000),\n input: {\n dataSampleId: dataSample.id\n },\n assignees,\n approvalLine: dataSet.reviewApprovalLine\n }\n\n dataSample.reviewActivityInstance = await issue(activityInstance as any, context)\n await tx.getRepository(DataSample).save(dataSample)\n\n try {\n pubsub.publish('notification', {\n notification: {\n domain,\n type: 'info',\n title: `[Data Review] ${dataSet.name}`,\n body: `Data Review occurred on '${dataSet.name}'`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/data-sample/${dataSample.id}`),\n timestamp: collectedAt\n }\n })\n } catch (err) {\n logger.error('Notification', err)\n }\n } else {\n console.error(\n `Assignees are not set. So Data Review task for ${dataSet.name}(${dataSet.id}) could not be issued.`\n )\n }\n } else {\n console.error('Data Review Activity not installed.')\n }\n }\n }\n\n return dataSample\n}\n"]}
1
+ {"version":3,"file":"create-data-sample.js","sourceRoot":"","sources":["../../server/controllers/create-data-sample.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\nimport { In } from 'typeorm'\n\nimport { Attachment, createAttachment } from '@things-factory/attachment-base'\nimport { Role } from '@things-factory/auth-base'\nimport { logger } from '@things-factory/env'\nimport { getRedirectSubdomainPath, pubsub } from '@things-factory/shell'\nimport { getWorkDateAndShift } from '@things-factory/work-shift'\nimport { Scenario, publishData } from '@things-factory/integration-base'\nimport { Activity } from '@things-factory/worklist'\nimport { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'\n\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\nimport { DataSample } from '../service/data-sample/data-sample'\nimport { NewDataSample } from '../service/data-sample/data-sample-type'\nimport { DataSet } from '../service/data-set/data-set'\nimport { DataUseCase } from './data-use-case'\n\n// See README.md at ## Data Samples\nprocess.env.TZ = 'UTC'\n\nconst fillDataKeys = (dataKeySet, data = {}) => {\n const keys = dataKeySet?.dataKeyItems || []\n return keys.reduce((sum, key, index) => {\n const value = data[key.dataKey]\n if (value != null) {\n sum[`key0${index + 1}`] = value instanceof Array ? value[0] : value\n }\n return sum\n }, {})\n}\n\n// parse variable javascript string pattern\nconst replaceVariables = (keys, dic) => {\n for (const k in keys) {\n const matches = keys[k].match(/\\$\\{\\w*\\}/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, dic[m.slice(2, -1)])\n })\n }\n return keys\n}\n\n// It is required UTC date for Partitioning File System like AWS S3 from Athena.\n// ex) %YYYY, %MM, %DD\nconst formatDate = (keys, _moment) => {\n for (const k in keys) {\n const matches = keys[k].match(/%\\w*/g)\n matches &&\n matches.forEach(m => {\n keys[k] = keys[k].replace(m, _moment.format(m.substr(1)))\n })\n }\n return keys\n}\n\nexport async function createDataSample(newDataSample: NewDataSample, context: ResolverContext): Promise<DataSample> {\n const { domain, user, tx } = context.state\n\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: newDataSample.dataSet.id },\n relations: ['dataKeySet']\n })\n\n const { dataItems = [], tag: publishTag, normalScenarioId, outlierScenarioId } = dataSet\n const collectedAt = newDataSample.collectedAt || new Date()\n\n const timezone = dataSet.timezone || domain.timezone || 'UTC'\n const format = 'YYYY-MM-DD'\n\n // workDate ex) 2022-04-04\n const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt, { timezone, format })\n\n // local time dataSet timezone or domain timezone or default 'UTC'\n\n const localDateTz = moment(collectedAt).tz(timezone)\n const defaultPartitionKeys = {\n domain: domain.subdomain,\n datasetid: newDataSample.dataSet.id /* It should not be 'data_set_id' as column name duplicated for Glue */,\n date: localDateTz.format(format) /* local time date */,\n workdate: workDate /* working date */,\n workshift: workShift\n }\n\n var partitionKeys = {\n ...defaultPartitionKeys,\n ...dataSet.partitionKeys\n }\n\n partitionKeys = formatDate(partitionKeys, localDateTz)\n partitionKeys = replaceVariables(partitionKeys, newDataSample.data)\n\n const dataKeys = fillDataKeys(dataSet?.dataKeySet, newDataSample.data)\n\n const { ooc, oos, judgment } = DataUseCase.evaluate(dataSet, dataItems, newDataSample.data) || {}\n\n const old = await tx.getRepository(DataSample).findOne({\n where: {\n domain: { id: domain.id },\n dataSet: { id: dataSet.id },\n collectedAt,\n ...dataKeys\n }\n })\n\n /* \n pre-processing for file attachment.\n currently only support type of [FileUpload].\n If [FileUpload[]] type needed, add 'files' type for dataset\n */\n\n const data = newDataSample.data\n const attachments = []\n\n for (let dataItem of dataItems) {\n if (dataItem.type == 'file') {\n const tag = dataItem.tag\n const filesArray = data[tag]\n\n if (tag && filesArray && filesArray.length > 0) {\n let pathsArray = []\n\n for (let files of filesArray) {\n let paths = []\n\n if (files instanceof Array) {\n for (let file of files) {\n if (file) {\n const attachment = await createAttachment(\n null,\n {\n attachment: {\n file: file.file,\n refType: DataSample.name\n }\n },\n context\n )\n\n const fetched = await tx.getRepository(Attachment).findOneBy({ id: attachment.id })\n if (fetched) {\n attachments.push(fetched)\n paths.push({\n id: fetched.id,\n mimetype: fetched.mimetype,\n name: fetched.name,\n fullpath: fetched.fullpath\n })\n } else {\n throw `Failed to save file(${attachment.name})`\n }\n } else {\n paths.push(null)\n }\n }\n }\n\n pathsArray.push(paths)\n }\n\n data[tag] = pathsArray\n }\n }\n }\n\n const dataSample = await tx.getRepository(DataSample).save({\n ...old,\n name: dataSet.name,\n description: dataSet.description,\n useCase: dataSet.useCase,\n type: dataSet.type,\n ...newDataSample,\n ...dataKeys,\n dataSetVersion: dataSet.version,\n domain,\n partitionKeys,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n creator: user,\n updater: user\n })\n\n if (publishTag) {\n publishData(publishTag, data, { domain, user })\n }\n\n /* post-process for for file attachment. */\n if (attachments.length > 0) {\n attachments.forEach(attachment => (attachment.refId = dataSample.id))\n tx.getRepository(Attachment).save(attachments)\n }\n\n if (ooc || oos) {\n const dataOoc = await tx.getRepository(DataOoc).save({\n ...dataSample,\n history: [\n {\n user: {\n id: user?.id,\n name: user?.name\n },\n state: DataOocStatus.ISSUED,\n timestamp: collectedAt\n }\n ],\n state: DataOocStatus.ISSUED,\n dataSample: dataSample\n })\n\n if (outlierScenarioId) {\n const scenario = await tx.getRepository(Scenario).findOne({\n where: {\n domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },\n id: outlierScenarioId\n },\n relations: ['domain', 'steps', 'updater']\n })\n\n if (scenario) {\n scenario.start({\n instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,\n domain,\n user,\n variables: {\n dataOocId: dataOoc.id,\n dataSampleId: dataSample.id,\n dataSet: dataSet.id,\n data,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n domain: {\n id: domain.id,\n subdomain: domain.subdomain,\n name: domain.name\n },\n updator: {\n id: user.id,\n email: user.email,\n name: user.name\n }\n }\n })\n } else {\n console.error(`Cannot find the set outlier-scenario for the dataset(${dataSet.name}).`)\n }\n }\n\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: domain.parentId ? { id: In([domain.id, domain.parentId]) } : { id: domain.id },\n name: 'OOC Review'\n })) as Activity\n\n if (activity) {\n const assigneeRole =\n dataSet.supervisoryRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: dataSet.supervisoryRoleId\n }))\n\n // const assignees = dataSet.supervisoryRoleId\n // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]\n // : []\n\n /* 해당 dataset의 supervisor로 하여금, OOC를 리뷰하고 instruction을 작성해서, OOC 해결을 위한 태스크를 dataset assignees에게 지시하도록 한다. */\n if (assigneeRole) {\n const activityInstance = {\n name: `[OOC 검토] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataOocId: dataOoc.id\n },\n assigneeRole,\n threadsMin: 1,\n threadsMax: 1,\n approvalLine: []\n }\n\n dataOoc.reviewActivityInstance = await issue(activityInstance as any, context)\n await tx.getRepository(DataOoc).save(dataOoc)\n } else {\n console.error(\n `Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`\n )\n }\n } else {\n console.warn('OOC Review Activity not installed.')\n }\n\n try {\n // pubsub.publish('data-ooc', {\n // dataOoc,\n // supervisoryRoleId: dataSet.supervisoryRoleId\n // })\n\n pubsub.publish('notification', {\n notification: {\n domain,\n type: 'error',\n title: `[OOC] ${dataSet.name}`,\n body: `Data OOC occurred on '${dataSet.name}'`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/data-ooc/${dataOoc.id}`),\n timestamp: collectedAt\n }\n })\n } catch (err) {\n logger.error('Notification', err)\n }\n } else {\n if (normalScenarioId) {\n const scenario = await tx.getRepository(Scenario).findOne({\n where: {\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: normalScenarioId\n },\n relations: ['domain', 'steps', 'updater']\n })\n\n if (scenario) {\n scenario.start({\n instanceName: scenario.name + ':' + dataSet.name + ':' + dataSample.id,\n domain,\n user,\n variables: {\n dataSampleId: dataSample.id,\n dataSet: dataSet.id,\n data,\n ooc,\n oos,\n judgment,\n collectedAt,\n workDate,\n workShift,\n domain: {\n id: domain.id,\n subdomain: domain.subdomain,\n name: domain.name\n },\n updator: {\n id: user.id,\n email: user.email,\n name: user.name\n }\n }\n })\n } else {\n console.error(`Cannot find the set normal-scenario for the dataset(${dataSet.name}).`)\n }\n }\n\n if (dataSet.requiresReview) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n name: 'Data Review'\n })) as Activity\n\n if (activity) {\n const assigneeRole =\n dataSet.supervisoryRoleId &&\n (await tx.getRepository(Role).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n id: dataSet.supervisoryRoleId\n }))\n\n // const assignees = dataSet.supervisoryRoleId\n // ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assigneeRole }]\n // : []\n\n /* 해당 dataset의 supervisor로 하여금, data를 리뷰하고 instruction을 작성해서, approvalLine을 이용해서 승인을 한다. */\n if (assigneeRole) {\n dataSample.dataItems = dataItems\n const activityInstance = {\n name: `[Data 검토] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(collectedAt.getTime() + (activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataSampleId: dataSample.id\n },\n assigneeRole,\n threadsMin: 1,\n threadsMax: 1,\n approvalLine: dataSet.reviewApprovalLine\n }\n\n dataSample.reviewActivityInstance = await issue(activityInstance as any, context)\n await tx.getRepository(DataSample).save(dataSample)\n\n try {\n pubsub.publish('notification', {\n notification: {\n domain,\n type: 'info',\n title: `[Data Review] ${dataSet.name}`,\n body: `Data Review occurred on '${dataSet.name}'`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/data-sample/${dataSample.id}`),\n timestamp: collectedAt\n }\n })\n } catch (err) {\n logger.error('Notification', err)\n }\n } else {\n console.error(\n `Assignees are not set. So Data Review task for ${dataSet.name}(${dataSet.id}) could not be issued.`\n )\n }\n } else {\n console.error('Data Review Activity not installed.')\n }\n }\n }\n\n return dataSample\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActivityInstance } from '@things-factory/worklist';
2
+ export declare function issueDataCollectionTask(domainId: string, dataSetId: string, context: ResolverContext): Promise<ActivityInstance | void>;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.issueCollectData = issueCollectData;
3
+ exports.issueDataCollectionTask = issueDataCollectionTask;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const shell_1 = require("@things-factory/shell");
6
6
  const worklist_1 = require("@things-factory/worklist");
7
7
  const data_set_1 = require("../service/data-set/data-set");
8
- async function issueCollectData(domainId, dataSetId, context) {
8
+ async function issueDataCollectionTask(domainId, dataSetId, context) {
9
9
  await (0, shell_1.getDataSource)().transaction(async (tx) => {
10
10
  const domain = await tx.getRepository(shell_1.Domain).findOneBy({ id: domainId });
11
11
  if (!domain) {
@@ -17,33 +17,36 @@ async function issueCollectData(domainId, dataSetId, context) {
17
17
  id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean))
18
18
  },
19
19
  id: dataSetId
20
- }
20
+ },
21
+ relations: ['entryRole']
21
22
  });
22
23
  const activity = (await tx.getRepository(worklist_1.Activity).findOneBy({
23
24
  domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) },
24
25
  name: 'Collect Data'
25
26
  }));
26
27
  if (activity) {
27
- const { assignees } = dataSet;
28
- /* 해당 dataset에 대한 데이타 수집 태스크를 dataset assignees에게 할당한다. */
29
- if (assignees && assignees instanceof Array && assignees.length > 0) {
28
+ const { entryRole, timeLimit } = dataSet;
29
+ /* 해당 dataset에 대한 데이타 수집 태스크를 dataset entryRole에게 할당한다. */
30
+ if (entryRole) {
30
31
  const activityInstance = {
31
32
  name: `[Data 수집] ${dataSet.name}`,
32
33
  description: dataSet.description,
33
34
  activityId: activity.id,
34
- dueAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
35
+ dueAt: new Date(Date.now() + (timeLimit || activity.standardTime || 24 * 60 * 60) * 1000),
35
36
  input: {
36
37
  dataSetId: dataSet.id,
37
38
  dataSetName: dataSet.name
38
39
  },
39
- assignees
40
+ assigneeRole: entryRole,
41
+ threadsMin: 1,
42
+ threadsMax: 1
40
43
  };
41
44
  context.state = Object.assign(Object.assign({}, context.state), { domain,
42
45
  tx });
43
46
  return await (0, worklist_1.issue)(activityInstance, context);
44
47
  }
45
48
  else {
46
- throw new Error(`Assignees not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`);
49
+ throw new Error(`Data Entry Role not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`);
47
50
  }
48
51
  }
49
52
  else {
@@ -51,4 +54,4 @@ async function issueCollectData(domainId, dataSetId, context) {
51
54
  }
52
55
  });
53
56
  }
54
- //# sourceMappingURL=issue-collect-data.js.map
57
+ //# sourceMappingURL=issue-data-collection-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-data-collection-task.js","sourceRoot":"","sources":["../../server/controllers/issue-data-collection-task.ts"],"names":[],"mappings":";;AAOA,0DA8DC;AArED,qCAA4B;AAE5B,iDAA6D;AAC7D,uDAA4E;AAE5E,2DAAsD;AAE/C,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,SAAiB,EACjB,OAAwB;IAExB,MAAM,IAAA,qBAAa,GAAE,CAAC,WAAW,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,cAAM,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,aAAa,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,kBAAO,CAAC,CAAC,OAAO,CAAC;YACtD,KAAK,EAAE;gBACL,MAAM,EAAE;oBACN,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;iBACrD;gBACD,EAAE,EAAE,SAAS;aACd;YACD,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAChE,IAAI,EAAE,cAAc;SACrB,CAAC,CAAa,CAAA;QAEf,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;YAExC,0DAA0D;YAC1D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,gBAAgB,GAAG;oBACvB,IAAI,EAAE,aAAa,OAAO,CAAC,IAAI,EAAE;oBACjC,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,UAAU,EAAE,QAAQ,CAAC,EAAE;oBACvB,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,YAAY,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;oBACzF,KAAK,EAAE;wBACL,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,WAAW,EAAE,OAAO,CAAC,IAAI;qBAC1B;oBACD,YAAY,EAAE,SAAS;oBACvB,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,CAAC;iBACd,CAAA;gBAED,OAAO,CAAC,KAAK,mCACR,OAAO,CAAC,KAAK,KAChB,MAAM;oBACN,EAAE,GACH,CAAA;gBAED,OAAO,MAAM,IAAA,gBAAK,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,yDAAyD,OAAO,CAAC,IAAI,oCAAoC,CAC1G,CAAA;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { In } from 'typeorm'\n\nimport { Domain, getDataSource } from '@things-factory/shell'\nimport { Activity, ActivityInstance, issue } from '@things-factory/worklist'\n\nimport { DataSet } from '../service/data-set/data-set'\n\nexport async function issueDataCollectionTask(\n domainId: string,\n dataSetId: string,\n context: ResolverContext\n): Promise<ActivityInstance | void> {\n await getDataSource().transaction(async tx => {\n const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })\n\n if (!domain) {\n throw new Error(`domain(${domainId}) not found`)\n }\n\n const dataSet = await tx.getRepository(DataSet).findOne({\n where: {\n domain: {\n id: In([domain.id, domain.parentId].filter(Boolean))\n },\n id: dataSetId\n },\n relations: ['entryRole']\n })\n\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: In([domain.id, domain.parentId].filter(Boolean)) },\n name: 'Collect Data'\n })) as Activity\n\n if (activity) {\n const { entryRole, timeLimit } = dataSet\n\n /* 해당 dataset에 대한 데이타 수집 태스크를 dataset entryRole에게 할당한다. */\n if (entryRole) {\n const activityInstance = {\n name: `[Data 수집] ${dataSet.name}`,\n description: dataSet.description,\n activityId: activity.id,\n dueAt: new Date(Date.now() + (timeLimit || activity.standardTime || 24 * 60 * 60) * 1000),\n input: {\n dataSetId: dataSet.id,\n dataSetName: dataSet.name\n },\n assigneeRole: entryRole,\n threadsMin: 1,\n threadsMax: 1\n }\n\n context.state = {\n ...context.state,\n domain,\n tx\n }\n\n return await issue(activityInstance, context)\n } else {\n throw new Error(\n `Data Entry Role not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`\n )\n }\n } else {\n throw new Error(`Data Collect Activity is not installed.`)\n }\n })\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const integration_base_1 = require("@things-factory/integration-base");
5
- const issue_collect_data_1 = require("../../controllers/issue-collect-data");
5
+ const issue_data_collection_task_1 = require("../../controllers/issue-data-collection-task");
6
6
  const i18next_1 = tslib_1.__importDefault(require("i18next"));
7
7
  async function IssueCollectData(step, context) {
8
8
  const { logger, data, domain, user, lng } = context;
@@ -10,7 +10,7 @@ async function IssueCollectData(step, context) {
10
10
  if (!dataSetId) {
11
11
  throw new Error(`no dataset found`);
12
12
  }
13
- const activityInstance = await (0, issue_collect_data_1.issueCollectData)(domain.id, dataSetId, {
13
+ const activityInstance = await (0, issue_data_collection_task_1.issueDataCollectionTask)(domain.id, dataSetId, {
14
14
  t: i18next_1.default.t,
15
15
  state: {
16
16
  domain,
@@ -1 +1 @@
1
- {"version":3,"file":"issue-collect-data.js","sourceRoot":"","sources":["../../../server/engine/task/issue-collect-data.ts"],"names":[],"mappings":";;;AAAA,uEAAmF;AACnF,6EAAuE;AACvE,8DAA6B;AAE7B,KAAK,UAAU,gBAAgB,CAAC,IAAe,EAAE,OAAgB;IAC/D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACnD,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAC/B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,qCAAgB,EAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE;QACpE,CAAC,EAAE,iBAAO,CAAC,CAAC;QACZ,KAAK,EAAE;YACL,MAAM;YACN,IAAI;YACJ,GAAG;YACH,EAAE,EAAE,SAAS;SACd;KACF,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,gBAAgB;KACvB,CAAA;AACH,CAAC;AAED,gBAAgB,CAAC,aAAa,GAAG;IAC/B;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAA;AAED,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAA;AACrC,gBAAgB,CAAC,IAAI,GAAG,iCAAiC,CAAA;AAEzD,+BAAY,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAA","sourcesContent":["import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'\nimport { issueCollectData } from '../../controllers/issue-collect-data'\nimport i18next from 'i18next'\n\nasync function IssueCollectData(step: InputStep, context: Context) {\n const { logger, data, domain, user, lng } = context\n var {\n params: { dataset: dataSetId }\n } = step\n\n if (!dataSetId) {\n throw new Error(`no dataset found`)\n }\n\n const activityInstance = await issueCollectData(domain.id, dataSetId, {\n t: i18next.t,\n state: {\n domain,\n user,\n lng,\n tx: undefined\n }\n })\n\n return {\n data: activityInstance\n }\n}\n\nIssueCollectData.parameterSpec = [\n {\n type: 'entity-selector',\n name: 'dataset',\n label: 'data-set',\n property: {\n queryName: 'dataSets',\n valueKey: 'id'\n }\n }\n]\n\nIssueCollectData.connectorFree = true\nIssueCollectData.help = 'dataset/task/issue-collect-data'\n\nTaskRegistry.registerTaskHandler('issue-collect-data', IssueCollectData)\n"]}
1
+ {"version":3,"file":"issue-collect-data.js","sourceRoot":"","sources":["../../../server/engine/task/issue-collect-data.ts"],"names":[],"mappings":";;;AAAA,uEAAmF;AACnF,6FAAsF;AACtF,8DAA6B;AAE7B,KAAK,UAAU,gBAAgB,CAAC,IAAe,EAAE,OAAgB;IAC/D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACnD,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAC/B,GAAG,IAAI,CAAA;IAER,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,oDAAuB,EAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE;QAC3E,CAAC,EAAE,iBAAO,CAAC,CAAC;QACZ,KAAK,EAAE;YACL,MAAM;YACN,IAAI;YACJ,GAAG;YACH,EAAE,EAAE,SAAS;SACd;KACF,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,EAAE,gBAAgB;KACvB,CAAA;AACH,CAAC;AAED,gBAAgB,CAAC,aAAa,GAAG;IAC/B;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,SAAS,EAAE,UAAU;YACrB,QAAQ,EAAE,IAAI;SACf;KACF;CACF,CAAA;AAED,gBAAgB,CAAC,aAAa,GAAG,IAAI,CAAA;AACrC,gBAAgB,CAAC,IAAI,GAAG,iCAAiC,CAAA;AAEzD,+BAAY,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAA","sourcesContent":["import { TaskRegistry, InputStep, Context } from '@things-factory/integration-base'\nimport { issueDataCollectionTask } from '../../controllers/issue-data-collection-task'\nimport i18next from 'i18next'\n\nasync function IssueCollectData(step: InputStep, context: Context) {\n const { logger, data, domain, user, lng } = context\n var {\n params: { dataset: dataSetId }\n } = step\n\n if (!dataSetId) {\n throw new Error(`no dataset found`)\n }\n\n const activityInstance = await issueDataCollectionTask(domain.id, dataSetId, {\n t: i18next.t,\n state: {\n domain,\n user,\n lng,\n tx: undefined\n }\n })\n\n return {\n data: activityInstance\n }\n}\n\nIssueCollectData.parameterSpec = [\n {\n type: 'entity-selector',\n name: 'dataset',\n label: 'data-set',\n property: {\n queryName: 'dataSets',\n valueKey: 'id'\n }\n }\n]\n\nIssueCollectData.connectorFree = true\nIssueCollectData.help = 'dataset/task/issue-collect-data'\n\nTaskRegistry.registerTaskHandler('issue-collect-data', IssueCollectData)\n"]}
@@ -7,7 +7,7 @@ const integration_base_1 = require("@things-factory/integration-base");
7
7
  const create_data_sample_1 = require("./controllers/create-data-sample");
8
8
  const jasper_report_1 = require("./controllers/jasper-report");
9
9
  const shiny_report_1 = require("./controllers/shiny-report");
10
- const issue_collect_data_1 = require("./controllers/issue-collect-data");
10
+ const issue_data_collection_task_1 = require("./controllers/issue-data-collection-task");
11
11
  const data_sensor_1 = require("./service/data-sensor/data-sensor");
12
12
  const data_set_1 = require("./service/data-set/data-set");
13
13
  process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) => {
@@ -86,7 +86,7 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
86
86
  if (!domainId || !dataSetId) {
87
87
  throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`);
88
88
  }
89
- await (0, issue_collect_data_1.issueCollectData)(domainId, dataSetId, context);
89
+ await (0, issue_data_collection_task_1.issueDataCollectionTask)(domainId, dataSetId, context);
90
90
  context.status = 200;
91
91
  });
92
92
  /* When a callback occurs from the scheduler when a scheduled summary is on schedule, data summary procedure for the dataset should be executed. */
@@ -104,7 +104,9 @@ process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) =>
104
104
  if (!domain) {
105
105
  throw new Error(`domain(${domainId}) not found`);
106
106
  }
107
- const dataSet = await tx.getRepository(data_set_1.DataSet).findOne({ where: { domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } });
107
+ const dataSet = await tx
108
+ .getRepository(data_set_1.DataSet)
109
+ .findOne({ where: { domain: { id: (0, typeorm_1.In)([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } });
108
110
  // do what you gotta do
109
111
  });
110
112
  context.status = 200;