rez_core 5.0.181 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +26 -0
- package/.idea/250218_nodejs_core.iml +8 -11
- package/.idea/codeStyles/Project.xml +58 -58
- package/.idea/codeStyles/codeStyleConfig.xml +4 -4
- package/.idea/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/inspectionProfiles/Project_Default.xml +1 -1
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +7 -7
- package/.idea/prettier.xml +5 -5
- package/.idea/vcs.xml +5 -5
- package/.prettierrc +3 -3
- package/README.md +99 -99
- package/dist/module/auth/guards/role.guard.js +3 -3
- package/dist/module/enterprise/controller/enterprise.controller.d.ts +12 -0
- package/dist/module/enterprise/controller/enterprise.controller.js +57 -0
- package/dist/module/enterprise/controller/enterprise.controller.js.map +1 -0
- package/dist/module/enterprise/controller/organization.controller.d.ts +11 -1
- package/dist/module/enterprise/controller/organization.controller.js +62 -2
- package/dist/module/enterprise/controller/organization.controller.js.map +1 -1
- package/dist/module/enterprise/enterprise.module.js +2 -1
- package/dist/module/enterprise/enterprise.module.js.map +1 -1
- package/dist/module/enterprise/entity/enterprise.entity.d.ts +1 -3
- package/dist/module/enterprise/entity/enterprise.entity.js +4 -12
- package/dist/module/enterprise/entity/enterprise.entity.js.map +1 -1
- package/dist/module/enterprise/entity/organization.entity.d.ts +1 -17
- package/dist/module/enterprise/entity/organization.entity.js +4 -72
- package/dist/module/enterprise/entity/organization.entity.js.map +1 -1
- package/dist/module/enterprise/repository/enterprise.repository.d.ts +2 -2
- package/dist/module/enterprise/repository/enterprise.repository.js +9 -4
- package/dist/module/enterprise/repository/enterprise.repository.js.map +1 -1
- package/dist/module/enterprise/service/enterprise.service.d.ts +2 -2
- package/dist/module/enterprise/service/enterprise.service.js +4 -4
- package/dist/module/enterprise/service/enterprise.service.js.map +1 -1
- package/dist/module/enterprise/service/organization.service.d.ts +2 -2
- package/dist/module/enterprise/service/organization.service.js +97 -20
- package/dist/module/enterprise/service/organization.service.js.map +1 -1
- package/dist/module/filter/entity/saved-filter-master.entity.d.ts +1 -0
- package/dist/module/filter/entity/saved-filter-master.entity.js +4 -0
- package/dist/module/filter/entity/saved-filter-master.entity.js.map +1 -1
- package/dist/module/filter/repository/saved-filter.repository.js +2 -0
- package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
- package/dist/module/filter/service/filter.service.js +19 -19
- package/dist/module/integration/examples/usage.example.js +9 -9
- package/dist/module/meta/repository/attribute-master.repository.js +8 -8
- package/dist/module/meta/service/entity-dynamic.service.js +16 -16
- package/dist/module/meta/service/media-data.service.js +6 -6
- package/dist/module/meta/service/resolver.service.js +11 -11
- package/dist/module/module/repository/menu.repository.js +4 -4
- package/dist/module/notification/service/notification.service.js +6 -6
- package/dist/module/user/controller/login.controller.js +18 -18
- package/dist/module/workflow/repository/action.repository.js +2 -2
- package/dist/module/workflow/repository/stage.repository.js +8 -8
- package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
- package/dist/module/workflow/service/action.service.js +5 -5
- package/dist/module/workflow/service/entity-modification.service.js +2 -2
- package/dist/module/workflow/service/task.service.js +8 -8
- package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
- package/dist/table.config.d.ts +1 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/service/reflection-helper.service.js +2 -2
- package/docs/modules/event-driven-integration-design.md +91 -91
- package/docs/modules/integration.md +250 -250
- package/eslint.config.mjs +34 -34
- package/nest-cli.json +14 -14
- package/package.json +125 -125
- package/server.log +850 -0
- package/src/app.controller.ts +12 -12
- package/src/app.module.ts +68 -68
- package/src/app.service.ts +8 -8
- package/src/config/bull.config.ts +69 -69
- package/src/config/config.module.ts +17 -17
- package/src/config/database.config.ts +48 -48
- package/src/constant/global.constant.ts +67 -67
- package/src/core.module.ts +94 -94
- package/src/decorators/roles.decorator.ts +7 -7
- package/src/dtos/response.dto.ts +6 -6
- package/src/dtos/response.ts +5 -5
- package/src/index.ts +1 -1
- package/src/module/auth/auth.module.ts +49 -49
- package/src/module/auth/controller/auth.controller.ts +28 -28
- package/src/module/auth/guards/google-auth.guard.ts +9 -9
- package/src/module/auth/guards/jwt.guard.ts +22 -22
- package/src/module/auth/guards/role.guard.ts +68 -68
- package/src/module/auth/services/auth.service.ts +56 -56
- package/src/module/auth/services/jwt.service.ts +11 -11
- package/src/module/auth/strategies/google.strategy.ts +54 -54
- package/src/module/auth/strategies/jwt.strategy.ts +58 -58
- package/src/module/auth/strategies/local.strategy.ts +13 -13
- package/src/module/dashboard/controller/dashboard.controller.ts +38 -38
- package/src/module/dashboard/dashboard.module.ts +21 -21
- package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
- package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
- package/src/module/dashboard/repository/dashboard.repository.ts +49 -49
- package/src/module/dashboard/service/dashboard.service.ts +72 -72
- package/src/module/enterprise/controller/enterprise.controller.ts +40 -0
- package/src/module/enterprise/controller/organization.controller.ts +93 -36
- package/src/module/enterprise/enterprise.module.ts +46 -45
- package/src/module/enterprise/entity/enterprise.entity.ts +31 -37
- package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
- package/src/module/enterprise/entity/organization.entity.ts +40 -92
- package/src/module/enterprise/repository/enterprise.repository.ts +39 -31
- package/src/module/enterprise/repository/organization.repository.ts +26 -26
- package/src/module/enterprise/repository/school.repository.ts +272 -272
- package/src/module/enterprise/service/brand.service.ts +5 -5
- package/src/module/enterprise/service/enterprise.service.ts +22 -16
- package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
- package/src/module/enterprise/service/organization.service.ts +262 -145
- package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
- package/src/module/entity_json/entity/entityJson.entity.ts +39 -39
- package/src/module/entity_json/entity_json.module.ts +18 -18
- package/src/module/entity_json/service/entityJson.repository.ts +37 -37
- package/src/module/entity_json/service/entity_json.service.ts +241 -241
- package/src/module/export/controller/export.controller.ts +83 -83
- package/src/module/export/export.module.ts +14 -14
- package/src/module/export/service/export.service.ts +105 -105
- package/src/module/filter/controller/filter.controller.ts +87 -87
- package/src/module/filter/dto/filter-request.dto.ts +39 -39
- package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
- package/src/module/filter/entity/saved-filter-master.entity.ts +35 -32
- package/src/module/filter/filter.module.ts +33 -33
- package/src/module/filter/repository/saved-filter.repository.ts +247 -258
- package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
- package/src/module/filter/service/filter-evaluator.service.ts +82 -82
- package/src/module/filter/service/filter.service.ts +1316 -1316
- package/src/module/filter/service/saved-filter.service.ts +164 -164
- package/src/module/ics/controller/ics.controller.ts +21 -21
- package/src/module/ics/dto/ics.dto.ts +55 -55
- package/src/module/ics/ics.module.ts +13 -13
- package/src/module/ics/service/ics.service.ts +57 -57
- package/src/module/integration/controller/calender-event.controller.ts +31 -31
- package/src/module/integration/controller/integration.controller.ts +662 -662
- package/src/module/integration/controller/wrapper.controller.ts +37 -37
- package/src/module/integration/dto/create-config.dto.ts +526 -526
- package/src/module/integration/entity/integration-config.entity.ts +112 -112
- package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
- package/src/module/integration/entity/integration-source.entity.ts +17 -17
- package/src/module/integration/entity/user-integration.entity.ts +71 -71
- package/src/module/integration/examples/usage.example.ts +338 -338
- package/src/module/integration/factories/base.factory.ts +7 -7
- package/src/module/integration/factories/email.factory.ts +49 -49
- package/src/module/integration/factories/integration.factory.ts +121 -121
- package/src/module/integration/factories/sms.factory.ts +51 -51
- package/src/module/integration/factories/telephone.factory.ts +41 -41
- package/src/module/integration/factories/whatsapp.factory.ts +56 -56
- package/src/module/integration/integration.module.ts +110 -110
- package/src/module/integration/service/calendar-event.service.ts +118 -118
- package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
- package/src/module/integration/service/integration-queue.service.ts +229 -229
- package/src/module/integration/service/integration.service.ts +2634 -2634
- package/src/module/integration/service/oauth.service.ts +224 -224
- package/src/module/integration/service/wrapper.service.ts +753 -753
- package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
- package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
- package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
- package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
- package/src/module/integration/strategies/integration.strategy.ts +97 -97
- package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
- package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
- package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
- package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
- package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
- package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
- package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
- package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
- package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
- package/src/module/layout/controller/layout.controller.ts +47 -47
- package/src/module/layout/entity/header-items.entity.ts +28 -28
- package/src/module/layout/entity/header-section.entity.ts +19 -19
- package/src/module/layout/layout.module.ts +21 -21
- package/src/module/layout/repository/header-items.repository.ts +18 -18
- package/src/module/layout/repository/header-section.repository.ts +22 -22
- package/src/module/layout/service/header-section.service.ts +25 -25
- package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -76
- package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
- package/src/module/layout_preference/layout_preference.module.ts +22 -22
- package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
- package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
- package/src/module/lead/controller/lead.controller.ts +30 -30
- package/src/module/lead/lead.module.ts +14 -14
- package/src/module/lead/repository/lead.repository.ts +41 -41
- package/src/module/lead/service/lead.service.ts +54 -54
- package/src/module/linked_attributes/controller/linked_attributes.controller.ts +37 -37
- package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
- package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
- package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
- package/src/module/linked_attributes/service/linked_attributes.service.ts +73 -73
- package/src/module/listmaster/controller/list-master.controller.ts +230 -230
- package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
- package/src/module/listmaster/entity/list-master.entity.ts +33 -33
- package/src/module/listmaster/listmaster.module.ts +46 -46
- package/src/module/listmaster/repository/list-master-items.repository.ts +173 -173
- package/src/module/listmaster/repository/list-master.repository.ts +56 -56
- package/src/module/listmaster/service/list-master-engine.ts +19 -19
- package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
- package/src/module/listmaster/service/list-master-item.service.ts +280 -280
- package/src/module/listmaster/service/list-master-registry.ts +15 -15
- package/src/module/listmaster/service/list-master.service.ts +527 -527
- package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
- package/src/module/mapper/controller/mapper.controller.ts +20 -20
- package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
- package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
- package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
- package/src/module/mapper/entity/mapper.entity.ts +16 -16
- package/src/module/mapper/mapper.module.ts +35 -35
- package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
- package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
- package/src/module/mapper/repository/mapper.repository.ts +32 -32
- package/src/module/mapper/service/field-mapper.service.ts +269 -269
- package/src/module/mapper/service/mapper.service.ts +80 -80
- package/src/module/master/controller/master.controller.ts +74 -74
- package/src/module/master/service/master.service.ts +484 -484
- package/src/module/meta/controller/app-master.controller.ts +38 -38
- package/src/module/meta/controller/attribute-master.controller.ts +84 -84
- package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
- package/src/module/meta/controller/entity-master.controller.ts +41 -41
- package/src/module/meta/controller/entity-relation.controller.ts +36 -36
- package/src/module/meta/controller/entity.controller.ts +308 -308
- package/src/module/meta/controller/entity.public.controller.ts +75 -75
- package/src/module/meta/controller/media.controller.ts +135 -135
- package/src/module/meta/controller/meta.controller.ts +101 -101
- package/src/module/meta/controller/view-master.controller.ts +79 -79
- package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
- package/src/module/meta/dto/entity-tab.dto.ts +4 -4
- package/src/module/meta/dto/entity-table.dto.ts +12 -12
- package/src/module/meta/entity/app-master.entity.ts +37 -37
- package/src/module/meta/entity/attribute-master.entity.ts +92 -92
- package/src/module/meta/entity/base-entity.entity.ts +75 -75
- package/src/module/meta/entity/entity-master.entity.ts +85 -85
- package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
- package/src/module/meta/entity/entity-relation.entity.ts +23 -23
- package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
- package/src/module/meta/entity/entity-table.entity.ts +50 -50
- package/src/module/meta/entity/media-data.entity.ts +32 -32
- package/src/module/meta/entity/preference.entity.ts +62 -62
- package/src/module/meta/entity/view-master.entity.ts +41 -41
- package/src/module/meta/entity.module.ts +165 -165
- package/src/module/meta/repository/app-master.repository.ts +20 -20
- package/src/module/meta/repository/attribute-master.repository.ts +164 -164
- package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
- package/src/module/meta/repository/entity-master.repository.ts +120 -120
- package/src/module/meta/repository/entity-relation.repository.ts +22 -22
- package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
- package/src/module/meta/repository/entity-table.repository.ts +53 -53
- package/src/module/meta/repository/media-data.repository.ts +50 -50
- package/src/module/meta/repository/preference.repository.ts +20 -20
- package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
- package/src/module/meta/repository/view-master.repository.ts +42 -42
- package/src/module/meta/service/app-master.service.ts +37 -37
- package/src/module/meta/service/attribute-master.service.ts +132 -132
- package/src/module/meta/service/common.service.ts +9 -9
- package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
- package/src/module/meta/service/entity-dynamic.service.ts +824 -824
- package/src/module/meta/service/entity-master.service.ts +171 -171
- package/src/module/meta/service/entity-realation-data.service.ts +9 -9
- package/src/module/meta/service/entity-relation.service.ts +74 -74
- package/src/module/meta/service/entity-service-impl.service.ts +388 -388
- package/src/module/meta/service/entity-table-column.service.ts +26 -26
- package/src/module/meta/service/entity-table.service.ts +157 -157
- package/src/module/meta/service/entity-validation.service.ts +188 -188
- package/src/module/meta/service/entity.service.ts +49 -49
- package/src/module/meta/service/field-group.service.ts +103 -103
- package/src/module/meta/service/media-data.service.ts +591 -591
- package/src/module/meta/service/populate-meta.service.ts +222 -222
- package/src/module/meta/service/preference.service.ts +16 -16
- package/src/module/meta/service/resolver.service.ts +280 -280
- package/src/module/meta/service/section-master.service.ts +104 -104
- package/src/module/meta/service/update-form-json.service.ts +22 -22
- package/src/module/meta/service/user-app-mapping.service.ts +17 -17
- package/src/module/meta/service/view-master.service.ts +127 -127
- package/src/module/microservice-client/microservice-clients.module.ts +13 -13
- package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
- package/src/module/microservice-client/service/microservice-clients.ts +4 -4
- package/src/module/module/controller/menu.controller.ts +15 -15
- package/src/module/module/controller/module-access.controller.ts +133 -133
- package/src/module/module/entity/menu.entity.ts +43 -43
- package/src/module/module/entity/module-access.entity.ts +25 -25
- package/src/module/module/entity/module-action.entity.ts +17 -17
- package/src/module/module/entity/module.entity.ts +52 -52
- package/src/module/module/module.module.ts +42 -42
- package/src/module/module/repository/menu.repository.ts +186 -186
- package/src/module/module/repository/module-access.repository.ts +344 -344
- package/src/module/module/service/menu.service.ts +82 -82
- package/src/module/module/service/module-access.service.ts +189 -189
- package/src/module/notification/controller/notification.controller.ts +58 -58
- package/src/module/notification/controller/otp.controller.ts +117 -117
- package/src/module/notification/entity/notification.entity.ts +26 -26
- package/src/module/notification/entity/otp.entity.ts +28 -28
- package/src/module/notification/firebase-admin.config.ts +22 -22
- package/src/module/notification/notification.module.ts +69 -69
- package/src/module/notification/repository/otp.repository.ts +27 -27
- package/src/module/notification/service/email.service.ts +127 -127
- package/src/module/notification/service/notification.service.ts +164 -164
- package/src/module/notification/service/otp.service.ts +133 -133
- package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
- package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
- package/src/module/third-party-module/service/api-registry.service.ts +13 -13
- package/src/module/third-party-module/third-party.module.ts +12 -12
- package/src/module/user/controller/login.controller.ts +198 -198
- package/src/module/user/controller/user.controller.ts +40 -40
- package/src/module/user/dto/create-user.dto.ts +62 -62
- package/src/module/user/dto/update-user.dto.ts +4 -4
- package/src/module/user/entity/role.entity.ts +33 -33
- package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
- package/src/module/user/entity/user-session.entity.ts +73 -73
- package/src/module/user/entity/user.entity.ts +62 -62
- package/src/module/user/repository/role.repository.ts +96 -96
- package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
- package/src/module/user/repository/user.repository.ts +50 -50
- package/src/module/user/repository/userSession.repository.ts +33 -33
- package/src/module/user/service/login.service.ts +326 -326
- package/src/module/user/service/role.service.ts +197 -197
- package/src/module/user/service/user-role-mapping.service.ts +98 -98
- package/src/module/user/service/user-session.service.ts +200 -200
- package/src/module/user/service/user.service.ts +368 -368
- package/src/module/user/user.module.ts +65 -65
- package/src/module/workflow/controller/action-category.controller.ts +54 -54
- package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
- package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
- package/src/module/workflow/controller/action.controller.ts +111 -111
- package/src/module/workflow/controller/activity-log.controller.ts +55 -55
- package/src/module/workflow/controller/comm-template.controller.ts +43 -43
- package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
- package/src/module/workflow/controller/form-master.controller.ts +43 -43
- package/src/module/workflow/controller/stage-group.controller.ts +49 -49
- package/src/module/workflow/controller/stage.controller.ts +51 -51
- package/src/module/workflow/controller/task.controller.ts +77 -77
- package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
- package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
- package/src/module/workflow/controller/workflow.controller.ts +67 -67
- package/src/module/workflow/entity/action-category.entity.ts +38 -38
- package/src/module/workflow/entity/action-data.entity.ts +55 -55
- package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
- package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
- package/src/module/workflow/entity/action.entity.ts +53 -53
- package/src/module/workflow/entity/activity-log.entity.ts +43 -43
- package/src/module/workflow/entity/comm-template.entity.ts +43 -43
- package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
- package/src/module/workflow/entity/form.entity.ts +25 -25
- package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
- package/src/module/workflow/entity/stage-group.entity.ts +23 -23
- package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
- package/src/module/workflow/entity/stage.entity.ts +20 -20
- package/src/module/workflow/entity/task-data.entity.ts +88 -88
- package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
- package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
- package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
- package/src/module/workflow/entity/workflow.entity.ts +20 -20
- package/src/module/workflow/repository/action-category.repository.ts +79 -79
- package/src/module/workflow/repository/action-data.repository.ts +347 -347
- package/src/module/workflow/repository/action.repository.ts +339 -339
- package/src/module/workflow/repository/activity-log.repository.ts +148 -148
- package/src/module/workflow/repository/comm-template.repository.ts +157 -157
- package/src/module/workflow/repository/form-master.repository.ts +50 -50
- package/src/module/workflow/repository/stage-group.repository.ts +186 -186
- package/src/module/workflow/repository/stage-movement.repository.ts +217 -217
- package/src/module/workflow/repository/stage.repository.ts +160 -160
- package/src/module/workflow/repository/task.repository.ts +154 -154
- package/src/module/workflow/repository/workflow.repository.ts +42 -42
- package/src/module/workflow/service/action-category.service.ts +33 -33
- package/src/module/workflow/service/action-data.service.ts +62 -62
- package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
- package/src/module/workflow/service/action-template-mapping.service.ts +137 -137
- package/src/module/workflow/service/action.service.ts +302 -302
- package/src/module/workflow/service/activity-log.service.ts +107 -107
- package/src/module/workflow/service/comm-template.service.ts +181 -181
- package/src/module/workflow/service/entity-modification.service.ts +61 -61
- package/src/module/workflow/service/form-master.service.ts +35 -35
- package/src/module/workflow/service/populate-workflow.service.ts +320 -320
- package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
- package/src/module/workflow/service/stage-group.service.ts +325 -325
- package/src/module/workflow/service/stage.service.ts +197 -197
- package/src/module/workflow/service/task.service.ts +551 -551
- package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
- package/src/module/workflow/service/workflow-meta.service.ts +640 -640
- package/src/module/workflow/service/workflow.service.ts +213 -213
- package/src/module/workflow/workflow.module.ts +180 -180
- package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
- package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
- package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
- package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
- package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
- package/src/module/workflow-automation/interface/action.interface.ts +5 -5
- package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
- package/src/module/workflow-automation/service/schedule-handler.service.ts +168 -168
- package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
- package/src/module/workflow-automation/service/workflow-automation.service.ts +476 -476
- package/src/module/workflow-automation/workflow-automation.module.ts +54 -54
- package/src/module/workflow-schedule/INSTALLATION.md +244 -244
- package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
- package/src/module/workflow-schedule/README.md +422 -422
- package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
- package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +253 -253
- package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
- package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
- package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
- package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
- package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
- package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
- package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
- package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
- package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
- package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
- package/src/module/workflow-schedule/processors/schedule.processor.ts +620 -620
- package/src/module/workflow-schedule/service/workflow-schedule.service.ts +597 -597
- package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
- package/src/resources/dev.properties.yaml +31 -31
- package/src/resources/local.properties.yaml +27 -27
- package/src/resources/properties.module.ts +12 -12
- package/src/resources/properties.yaml.ts +11 -11
- package/src/resources/uat.properties.yaml +31 -31
- package/src/table.config.ts +133 -133
- package/src/utils/dto/excel-data.dto.ts +14 -14
- package/src/utils/dto/excelsheet-data.dto.ts +5 -5
- package/src/utils/service/base64util.service.ts +18 -18
- package/src/utils/service/clockIDGenUtil.service.ts +21 -21
- package/src/utils/service/codeGenerator.service.ts +22 -22
- package/src/utils/service/dateUtil.service.ts +17 -17
- package/src/utils/service/encryptUtil.service.ts +97 -97
- package/src/utils/service/excel-helper.service.ts +72 -72
- package/src/utils/service/excelUtil.service.ts +15 -15
- package/src/utils/service/file-util.service.ts +11 -11
- package/src/utils/service/json-util.service.ts +23 -23
- package/src/utils/service/loggingUtil.service.ts +88 -88
- package/src/utils/service/reflection-helper.service.ts +62 -62
- package/src/utils/service/wbsCodeGen.service.ts +8 -8
- package/src/utils/utils.module.ts +27 -27
- package/tsconfig.build.json +4 -4
- package/tsconfig.json +24 -24
|
@@ -1,362 +1,362 @@
|
|
|
1
|
-
# Prompt for Claude Code: Workflow Schedule Module Implementation
|
|
2
|
-
|
|
3
|
-
## Project Context
|
|
4
|
-
|
|
5
|
-
**Project Path**: `/Users/debrajdas/WORKSPACE/001_RZ/PROJECTS/ETHER/250218_nodejs_core`
|
|
6
|
-
**Framework**: NestJS with TypeORM
|
|
7
|
-
**Database**: MySQL
|
|
8
|
-
**Task**: Implement complete workflow schedule module with Bull queue
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Implementation Request
|
|
13
|
-
|
|
14
|
-
I need you to implement a complete scheduled workflow system in my NestJS project. This will extend the existing workflow module to support time-based workflow execution using cron schedules.
|
|
15
|
-
|
|
16
|
-
### Target Location
|
|
17
|
-
Create all files in: `src/module/workflow-schedule/`
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Required Files and Implementation
|
|
22
|
-
|
|
23
|
-
### 1. Module Structure
|
|
24
|
-
|
|
25
|
-
Create the following directory structure:
|
|
26
|
-
```
|
|
27
|
-
src/module/workflow-schedule/
|
|
28
|
-
├── workflow-schedule.module.ts
|
|
29
|
-
├── workflow-schedule.service.ts
|
|
30
|
-
├── workflow-schedule.controller.ts
|
|
31
|
-
├── constants/
|
|
32
|
-
│ └── schedule.constants.ts
|
|
33
|
-
├── dto/
|
|
34
|
-
│ ├── create-schedule.dto.ts
|
|
35
|
-
│ ├── update-schedule.dto.ts
|
|
36
|
-
│ └── get-execution-logs.dto.ts
|
|
37
|
-
├── entities/
|
|
38
|
-
│ ├── scheduled-workflow.entity.ts
|
|
39
|
-
│ └── workflow-execution-log.entity.ts
|
|
40
|
-
├── interfaces/
|
|
41
|
-
│ └── schedule-job-data.interface.ts
|
|
42
|
-
├── processors/
|
|
43
|
-
│ └── schedule.processor.ts
|
|
44
|
-
└── tests/
|
|
45
|
-
└── workflow-schedule.service.spec.ts
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 2. Database Migrations
|
|
49
|
-
|
|
50
|
-
Create in: `src/migrations/`
|
|
51
|
-
|
|
52
|
-
**Migration 1**: Add `workflow_type` column to workflows table
|
|
53
|
-
- Column: `workflow_type ENUM('trigger', 'schedule') DEFAULT 'trigger'`
|
|
54
|
-
|
|
55
|
-
**Migration 2**: Create `scheduled_workflows` table with:
|
|
56
|
-
- id, workflow_id (FK), schedule_expression, timezone
|
|
57
|
-
- is_active, last_executed_at, next_execution_at, execution_count
|
|
58
|
-
- start_date, end_date, created_at, updated_at
|
|
59
|
-
- Indexes: (next_execution_at, is_active), (workflow_id)
|
|
60
|
-
|
|
61
|
-
**Migration 3**: Create `workflow_execution_logs` table with:
|
|
62
|
-
- id, workflow_id (FK), execution_type, status
|
|
63
|
-
- started_at, completed_at, records_processed, records_failed
|
|
64
|
-
- error_message, job_id, execution_data (JSON)
|
|
65
|
-
- Indexes: (workflow_id, status), (started_at), (execution_type)
|
|
66
|
-
|
|
67
|
-
### 3. Configuration
|
|
68
|
-
|
|
69
|
-
Create: `src/config/bull.config.ts`
|
|
70
|
-
- Export `getBullConfig()` function returning BullModuleOptions
|
|
71
|
-
- Read from env: REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DB
|
|
72
|
-
- Configure: retry strategy, job options, queue settings
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Detailed Requirements
|
|
77
|
-
|
|
78
|
-
### Entities
|
|
79
|
-
|
|
80
|
-
**scheduled-workflow.entity.ts**:
|
|
81
|
-
- TypeORM entity for `scheduled_workflows` table
|
|
82
|
-
- Relations: `@ManyToOne(() => Workflow)`
|
|
83
|
-
- Proper column decorators with snake_case naming
|
|
84
|
-
- Indexes using @Index decorator
|
|
85
|
-
|
|
86
|
-
**workflow-execution-log.entity.ts**:
|
|
87
|
-
- TypeORM entity for `workflow_execution_logs` table
|
|
88
|
-
- Enums: ExecutionType (trigger/schedule/manual), ExecutionStatus (running/success/failed/partial_success)
|
|
89
|
-
- Computed properties: `durationMs()`, `successRate()`
|
|
90
|
-
|
|
91
|
-
### DTOs
|
|
92
|
-
|
|
93
|
-
**create-schedule.dto.ts**:
|
|
94
|
-
```typescript
|
|
95
|
-
- workflowId: number (required)
|
|
96
|
-
- scheduleExpression: string (required, cron format validation)
|
|
97
|
-
- timezone: string (optional, IANA format, default: 'UTC')
|
|
98
|
-
- startDate: string (optional, ISO date)
|
|
99
|
-
- endDate: string (optional, ISO date)
|
|
100
|
-
- isActive: boolean (optional, default: true)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**update-schedule.dto.ts**:
|
|
104
|
-
- All fields optional from CreateScheduleDto
|
|
105
|
-
|
|
106
|
-
**get-execution-logs.dto.ts**:
|
|
107
|
-
```typescript
|
|
108
|
-
- status: ExecutionStatus (optional)
|
|
109
|
-
- executionType: ExecutionType (optional)
|
|
110
|
-
- limit: number (optional, default: 50, max: 500)
|
|
111
|
-
- offset: number (optional, default: 0)
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Use `class-validator` decorators for all validation.
|
|
115
|
-
|
|
116
|
-
### Service (workflow-schedule.service.ts)
|
|
117
|
-
|
|
118
|
-
Implement these methods:
|
|
119
|
-
|
|
120
|
-
1. **scheduleWorkflow(dto: CreateScheduleDto): Promise<ScheduledWorkflow>**
|
|
121
|
-
- Validate cron expression using cron-parser
|
|
122
|
-
- Validate timezone using moment-timezone
|
|
123
|
-
- Calculate next execution time
|
|
124
|
-
- Create schedule in database
|
|
125
|
-
- Add job to Bull queue if active
|
|
126
|
-
|
|
127
|
-
2. **updateSchedule(id: number, dto: UpdateScheduleDto): Promise<ScheduledWorkflow>**
|
|
128
|
-
- Find schedule or throw NotFoundException
|
|
129
|
-
- Validate updates
|
|
130
|
-
- Recalculate next execution
|
|
131
|
-
- Update Bull queue job
|
|
132
|
-
|
|
133
|
-
3. **deleteSchedule(id: number): Promise<void>**
|
|
134
|
-
- Remove from database
|
|
135
|
-
- Remove job from Bull queue
|
|
136
|
-
|
|
137
|
-
4. **pauseSchedule(id: number): Promise<ScheduledWorkflow>**
|
|
138
|
-
- Set isActive = false
|
|
139
|
-
- Remove job from queue
|
|
140
|
-
|
|
141
|
-
5. **resumeSchedule(id: number): Promise<ScheduledWorkflow>**
|
|
142
|
-
- Set isActive = true
|
|
143
|
-
- Recalculate next execution
|
|
144
|
-
- Add job back to queue
|
|
145
|
-
|
|
146
|
-
6. **triggerSchedule(id: number): Promise<WorkflowExecutionLog>**
|
|
147
|
-
- Create execution log with type 'manual'
|
|
148
|
-
- Add high-priority job to queue
|
|
149
|
-
|
|
150
|
-
7. **getExecutionLogs(scheduleId, query): Promise<{logs, total}>**
|
|
151
|
-
- Query with filters (status, executionType)
|
|
152
|
-
- Pagination (limit, offset)
|
|
153
|
-
- Order by startedAt DESC
|
|
154
|
-
|
|
155
|
-
8. **getScheduledJobs(): Promise<ScheduledWorkflow[]>**
|
|
156
|
-
- Return all active schedules with relations
|
|
157
|
-
|
|
158
|
-
9. **getScheduleById(id): Promise<ScheduledWorkflow>**
|
|
159
|
-
- Find with relations or throw NotFoundException
|
|
160
|
-
|
|
161
|
-
### Controller (workflow-schedule.controller.ts)
|
|
162
|
-
|
|
163
|
-
REST API endpoints with Swagger decorators:
|
|
164
|
-
|
|
165
|
-
```
|
|
166
|
-
POST /workflow-schedule - create()
|
|
167
|
-
GET /workflow-schedule - getAll()
|
|
168
|
-
GET /workflow-schedule/:id - getById()
|
|
169
|
-
PUT /workflow-schedule/:id - update()
|
|
170
|
-
DELETE /workflow-schedule/:id - delete()
|
|
171
|
-
POST /workflow-schedule/:id/pause - pause()
|
|
172
|
-
POST /workflow-schedule/:id/resume - resume()
|
|
173
|
-
POST /workflow-schedule/:id/trigger - trigger()
|
|
174
|
-
GET /workflow-schedule/:id/logs - getLogs()
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Add @ApiTags, @ApiOperation, @ApiResponse decorators.
|
|
178
|
-
|
|
179
|
-
### Processor (schedule.processor.ts)
|
|
180
|
-
|
|
181
|
-
Bull queue processor with:
|
|
182
|
-
|
|
183
|
-
**@Process() handleScheduledJob(job: Job<ScheduleJobData>)**:
|
|
184
|
-
1. Create execution log (status: 'running')
|
|
185
|
-
2. Verify schedule is still active and hasn't ended
|
|
186
|
-
3. Get workflow configuration
|
|
187
|
-
4. Query records matching workflow criteria
|
|
188
|
-
5. Process in batches of 100 records
|
|
189
|
-
6. Execute actions for each record:
|
|
190
|
-
- sendEmail(config, record)
|
|
191
|
-
- updateRecord(config, record)
|
|
192
|
-
- createTask(config, record)
|
|
193
|
-
- sendNotification(config, record)
|
|
194
|
-
7. Handle template variables: `{{record.field}}`, `{{current_date}}`
|
|
195
|
-
8. Update execution log with results
|
|
196
|
-
9. Update schedule (last_executed_at, execution_count, next_execution_at)
|
|
197
|
-
10. Schedule next job
|
|
198
|
-
|
|
199
|
-
**Error handling**:
|
|
200
|
-
- Try/catch around entire process
|
|
201
|
-
- Log errors to execution log
|
|
202
|
-
- Retry with exponential backoff (3 attempts)
|
|
203
|
-
|
|
204
|
-
**Lifecycle hooks**:
|
|
205
|
-
- @OnQueueActive() - Log job start
|
|
206
|
-
- @OnQueueCompleted() - Log success
|
|
207
|
-
- @OnQueueFailed() - Log failure
|
|
208
|
-
|
|
209
|
-
### Constants (schedule.constants.ts)
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
export const SCHEDULE_QUEUE_NAME = 'workflow-schedule';
|
|
213
|
-
export const MAX_BATCH_SIZE = 100;
|
|
214
|
-
export const EXECUTION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
215
|
-
|
|
216
|
-
export const DEFAULT_JOB_OPTIONS = {
|
|
217
|
-
attempts: 3,
|
|
218
|
-
backoff: { type: 'exponential', delay: 5000 },
|
|
219
|
-
removeOnComplete: false,
|
|
220
|
-
removeOnFail: false,
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
export const COMMON_CRON_EXPRESSIONS = {
|
|
224
|
-
EVERY_MINUTE: '* * * * *',
|
|
225
|
-
EVERY_HOUR: '0 * * * *',
|
|
226
|
-
EVERY_DAY_9AM: '0 9 * * *',
|
|
227
|
-
EVERY_MONDAY_9AM: '0 9 * * 1',
|
|
228
|
-
// ... etc
|
|
229
|
-
};
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Interfaces (schedule-job-data.interface.ts)
|
|
233
|
-
|
|
234
|
-
```typescript
|
|
235
|
-
export interface ScheduleJobData {
|
|
236
|
-
scheduleId: number;
|
|
237
|
-
workflowId: number;
|
|
238
|
-
workflowName: string;
|
|
239
|
-
scheduledAt: Date;
|
|
240
|
-
attempt: number;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export interface WorkflowExecutionResult {
|
|
244
|
-
success: boolean;
|
|
245
|
-
recordsProcessed: number;
|
|
246
|
-
recordsFailed: number;
|
|
247
|
-
errorMessage?: string;
|
|
248
|
-
executionData?: Record<string, any>;
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### Module (workflow-schedule.module.ts)
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
@Module({
|
|
256
|
-
imports: [
|
|
257
|
-
TypeOrmModule.forFeature([ScheduledWorkflow, WorkflowExecutionLog]),
|
|
258
|
-
BullModule.registerQueue({ name: SCHEDULE_QUEUE_NAME }),
|
|
259
|
-
WorkflowModule,
|
|
260
|
-
],
|
|
261
|
-
controllers: [WorkflowScheduleController],
|
|
262
|
-
providers: [WorkflowScheduleService, ScheduleProcessor],
|
|
263
|
-
exports: [WorkflowScheduleService],
|
|
264
|
-
})
|
|
265
|
-
export class WorkflowScheduleModule {}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Additional Requirements
|
|
271
|
-
|
|
272
|
-
### Update app.module.ts
|
|
273
|
-
|
|
274
|
-
Add imports:
|
|
275
|
-
```typescript
|
|
276
|
-
import { BullModule } from '@nestjs/bull';
|
|
277
|
-
import { WorkflowScheduleModule } from './module/workflow-schedule/workflow-schedule.module';
|
|
278
|
-
import { getBullConfig } from './config/bull.config';
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
Add to imports array:
|
|
282
|
-
```typescript
|
|
283
|
-
BullModule.forRootAsync({
|
|
284
|
-
imports: [ConfigModule],
|
|
285
|
-
inject: [ConfigService],
|
|
286
|
-
useFactory: getBullConfig,
|
|
287
|
-
}),
|
|
288
|
-
WorkflowScheduleModule,
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Tests
|
|
292
|
-
|
|
293
|
-
Create comprehensive unit tests in `workflow-schedule.service.spec.ts`:
|
|
294
|
-
- Test all service methods
|
|
295
|
-
- Mock TypeORM repositories
|
|
296
|
-
- Mock Bull queue
|
|
297
|
-
- Test validation (invalid cron, invalid timezone)
|
|
298
|
-
- Test error cases (not found, etc.)
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## Code Quality Requirements
|
|
303
|
-
|
|
304
|
-
1. **TypeScript**: Use strict types, no `any` unless necessary
|
|
305
|
-
2. **Error Handling**: Proper exceptions (NotFoundException, BadRequestException)
|
|
306
|
-
3. **Validation**: Use class-validator decorators
|
|
307
|
-
4. **Documentation**: JSDoc comments for all public methods
|
|
308
|
-
5. **Naming**: camelCase for variables, PascalCase for classes
|
|
309
|
-
6. **Async/Await**: Use async/await, not .then()
|
|
310
|
-
7. **Imports**: Organized and clean
|
|
311
|
-
8. **Logging**: Use Logger from @nestjs/common
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## Dependencies (already in package.json, but for reference)
|
|
316
|
-
|
|
317
|
-
```
|
|
318
|
-
@nestjs/bull
|
|
319
|
-
bull
|
|
320
|
-
ioredis
|
|
321
|
-
cron-parser
|
|
322
|
-
moment-timezone
|
|
323
|
-
class-validator
|
|
324
|
-
class-transformer
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Expected Behavior
|
|
330
|
-
|
|
331
|
-
After implementation:
|
|
332
|
-
- ✅ Can create schedules via REST API
|
|
333
|
-
- ✅ Schedules execute automatically at cron time
|
|
334
|
-
- ✅ Can pause/resume schedules
|
|
335
|
-
- ✅ Can manually trigger execution
|
|
336
|
-
- ✅ Execution logs are created with detailed metrics
|
|
337
|
-
- ✅ Failed jobs retry 3 times with exponential backoff
|
|
338
|
-
- ✅ Records processed in batches of 100
|
|
339
|
-
- ✅ Template variables work correctly
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
## Notes
|
|
344
|
-
|
|
345
|
-
- Assume existing Workflow entity exists at `src/module/workflow/entities/workflow.entity.ts`
|
|
346
|
-
- Assume WorkflowService exists and has necessary methods
|
|
347
|
-
- Use proper TypeORM relationships and cascades
|
|
348
|
-
- Follow NestJS best practices
|
|
349
|
-
- Make code production-ready
|
|
350
|
-
|
|
351
|
-
---
|
|
352
|
-
|
|
353
|
-
## Please Implement
|
|
354
|
-
|
|
355
|
-
Create all the files listed above with complete, working code. Ensure:
|
|
356
|
-
1. All TypeScript types are correct
|
|
357
|
-
2. All decorators are properly used
|
|
358
|
-
3. Error handling is comprehensive
|
|
359
|
-
4. Code follows NestJS conventions
|
|
360
|
-
5. Everything is well-documented
|
|
361
|
-
|
|
362
|
-
Start with the entities and migrations, then services, then controller, then processor.
|
|
1
|
+
# Prompt for Claude Code: Workflow Schedule Module Implementation
|
|
2
|
+
|
|
3
|
+
## Project Context
|
|
4
|
+
|
|
5
|
+
**Project Path**: `/Users/debrajdas/WORKSPACE/001_RZ/PROJECTS/ETHER/250218_nodejs_core`
|
|
6
|
+
**Framework**: NestJS with TypeORM
|
|
7
|
+
**Database**: MySQL
|
|
8
|
+
**Task**: Implement complete workflow schedule module with Bull queue
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Implementation Request
|
|
13
|
+
|
|
14
|
+
I need you to implement a complete scheduled workflow system in my NestJS project. This will extend the existing workflow module to support time-based workflow execution using cron schedules.
|
|
15
|
+
|
|
16
|
+
### Target Location
|
|
17
|
+
Create all files in: `src/module/workflow-schedule/`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Required Files and Implementation
|
|
22
|
+
|
|
23
|
+
### 1. Module Structure
|
|
24
|
+
|
|
25
|
+
Create the following directory structure:
|
|
26
|
+
```
|
|
27
|
+
src/module/workflow-schedule/
|
|
28
|
+
├── workflow-schedule.module.ts
|
|
29
|
+
├── workflow-schedule.service.ts
|
|
30
|
+
├── workflow-schedule.controller.ts
|
|
31
|
+
├── constants/
|
|
32
|
+
│ └── schedule.constants.ts
|
|
33
|
+
├── dto/
|
|
34
|
+
│ ├── create-schedule.dto.ts
|
|
35
|
+
│ ├── update-schedule.dto.ts
|
|
36
|
+
│ └── get-execution-logs.dto.ts
|
|
37
|
+
├── entities/
|
|
38
|
+
│ ├── scheduled-workflow.entity.ts
|
|
39
|
+
│ └── workflow-execution-log.entity.ts
|
|
40
|
+
├── interfaces/
|
|
41
|
+
│ └── schedule-job-data.interface.ts
|
|
42
|
+
├── processors/
|
|
43
|
+
│ └── schedule.processor.ts
|
|
44
|
+
└── tests/
|
|
45
|
+
└── workflow-schedule.service.spec.ts
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Database Migrations
|
|
49
|
+
|
|
50
|
+
Create in: `src/migrations/`
|
|
51
|
+
|
|
52
|
+
**Migration 1**: Add `workflow_type` column to workflows table
|
|
53
|
+
- Column: `workflow_type ENUM('trigger', 'schedule') DEFAULT 'trigger'`
|
|
54
|
+
|
|
55
|
+
**Migration 2**: Create `scheduled_workflows` table with:
|
|
56
|
+
- id, workflow_id (FK), schedule_expression, timezone
|
|
57
|
+
- is_active, last_executed_at, next_execution_at, execution_count
|
|
58
|
+
- start_date, end_date, created_at, updated_at
|
|
59
|
+
- Indexes: (next_execution_at, is_active), (workflow_id)
|
|
60
|
+
|
|
61
|
+
**Migration 3**: Create `workflow_execution_logs` table with:
|
|
62
|
+
- id, workflow_id (FK), execution_type, status
|
|
63
|
+
- started_at, completed_at, records_processed, records_failed
|
|
64
|
+
- error_message, job_id, execution_data (JSON)
|
|
65
|
+
- Indexes: (workflow_id, status), (started_at), (execution_type)
|
|
66
|
+
|
|
67
|
+
### 3. Configuration
|
|
68
|
+
|
|
69
|
+
Create: `src/config/bull.config.ts`
|
|
70
|
+
- Export `getBullConfig()` function returning BullModuleOptions
|
|
71
|
+
- Read from env: REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DB
|
|
72
|
+
- Configure: retry strategy, job options, queue settings
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Detailed Requirements
|
|
77
|
+
|
|
78
|
+
### Entities
|
|
79
|
+
|
|
80
|
+
**scheduled-workflow.entity.ts**:
|
|
81
|
+
- TypeORM entity for `scheduled_workflows` table
|
|
82
|
+
- Relations: `@ManyToOne(() => Workflow)`
|
|
83
|
+
- Proper column decorators with snake_case naming
|
|
84
|
+
- Indexes using @Index decorator
|
|
85
|
+
|
|
86
|
+
**workflow-execution-log.entity.ts**:
|
|
87
|
+
- TypeORM entity for `workflow_execution_logs` table
|
|
88
|
+
- Enums: ExecutionType (trigger/schedule/manual), ExecutionStatus (running/success/failed/partial_success)
|
|
89
|
+
- Computed properties: `durationMs()`, `successRate()`
|
|
90
|
+
|
|
91
|
+
### DTOs
|
|
92
|
+
|
|
93
|
+
**create-schedule.dto.ts**:
|
|
94
|
+
```typescript
|
|
95
|
+
- workflowId: number (required)
|
|
96
|
+
- scheduleExpression: string (required, cron format validation)
|
|
97
|
+
- timezone: string (optional, IANA format, default: 'UTC')
|
|
98
|
+
- startDate: string (optional, ISO date)
|
|
99
|
+
- endDate: string (optional, ISO date)
|
|
100
|
+
- isActive: boolean (optional, default: true)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**update-schedule.dto.ts**:
|
|
104
|
+
- All fields optional from CreateScheduleDto
|
|
105
|
+
|
|
106
|
+
**get-execution-logs.dto.ts**:
|
|
107
|
+
```typescript
|
|
108
|
+
- status: ExecutionStatus (optional)
|
|
109
|
+
- executionType: ExecutionType (optional)
|
|
110
|
+
- limit: number (optional, default: 50, max: 500)
|
|
111
|
+
- offset: number (optional, default: 0)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Use `class-validator` decorators for all validation.
|
|
115
|
+
|
|
116
|
+
### Service (workflow-schedule.service.ts)
|
|
117
|
+
|
|
118
|
+
Implement these methods:
|
|
119
|
+
|
|
120
|
+
1. **scheduleWorkflow(dto: CreateScheduleDto): Promise<ScheduledWorkflow>**
|
|
121
|
+
- Validate cron expression using cron-parser
|
|
122
|
+
- Validate timezone using moment-timezone
|
|
123
|
+
- Calculate next execution time
|
|
124
|
+
- Create schedule in database
|
|
125
|
+
- Add job to Bull queue if active
|
|
126
|
+
|
|
127
|
+
2. **updateSchedule(id: number, dto: UpdateScheduleDto): Promise<ScheduledWorkflow>**
|
|
128
|
+
- Find schedule or throw NotFoundException
|
|
129
|
+
- Validate updates
|
|
130
|
+
- Recalculate next execution
|
|
131
|
+
- Update Bull queue job
|
|
132
|
+
|
|
133
|
+
3. **deleteSchedule(id: number): Promise<void>**
|
|
134
|
+
- Remove from database
|
|
135
|
+
- Remove job from Bull queue
|
|
136
|
+
|
|
137
|
+
4. **pauseSchedule(id: number): Promise<ScheduledWorkflow>**
|
|
138
|
+
- Set isActive = false
|
|
139
|
+
- Remove job from queue
|
|
140
|
+
|
|
141
|
+
5. **resumeSchedule(id: number): Promise<ScheduledWorkflow>**
|
|
142
|
+
- Set isActive = true
|
|
143
|
+
- Recalculate next execution
|
|
144
|
+
- Add job back to queue
|
|
145
|
+
|
|
146
|
+
6. **triggerSchedule(id: number): Promise<WorkflowExecutionLog>**
|
|
147
|
+
- Create execution log with type 'manual'
|
|
148
|
+
- Add high-priority job to queue
|
|
149
|
+
|
|
150
|
+
7. **getExecutionLogs(scheduleId, query): Promise<{logs, total}>**
|
|
151
|
+
- Query with filters (status, executionType)
|
|
152
|
+
- Pagination (limit, offset)
|
|
153
|
+
- Order by startedAt DESC
|
|
154
|
+
|
|
155
|
+
8. **getScheduledJobs(): Promise<ScheduledWorkflow[]>**
|
|
156
|
+
- Return all active schedules with relations
|
|
157
|
+
|
|
158
|
+
9. **getScheduleById(id): Promise<ScheduledWorkflow>**
|
|
159
|
+
- Find with relations or throw NotFoundException
|
|
160
|
+
|
|
161
|
+
### Controller (workflow-schedule.controller.ts)
|
|
162
|
+
|
|
163
|
+
REST API endpoints with Swagger decorators:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
POST /workflow-schedule - create()
|
|
167
|
+
GET /workflow-schedule - getAll()
|
|
168
|
+
GET /workflow-schedule/:id - getById()
|
|
169
|
+
PUT /workflow-schedule/:id - update()
|
|
170
|
+
DELETE /workflow-schedule/:id - delete()
|
|
171
|
+
POST /workflow-schedule/:id/pause - pause()
|
|
172
|
+
POST /workflow-schedule/:id/resume - resume()
|
|
173
|
+
POST /workflow-schedule/:id/trigger - trigger()
|
|
174
|
+
GET /workflow-schedule/:id/logs - getLogs()
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Add @ApiTags, @ApiOperation, @ApiResponse decorators.
|
|
178
|
+
|
|
179
|
+
### Processor (schedule.processor.ts)
|
|
180
|
+
|
|
181
|
+
Bull queue processor with:
|
|
182
|
+
|
|
183
|
+
**@Process() handleScheduledJob(job: Job<ScheduleJobData>)**:
|
|
184
|
+
1. Create execution log (status: 'running')
|
|
185
|
+
2. Verify schedule is still active and hasn't ended
|
|
186
|
+
3. Get workflow configuration
|
|
187
|
+
4. Query records matching workflow criteria
|
|
188
|
+
5. Process in batches of 100 records
|
|
189
|
+
6. Execute actions for each record:
|
|
190
|
+
- sendEmail(config, record)
|
|
191
|
+
- updateRecord(config, record)
|
|
192
|
+
- createTask(config, record)
|
|
193
|
+
- sendNotification(config, record)
|
|
194
|
+
7. Handle template variables: `{{record.field}}`, `{{current_date}}`
|
|
195
|
+
8. Update execution log with results
|
|
196
|
+
9. Update schedule (last_executed_at, execution_count, next_execution_at)
|
|
197
|
+
10. Schedule next job
|
|
198
|
+
|
|
199
|
+
**Error handling**:
|
|
200
|
+
- Try/catch around entire process
|
|
201
|
+
- Log errors to execution log
|
|
202
|
+
- Retry with exponential backoff (3 attempts)
|
|
203
|
+
|
|
204
|
+
**Lifecycle hooks**:
|
|
205
|
+
- @OnQueueActive() - Log job start
|
|
206
|
+
- @OnQueueCompleted() - Log success
|
|
207
|
+
- @OnQueueFailed() - Log failure
|
|
208
|
+
|
|
209
|
+
### Constants (schedule.constants.ts)
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
export const SCHEDULE_QUEUE_NAME = 'workflow-schedule';
|
|
213
|
+
export const MAX_BATCH_SIZE = 100;
|
|
214
|
+
export const EXECUTION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
215
|
+
|
|
216
|
+
export const DEFAULT_JOB_OPTIONS = {
|
|
217
|
+
attempts: 3,
|
|
218
|
+
backoff: { type: 'exponential', delay: 5000 },
|
|
219
|
+
removeOnComplete: false,
|
|
220
|
+
removeOnFail: false,
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
export const COMMON_CRON_EXPRESSIONS = {
|
|
224
|
+
EVERY_MINUTE: '* * * * *',
|
|
225
|
+
EVERY_HOUR: '0 * * * *',
|
|
226
|
+
EVERY_DAY_9AM: '0 9 * * *',
|
|
227
|
+
EVERY_MONDAY_9AM: '0 9 * * 1',
|
|
228
|
+
// ... etc
|
|
229
|
+
};
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Interfaces (schedule-job-data.interface.ts)
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
export interface ScheduleJobData {
|
|
236
|
+
scheduleId: number;
|
|
237
|
+
workflowId: number;
|
|
238
|
+
workflowName: string;
|
|
239
|
+
scheduledAt: Date;
|
|
240
|
+
attempt: number;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export interface WorkflowExecutionResult {
|
|
244
|
+
success: boolean;
|
|
245
|
+
recordsProcessed: number;
|
|
246
|
+
recordsFailed: number;
|
|
247
|
+
errorMessage?: string;
|
|
248
|
+
executionData?: Record<string, any>;
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Module (workflow-schedule.module.ts)
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
@Module({
|
|
256
|
+
imports: [
|
|
257
|
+
TypeOrmModule.forFeature([ScheduledWorkflow, WorkflowExecutionLog]),
|
|
258
|
+
BullModule.registerQueue({ name: SCHEDULE_QUEUE_NAME }),
|
|
259
|
+
WorkflowModule,
|
|
260
|
+
],
|
|
261
|
+
controllers: [WorkflowScheduleController],
|
|
262
|
+
providers: [WorkflowScheduleService, ScheduleProcessor],
|
|
263
|
+
exports: [WorkflowScheduleService],
|
|
264
|
+
})
|
|
265
|
+
export class WorkflowScheduleModule {}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Additional Requirements
|
|
271
|
+
|
|
272
|
+
### Update app.module.ts
|
|
273
|
+
|
|
274
|
+
Add imports:
|
|
275
|
+
```typescript
|
|
276
|
+
import { BullModule } from '@nestjs/bull';
|
|
277
|
+
import { WorkflowScheduleModule } from './module/workflow-schedule/workflow-schedule.module';
|
|
278
|
+
import { getBullConfig } from './config/bull.config';
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Add to imports array:
|
|
282
|
+
```typescript
|
|
283
|
+
BullModule.forRootAsync({
|
|
284
|
+
imports: [ConfigModule],
|
|
285
|
+
inject: [ConfigService],
|
|
286
|
+
useFactory: getBullConfig,
|
|
287
|
+
}),
|
|
288
|
+
WorkflowScheduleModule,
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Tests
|
|
292
|
+
|
|
293
|
+
Create comprehensive unit tests in `workflow-schedule.service.spec.ts`:
|
|
294
|
+
- Test all service methods
|
|
295
|
+
- Mock TypeORM repositories
|
|
296
|
+
- Mock Bull queue
|
|
297
|
+
- Test validation (invalid cron, invalid timezone)
|
|
298
|
+
- Test error cases (not found, etc.)
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Code Quality Requirements
|
|
303
|
+
|
|
304
|
+
1. **TypeScript**: Use strict types, no `any` unless necessary
|
|
305
|
+
2. **Error Handling**: Proper exceptions (NotFoundException, BadRequestException)
|
|
306
|
+
3. **Validation**: Use class-validator decorators
|
|
307
|
+
4. **Documentation**: JSDoc comments for all public methods
|
|
308
|
+
5. **Naming**: camelCase for variables, PascalCase for classes
|
|
309
|
+
6. **Async/Await**: Use async/await, not .then()
|
|
310
|
+
7. **Imports**: Organized and clean
|
|
311
|
+
8. **Logging**: Use Logger from @nestjs/common
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Dependencies (already in package.json, but for reference)
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
@nestjs/bull
|
|
319
|
+
bull
|
|
320
|
+
ioredis
|
|
321
|
+
cron-parser
|
|
322
|
+
moment-timezone
|
|
323
|
+
class-validator
|
|
324
|
+
class-transformer
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Expected Behavior
|
|
330
|
+
|
|
331
|
+
After implementation:
|
|
332
|
+
- ✅ Can create schedules via REST API
|
|
333
|
+
- ✅ Schedules execute automatically at cron time
|
|
334
|
+
- ✅ Can pause/resume schedules
|
|
335
|
+
- ✅ Can manually trigger execution
|
|
336
|
+
- ✅ Execution logs are created with detailed metrics
|
|
337
|
+
- ✅ Failed jobs retry 3 times with exponential backoff
|
|
338
|
+
- ✅ Records processed in batches of 100
|
|
339
|
+
- ✅ Template variables work correctly
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Notes
|
|
344
|
+
|
|
345
|
+
- Assume existing Workflow entity exists at `src/module/workflow/entities/workflow.entity.ts`
|
|
346
|
+
- Assume WorkflowService exists and has necessary methods
|
|
347
|
+
- Use proper TypeORM relationships and cascades
|
|
348
|
+
- Follow NestJS best practices
|
|
349
|
+
- Make code production-ready
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Please Implement
|
|
354
|
+
|
|
355
|
+
Create all the files listed above with complete, working code. Ensure:
|
|
356
|
+
1. All TypeScript types are correct
|
|
357
|
+
2. All decorators are properly used
|
|
358
|
+
3. Error handling is comprehensive
|
|
359
|
+
4. Code follows NestJS conventions
|
|
360
|
+
5. Everything is well-documented
|
|
361
|
+
|
|
362
|
+
Start with the entities and migrations, then services, then controller, then processor.
|