@coopenomics/notifications 2025.11.8 → 2025.11.9-alpha-2
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/dist/index.cjs +13 -14
- package/dist/index.d.cts +5 -8
- package/dist/index.d.mts +5 -8
- package/dist/index.d.ts +5 -8
- package/dist/index.mjs +13 -14
- package/package.json +6 -2
- package/src/workflows/server-provisioned/index.ts +16 -17
- package/dist/sync/novu-sync.service.d.ts +0 -30
- package/dist/sync/novu-sync.service.js +0 -128
- package/dist/sync/sync-runner.d.ts +0 -4
- package/dist/sync/sync-runner.js +0 -130
- package/dist/utils/role-utils.d.ts +0 -8
- package/dist/utils/role-utils.js +0 -18
- package/dist/workflows/incoming-transfer/incoming-transfer-workflow.d.ts +0 -3
- package/dist/workflows/incoming-transfer/incoming-transfer-workflow.js +0 -16
- package/dist/workflows/incoming-transfer/index.d.ts +0 -3
- package/dist/workflows/incoming-transfer/index.js +0 -2
- package/dist/workflows/incoming-transfer/types.d.ts +0 -12
- package/dist/workflows/incoming-transfer/types.js +0 -5
- package/dist/workflows/new-agenda-item/index.d.ts +0 -3
- package/dist/workflows/new-agenda-item/index.js +0 -2
- package/dist/workflows/new-agenda-item/new-agenda-item-workflow.d.ts +0 -3
- package/dist/workflows/new-agenda-item/new-agenda-item-workflow.js +0 -16
- package/dist/workflows/new-agenda-item/types.d.ts +0 -27
- package/dist/workflows/new-agenda-item/types.js +0 -10
- package/dist/workflows/role-based-workflows.d.ts +0 -21
- package/dist/workflows/role-based-workflows.js +0 -65
package/dist/index.cjs
CHANGED
|
@@ -2928,29 +2928,28 @@ const index$2 = {
|
|
|
2928
2928
|
workflow: workflow$1
|
|
2929
2929
|
};
|
|
2930
2930
|
|
|
2931
|
-
const
|
|
2931
|
+
const serviceProvisionedPayloadSchema = zod.z.object({
|
|
2932
2932
|
cooperativeName: zod.z.string(),
|
|
2933
2933
|
domain: zod.z.string(),
|
|
2934
|
-
serverIp: zod.z.string().optional(),
|
|
2935
2934
|
provisionedAt: zod.z.string()
|
|
2936
2935
|
});
|
|
2937
|
-
const name = "\
|
|
2936
|
+
const name = "\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442";
|
|
2938
2937
|
const id = slugify(name);
|
|
2939
|
-
const workflow = WorkflowBuilder.create().name(name).workflowId(id).description("\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E\
|
|
2938
|
+
const workflow = WorkflowBuilder.create().name(name).workflowId(id).description("\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E\u043C \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u0446\u0438\u0444\u0440\u043E\u0432\u043E\u0433\u043E \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430").payloadSchema(serviceProvisionedPayloadSchema).tags(["digital", "cooperative", "deployment", "provisioning", "provider"]).addSteps([
|
|
2940
2939
|
createEmailStep(
|
|
2941
|
-
"
|
|
2942
|
-
"\
|
|
2943
|
-
'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!<br><br>\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0435\u043C \u0432\u0430\u0441 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \
|
|
2940
|
+
"digital-cooperative-deployed-email",
|
|
2941
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 - {{payload.cooperativeName}}",
|
|
2942
|
+
'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!<br><br>\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0435\u043C \u0432\u0430\u0441 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0446\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 <strong>{{payload.cooperativeName}}</strong> \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0440\u0430\u0431\u043E\u0442\u0435.<br><br><strong>\u0414\u0435\u0442\u0430\u043B\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F:</strong><br>- \u0414\u043E\u043C\u0435\u043D: {{payload.domain}}<br>- \u0414\u0430\u0442\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F: {{payload.provisionedAt}}<br><br>\u0412\u0430\u0448 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E \u0430\u0434\u0440\u0435\u0441\u0443: <a href="https://{{payload.domain}}">https://{{payload.domain}}</a><br><br>\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443.<br><br>\u0421 \u0443\u0432\u0430\u0436\u0435\u043D\u0438\u0435\u043C,<br>\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438'
|
|
2944
2943
|
),
|
|
2945
2944
|
createInAppStep(
|
|
2946
|
-
"
|
|
2947
|
-
"\
|
|
2948
|
-
"\
|
|
2945
|
+
"digital-cooperative-deployed-notification",
|
|
2946
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442",
|
|
2947
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 {{payload.cooperativeName}} \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 https://{{payload.domain}}, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443."
|
|
2949
2948
|
),
|
|
2950
2949
|
createPushStep(
|
|
2951
|
-
"
|
|
2952
|
-
"\
|
|
2953
|
-
"\
|
|
2950
|
+
"digital-cooperative-deployed-push",
|
|
2951
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 - {{payload.cooperativeName}}",
|
|
2952
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D! \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443."
|
|
2954
2953
|
)
|
|
2955
2954
|
]).build();
|
|
2956
2955
|
|
|
@@ -2958,7 +2957,7 @@ const index$1 = {
|
|
|
2958
2957
|
__proto__: null,
|
|
2959
2958
|
id: id,
|
|
2960
2959
|
name: name,
|
|
2961
|
-
|
|
2960
|
+
serviceProvisionedPayloadSchema: serviceProvisionedPayloadSchema,
|
|
2962
2961
|
workflow: workflow
|
|
2963
2962
|
};
|
|
2964
2963
|
|
package/dist/index.d.cts
CHANGED
|
@@ -747,26 +747,23 @@ declare namespace index$2 {
|
|
|
747
747
|
export { type IPayload$1 as IPayload, type IWorkflow$1 as IWorkflow, index$2_emailVerificationPayloadSchema as emailVerificationPayloadSchema, id$1 as id, name$1 as name, workflow$1 as workflow };
|
|
748
748
|
}
|
|
749
749
|
|
|
750
|
-
declare const
|
|
750
|
+
declare const serviceProvisionedPayloadSchema: z.ZodObject<{
|
|
751
751
|
cooperativeName: z.ZodString;
|
|
752
752
|
domain: z.ZodString;
|
|
753
|
-
serverIp: z.ZodOptional<z.ZodString>;
|
|
754
753
|
provisionedAt: z.ZodString;
|
|
755
754
|
}, "strip", z.ZodTypeAny, {
|
|
756
755
|
cooperativeName: string;
|
|
757
756
|
domain: string;
|
|
758
757
|
provisionedAt: string;
|
|
759
|
-
serverIp?: string | undefined;
|
|
760
758
|
}, {
|
|
761
759
|
cooperativeName: string;
|
|
762
760
|
domain: string;
|
|
763
761
|
provisionedAt: string;
|
|
764
|
-
serverIp?: string | undefined;
|
|
765
762
|
}>;
|
|
766
|
-
type IPayload = z.infer<typeof
|
|
763
|
+
type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
|
|
767
764
|
interface IWorkflow extends BaseWorkflowPayload, IPayload {
|
|
768
765
|
}
|
|
769
|
-
declare const name = "\
|
|
766
|
+
declare const name = "\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442";
|
|
770
767
|
declare const id: string;
|
|
771
768
|
declare const workflow: WorkflowDefinition<IWorkflow>;
|
|
772
769
|
|
|
@@ -774,10 +771,10 @@ type index$1_IPayload = IPayload;
|
|
|
774
771
|
type index$1_IWorkflow = IWorkflow;
|
|
775
772
|
declare const index$1_id: typeof id;
|
|
776
773
|
declare const index$1_name: typeof name;
|
|
777
|
-
declare const index$
|
|
774
|
+
declare const index$1_serviceProvisionedPayloadSchema: typeof serviceProvisionedPayloadSchema;
|
|
778
775
|
declare const index$1_workflow: typeof workflow;
|
|
779
776
|
declare namespace index$1 {
|
|
780
|
-
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$
|
|
777
|
+
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$1_serviceProvisionedPayloadSchema as serviceProvisionedPayloadSchema, index$1_workflow as workflow };
|
|
781
778
|
}
|
|
782
779
|
|
|
783
780
|
declare const allWorkflows: WorkflowDefinition[];
|
package/dist/index.d.mts
CHANGED
|
@@ -747,26 +747,23 @@ declare namespace index$2 {
|
|
|
747
747
|
export { type IPayload$1 as IPayload, type IWorkflow$1 as IWorkflow, index$2_emailVerificationPayloadSchema as emailVerificationPayloadSchema, id$1 as id, name$1 as name, workflow$1 as workflow };
|
|
748
748
|
}
|
|
749
749
|
|
|
750
|
-
declare const
|
|
750
|
+
declare const serviceProvisionedPayloadSchema: z.ZodObject<{
|
|
751
751
|
cooperativeName: z.ZodString;
|
|
752
752
|
domain: z.ZodString;
|
|
753
|
-
serverIp: z.ZodOptional<z.ZodString>;
|
|
754
753
|
provisionedAt: z.ZodString;
|
|
755
754
|
}, "strip", z.ZodTypeAny, {
|
|
756
755
|
cooperativeName: string;
|
|
757
756
|
domain: string;
|
|
758
757
|
provisionedAt: string;
|
|
759
|
-
serverIp?: string | undefined;
|
|
760
758
|
}, {
|
|
761
759
|
cooperativeName: string;
|
|
762
760
|
domain: string;
|
|
763
761
|
provisionedAt: string;
|
|
764
|
-
serverIp?: string | undefined;
|
|
765
762
|
}>;
|
|
766
|
-
type IPayload = z.infer<typeof
|
|
763
|
+
type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
|
|
767
764
|
interface IWorkflow extends BaseWorkflowPayload, IPayload {
|
|
768
765
|
}
|
|
769
|
-
declare const name = "\
|
|
766
|
+
declare const name = "\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442";
|
|
770
767
|
declare const id: string;
|
|
771
768
|
declare const workflow: WorkflowDefinition<IWorkflow>;
|
|
772
769
|
|
|
@@ -774,10 +771,10 @@ type index$1_IPayload = IPayload;
|
|
|
774
771
|
type index$1_IWorkflow = IWorkflow;
|
|
775
772
|
declare const index$1_id: typeof id;
|
|
776
773
|
declare const index$1_name: typeof name;
|
|
777
|
-
declare const index$
|
|
774
|
+
declare const index$1_serviceProvisionedPayloadSchema: typeof serviceProvisionedPayloadSchema;
|
|
778
775
|
declare const index$1_workflow: typeof workflow;
|
|
779
776
|
declare namespace index$1 {
|
|
780
|
-
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$
|
|
777
|
+
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$1_serviceProvisionedPayloadSchema as serviceProvisionedPayloadSchema, index$1_workflow as workflow };
|
|
781
778
|
}
|
|
782
779
|
|
|
783
780
|
declare const allWorkflows: WorkflowDefinition[];
|
package/dist/index.d.ts
CHANGED
|
@@ -747,26 +747,23 @@ declare namespace index$2 {
|
|
|
747
747
|
export { type IPayload$1 as IPayload, type IWorkflow$1 as IWorkflow, index$2_emailVerificationPayloadSchema as emailVerificationPayloadSchema, id$1 as id, name$1 as name, workflow$1 as workflow };
|
|
748
748
|
}
|
|
749
749
|
|
|
750
|
-
declare const
|
|
750
|
+
declare const serviceProvisionedPayloadSchema: z.ZodObject<{
|
|
751
751
|
cooperativeName: z.ZodString;
|
|
752
752
|
domain: z.ZodString;
|
|
753
|
-
serverIp: z.ZodOptional<z.ZodString>;
|
|
754
753
|
provisionedAt: z.ZodString;
|
|
755
754
|
}, "strip", z.ZodTypeAny, {
|
|
756
755
|
cooperativeName: string;
|
|
757
756
|
domain: string;
|
|
758
757
|
provisionedAt: string;
|
|
759
|
-
serverIp?: string | undefined;
|
|
760
758
|
}, {
|
|
761
759
|
cooperativeName: string;
|
|
762
760
|
domain: string;
|
|
763
761
|
provisionedAt: string;
|
|
764
|
-
serverIp?: string | undefined;
|
|
765
762
|
}>;
|
|
766
|
-
type IPayload = z.infer<typeof
|
|
763
|
+
type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
|
|
767
764
|
interface IWorkflow extends BaseWorkflowPayload, IPayload {
|
|
768
765
|
}
|
|
769
|
-
declare const name = "\
|
|
766
|
+
declare const name = "\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442";
|
|
770
767
|
declare const id: string;
|
|
771
768
|
declare const workflow: WorkflowDefinition<IWorkflow>;
|
|
772
769
|
|
|
@@ -774,10 +771,10 @@ type index$1_IPayload = IPayload;
|
|
|
774
771
|
type index$1_IWorkflow = IWorkflow;
|
|
775
772
|
declare const index$1_id: typeof id;
|
|
776
773
|
declare const index$1_name: typeof name;
|
|
777
|
-
declare const index$
|
|
774
|
+
declare const index$1_serviceProvisionedPayloadSchema: typeof serviceProvisionedPayloadSchema;
|
|
778
775
|
declare const index$1_workflow: typeof workflow;
|
|
779
776
|
declare namespace index$1 {
|
|
780
|
-
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$
|
|
777
|
+
export { type index$1_IPayload as IPayload, type index$1_IWorkflow as IWorkflow, index$1_id as id, index$1_name as name, index$1_serviceProvisionedPayloadSchema as serviceProvisionedPayloadSchema, index$1_workflow as workflow };
|
|
781
778
|
}
|
|
782
779
|
|
|
783
780
|
declare const allWorkflows: WorkflowDefinition[];
|
package/dist/index.mjs
CHANGED
|
@@ -2926,29 +2926,28 @@ const index$2 = {
|
|
|
2926
2926
|
workflow: workflow$1
|
|
2927
2927
|
};
|
|
2928
2928
|
|
|
2929
|
-
const
|
|
2929
|
+
const serviceProvisionedPayloadSchema = z.object({
|
|
2930
2930
|
cooperativeName: z.string(),
|
|
2931
2931
|
domain: z.string(),
|
|
2932
|
-
serverIp: z.string().optional(),
|
|
2933
2932
|
provisionedAt: z.string()
|
|
2934
2933
|
});
|
|
2935
|
-
const name = "\
|
|
2934
|
+
const name = "\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442";
|
|
2936
2935
|
const id = slugify(name);
|
|
2937
|
-
const workflow = WorkflowBuilder.create().name(name).workflowId(id).description("\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E\
|
|
2936
|
+
const workflow = WorkflowBuilder.create().name(name).workflowId(id).description("\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E\u043C \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u0446\u0438\u0444\u0440\u043E\u0432\u043E\u0433\u043E \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430").payloadSchema(serviceProvisionedPayloadSchema).tags(["digital", "cooperative", "deployment", "provisioning", "provider"]).addSteps([
|
|
2938
2937
|
createEmailStep(
|
|
2939
|
-
"
|
|
2940
|
-
"\
|
|
2941
|
-
'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!<br><br>\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0435\u043C \u0432\u0430\u0441 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \
|
|
2938
|
+
"digital-cooperative-deployed-email",
|
|
2939
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 - {{payload.cooperativeName}}",
|
|
2940
|
+
'\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!<br><br>\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u044F\u0435\u043C \u0432\u0430\u0441 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0446\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 <strong>{{payload.cooperativeName}}</strong> \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0440\u0430\u0431\u043E\u0442\u0435.<br><br><strong>\u0414\u0435\u0442\u0430\u043B\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F:</strong><br>- \u0414\u043E\u043C\u0435\u043D: {{payload.domain}}<br>- \u0414\u0430\u0442\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F: {{payload.provisionedAt}}<br><br>\u0412\u0430\u0448 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0442\u0435\u043F\u0435\u0440\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E \u0430\u0434\u0440\u0435\u0441\u0443: <a href="https://{{payload.domain}}">https://{{payload.domain}}</a><br><br>\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443.<br><br>\u0421 \u0443\u0432\u0430\u0436\u0435\u043D\u0438\u0435\u043C,<br>\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0438'
|
|
2942
2941
|
),
|
|
2943
2942
|
createInAppStep(
|
|
2944
|
-
"
|
|
2945
|
-
"\
|
|
2946
|
-
"\
|
|
2943
|
+
"digital-cooperative-deployed-notification",
|
|
2944
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442",
|
|
2945
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 {{payload.cooperativeName}} \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 https://{{payload.domain}}, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443."
|
|
2947
2946
|
),
|
|
2948
2947
|
createPushStep(
|
|
2949
|
-
"
|
|
2950
|
-
"\
|
|
2951
|
-
"\
|
|
2948
|
+
"digital-cooperative-deployed-push",
|
|
2949
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442 - {{payload.cooperativeName}}",
|
|
2950
|
+
"\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0439 \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D! \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443."
|
|
2952
2951
|
)
|
|
2953
2952
|
]).build();
|
|
2954
2953
|
|
|
@@ -2956,7 +2955,7 @@ const index$1 = {
|
|
|
2956
2955
|
__proto__: null,
|
|
2957
2956
|
id: id,
|
|
2958
2957
|
name: name,
|
|
2959
|
-
|
|
2958
|
+
serviceProvisionedPayloadSchema: serviceProvisionedPayloadSchema,
|
|
2960
2959
|
workflow: workflow
|
|
2961
2960
|
};
|
|
2962
2961
|
|
package/package.json
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coopenomics/notifications",
|
|
3
|
-
"version": "2025.11.
|
|
3
|
+
"version": "2025.11.9-alpha-2",
|
|
4
4
|
"description": "Typesafe notification workflows library for Novu",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
7
|
"main": "dist/index.cjs",
|
|
8
8
|
"module": "dist/index.mjs",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
10
13
|
"typesVersions": {
|
|
11
14
|
"*": {
|
|
12
15
|
"*": [
|
|
@@ -47,5 +50,6 @@
|
|
|
47
50
|
"import": "./dist/index.mjs",
|
|
48
51
|
"require": "./dist/index.cjs"
|
|
49
52
|
}
|
|
50
|
-
}
|
|
53
|
+
},
|
|
54
|
+
"gitHead": "5acd7ae2c437ce54f356113b5474700114f586ab"
|
|
51
55
|
}
|
|
@@ -5,41 +5,40 @@ import { createEmailStep, createInAppStep, createPushStep } from '../../base/def
|
|
|
5
5
|
import { BaseWorkflowPayload } from '../../types';
|
|
6
6
|
import { slugify } from '../../utils';
|
|
7
7
|
|
|
8
|
-
// Схема для
|
|
9
|
-
export const
|
|
8
|
+
// Схема для service-provisioned воркфлоу
|
|
9
|
+
export const serviceProvisionedPayloadSchema = z.object({
|
|
10
10
|
cooperativeName: z.string(),
|
|
11
11
|
domain: z.string(),
|
|
12
|
-
serverIp: z.string().optional(),
|
|
13
12
|
provisionedAt: z.string(),
|
|
14
13
|
});
|
|
15
|
-
export type IPayload = z.infer<typeof
|
|
14
|
+
export type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
|
|
16
15
|
export interface IWorkflow extends BaseWorkflowPayload, IPayload {}
|
|
17
16
|
|
|
18
|
-
export const name = '
|
|
17
|
+
export const name = 'Цифровой кооператив развернут';
|
|
19
18
|
export const id = slugify(name);
|
|
20
19
|
|
|
21
20
|
export const workflow: WorkflowDefinition<IWorkflow> = WorkflowBuilder
|
|
22
21
|
.create<IWorkflow>()
|
|
23
22
|
.name(name)
|
|
24
23
|
.workflowId(id)
|
|
25
|
-
.description('Уведомления о
|
|
26
|
-
.payloadSchema(
|
|
27
|
-
.tags(['
|
|
24
|
+
.description('Уведомления о успешном развертывании цифрового кооператива')
|
|
25
|
+
.payloadSchema(serviceProvisionedPayloadSchema)
|
|
26
|
+
.tags(['digital', 'cooperative', 'deployment', 'provisioning', 'provider'])
|
|
28
27
|
.addSteps([
|
|
29
28
|
createEmailStep(
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'Здравствуйте!<br><br>Уведомляем вас о том, что
|
|
29
|
+
'digital-cooperative-deployed-email',
|
|
30
|
+
'Цифровой кооператив развернут - {{payload.cooperativeName}}',
|
|
31
|
+
'Здравствуйте!<br><br>Уведомляем вас о том, что цифровой кооператив <strong>{{payload.cooperativeName}}</strong> был успешно развернут и готов к работе.<br><br><strong>Детали развертывания:</strong><br>- Домен: {{payload.domain}}<br>- Дата развертывания: {{payload.provisionedAt}}<br><br>Ваш кооператив теперь доступен по адресу: <a href="https://{{payload.domain}}">https://{{payload.domain}}</a><br><br>Перейдите по ссылке, чтобы завершить установку.<br><br>С уважением,<br>Команда технической поддержки'
|
|
33
32
|
),
|
|
34
33
|
createInAppStep(
|
|
35
|
-
'
|
|
36
|
-
'
|
|
37
|
-
'
|
|
34
|
+
'digital-cooperative-deployed-notification',
|
|
35
|
+
'Цифровой кооператив развернут',
|
|
36
|
+
'Цифровой кооператив {{payload.cooperativeName}} успешно развернут. Перейдите по ссылке https://{{payload.domain}}, чтобы завершить установку.'
|
|
38
37
|
),
|
|
39
38
|
createPushStep(
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
'
|
|
39
|
+
'digital-cooperative-deployed-push',
|
|
40
|
+
'Цифровой кооператив развернут - {{payload.cooperativeName}}',
|
|
41
|
+
'Цифровой кооператив активирован! Перейдите по ссылке, чтобы завершить установку.'
|
|
43
42
|
),
|
|
44
43
|
])
|
|
45
44
|
.build();
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Types } from '../index';
|
|
2
|
-
export interface NovuSyncConfig {
|
|
3
|
-
apiKey: string;
|
|
4
|
-
apiUrl: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class NovuSyncService {
|
|
7
|
-
private readonly client;
|
|
8
|
-
private readonly config;
|
|
9
|
-
constructor(config: NovuSyncConfig);
|
|
10
|
-
/**
|
|
11
|
-
* Получить информацию о воркфлоу
|
|
12
|
-
*/
|
|
13
|
-
getWorkflow(workflowId: string): Promise<any>;
|
|
14
|
-
/**
|
|
15
|
-
* Создать новый воркфлоу
|
|
16
|
-
*/
|
|
17
|
-
createWorkflow(data: Types.NovuWorkflowData): Promise<any>;
|
|
18
|
-
/**
|
|
19
|
-
* Обновить существующий воркфлоу
|
|
20
|
-
*/
|
|
21
|
-
updateWorkflow(workflowId: string, data: Types.NovuWorkflowData): Promise<any>;
|
|
22
|
-
/**
|
|
23
|
-
* Создать или обновить воркфлоу (upsert)
|
|
24
|
-
*/
|
|
25
|
-
upsertWorkflow(workflow: Types.WorkflowDefinition): Promise<any>;
|
|
26
|
-
/**
|
|
27
|
-
* Создать или обновить все воркфлоу
|
|
28
|
-
*/
|
|
29
|
-
upsertAllWorkflows(): Promise<void>;
|
|
30
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import { allWorkflows } from '../index';
|
|
3
|
-
export class NovuSyncService {
|
|
4
|
-
constructor(config) {
|
|
5
|
-
this.config = config;
|
|
6
|
-
if (!this.config.apiKey) {
|
|
7
|
-
throw new Error('NOVU_API_KEY is required');
|
|
8
|
-
}
|
|
9
|
-
if (!this.config.apiUrl) {
|
|
10
|
-
throw new Error('NOVU_API_URL is required');
|
|
11
|
-
}
|
|
12
|
-
this.client = axios.create({
|
|
13
|
-
baseURL: this.config.apiUrl,
|
|
14
|
-
headers: {
|
|
15
|
-
'Authorization': `ApiKey ${this.config.apiKey}`,
|
|
16
|
-
'Content-Type': 'application/json',
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Получить информацию о воркфлоу
|
|
22
|
-
*/
|
|
23
|
-
async getWorkflow(workflowId) {
|
|
24
|
-
try {
|
|
25
|
-
const response = await this.client.get(`/v2/workflows/${workflowId}`);
|
|
26
|
-
return response.data;
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
if (error.response?.status === 404) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
throw error;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Создать новый воркфлоу
|
|
37
|
-
*/
|
|
38
|
-
async createWorkflow(data) {
|
|
39
|
-
try {
|
|
40
|
-
// Для создания НЕ передаем origin (как в testFramework2.ts)
|
|
41
|
-
const createData = { ...data };
|
|
42
|
-
delete createData.origin;
|
|
43
|
-
const response = await this.client.post('/v2/workflows', createData);
|
|
44
|
-
return response.data;
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error(`Ошибка создания воркфлоу ${data.workflowId}:`, error.response?.data || error.message);
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Обновить существующий воркфлоу
|
|
53
|
-
*/
|
|
54
|
-
async updateWorkflow(workflowId, data) {
|
|
55
|
-
try {
|
|
56
|
-
// Для обновления ВСЕГДА передаем origin: "external" (как в testFramework2.ts)
|
|
57
|
-
const updateData = { ...data, origin: 'novu-cloud' };
|
|
58
|
-
const response = await this.client.put(`/v2/workflows/${workflowId}`, updateData);
|
|
59
|
-
// console.log('response', response.data);
|
|
60
|
-
return response.data;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
console.error(`Ошибка обновления воркфлоу ${workflowId}:`, error.response?.data || error.message);
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Создать или обновить воркфлоу (upsert)
|
|
69
|
-
*/
|
|
70
|
-
async upsertWorkflow(workflow) {
|
|
71
|
-
try {
|
|
72
|
-
console.log(`Проверяем воркфлоу: ${workflow.workflowId}`);
|
|
73
|
-
const existingWorkflow = await this.getWorkflow(workflow.workflowId);
|
|
74
|
-
const novuData = {
|
|
75
|
-
name: workflow.name,
|
|
76
|
-
workflowId: workflow.workflowId,
|
|
77
|
-
description: workflow.description,
|
|
78
|
-
payloadSchema: workflow.payloadSchema,
|
|
79
|
-
steps: workflow.steps,
|
|
80
|
-
preferences: workflow.preferences,
|
|
81
|
-
tags: workflow.tags,
|
|
82
|
-
};
|
|
83
|
-
if (existingWorkflow) {
|
|
84
|
-
console.log(`Обновляем воркфлоу: ${workflow.workflowId}`);
|
|
85
|
-
return await this.updateWorkflow(workflow.workflowId, novuData);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
console.log(`Создаём воркфлоу: ${workflow.workflowId}`);
|
|
89
|
-
return await this.createWorkflow(novuData);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
console.error(`Ошибка upsert воркфлоу ${workflow.workflowId}:`, error.message);
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Создать или обновить все воркфлоу
|
|
99
|
-
*/
|
|
100
|
-
async upsertAllWorkflows() {
|
|
101
|
-
console.log(`Начинаем upsert ${allWorkflows.length} воркфлоу...`);
|
|
102
|
-
const errors = [];
|
|
103
|
-
let successCount = 0;
|
|
104
|
-
for (const workflow of allWorkflows) {
|
|
105
|
-
try {
|
|
106
|
-
await this.upsertWorkflow(workflow);
|
|
107
|
-
console.log(`✓ Воркфлоу ${workflow.workflowId} успешно обработан`);
|
|
108
|
-
successCount++;
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
const errorMessage = `Ошибка обработки воркфлоу ${workflow.workflowId}: ${error.message}`;
|
|
112
|
-
console.error(`✗ ${errorMessage}`);
|
|
113
|
-
errors.push(errorMessage);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
console.log(`\nРезультат синхронизации:`);
|
|
117
|
-
console.log(`✅ Успешно: ${successCount}`);
|
|
118
|
-
console.log(`❌ Ошибки: ${errors.length}`);
|
|
119
|
-
if (errors.length > 0) {
|
|
120
|
-
console.log(`\nСписок ошибок:`);
|
|
121
|
-
errors.forEach((error, index) => {
|
|
122
|
-
console.log(`${index + 1}. ${error}`);
|
|
123
|
-
});
|
|
124
|
-
throw new Error(`Синхронизация завершилась с ошибками: ${errors.length} из ${allWorkflows.length} воркфлоу`);
|
|
125
|
-
}
|
|
126
|
-
console.log('✅ Все воркфлоу синхронизированы успешно');
|
|
127
|
-
}
|
|
128
|
-
}
|
package/dist/sync/sync-runner.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { NovuSyncService } from './novu-sync.service';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
import { join, dirname } from 'path';
|
|
5
|
-
import { watch } from 'chokidar';
|
|
6
|
-
import dotenv from 'dotenv';
|
|
7
|
-
import { fileURLToPath } from 'url';
|
|
8
|
-
dotenv.config();
|
|
9
|
-
// Конфигурация из переменных окружения
|
|
10
|
-
const config = {
|
|
11
|
-
apiKey: process.env.NOVU_API_KEY || '',
|
|
12
|
-
apiUrl: process.env.NOVU_API_URL || '',
|
|
13
|
-
};
|
|
14
|
-
async function runSync() {
|
|
15
|
-
console.log('🔄 Запуск синхронизации воркфлоу...');
|
|
16
|
-
try {
|
|
17
|
-
// Проверяем конфигурацию
|
|
18
|
-
if (!config.apiKey) {
|
|
19
|
-
throw new Error('❌ NOVU_API_KEY не установлен в переменных окружения');
|
|
20
|
-
}
|
|
21
|
-
if (!config.apiUrl) {
|
|
22
|
-
throw new Error('❌ NOVU_API_URL не установлен в переменных окружения');
|
|
23
|
-
}
|
|
24
|
-
const syncService = new NovuSyncService(config);
|
|
25
|
-
await syncService.upsertAllWorkflows();
|
|
26
|
-
console.log('✅ Синхронизация завершена успешно');
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
console.error('❌ Ошибка синхронизации:', error.message);
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async function main() {
|
|
35
|
-
const args = process.argv.slice(2);
|
|
36
|
-
const isDev = args.includes('--dev') || process.env.NODE_ENV === 'development';
|
|
37
|
-
if (isDev) {
|
|
38
|
-
console.log('📡 Режим разработки: отслеживаем изменения...');
|
|
39
|
-
// Запускаем синхронизацию сразу
|
|
40
|
-
const initialSyncSuccess = await runSync();
|
|
41
|
-
if (!initialSyncSuccess) {
|
|
42
|
-
console.error('❌ Первоначальная синхронизация не удалась');
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
// Отслеживаем изменения в файлах воркфлоу и типов
|
|
46
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
47
|
-
const workflowsPath = join(__dirname, '../workflows');
|
|
48
|
-
const typesPath = join(__dirname, '../types');
|
|
49
|
-
const watchPaths = [];
|
|
50
|
-
if (existsSync(workflowsPath)) {
|
|
51
|
-
watchPaths.push(workflowsPath);
|
|
52
|
-
}
|
|
53
|
-
if (existsSync(typesPath)) {
|
|
54
|
-
watchPaths.push(typesPath);
|
|
55
|
-
}
|
|
56
|
-
if (watchPaths.length > 0) {
|
|
57
|
-
console.log('👀 Отслеживаем изменения в:', watchPaths.join(', '));
|
|
58
|
-
let syncTimeout = null;
|
|
59
|
-
const watcher = watch(watchPaths, {
|
|
60
|
-
ignored: /node_modules/,
|
|
61
|
-
persistent: true,
|
|
62
|
-
ignoreInitial: true,
|
|
63
|
-
});
|
|
64
|
-
watcher.on('change', (path) => {
|
|
65
|
-
console.log(`📝 Изменен файл: ${path}`);
|
|
66
|
-
// Дебаунс для избежания множественных запусков
|
|
67
|
-
if (syncTimeout) {
|
|
68
|
-
clearTimeout(syncTimeout);
|
|
69
|
-
}
|
|
70
|
-
syncTimeout = setTimeout(async () => {
|
|
71
|
-
console.log('⏰ Запускаем синхронизацию...');
|
|
72
|
-
const success = await runSync();
|
|
73
|
-
if (!success) {
|
|
74
|
-
console.error('⚠️ Синхронизация не удалась, но продолжаем отслеживание...');
|
|
75
|
-
}
|
|
76
|
-
}, 1000);
|
|
77
|
-
});
|
|
78
|
-
watcher.on('add', (path) => {
|
|
79
|
-
console.log(`➕ Добавлен файл: ${path}`);
|
|
80
|
-
if (syncTimeout) {
|
|
81
|
-
clearTimeout(syncTimeout);
|
|
82
|
-
}
|
|
83
|
-
syncTimeout = setTimeout(async () => {
|
|
84
|
-
console.log('⏰ Запускаем синхронизацию...');
|
|
85
|
-
const success = await runSync();
|
|
86
|
-
if (!success) {
|
|
87
|
-
console.error('⚠️ Синхронизация не удалась, но продолжаем отслеживание...');
|
|
88
|
-
}
|
|
89
|
-
}, 1000);
|
|
90
|
-
});
|
|
91
|
-
watcher.on('unlink', (path) => {
|
|
92
|
-
console.log(`➖ Удален файл: ${path}`);
|
|
93
|
-
if (syncTimeout) {
|
|
94
|
-
clearTimeout(syncTimeout);
|
|
95
|
-
}
|
|
96
|
-
syncTimeout = setTimeout(async () => {
|
|
97
|
-
console.log('⏰ Запускаем синхронизацию...');
|
|
98
|
-
const success = await runSync();
|
|
99
|
-
if (!success) {
|
|
100
|
-
console.error('⚠️ Синхронизация не удалась, но продолжаем отслеживание...');
|
|
101
|
-
}
|
|
102
|
-
}, 1000);
|
|
103
|
-
});
|
|
104
|
-
console.log('💡 Нажмите Ctrl+C для выхода');
|
|
105
|
-
// Держим процесс живым
|
|
106
|
-
process.on('SIGINT', () => {
|
|
107
|
-
console.log('\n👋 Выход из режима разработки');
|
|
108
|
-
watcher.close();
|
|
109
|
-
process.exit(0);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
console.log('⚠️ Папки для отслеживания не найдены');
|
|
114
|
-
process.exit(1);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
// Production режим - запускаем один раз
|
|
119
|
-
const success = await runSync();
|
|
120
|
-
process.exit(success ? 0 : 1);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// Проверяем, запущен ли файл как основной модуль
|
|
124
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
125
|
-
main().catch((error) => {
|
|
126
|
-
console.error('❌ Критическая ошибка:', error);
|
|
127
|
-
process.exit(1);
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
export { runSync, NovuSyncService };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { UserRole } from '../workflows/role-based-workflows';
|
|
2
|
-
export interface UserWithRole {
|
|
3
|
-
isChairman: boolean;
|
|
4
|
-
isMember: boolean;
|
|
5
|
-
isUser?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export declare function getUserRole(user: UserWithRole): UserRole;
|
|
8
|
-
export declare function isAuthenticatedUser(user: UserWithRole): boolean;
|
package/dist/utils/role-utils.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getUserRole = getUserRole;
|
|
4
|
-
exports.isAuthenticatedUser = isAuthenticatedUser;
|
|
5
|
-
// Функция для определения роли пользователя
|
|
6
|
-
function getUserRole(user) {
|
|
7
|
-
if (user.isChairman) {
|
|
8
|
-
return 'chairman';
|
|
9
|
-
}
|
|
10
|
-
if (user.isMember) {
|
|
11
|
-
return 'member';
|
|
12
|
-
}
|
|
13
|
-
return 'user';
|
|
14
|
-
}
|
|
15
|
-
// Функция для проверки является ли пользователь авторизованным
|
|
16
|
-
function isAuthenticatedUser(user) {
|
|
17
|
-
return user.isChairman || user.isMember || Boolean(user.isUser);
|
|
18
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
2
|
-
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
3
|
-
import { incomingTransferPayloadSchema } from './types';
|
|
4
|
-
export const incomingTransferWorkflow = WorkflowBuilder
|
|
5
|
-
.create()
|
|
6
|
-
.name('Входящий перевод')
|
|
7
|
-
.workflowId('vkhodyashchiy-perevod')
|
|
8
|
-
.description('Уведомление о получении входящего перевода')
|
|
9
|
-
.payloadSchema(incomingTransferPayloadSchema)
|
|
10
|
-
.tags(['user', 'chairman', 'member']) // Доступно для всех ролей
|
|
11
|
-
.addSteps([
|
|
12
|
-
createEmailStep('incoming-transfer-email', 'Получен входящий перевод на сумму {{payload.quantity}}', 'Уведомляем вас о получении входящего перевода.<br><br><strong>Сумма перевода: {{payload.quantity}}</strong><br><br>Перевод успешно зачислен на ваш счет.'),
|
|
13
|
-
createInAppStep('incoming-transfer-notification', 'Входящий перевод', 'Получен входящий перевод на сумму {{payload.quantity}}'),
|
|
14
|
-
createPushStep('incoming-transfer-push', 'Входящий перевод', 'Получен перевод на сумму {{payload.quantity}}'),
|
|
15
|
-
])
|
|
16
|
-
.build();
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { BaseWorkflowPayload } from '../../types';
|
|
3
|
-
export declare const incomingTransferPayloadSchema: z.ZodObject<{
|
|
4
|
-
quantity: z.ZodString;
|
|
5
|
-
}, "strip", z.ZodTypeAny, {
|
|
6
|
-
quantity: string;
|
|
7
|
-
}, {
|
|
8
|
-
quantity: string;
|
|
9
|
-
}>;
|
|
10
|
-
export type IncomingTransferPayload = z.infer<typeof incomingTransferPayloadSchema>;
|
|
11
|
-
export interface IncomingTransferWorkflowPayload extends BaseWorkflowPayload, IncomingTransferPayload {
|
|
12
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { WorkflowBuilder } from '../../base/workflow-builder';
|
|
2
|
-
import { createEmailStep, createInAppStep, createPushStep } from '../../base/defaults';
|
|
3
|
-
import { newAgendaItemPayloadSchema } from './types';
|
|
4
|
-
export const newAgendaItemWorkflow = WorkflowBuilder
|
|
5
|
-
.create()
|
|
6
|
-
.name('Новый вопрос на повестке')
|
|
7
|
-
.workflowId('noviy-vopros-na-povestke')
|
|
8
|
-
.description('Уведомление о новом вопросе на повестке дня собрания совета для председателя и членов совета')
|
|
9
|
-
.payloadSchema(newAgendaItemPayloadSchema)
|
|
10
|
-
.tags(['chairman', 'member']) // Доступно только для председателя и членов
|
|
11
|
-
.addSteps([
|
|
12
|
-
createEmailStep('new-agenda-item-email', 'Новый вопрос на повестке: {{payload.itemTitle}}', 'Добавлен новый вопрос на повестку:<br><br><strong>{{payload.itemTitle}}</strong><br><br>{{payload.itemDescription}}<br><br>Автор: {{payload.authorName}} ({{payload.authorEmail}})<br><br>{{payload.meetingDate}}Дата заседания: {{payload.meetingDate}}<br>{{payload.meetingDate}}{{payload.meetingTitle}}Заседание: {{payload.meetingTitle}}{{payload.meetingTitle}}'),
|
|
13
|
-
createInAppStep('new-agenda-item-notification', 'Новый вопрос на повестке', 'Добавлен новый вопрос: {{payload.itemTitle}}<br>Автор: {{payload.authorName}}'),
|
|
14
|
-
createPushStep('new-agenda-item-push', 'Новый вопрос на повестке', 'Добавлен новый вопрос: {{payload.itemTitle}}'),
|
|
15
|
-
])
|
|
16
|
-
.build();
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { BaseWorkflowPayload } from '../../types';
|
|
3
|
-
export declare const newAgendaItemPayloadSchema: z.ZodObject<{
|
|
4
|
-
itemTitle: z.ZodString;
|
|
5
|
-
itemDescription: z.ZodString;
|
|
6
|
-
authorName: z.ZodString;
|
|
7
|
-
authorEmail: z.ZodString;
|
|
8
|
-
meetingDate: z.ZodOptional<z.ZodString>;
|
|
9
|
-
meetingTitle: z.ZodOptional<z.ZodString>;
|
|
10
|
-
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
itemTitle: string;
|
|
12
|
-
itemDescription: string;
|
|
13
|
-
authorName: string;
|
|
14
|
-
authorEmail: string;
|
|
15
|
-
meetingDate?: string | undefined;
|
|
16
|
-
meetingTitle?: string | undefined;
|
|
17
|
-
}, {
|
|
18
|
-
itemTitle: string;
|
|
19
|
-
itemDescription: string;
|
|
20
|
-
authorName: string;
|
|
21
|
-
authorEmail: string;
|
|
22
|
-
meetingDate?: string | undefined;
|
|
23
|
-
meetingTitle?: string | undefined;
|
|
24
|
-
}>;
|
|
25
|
-
export type NewAgendaItemPayload = z.infer<typeof newAgendaItemPayloadSchema>;
|
|
26
|
-
export interface NewAgendaItemWorkflowPayload extends BaseWorkflowPayload, NewAgendaItemPayload {
|
|
27
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
// Схема для new-agenda-item воркфлоу
|
|
3
|
-
export const newAgendaItemPayloadSchema = z.object({
|
|
4
|
-
itemTitle: z.string(),
|
|
5
|
-
itemDescription: z.string(),
|
|
6
|
-
authorName: z.string(),
|
|
7
|
-
authorEmail: z.string().email(),
|
|
8
|
-
meetingDate: z.string().optional(),
|
|
9
|
-
meetingTitle: z.string().optional(),
|
|
10
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { WorkflowDefinition } from '../types';
|
|
2
|
-
export type UserRole = 'chairman' | 'member' | 'user';
|
|
3
|
-
export interface RoleBasedWorkflow {
|
|
4
|
-
workflow: WorkflowDefinition;
|
|
5
|
-
roles: UserRole[];
|
|
6
|
-
displayName: string;
|
|
7
|
-
description: string;
|
|
8
|
-
}
|
|
9
|
-
export declare const roleBasedWorkflows: RoleBasedWorkflow[];
|
|
10
|
-
export declare function getWorkflowsByRole(role: UserRole): RoleBasedWorkflow[];
|
|
11
|
-
export declare function getWorkflowsWithRoleAccess(role: UserRole): Array<RoleBasedWorkflow & {
|
|
12
|
-
hasAccess: boolean;
|
|
13
|
-
}>;
|
|
14
|
-
export declare function hasWorkflowAccess(workflowId: string, role: UserRole): boolean;
|
|
15
|
-
export declare function getAvailableRoles(userRole: UserRole): UserRole[];
|
|
16
|
-
export declare function getRoleDisplayName(role: UserRole): string;
|
|
17
|
-
export declare const workflowsByRole: {
|
|
18
|
-
readonly chairman: RoleBasedWorkflow[];
|
|
19
|
-
readonly member: RoleBasedWorkflow[];
|
|
20
|
-
readonly user: RoleBasedWorkflow[];
|
|
21
|
-
};
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { welcomeWorkflow } from './welcome';
|
|
2
|
-
import { newAgendaItemWorkflow } from './new-agenda-item';
|
|
3
|
-
// Определение воркфлоу по ролям
|
|
4
|
-
export const roleBasedWorkflows = [
|
|
5
|
-
{
|
|
6
|
-
workflow: welcomeWorkflow,
|
|
7
|
-
roles: ['chairman', 'member', 'user'], // Все роли
|
|
8
|
-
displayName: 'Приветственные уведомления',
|
|
9
|
-
description: 'Уведомления при регистрации в системе',
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
workflow: newAgendaItemWorkflow,
|
|
13
|
-
roles: ['chairman', 'member'], // Только председатель и члены совета
|
|
14
|
-
displayName: 'Новый вопрос на повестке',
|
|
15
|
-
description: 'Уведомления о новых вопросах на повестке заседания',
|
|
16
|
-
},
|
|
17
|
-
];
|
|
18
|
-
// Функция для получения воркфлоу по роли пользователя
|
|
19
|
-
export function getWorkflowsByRole(role) {
|
|
20
|
-
return roleBasedWorkflows.filter(item => item.roles.includes(role));
|
|
21
|
-
}
|
|
22
|
-
// Функция для получения всех воркфлоу с указанием доступности для роли
|
|
23
|
-
export function getWorkflowsWithRoleAccess(role) {
|
|
24
|
-
return roleBasedWorkflows.map(item => ({
|
|
25
|
-
...item,
|
|
26
|
-
hasAccess: item.roles.includes(role),
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
// Функция для проверки доступа к воркфлоу
|
|
30
|
-
export function hasWorkflowAccess(workflowId, role) {
|
|
31
|
-
const workflowItem = roleBasedWorkflows.find(item => item.workflow.workflowId === workflowId);
|
|
32
|
-
return workflowItem ? workflowItem.roles.includes(role) : false;
|
|
33
|
-
}
|
|
34
|
-
// Функция для получения всех доступных ролей для пользователя
|
|
35
|
-
export function getAvailableRoles(userRole) {
|
|
36
|
-
switch (userRole) {
|
|
37
|
-
case 'chairman':
|
|
38
|
-
return ['user', 'member', 'chairman']; // Председатель видит все роли
|
|
39
|
-
case 'member':
|
|
40
|
-
return ['user', 'member']; // Член совета видит user и member
|
|
41
|
-
case 'user':
|
|
42
|
-
return ['user']; // Обычный пользователь видит только user
|
|
43
|
-
default:
|
|
44
|
-
return ['user'];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Функция для получения названия роли для отображения
|
|
48
|
-
export function getRoleDisplayName(role) {
|
|
49
|
-
switch (role) {
|
|
50
|
-
case 'chairman':
|
|
51
|
-
return 'Председатель';
|
|
52
|
-
case 'member':
|
|
53
|
-
return 'Член совета';
|
|
54
|
-
case 'user':
|
|
55
|
-
return 'Пользователь';
|
|
56
|
-
default:
|
|
57
|
-
return 'Пользователь';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Экспорт воркфлоу по ролям для удобного доступа
|
|
61
|
-
export const workflowsByRole = {
|
|
62
|
-
chairman: getWorkflowsByRole('chairman'),
|
|
63
|
-
member: getWorkflowsByRole('member'),
|
|
64
|
-
user: getWorkflowsByRole('user'),
|
|
65
|
-
};
|