@capillarytech/creatives-library 8.0.148 → 8.0.149

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.148",
4
+ "version": "8.0.149",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -11,7 +11,10 @@ import {
11
11
  MOBILE_PUSH,
12
12
  WHATSAPP,
13
13
  PUSH,
14
- ZALO
14
+ ZALO,
15
+ RCS,
16
+ LINE,
17
+ VIBER,
15
18
  } from "../../v2Containers/CreativesContainer/constants";
16
19
 
17
20
  describe("transformerUtils", () => {
@@ -819,6 +822,366 @@ describe("transformerUtils", () => {
819
822
  });
820
823
  });
821
824
 
825
+ describe("RCS payload transformation", () => {
826
+ it("should transform RCS data with all options", () => {
827
+ const mockData = {
828
+ channel: RCS,
829
+ messageBody: "test rcs message",
830
+ accountId: "rcs-account-123",
831
+ accountName: "RCS Official Account",
832
+ templateConfigs: {
833
+ id: "template-789",
834
+ name: "notification_template",
835
+ template: "https://example.com/rcs-template",
836
+ varMapped: {
837
+ customer: "Mike Johnson",
838
+ notification: "Important Update",
839
+ urgency: "HIGH"
840
+ }
841
+ }
842
+ };
843
+
844
+ const options = {
845
+ loyaltyMetaData: {
846
+ actionId: "action-123",
847
+ ouId: 456,
848
+ clientName: "TestClient",
849
+ module: "TestModule",
850
+ transformedMessageDetails: {
851
+ rcsDeliverySettings: {
852
+ sendDate: "2023-01-01",
853
+ priority: "URGENT"
854
+ }
855
+ }
856
+ }
857
+ };
858
+
859
+ const result = transformChannelPayload(mockData, options);
860
+
861
+ // Check base payload
862
+ expect(result.centralCommsPayload.sourceEntityId).toEqual("action-123");
863
+ expect(result.centralCommsPayload.ouId).toEqual(456);
864
+ expect(result.centralCommsPayload.clientName).toEqual("TestClient");
865
+ expect(result.centralCommsPayload.module).toEqual("TestModule");
866
+ // Check RCS-specific content
867
+ expect(result.centralCommsPayload.rcsMessageContent.messageBody).toEqual(
868
+ "test rcs message"
869
+ );
870
+ expect(result.centralCommsPayload.rcsMessageContent.accountId).toEqual(
871
+ "rcs-account-123"
872
+ );
873
+ expect(result.centralCommsPayload.rcsMessageContent.accountName).toEqual(
874
+ "RCS Official Account"
875
+ );
876
+ // Check template configs
877
+ expect(
878
+ result.centralCommsPayload.rcsMessageContent.templateConfigs.id
879
+ ).toEqual("template-789");
880
+ expect(
881
+ result.centralCommsPayload.rcsMessageContent.templateConfigs.name
882
+ ).toEqual("notification_template");
883
+ expect(
884
+ result.centralCommsPayload.rcsMessageContent.templateConfigs.template
885
+ ).toEqual("https://example.com/rcs-template");
886
+ expect(
887
+ result.centralCommsPayload.rcsMessageContent.templateConfigs.varMapped
888
+ ).toEqual({
889
+ customer: "Mike Johnson",
890
+ notification: "Important Update",
891
+ urgency: "HIGH"
892
+ });
893
+ // Check delivery settings
894
+ expect(result.centralCommsPayload.rcsDeliverySettings).toEqual({
895
+ sendDate: "2023-01-01",
896
+ priority: "URGENT"
897
+ });
898
+ });
899
+
900
+ it("should handle missing template configs", () => {
901
+ const mockData = {
902
+ channel: RCS,
903
+ messageBody: "test rcs message"
904
+ };
905
+
906
+ const result = transformChannelPayload(mockData);
907
+
908
+ expect(
909
+ result.centralCommsPayload.rcsMessageContent.templateConfigs
910
+ ).toEqual({});
911
+ });
912
+
913
+ it("should handle undefined rcsDeliverySettings", () => {
914
+ const mockData = {
915
+ channel: RCS,
916
+ messageBody: "test rcs message"
917
+ };
918
+
919
+ const options = {
920
+ loyaltyMetaData: {
921
+ transformedMessageDetails: {}
922
+ }
923
+ };
924
+
925
+ const result = transformChannelPayload(mockData, options);
926
+
927
+ expect(result.centralCommsPayload.rcsDeliverySettings).toEqual({});
928
+ });
929
+
930
+ it("should initialize default values when fields are missing", () => {
931
+ const mockData = {
932
+ channel: RCS
933
+ };
934
+
935
+ const result = transformChannelPayload(mockData);
936
+
937
+ expect(result.centralCommsPayload.rcsMessageContent.messageBody).toEqual(
938
+ ""
939
+ );
940
+ expect(result.centralCommsPayload.rcsMessageContent.accountId).toEqual(
941
+ ""
942
+ );
943
+ expect(result.centralCommsPayload.rcsMessageContent.accountName).toEqual(
944
+ ""
945
+ );
946
+ });
947
+ });
948
+
949
+ describe("LINE payload transformation", () => {
950
+ it("should transform LINE data correctly with minimal data", () => {
951
+ const mockData = {
952
+ channel: LINE,
953
+ messageBody: "test line message"
954
+ };
955
+
956
+ const result = transformChannelPayload(mockData);
957
+
958
+ expect(result.centralCommsPayload).toBeDefined();
959
+ expect(result.centralCommsPayload.channel).toEqual(LINE);
960
+ expect(result.centralCommsPayload.lineMessageContent.messageBody).toEqual(
961
+ "test line message"
962
+ );
963
+ expect(result.centralCommsPayload.clientName).toEqual("VENENO");
964
+ });
965
+
966
+ it("should transform LINE data with all options", () => {
967
+ const mockData = {
968
+ channel: LINE,
969
+ messageBody: "test line message",
970
+ accountId: 12345,
971
+ accountDetails: "LINE Official Account Details"
972
+ };
973
+
974
+ const options = {
975
+ loyaltyMetaData: {
976
+ actionId: "action-123",
977
+ ouId: 456,
978
+ clientName: "TestClient",
979
+ module: "TestModule",
980
+ transformedMessageDetails: {
981
+ lineDeliverySettings: {
982
+ sendDate: "2023-01-01",
983
+ priority: "NORMAL"
984
+ }
985
+ }
986
+ }
987
+ };
988
+
989
+ const result = transformChannelPayload(mockData, options);
990
+
991
+ // Check base payload
992
+ expect(result.centralCommsPayload.sourceEntityId).toEqual("action-123");
993
+ expect(result.centralCommsPayload.ouId).toEqual(456);
994
+ expect(result.centralCommsPayload.clientName).toEqual("TestClient");
995
+ expect(result.centralCommsPayload.module).toEqual("TestModule");
996
+
997
+ // Check LINE-specific content
998
+ expect(result.centralCommsPayload.lineMessageContent.messageBody).toEqual(
999
+ "test line message"
1000
+ );
1001
+ expect(result.centralCommsPayload.lineMessageContent.accountId).toEqual(12345);
1002
+ expect(result.centralCommsPayload.lineMessageContent.accountDetails).toEqual(
1003
+ "LINE Official Account Details"
1004
+ );
1005
+
1006
+ // Check delivery settings
1007
+ expect(result.centralCommsPayload.lineDeliverySettings).toEqual({
1008
+ sendDate: "2023-01-01",
1009
+ priority: "NORMAL"
1010
+ });
1011
+ });
1012
+
1013
+ it("should handle undefined lineDeliverySettings", () => {
1014
+ const mockData = {
1015
+ channel: LINE,
1016
+ messageBody: "test line message"
1017
+ };
1018
+
1019
+ const options = {
1020
+ loyaltyMetaData: {
1021
+ transformedMessageDetails: {}
1022
+ }
1023
+ };
1024
+
1025
+ const result = transformChannelPayload(mockData, options);
1026
+
1027
+ expect(result.centralCommsPayload.lineDeliverySettings).toEqual({});
1028
+ });
1029
+
1030
+ it("should initialize default values when fields are missing", () => {
1031
+ const mockData = {
1032
+ channel: LINE
1033
+ };
1034
+
1035
+ const result = transformChannelPayload(mockData);
1036
+
1037
+ expect(result.centralCommsPayload.lineMessageContent.messageBody).toEqual(
1038
+ ""
1039
+ );
1040
+ expect(result.centralCommsPayload.lineMessageContent.accountId).toEqual(0);
1041
+ expect(result.centralCommsPayload.lineMessageContent.accountDetails).toEqual(
1042
+ ""
1043
+ );
1044
+ });
1045
+
1046
+ it("should preserve all original LINE data properties", () => {
1047
+ const mockData = {
1048
+ channel: LINE,
1049
+ messageBody: "test line message",
1050
+ accountId: 12345,
1051
+ accountDetails: "LINE Official Account Details",
1052
+ customField1: "custom value 1",
1053
+ customField2: "custom value 2"
1054
+ };
1055
+
1056
+ const result = transformChannelPayload(mockData);
1057
+
1058
+ expect(result.centralCommsPayload.lineMessageContent.customField1).toEqual(
1059
+ "custom value 1"
1060
+ );
1061
+ expect(result.centralCommsPayload.lineMessageContent.customField2).toEqual(
1062
+ "custom value 2"
1063
+ );
1064
+ });
1065
+ });
1066
+
1067
+ describe("VIBER payload transformation", () => {
1068
+ it("should transform VIBER data correctly with minimal data", () => {
1069
+ const mockData = {
1070
+ channel: VIBER,
1071
+ messageBody: "test viber message"
1072
+ };
1073
+
1074
+ const result = transformChannelPayload(mockData);
1075
+
1076
+ expect(result.centralCommsPayload).toBeDefined();
1077
+ expect(result.centralCommsPayload.channel).toEqual(VIBER);
1078
+ expect(result.centralCommsPayload.viberMessageContent.messageBody).toEqual(
1079
+ "test viber message"
1080
+ );
1081
+ expect(result.centralCommsPayload.clientName).toEqual("VENENO");
1082
+ });
1083
+
1084
+ it("should transform VIBER data with all options", () => {
1085
+ const mockData = {
1086
+ channel: VIBER,
1087
+ messageBody: "test viber message",
1088
+ accountId: 67890,
1089
+ accountDetails: "VIBER Official Account Details"
1090
+ };
1091
+
1092
+ const options = {
1093
+ loyaltyMetaData: {
1094
+ actionId: "action-123",
1095
+ ouId: 456,
1096
+ clientName: "TestClient",
1097
+ module: "TestModule",
1098
+ transformedMessageDetails: {
1099
+ viberDeliverySettings: {
1100
+ sendDate: "2023-01-01",
1101
+ priority: "HIGH"
1102
+ }
1103
+ }
1104
+ }
1105
+ };
1106
+
1107
+ const result = transformChannelPayload(mockData, options);
1108
+
1109
+ // Check base payload
1110
+ expect(result.centralCommsPayload.sourceEntityId).toEqual("action-123");
1111
+ expect(result.centralCommsPayload.ouId).toEqual(456);
1112
+ expect(result.centralCommsPayload.clientName).toEqual("TestClient");
1113
+ expect(result.centralCommsPayload.module).toEqual("TestModule");
1114
+
1115
+ // Check VIBER-specific content
1116
+ expect(result.centralCommsPayload.viberMessageContent.messageBody).toEqual(
1117
+ "test viber message"
1118
+ );
1119
+ expect(result.centralCommsPayload.viberMessageContent.accountId).toEqual(67890);
1120
+ expect(result.centralCommsPayload.viberMessageContent.accountDetails).toEqual(
1121
+ "VIBER Official Account Details"
1122
+ );
1123
+
1124
+ // Check delivery settings
1125
+ expect(result.centralCommsPayload.viberDeliverySettings).toEqual({
1126
+ sendDate: "2023-01-01",
1127
+ priority: "HIGH"
1128
+ });
1129
+ });
1130
+
1131
+ it("should handle undefined viberDeliverySettings", () => {
1132
+ const mockData = {
1133
+ channel: VIBER,
1134
+ messageBody: "test viber message"
1135
+ };
1136
+
1137
+ const options = {
1138
+ loyaltyMetaData: {
1139
+ transformedMessageDetails: {}
1140
+ }
1141
+ };
1142
+
1143
+ const result = transformChannelPayload(mockData, options);
1144
+
1145
+ expect(result.centralCommsPayload.viberDeliverySettings).toEqual({});
1146
+ });
1147
+
1148
+ it("should initialize default values when fields are missing", () => {
1149
+ const mockData = {
1150
+ channel: VIBER
1151
+ };
1152
+
1153
+ const result = transformChannelPayload(mockData);
1154
+
1155
+ expect(result.centralCommsPayload.viberMessageContent.messageBody).toEqual(
1156
+ ""
1157
+ );
1158
+ expect(result.centralCommsPayload.viberMessageContent.accountId).toEqual(0);
1159
+ expect(result.centralCommsPayload.viberMessageContent.accountDetails).toEqual(
1160
+ ""
1161
+ );
1162
+ });
1163
+
1164
+ it("should preserve all original VIBER data properties", () => {
1165
+ const mockData = {
1166
+ channel: VIBER,
1167
+ messageBody: "test viber message",
1168
+ accountId: 67890,
1169
+ accountDetails: "VIBER Official Account Details",
1170
+ customField1: "custom value 1",
1171
+ customField2: "custom value 2"
1172
+ };
1173
+
1174
+ const result = transformChannelPayload(mockData);
1175
+
1176
+ expect(result.centralCommsPayload.viberMessageContent.customField1).toEqual(
1177
+ "custom value 1"
1178
+ );
1179
+ expect(result.centralCommsPayload.viberMessageContent.customField2).toEqual(
1180
+ "custom value 2"
1181
+ );
1182
+ });
1183
+ });
1184
+
822
1185
  describe("getTemplateDiffState", () => {
823
1186
  it("should return false for unsupported channel", () => {
824
1187
  const result = getTemplateDiffState("UNSUPPORTED_CHANNEL", {}, {});
@@ -2124,4 +2487,501 @@ describe("transformerUtils", () => {
2124
2487
  ).toBe(true);
2125
2488
  });
2126
2489
  });
2490
+
2491
+ describe("LINE template diff checking", () => {
2492
+ it("should detect changes in message content", () => {
2493
+ const oldData = {
2494
+ transformedMessageDetails: {
2495
+ lineMessageContent: {
2496
+ messageBody: "old line message",
2497
+ accountId: "same-account",
2498
+ accountDetails: "same-details",
2499
+ },
2500
+ },
2501
+ };
2502
+
2503
+ const newData = {
2504
+ messageBody: "new line message",
2505
+ accountId: "same-account",
2506
+ accountDetails: "same-details",
2507
+ };
2508
+
2509
+ const result = getTemplateDiffState(LINE, oldData, newData);
2510
+
2511
+ expect(result).toBe(true);
2512
+ });
2513
+
2514
+ it("should detect changes in accountId", () => {
2515
+ const oldData = {
2516
+ transformedMessageDetails: {
2517
+ lineMessageContent: {
2518
+ messageBody: "same line message",
2519
+ accountId: "old-account-123",
2520
+ accountDetails: "same-details",
2521
+ },
2522
+ },
2523
+ };
2524
+
2525
+ const newData = {
2526
+ messageBody: "same line message",
2527
+ accountId: "new-account-123",
2528
+ accountDetails: "same-details",
2529
+ };
2530
+
2531
+ const result = getTemplateDiffState(LINE, oldData, newData);
2532
+
2533
+ expect(result).toBe(true);
2534
+ });
2535
+
2536
+ it("should detect changes in accountDetails", () => {
2537
+ const oldData = {
2538
+ transformedMessageDetails: {
2539
+ lineMessageContent: {
2540
+ messageBody: "same line message",
2541
+ accountId: "same-account",
2542
+ accountDetails: "old-account-details",
2543
+ },
2544
+ },
2545
+ };
2546
+
2547
+ const newData = {
2548
+ messageBody: "same line message",
2549
+ accountId: "same-account",
2550
+ accountDetails: "new-account-details",
2551
+ };
2552
+
2553
+ const result = getTemplateDiffState(LINE, oldData, newData);
2554
+
2555
+ expect(result).toBe(true);
2556
+ });
2557
+
2558
+ it("should return false when LINE content is the same", () => {
2559
+ const oldData = {
2560
+ transformedMessageDetails: {
2561
+ lineMessageContent: {
2562
+ messageBody: "same line message",
2563
+ accountId: "same-account",
2564
+ accountDetails: "same-details",
2565
+ },
2566
+ },
2567
+ };
2568
+
2569
+ const newData = {
2570
+ messageBody: "same line message",
2571
+ accountId: "same-account",
2572
+ accountDetails: "same-details",
2573
+ };
2574
+
2575
+ const result = getTemplateDiffState(LINE, oldData, newData);
2576
+
2577
+ expect(result).toBe(false);
2578
+ });
2579
+
2580
+ it("should detect actual changes despite type differences", () => {
2581
+ const oldData = {
2582
+ transformedMessageDetails: {
2583
+ lineMessageContent: {
2584
+ messageBody: "same message",
2585
+ accountId: 12345,
2586
+ accountDetails: "same details",
2587
+ },
2588
+ },
2589
+ };
2590
+
2591
+ const newData = {
2592
+ messageBody: "same message",
2593
+ accountId: "12346",
2594
+ accountDetails: "same details",
2595
+ };
2596
+
2597
+ // Should return true because "12345" !== "12346"
2598
+ const result = getTemplateDiffState(LINE, oldData, newData);
2599
+
2600
+ expect(result).toBe(true);
2601
+ });
2602
+
2603
+ it("should handle undefined/null values gracefully", () => {
2604
+ // Both values undefined
2605
+ expect(
2606
+ getTemplateDiffState(
2607
+ LINE,
2608
+ { transformedMessageDetails: { lineMessageContent: {} } },
2609
+ {}
2610
+ )
2611
+ ).toBe(false);
2612
+
2613
+ // Old value undefined, new value defined
2614
+ expect(
2615
+ getTemplateDiffState(
2616
+ LINE,
2617
+ { transformedMessageDetails: { lineMessageContent: {} } },
2618
+ { messageBody: "new message" }
2619
+ )
2620
+ ).toBe(true);
2621
+
2622
+ // Old value defined, new value undefined
2623
+ expect(
2624
+ getTemplateDiffState(
2625
+ LINE,
2626
+ {
2627
+ transformedMessageDetails: {
2628
+ lineMessageContent: { messageBody: "old message" }
2629
+ }
2630
+ },
2631
+ {}
2632
+ )
2633
+ ).toBe(true);
2634
+ });
2635
+ });
2636
+
2637
+ describe("VIBER template diff checking", () => {
2638
+ it("should detect changes in message content", () => {
2639
+ const oldData = {
2640
+ transformedMessageDetails: {
2641
+ viberMessageContent: {
2642
+ messageBody: "old viber message",
2643
+ accountId: "same-account",
2644
+ accountDetails: "same-details",
2645
+ },
2646
+ },
2647
+ };
2648
+
2649
+ const newData = {
2650
+ messageBody: "new viber message",
2651
+ accountId: "same-account",
2652
+ accountDetails: "same-details",
2653
+ };
2654
+
2655
+ const result = getTemplateDiffState(VIBER, oldData, newData);
2656
+
2657
+ expect(result).toBe(true);
2658
+ });
2659
+
2660
+ it("should detect changes in accountId", () => {
2661
+ const oldData = {
2662
+ transformedMessageDetails: {
2663
+ viberMessageContent: {
2664
+ messageBody: "same viber message",
2665
+ accountId: "old-account-123",
2666
+ accountDetails: "same-details",
2667
+ },
2668
+ },
2669
+ };
2670
+
2671
+ const newData = {
2672
+ messageBody: "same viber message",
2673
+ accountId: "new-account-123",
2674
+ accountDetails: "same-details",
2675
+ };
2676
+
2677
+ const result = getTemplateDiffState(VIBER, oldData, newData);
2678
+
2679
+ expect(result).toBe(true);
2680
+ });
2681
+
2682
+ it("should detect changes in accountDetails", () => {
2683
+ const oldData = {
2684
+ transformedMessageDetails: {
2685
+ viberMessageContent: {
2686
+ messageBody: "same viber message",
2687
+ accountId: "same-account",
2688
+ accountDetails: "old-account-details",
2689
+ },
2690
+ },
2691
+ };
2692
+
2693
+ const newData = {
2694
+ messageBody: "same viber message",
2695
+ accountId: "same-account",
2696
+ accountDetails: "new-account-details",
2697
+ };
2698
+
2699
+ const result = getTemplateDiffState(VIBER, oldData, newData);
2700
+
2701
+ expect(result).toBe(true);
2702
+ });
2703
+
2704
+ it("should return false when VIBER content is the same", () => {
2705
+ const oldData = {
2706
+ transformedMessageDetails: {
2707
+ viberMessageContent: {
2708
+ messageBody: "same viber message",
2709
+ accountId: "same-account",
2710
+ accountDetails: "same-details",
2711
+ },
2712
+ },
2713
+ };
2714
+
2715
+ const newData = {
2716
+ messageBody: "same viber message",
2717
+ accountId: "same-account",
2718
+ accountDetails: "same-details",
2719
+ };
2720
+
2721
+ const result = getTemplateDiffState(VIBER, oldData, newData);
2722
+
2723
+ expect(result).toBe(false);
2724
+ });
2725
+
2726
+ it("should detect actual changes despite type differences", () => {
2727
+ const oldData = {
2728
+ transformedMessageDetails: {
2729
+ viberMessageContent: {
2730
+ messageBody: "same message",
2731
+ accountId: 67890,
2732
+ accountDetails: "same details",
2733
+ },
2734
+ },
2735
+ };
2736
+
2737
+ const newData = {
2738
+ messageBody: "same message",
2739
+ accountId: "67891",
2740
+ accountDetails: "same details",
2741
+ };
2742
+
2743
+ // Should return true because "67890" !== "67891"
2744
+ const result = getTemplateDiffState(VIBER, oldData, newData);
2745
+
2746
+ expect(result).toBe(true);
2747
+ });
2748
+
2749
+ it("should handle undefined/null values gracefully", () => {
2750
+ // Both values undefined
2751
+ expect(
2752
+ getTemplateDiffState(
2753
+ VIBER,
2754
+ { transformedMessageDetails: { viberMessageContent: {} } },
2755
+ {}
2756
+ )
2757
+ ).toBe(false);
2758
+
2759
+ // Old value undefined, new value defined
2760
+ expect(
2761
+ getTemplateDiffState(
2762
+ VIBER,
2763
+ { transformedMessageDetails: { viberMessageContent: {} } },
2764
+ { messageBody: "new message" }
2765
+ )
2766
+ ).toBe(true);
2767
+
2768
+ // Old value defined, new value undefined
2769
+ expect(
2770
+ getTemplateDiffState(
2771
+ VIBER,
2772
+ {
2773
+ transformedMessageDetails: {
2774
+ viberMessageContent: { messageBody: "old message" }
2775
+ }
2776
+ },
2777
+ {}
2778
+ )
2779
+ ).toBe(true);
2780
+ });
2781
+ });
2782
+
2783
+ describe("RCS template diff checking", () => {
2784
+ it("should detect changes in accountId", () => {
2785
+ const oldData = {
2786
+ transformedMessageDetails: {
2787
+ rcsMessageContent: {
2788
+ accountId: "old-account-123",
2789
+ accountName: "same-account-name",
2790
+ templateConfigs: {
2791
+ id: "same-template-123",
2792
+ name: "same_template_name",
2793
+ template: "same_template_content",
2794
+ varMapped: { customer: "John" },
2795
+ },
2796
+ },
2797
+ },
2798
+ };
2799
+
2800
+ const newData = {
2801
+ accountId: "new-account-123",
2802
+ accountName: "same-account-name",
2803
+ templateConfigs: {
2804
+ id: "same-template-123",
2805
+ name: "same_template_name",
2806
+ template: "same_template_content",
2807
+ varMapped: { customer: "John" },
2808
+ },
2809
+ };
2810
+
2811
+ const result = getTemplateDiffState(RCS, oldData, newData);
2812
+
2813
+ expect(result).toBe(true);
2814
+ });
2815
+
2816
+ it("should detect changes in accountName", () => {
2817
+ const oldData = {
2818
+ transformedMessageDetails: {
2819
+ rcsMessageContent: {
2820
+ accountId: "same-account",
2821
+ accountName: "old-account-name",
2822
+ templateConfigs: {
2823
+ id: "same-template-123",
2824
+ name: "same_template_name",
2825
+ template: "same_template_content",
2826
+ varMapped: { customer: "John" },
2827
+ },
2828
+ },
2829
+ },
2830
+ };
2831
+
2832
+ const newData = {
2833
+ accountId: "same-account",
2834
+ accountName: "new-account-name",
2835
+ templateConfigs: {
2836
+ id: "same-template-123",
2837
+ name: "same_template_name",
2838
+ template: "same_template_content",
2839
+ varMapped: { customer: "John" },
2840
+ },
2841
+ };
2842
+
2843
+ const result = getTemplateDiffState(RCS, oldData, newData);
2844
+
2845
+ expect(result).toBe(true);
2846
+ });
2847
+
2848
+ it("should detect changes in template configs structure", () => {
2849
+ const oldData = {
2850
+ transformedMessageDetails: {
2851
+ rcsMessageContent: {
2852
+ accountId: "same-account",
2853
+ accountName: "same-account-name",
2854
+ templateConfigs: {
2855
+ id: "same-template-123",
2856
+ name: "same_template_name",
2857
+ // Missing template and varMapped properties
2858
+ },
2859
+ },
2860
+ },
2861
+ };
2862
+
2863
+ const newData = {
2864
+ accountId: "same-account",
2865
+ accountName: "same-account-name",
2866
+ templateConfigs: {
2867
+ id: "same-template-123",
2868
+ name: "same_template_name",
2869
+ template: "same_template_content",
2870
+ varMapped: { customer: "John" },
2871
+ },
2872
+ };
2873
+
2874
+ const result = getTemplateDiffState(RCS, oldData, newData);
2875
+
2876
+ expect(result).toBe(true);
2877
+ });
2878
+
2879
+ it("should detect changes in account details", () => {
2880
+ const oldData = {
2881
+ transformedMessageDetails: {
2882
+ rcsMessageContent: {
2883
+ accountId: "old-account-123",
2884
+ accountName: "old-account-name",
2885
+ templateConfigs: {
2886
+ id: "same-template-123",
2887
+ name: "same_template_name",
2888
+ template: "same_template_content",
2889
+ varMapped: { customer: "John" },
2890
+ },
2891
+ },
2892
+ },
2893
+ };
2894
+
2895
+ const newData = {
2896
+ accountId: "new-account-123",
2897
+ accountName: "new-account-name",
2898
+ templateConfigs: {
2899
+ id: "same-template-123",
2900
+ name: "same_template_name",
2901
+ template: "same_template_content",
2902
+ varMapped: { customer: "John" },
2903
+ },
2904
+ };
2905
+
2906
+ const result = getTemplateDiffState("RCS", oldData, newData);
2907
+
2908
+ expect(result).toBe(true);
2909
+ });
2910
+
2911
+ it("should return false when RCS content is the same", () => {
2912
+ const oldData = {
2913
+ transformedMessageDetails: {
2914
+ rcsMessageContent: {
2915
+ accountId: "same-account",
2916
+ accountName: "same-account-name",
2917
+ templateConfigs: {
2918
+ id: "same-template-123",
2919
+ name: "same_template_name",
2920
+ template: "same_template_content",
2921
+ varMapped: { customer: "John" },
2922
+ },
2923
+ },
2924
+ },
2925
+ };
2926
+
2927
+ const newData = {
2928
+ accountId: "same-account",
2929
+ accountName: "same-account-name",
2930
+ templateConfigs: {
2931
+ id: "same-template-123",
2932
+ name: "same_template_name",
2933
+ template: "same_template_content",
2934
+ varMapped: { customer: "John" },
2935
+ },
2936
+ };
2937
+
2938
+ const result = getTemplateDiffState(RCS, oldData, newData);
2939
+
2940
+ expect(result).toBe(false);
2941
+ });
2942
+
2943
+ it("should handle missing transformedMessageDetails with default values", () => {
2944
+ const oldData = {
2945
+ // Missing transformedMessageDetails completely
2946
+ };
2947
+
2948
+ const newData = {
2949
+ accountId: "new-account",
2950
+ accountName: "new-account-name",
2951
+ templateConfigs: {
2952
+ id: "template-123",
2953
+ name: "template_name",
2954
+ },
2955
+ };
2956
+
2957
+ // This should trigger default value assignments in destructuring
2958
+ const result = getTemplateDiffState(RCS, oldData, newData);
2959
+
2960
+ // Should return true because oldData has no rcsMessageContent
2961
+ expect(result).toBe(true);
2962
+ });
2963
+
2964
+ it("should handle empty newData with default values", () => {
2965
+ const oldData = {
2966
+ transformedMessageDetails: {
2967
+ rcsMessageContent: {
2968
+ accountId: "old-account",
2969
+ accountName: "old-account-name",
2970
+ templateConfigs: {
2971
+ id: "template-123",
2972
+ name: "template_name",
2973
+ },
2974
+ },
2975
+ },
2976
+ };
2977
+
2978
+ const newData = null;
2979
+
2980
+ // This should trigger default value assignments in destructuring for newData
2981
+ const result = getTemplateDiffState(RCS, oldData, newData);
2982
+
2983
+ // Should return true because newData is null
2984
+ expect(result).toBe(true);
2985
+ });
2986
+ });
2127
2987
  });
