@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 CHANGED
@@ -2928,29 +2928,28 @@ const index$2 = {
2928
2928
  workflow: workflow$1
2929
2929
  };
2930
2930
 
2931
- const serverProvisionedPayloadSchema = zod.z.object({
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 = "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D";
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\u0439 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430").payloadSchema(serverProvisionedPayloadSchema).tags(["server", "hosting", "provisioning", "provider"]).addSteps([
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
- "server-provisioned-email",
2942
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D - {{payload.cooperativeName}}",
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 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430 <strong>{{payload.cooperativeName}}</strong> \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0440\u0430\u0431\u043E\u0442\u0435.<br><br><strong>\u0414\u0435\u0442\u0430\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:</strong><br>- \u0414\u043E\u043C\u0435\u043D: {{payload.domain}}<br>{{#if payload.serverIp}}- IP \u0430\u0434\u0440\u0435\u0441: {{payload.serverIp}}<br>{{/if}}- \u0414\u0430\u0442\u0430 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F: {{payload.provisionedAt}}<br><br>\u0421\u0435\u0440\u0432\u0435\u0440 \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>\u0412 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0431\u0443\u0434\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430.<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'
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
- "server-provisioned-notification",
2947
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D",
2948
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430 {{payload.cooperativeName}} \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u041F\u041E."
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
- "server-provisioned-push",
2952
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D - {{payload.cooperativeName}}",
2953
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u044F!"
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
- serverProvisionedPayloadSchema: serverProvisionedPayloadSchema,
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 serverProvisionedPayloadSchema: z.ZodObject<{
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 serverProvisionedPayloadSchema>;
763
+ type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
767
764
  interface IWorkflow extends BaseWorkflowPayload, IPayload {
768
765
  }
769
- declare const name = "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D";
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$1_serverProvisionedPayloadSchema: typeof serverProvisionedPayloadSchema;
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$1_serverProvisionedPayloadSchema as serverProvisionedPayloadSchema, index$1_workflow as workflow };
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 serverProvisionedPayloadSchema: z.ZodObject<{
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 serverProvisionedPayloadSchema>;
763
+ type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
767
764
  interface IWorkflow extends BaseWorkflowPayload, IPayload {
768
765
  }
769
- declare const name = "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D";
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$1_serverProvisionedPayloadSchema: typeof serverProvisionedPayloadSchema;
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$1_serverProvisionedPayloadSchema as serverProvisionedPayloadSchema, index$1_workflow as workflow };
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 serverProvisionedPayloadSchema: z.ZodObject<{
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 serverProvisionedPayloadSchema>;
763
+ type IPayload = z.infer<typeof serviceProvisionedPayloadSchema>;
767
764
  interface IWorkflow extends BaseWorkflowPayload, IPayload {
768
765
  }
769
- declare const name = "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D";
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$1_serverProvisionedPayloadSchema: typeof serverProvisionedPayloadSchema;
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$1_serverProvisionedPayloadSchema as serverProvisionedPayloadSchema, index$1_workflow as workflow };
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 serverProvisionedPayloadSchema = z.object({
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 = "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D";
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\u0439 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430").payloadSchema(serverProvisionedPayloadSchema).tags(["server", "hosting", "provisioning", "provider"]).addSteps([
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
- "server-provisioned-email",
2940
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D - {{payload.cooperativeName}}",
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 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430 <strong>{{payload.cooperativeName}}</strong> \u0431\u044B\u043B \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0440\u0430\u0431\u043E\u0442\u0435.<br><br><strong>\u0414\u0435\u0442\u0430\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:</strong><br>- \u0414\u043E\u043C\u0435\u043D: {{payload.domain}}<br>{{#if payload.serverIp}}- IP \u0430\u0434\u0440\u0435\u0441: {{payload.serverIp}}<br>{{/if}}- \u0414\u0430\u0442\u0430 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F: {{payload.provisionedAt}}<br><br>\u0421\u0435\u0440\u0432\u0435\u0440 \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>\u0412 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0431\u0443\u0434\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430.<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'
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
- "server-provisioned-notification",
2945
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D",
2946
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u0430 {{payload.cooperativeName}} \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u041F\u041E."
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
- "server-provisioned-push",
2950
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D - {{payload.cooperativeName}}",
2951
- "\u0421\u0435\u0440\u0432\u0435\u0440 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0438 \u0433\u043E\u0442\u043E\u0432 \u043A \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u044F!"
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
- serverProvisionedPayloadSchema: serverProvisionedPayloadSchema,
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.8",
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
- // Схема для server-provisioned воркфлоу
9
- export const serverProvisionedPayloadSchema = z.object({
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 serverProvisionedPayloadSchema>;
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(serverProvisionedPayloadSchema)
27
- .tags(['server', 'hosting', 'provisioning', 'provider'])
24
+ .description('Уведомления о успешном развертывании цифрового кооператива')
25
+ .payloadSchema(serviceProvisionedPayloadSchema)
26
+ .tags(['digital', 'cooperative', 'deployment', 'provisioning', 'provider'])
28
27
  .addSteps([
29
28
  createEmailStep(
30
- 'server-provisioned-email',
31
- 'Сервер успешно предоставлен - {{payload.cooperativeName}}',
32
- 'Здравствуйте!<br><br>Уведомляем вас о том, что сервер для кооператива <strong>{{payload.cooperativeName}}</strong> был успешно предоставлен и готов к работе.<br><br><strong>Детали сервера:</strong><br>- Домен: {{payload.domain}}<br>{{#if payload.serverIp}}- IP адрес: {{payload.serverIp}}<br>{{/if}}- Дата предоставления: {{payload.provisionedAt}}<br><br>Сервер теперь доступен по адресу: <a href="https://{{payload.domain}}">https://{{payload.domain}}</a><br><br ближайшее время будет выполнена установка программного обеспечения кооператива.<br><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
- 'server-provisioned-notification',
36
- 'Сервер предоставлен',
37
- 'Сервер для кооператива {{payload.cooperativeName}} успешно предоставлен и готов к установке ПО.'
34
+ 'digital-cooperative-deployed-notification',
35
+ 'Цифровой кооператив развернут',
36
+ 'Цифровой кооператив {{payload.cooperativeName}} успешно развернут. Перейдите по ссылке https://{{payload.domain}}, чтобы завершить установку.'
38
37
  ),
39
38
  createPushStep(
40
- 'server-provisioned-push',
41
- 'Сервер предоставлен - {{payload.cooperativeName}}',
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
- }
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import { NovuSyncService } from './novu-sync.service';
3
- declare function runSync(): Promise<boolean>;
4
- export { runSync, NovuSyncService };
@@ -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;
@@ -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,3 +0,0 @@
1
- import { WorkflowDefinition } from '../../types';
2
- import { IncomingTransferWorkflowPayload } from './types';
3
- export declare const incomingTransferWorkflow: WorkflowDefinition<IncomingTransferWorkflowPayload>;
@@ -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,3 +0,0 @@
1
- export { incomingTransferWorkflow } from './incoming-transfer-workflow';
2
- export { incomingTransferPayloadSchema } from './types';
3
- export type { IncomingTransferPayload, IncomingTransferWorkflowPayload } from './types';
@@ -1,2 +0,0 @@
1
- export { incomingTransferWorkflow } from './incoming-transfer-workflow';
2
- export { incomingTransferPayloadSchema } from './types';
@@ -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,5 +0,0 @@
1
- import { z } from 'zod';
2
- // Схема для incoming-transfer воркфлоу
3
- export const incomingTransferPayloadSchema = z.object({
4
- quantity: z.string(),
5
- });
@@ -1,3 +0,0 @@
1
- export { newAgendaItemWorkflow } from './new-agenda-item-workflow';
2
- export { newAgendaItemPayloadSchema } from './types';
3
- export type { NewAgendaItemPayload, NewAgendaItemWorkflowPayload } from './types';
@@ -1,2 +0,0 @@
1
- export { newAgendaItemWorkflow } from './new-agenda-item-workflow';
2
- export { newAgendaItemPayloadSchema } from './types';
@@ -1,3 +0,0 @@
1
- import { WorkflowDefinition } from '../../types';
2
- import { NewAgendaItemWorkflowPayload } from './types';
3
- export declare const newAgendaItemWorkflow: WorkflowDefinition<NewAgendaItemWorkflowPayload>;
@@ -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
- };