@things-factory/scheduler 7.1.34

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 (81) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/client/bootstrap.ts +1 -0
  3. package/client/index.ts +0 -0
  4. package/client/pages/scheduler/popup-crontab-input.ts +75 -0
  5. package/client/pages/scheduler/schedule-list-page.ts +326 -0
  6. package/client/pages/scheduler/schedule-popup.ts +484 -0
  7. package/client/route.ts +7 -0
  8. package/client/tsconfig.json +11 -0
  9. package/client/types.ts +34 -0
  10. package/dist-client/bootstrap.d.ts +1 -0
  11. package/dist-client/bootstrap.js +2 -0
  12. package/dist-client/bootstrap.js.map +1 -0
  13. package/dist-client/index.d.ts +0 -0
  14. package/dist-client/index.js +2 -0
  15. package/dist-client/index.js.map +1 -0
  16. package/dist-client/pages/scheduler/popup-crontab-input.d.ts +12 -0
  17. package/dist-client/pages/scheduler/popup-crontab-input.js +77 -0
  18. package/dist-client/pages/scheduler/popup-crontab-input.js.map +1 -0
  19. package/dist-client/pages/scheduler/schedule-list-page.d.ts +42 -0
  20. package/dist-client/pages/scheduler/schedule-list-page.js +326 -0
  21. package/dist-client/pages/scheduler/schedule-list-page.js.map +1 -0
  22. package/dist-client/pages/scheduler/schedule-popup.d.ts +25 -0
  23. package/dist-client/pages/scheduler/schedule-popup.js +457 -0
  24. package/dist-client/pages/scheduler/schedule-popup.js.map +1 -0
  25. package/dist-client/route.d.ts +1 -0
  26. package/dist-client/route.js +8 -0
  27. package/dist-client/route.js.map +1 -0
  28. package/dist-client/tsconfig.tsbuildinfo +1 -0
  29. package/dist-client/types.d.ts +33 -0
  30. package/dist-client/types.js +2 -0
  31. package/dist-client/types.js.map +1 -0
  32. package/dist-server/controllers/index.d.ts +0 -0
  33. package/dist-server/controllers/index.js +1 -0
  34. package/dist-server/controllers/index.js.map +1 -0
  35. package/dist-server/index.d.ts +2 -0
  36. package/dist-server/index.js +6 -0
  37. package/dist-server/index.js.map +1 -0
  38. package/dist-server/routes.d.ts +1 -0
  39. package/dist-server/routes.js +25 -0
  40. package/dist-server/routes.js.map +1 -0
  41. package/dist-server/service/index.d.ts +5 -0
  42. package/dist-server/service/index.js +21 -0
  43. package/dist-server/service/index.js.map +1 -0
  44. package/dist-server/service/schedule/index.d.ts +6 -0
  45. package/dist-server/service/schedule/index.js +10 -0
  46. package/dist-server/service/schedule/index.js.map +1 -0
  47. package/dist-server/service/schedule/schedule-mutation.d.ts +6 -0
  48. package/dist-server/service/schedule/schedule-mutation.js +55 -0
  49. package/dist-server/service/schedule/schedule-mutation.js.map +1 -0
  50. package/dist-server/service/schedule/schedule-query.d.ts +6 -0
  51. package/dist-server/service/schedule/schedule-query.js +70 -0
  52. package/dist-server/service/schedule/schedule-query.js.map +1 -0
  53. package/dist-server/service/schedule/schedule-type.d.ts +75 -0
  54. package/dist-server/service/schedule/schedule-type.js +281 -0
  55. package/dist-server/service/schedule/schedule-type.js.map +1 -0
  56. package/dist-server/tsconfig.tsbuildinfo +1 -0
  57. package/helps/scheduler/assets/scheduler-explains.png +0 -0
  58. package/helps/scheduler/assets/scheduler-service-msa.png +0 -0
  59. package/helps/scheduler/assets/scheduler-service-openapi.png +0 -0
  60. package/helps/scheduler/assets/scheduler-service-scalable.png +0 -0
  61. package/helps/scheduler/assets/updated-scheduler-diagram-periodic.png +0 -0
  62. package/helps/scheduler/assets/updated-scheduler-diagram-pubsub.png +0 -0
  63. package/helps/scheduler/scheduler.ko.md +185 -0
  64. package/helps/scheduler/scheduler.md +186 -0
  65. package/helps/scheduler/scheduler.zh.md +185 -0
  66. package/package.json +38 -0
  67. package/server/controllers/index.ts +0 -0
  68. package/server/index.ts +3 -0
  69. package/server/routes.ts +28 -0
  70. package/server/service/index.ts +25 -0
  71. package/server/service/schedule/index.ts +7 -0
  72. package/server/service/schedule/schedule-mutation.ts +34 -0
  73. package/server/service/schedule/schedule-query.ts +64 -0
  74. package/server/service/schedule/schedule-type.ts +194 -0
  75. package/server/tsconfig.json +10 -0
  76. package/things-factory.config.js +8 -0
  77. package/translations/en.json +9 -0
  78. package/translations/ja.json +9 -0
  79. package/translations/ko.json +9 -0
  80. package/translations/ms.json +9 -0
  81. package/translations/zh.json +9 -0