@@ -7,6 +7,9 @@ import {
7
7
  WHATSAPP,
8
8
  PUSH,
9
9
  ZALO,
10
+ RCS,
11
+ LINE,
12
+ VIBER,
10
13
  EMF,
11
14
  VENENO,
12
15
  TEXT,
@@ -54,6 +57,12 @@ export const transformChannelPayload = (data, options = {}) => {
54
57
  return transformWhatsappPayload(data, options);
55
58
  case ZALO:
56
59
  return transformZaloPayload(data, options);
60
+ case RCS:
61
+ return transformRcsPayload(data, options);
62
+ case LINE:
63
+ return transformLinePayload(data, options);
64
+ case VIBER:
65
+ return transformViberPayload(data, options);
57
66
  default:
58
67
  return data; // Return unchanged for unsupported channels
59
68
  }
@@ -231,6 +240,83 @@ const transformZaloPayload = (zaloData, options = {}) => {
231
240
  return payload;
232
241
  };
233
242
 
243
+ /**
244
+ * Transforms RCS data to the required payload format
245
+ * @param {Object} rcsData - Current RCS data
246
+ * @param {Object} options - Additional options (ouId, sourceEntityId, etc.)
247
+ * @returns {Object} - Transformed RCS payload
248
+ */
249
+ // TODO: RCS is currently not supported by the CCS - BE. We need to make changes in future as per the BE changes.
250
+ const transformRcsPayload = (rcsData, options = {}) => {
251
+ const { loyaltyMetaData = {} } = options;
252
+ const { transformedMessageDetails = {} } = loyaltyMetaData;
253
+ const { rcsDeliverySettings = {} } = transformedMessageDetails || {};
254
+
255
+ // Get base payload structure
256
+ const payload = createBasePayload(RCS, loyaltyMetaData);
257
+
258
+ // Add RCS-specific properties
259
+ payload.centralCommsPayload.rcsMessageContent = {
260
+ channel: RCS,
261
+ messageBody: "",
262
+ accountId: rcsData?.accountId || "",
263
+ accountName: rcsData?.accountName || "",
264
+ ...rcsData,
265
+ // Ensure templateConfigs is preserved (it might contain complex nested objects)
266
+ templateConfigs: rcsData?.templateConfigs || {},
267
+ };
268
+ payload.centralCommsPayload.rcsDeliverySettings = rcsDeliverySettings;
269
+
270
+ return payload;
271
+ };
272
+
273
+ /**
274
+ * Transforms LINE data to the required payload format
275
+ * @param {Object} lineData - Current LINE data
276
+ * @param {Object} options - Additional options (ouId, sourceEntityId, etc.)
277
+ * @returns {Object} - Transformed LINE payload
278
+ */
279
+ const transformLinePayload = (lineData, options = {}) => {
280
+ const { loyaltyMetaData = {} } = options;
281
+ const { transformedMessageDetails = {} } = loyaltyMetaData;
282
+ const { lineDeliverySettings = {} } = transformedMessageDetails || {};
283
+
284
+ // Get base payload structure
285
+ const payload = createBasePayload(LINE, loyaltyMetaData);
286
+ payload.centralCommsPayload.lineMessageContent = {
287
+ channel: LINE,
288
+ accountId: lineData?.accountId || 0,
289
+ accountDetails: lineData?.accountDetails || "",
290
+ messageBody: lineData?.messageBody || "",
291
+ ...lineData,
292
+ };
293
+ payload.centralCommsPayload.lineDeliverySettings = lineDeliverySettings;
294
+ return payload;
295
+ };
296
+
297
+ /**
298
+ * Transforms VIBER data to the required payload format
299
+ * @param {Object} viberData - Current VIBER data
300
+ * @param {Object} options - Additional options (ouId, sourceEntityId, etc.)
301
+ * @returns {Object} - Transformed VIBER payload
302
+ */
303
+ const transformViberPayload = (viberData, options = {}) => {
304
+ const { loyaltyMetaData = {} } = options;
305
+ const { transformedMessageDetails = {} } = loyaltyMetaData;
306
+ const { viberDeliverySettings = {} } = transformedMessageDetails || {};
307
+ // Get base payload structure
308
+ const payload = createBasePayload(VIBER, loyaltyMetaData);
309
+ payload.centralCommsPayload.viberMessageContent = {
310
+ channel: VIBER,
311
+ accountId: viberData?.accountId || 0,
312
+ accountDetails: viberData?.accountDetails || "",
313
+ messageBody: viberData?.messageBody || "",
314
+ ...viberData,
315
+ };
316
+ payload.centralCommsPayload.viberDeliverySettings = viberDeliverySettings;
317
+ return payload;
318
+ };
319
+
234
320
  // Checks if the template has changed
235
321
  export const getTemplateDiffState = (channel, oldData, newData) => {
236
322
  switch (channel.toUpperCase()) {
@@ -245,6 +331,13 @@ export const getTemplateDiffState = (channel, oldData, newData) => {
245
331
  return checkWhatsappDiff(oldData, newData);
246
332
  case ZALO:
247
333
  return checkZaloDiff(oldData, newData);
334
+ case LINE:
335
+ return checkLineDiff(oldData, newData);
336
+ case VIBER:
337
+ return checkViberDiff(oldData, newData);
338
+ // TODO: RCS is currently not supported by the CCS - BE. We need to make changes in future as per the BE changes.
339
+ case RCS:
340
+ return checkRcsDiff(oldData, newData);
248
341
  default:
249
342
  return false;
250
343
  }
@@ -418,3 +511,78 @@ const checkZaloDiff = (oldData, newData) => {
418
511
  // Use deep comparison for template configs
419
512
  return !isEqual(oldTemplateConfigs, newTemplateConfigs);
420
513
  };
514
+
515
+ /**
516
+ * Checks differences between old and new RCS data
517
+ * @param {Object} oldData - Previous RCS template data
518
+ * @param {Object} newData - Updated RCS template data
519
+ * @returns {Boolean} - Whether the template has changed
520
+ */
521
+ // TODO: RCS is currently not supported by the CCS - BE. We need to make changes in future as per the BE changes.
522
+ const checkRcsDiff = (oldData, newData) => {
523
+ // Extract old RCS content
524
+ const { templateConfigs: oldTemplateConfigs = {}, accountId: oldAccountId = "", accountName: oldAccountName = "" } =
525
+ oldData?.transformedMessageDetails?.rcsMessageContent || {};
526
+
527
+ // Extract new RCS content
528
+ const { templateConfigs: newTemplateConfigs = {}, accountId: newAccountId = "", accountName: newAccountName = "" } = newData || {};
529
+
530
+ // Compare simple properties for quick rejection
531
+ if (oldAccountId !== newAccountId) return true;
532
+ if (oldAccountName !== newAccountName) return true;
533
+
534
+ // If template configs have different structures, they've changed
535
+ if (
536
+ Object.keys(newTemplateConfigs)?.length
537
+ !== Object.keys(oldTemplateConfigs)?.length
538
+ ) {
539
+ return true;
540
+ }
541
+
542
+ // Use deep comparison for template configs
543
+ return !isEqual(oldTemplateConfigs, newTemplateConfigs);
544
+ };
545
+
546
+ /**
547
+ * Checks differences between old and new LINE data
548
+ * @param {Object} oldData - Previous LINE template data
549
+ * @param {Object} newData - Updated LINE template data
550
+ * @returns {Boolean} - Whether the template has changed
551
+ */
552
+ const checkLineDiff = (oldData, newData) => {
553
+ // Extract old LINE content
554
+ const { messageBody: oldMessageBody = "", accountId: oldAccountId = "", accountDetails: oldAccountDetails = "" } =
555
+ oldData?.transformedMessageDetails?.lineMessageContent || {};
556
+
557
+ // Extract new LINE content
558
+ const { messageBody: newMessageBody = "", accountId: newAccountId = "", accountDetails: newAccountDetails = "" } = newData || {};
559
+
560
+ // Compare simple properties for quick rejection
561
+ if (oldMessageBody !== newMessageBody) return true;
562
+ if (oldAccountId !== newAccountId) return true;
563
+ if (oldAccountDetails !== newAccountDetails) return true;
564
+
565
+ return false;
566
+ };
567
+
568
+ /**
569
+ * Checks differences between old and new VIBER data
570
+ * @param {Object} oldData - Previous VIBER template data
571
+ * @param {Object} newData - Updated VIBER template data
572
+ * @returns {Boolean} - Whether the template has changed
573
+ */
574
+ const checkViberDiff = (oldData, newData) => {
575
+ // Extract old VIBER content
576
+ const { messageBody: oldMessageBody = "", accountId: oldAccountId = "", accountDetails: oldAccountDetails = "" } =
577
+ oldData?.transformedMessageDetails?.viberMessageContent || {};
578
+
579
+ // Extract new VIBER content
580
+ const { messageBody: newMessageBody = "", accountId: newAccountId = "", accountDetails: newAccountDetails = "" } = newData || {};
581
+
582
+ // Compare simple properties for quick rejection
583
+ if (oldMessageBody !== newMessageBody) return true;
584
+ if (oldAccountId !== newAccountId) return true;
585
+ if (oldAccountDetails !== newAccountDetails) return true;
586
+
587
+ return false;
588
+ };