@@ -0,0 +1,34 @@
1
+ import { Resolver, Directive, Mutation, Arg, ID } from 'type-graphql'
2
+
3
+ import { registerSchedule, updateSchedule, unregisterSchedule } from '@things-factory/scheduler-client'
4
+ import { Schedule, NewSchedule, SchedulePatch } from './schedule-type'
5
+
6
+ @Resolver(Schedule)
7
+ export class ScheduleMutation {
8
+ @Directive('@privilege(superUserGranted: true)')
9
+ @Mutation(() => ID)
10
+ async registerSchedule(@Arg('schedule') schedule: NewSchedule): Promise<string> {
11
+ var handle = await registerSchedule(schedule)
12
+
13
+ return handle
14
+ }
15
+
16
+ @Directive('@privilege(superUserGranted: true)')
17
+ @Mutation(() => ID)
18
+ async updateSchedule(@Arg('schedule') schedule: SchedulePatch): Promise<string> {
19
+ return await updateSchedule(schedule)
20
+ }
21
+
22
+ @Directive('@privilege(superUserGranted: true)')
23
+ @Mutation(() => Boolean)
24
+ async unregisterSchedule(@Arg('handle', () => ID) handle: string): Promise<boolean> {
25
+ try {
26
+ await unregisterSchedule(handle)
27
+ } catch (error) {
28
+ console.error(error)
29
+ return false
30
+ }
31
+
32
+ return true
33
+ }
34
+ }
@@ -0,0 +1,64 @@
1
+ import { Resolver, Query, Args, Arg, Ctx, Directive, ID } from 'type-graphql'
2
+ import { ListParam } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { getSchedules, getSchedule } from '@things-factory/scheduler-client'
5
+ import { Schedule, ScheduleList } from './schedule-type'
6
+
7
+ @Resolver(Schedule)
8
+ export class ScheduleQuery {
9
+ @Directive('@privilege(superUserGranted: true)')
10
+ @Query(() => Schedule, { nullable: true })
11
+ async schedule(@Arg('id', () => ID) id: string): Promise<Schedule | null> {
12
+ return await getSchedule(id)
13
+ }
14
+
15
+ @Directive('@privilege(superUserGranted: true)')
16
+ @Query(returns => ScheduleList, { description: 'To fetch multiple Schedules' })
17
+ async schedules(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ScheduleList> {
18
+ const filters = params.filters || []
19
+
20
+ const name = filters.find(filter => filter.name == 'name')?.value
21
+
22
+ const application = filters.find(filter => filter.name == 'application')?.value
23
+ const group = filters.find(filter => filter.name == 'group')?.value
24
+ const type = filters.find(filter => filter.name == 'type')?.value
25
+ const key = filters.find(filter => filter.name == 'key')?.value
26
+ const operation = filters.find(filter => filter.name == 'operation')?.value
27
+
28
+ var schedules = await getSchedules({})
29
+
30
+ if (name) {
31
+ schedules = schedules.filter(schedule => (schedule.name || '').toLowerCase().includes(name.toLowerCase()))
32
+ }
33
+ if (application) {
34
+ schedules = schedules.filter(schedule =>
35
+ (schedule.client?.application || '').toLowerCase().includes(application.toLowerCase())
36
+ )
37
+ }
38
+ if (group) {
39
+ schedules = schedules.filter(schedule =>
40
+ (schedule.client?.group || '').toLowerCase().includes(group.toLowerCase())
41
+ )
42
+ }
43
+ if (type) {
44
+ schedules = schedules.filter(schedule => (schedule.client?.type || '').toLowerCase().includes(type.toLowerCase()))
45
+ }
46
+ if (key) {
47
+ schedules = schedules.filter(schedule => (schedule.client?.key || '').toLowerCase().includes(key.toLowerCase()))
48
+ }
49
+ if (operation) {
50
+ schedules = schedules.filter(schedule =>
51
+ (schedule.client?.operation || '').toLowerCase().includes(operation.toLowerCase())
52
+ )
53
+ }
54
+
55
+ const { page = 1, limit = 20 } = params.pagination || {}
56
+
57
+ const start = (page - 1) * limit
58
+ const end = start + limit
59
+ const items = schedules.slice(start, end)
60
+ const total = schedules.length
61
+
62
+ return { items, total }
63
+ }
64
+ }
@@ -0,0 +1,194 @@
1
+ import { ObjectType, Field, InputType, Int, ID } from 'type-graphql'
2
+ import { ScalarObject } from '@things-factory/shell'
3
+
4
+ @ObjectType()
5
+ export class ScheduleClient {
6
+ @Field()
7
+ application: string
8
+
9
+ @Field()
10
+ group: string
11
+
12
+ @Field()
13
+ type: string
14
+
15
+ @Field()
16
+ key: string
17
+
18
+ @Field()
19
+ operation: string
20
+ }
21
+
22
+ @ObjectType()
23
+ export class ScheduleTaskConnection {
24
+ @Field({ nullable: true })
25
+ host?: string
26
+
27
+ @Field(type => ScalarObject, { nullable: true })
28
+ headers?: Record<string, string>
29
+
30
+ @Field({ nullable: true })
31
+ topic?: string
32
+ }
33
+
34
+ @ObjectType()
35
+ export class ScheduleTask {
36
+ @Field()
37
+ type: string
38
+
39
+ @Field(type => ScheduleTaskConnection)
40
+ connection: ScheduleTaskConnection
41
+
42
+ @Field(type => ScalarObject)
43
+ data: Record<string, any>
44
+
45
+ @Field()
46
+ history_check: boolean
47
+
48
+ @Field()
49
+ failed_policy: 'ignore' | 'retry' | 'retry_dlq'
50
+
51
+ @Field(type => Int)
52
+ retry_wait: number
53
+
54
+ @Field(type => Int)
55
+ retry_count: number
56
+
57
+ @Field(type => Int)
58
+ max_retry_count: number
59
+ }
60
+
61
+ @ObjectType()
62
+ export class Schedule {
63
+ @Field(type => ID)
64
+ id: string
65
+
66
+ @Field({ nullable: true })
67
+ name?: string
68
+
69
+ @Field(type => ScheduleClient)
70
+ client: ScheduleClient
71
+
72
+ @Field()
73
+ type: 'now' | 'delay' | 'date' | 'cron' | 'delay-recur'
74
+
75
+ @Field({ nullable: true })
76
+ schedule?: string
77
+
78
+ @Field({ nullable: true })
79
+ timezone?: string
80
+
81
+ @Field(type => ScheduleTask)
82
+ task: ScheduleTask
83
+ }
84
+
85
+ @InputType()
86
+ class ScheduleClientInput {
87
+ @Field()
88
+ application: string
89
+
90
+ @Field()
91
+ group: string
92
+
93
+ @Field()
94
+ type: string
95
+
96
+ @Field()
97
+ key: string
98
+
99
+ @Field()
100
+ operation: string
101
+ }
102
+
103
+ @InputType()
104
+ export class ScheduleTaskConnectionInput {
105
+ @Field({ nullable: true })
106
+ host?: string
107
+
108
+ @Field(type => ScalarObject, { nullable: true })
109
+ headers?: Record<string, string>
110
+
111
+ @Field({ nullable: true })
112
+ topic?: string
113
+ }
114
+
115
+ @InputType()
116
+ class ScheduleTaskInput {
117
+ @Field()
118
+ type: 'rest' | 'kafka' | 'redis'
119
+
120
+ @Field(type => ScheduleTaskConnectionInput)
121
+ connection: ScheduleTaskConnectionInput
122
+
123
+ @Field(type => ScalarObject)
124
+ data: Record<string, any>
125
+
126
+ @Field()
127
+ history_check: boolean
128
+
129
+ @Field()
130
+ failed_policy: 'ignore' | 'retry' | 'retry_dlq'
131
+
132
+ @Field(type => Int)
133
+ retry_wait: number
134
+
135
+ @Field(type => Int)
136
+ retry_count: number
137
+
138
+ @Field(type => Int)
139
+ max_retry_count: number
140
+ }
141
+
142
+ @InputType()
143
+ export class NewSchedule {
144
+ @Field()
145
+ name: string
146
+
147
+ @Field(type => ScheduleClientInput)
148
+ client: ScheduleClientInput
149
+
150
+ @Field()
151
+ type: 'now' | 'delay' | 'date' | 'cron' | 'delay-recur'
152
+
153
+ @Field({ nullable: true })
154
+ schedule: string
155
+
156
+ @Field({ nullable: true })
157
+ timezone: string
158
+
159
+ @Field(type => ScheduleTaskInput)
160
+ task: ScheduleTaskInput
161
+ }
162
+
163
+ @InputType()
164
+ export class SchedulePatch {
165
+ @Field({ nullable: true })
166
+ id: string
167
+
168
+ @Field({ nullable: true })
169
+ name?: string
170
+
171
+ @Field(type => ScheduleClientInput)
172
+ client: ScheduleClientInput
173
+
174
+ @Field()
175
+ type: 'now' | 'delay' | 'date' | 'cron' | 'delay-recur'
176
+
177
+ @Field({ nullable: true })
178
+ schedule: string
179
+
180
+ @Field({ nullable: true })
181
+ timezone: string
182
+
183
+ @Field(type => ScheduleTaskInput)
184
+ task: ScheduleTaskInput
185
+ }
186
+
187
+ @ObjectType()
188
+ export class ScheduleList {
189
+ @Field(type => [Schedule])
190
+ items: Schedule[]
191
+
192
+ @Field(type => Int)
193
+ total: number
194
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }
@@ -0,0 +1,8 @@
1
+ import route from './dist-client/route'
2
+ import bootstrap from './dist-client/bootstrap'
3
+
4
+ export default {
5
+ route,
6
+ routes: [{ tagname: 'schedule-list-page', page: 'schedule-list' }],
7
+ bootstrap
8
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "button.register": "register",
3
+ "field.schedule-application": "application",
4
+ "field.schedule-operation": "operation",
5
+ "text.register": "register",
6
+ "text.update": "update",
7
+ "title.schedule list": "schedule list",
8
+ "title.schedule detail": "schedule detail"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "button.register": "登録",
3
+ "field.schedule-application": "申請",
4
+ "field.schedule-operation": "操作",
5
+ "text.register": "登録",
6
+ "text.update": "変更",
7
+ "title.schedule list": "スケジュールリスト",
8
+ "title.schedule detail": "スケジュール詳細"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "button.register": "등록",
3
+ "field.schedule-application": "어플리케이션",
4
+ "field.schedule-operation": "오퍼레이션",
5
+ "text.register": "등록",
6
+ "text.update": "변경",
7
+ "title.schedule list": "스케쥴 목록",
8
+ "title.schedule detail": "스케쥴 상세"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "button.register": "daftar",
3
+ "field.schedule-application": "permohonan",
4
+ "field.schedule-operation": "operasi",
5
+ "text.register": "daftar",
6
+ "text.update": "kemas kini",
7
+ "title.schedule list": "senarai jadual",
8
+ "title.schedule detail": "butiran jadual"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "button.register": "注册",
3
+ "field.schedule-application": "申请",
4
+ "field.schedule-operation": "操作",
5
+ "text.register": "注册",
6
+ "text.update": "更改",
7
+ "title.schedule list": "时间表列表",
8
+ "title.schedule detail": "日程详情"
9
+ }