agrs-sequelize-sdk 1.1.48 → 1.1.49

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/models/Channel.js CHANGED
@@ -17,10 +17,18 @@ module.exports = (sequelize, DataTypes) => {
17
17
  allowNull: true,
18
18
  defaultValue: "3544685732",
19
19
  },
20
+ status: {
21
+ type: DataTypes.STRING,
22
+ allowNull: false,
23
+ defaultValue: "free",
24
+ validate: {
25
+ isIn: [["free", "used"]],
26
+ },
27
+ },
20
28
  connectedCampaigns: {
21
29
  type: DataTypes.JSON,
22
30
  allowNull: true,
23
- defaultValue: [],
31
+ defaultValue: [], // Array of objects: { campaignId, assignedAt, releasedAt }
24
32
  },
25
33
  createdAt: {
26
34
  type: DataTypes.DATE,
@@ -46,20 +54,35 @@ module.exports = (sequelize, DataTypes) => {
46
54
  });
47
55
  };
48
56
 
57
+ // Hook to update status and history when a channel is created or updated
49
58
  Channel.afterCreate(async (channel, options) => {
50
59
  const campaigns = await sequelize.models.RSOCFeedCampaign.findAll({
51
60
  where: { channelId: channel.channelId },
52
61
  });
53
- const campaignIds = campaigns.map((campaign) => campaign.AGRS_CID);
54
- await channel.update({ connectedCampaigns: campaignIds });
62
+ const campaignIds = campaigns.map((campaign) => ({
63
+ campaignId: campaign.AGRS_CID,
64
+ assignedAt: new Date(),
65
+ releasedAt: null,
66
+ }));
67
+ if (campaignIds.length > 0) {
68
+ await channel.update({ status: "used", connectedCampaigns: campaignIds });
69
+ }
55
70
  });
56
71
 
57
72
  Channel.afterUpdate(async (channel, options) => {
58
73
  const campaigns = await sequelize.models.RSOCFeedCampaign.findAll({
59
74
  where: { channelId: channel.channelId },
60
75
  });
61
- const campaignIds = campaigns.map((campaign) => campaign.AGRS_CID);
62
- await channel.update({ connectedCampaigns: campaignIds });
76
+ const campaignIds = campaigns.map((campaign) => ({
77
+ campaignId: campaign.AGRS_CID,
78
+ assignedAt: new Date(),
79
+ releasedAt: null,
80
+ }));
81
+ if (campaignIds.length > 0) {
82
+ await channel.update({ status: "used", connectedCampaigns: campaignIds });
83
+ } else {
84
+ await channel.update({ status: "free", connectedCampaigns: [] });
85
+ }
63
86
  });
64
87
 
65
88
  return Channel;
@@ -35,6 +35,10 @@ module.exports = (sequelize, DataTypes) => {
35
35
  status: {
36
36
  type: DataTypes.STRING,
37
37
  allowNull: false,
38
+ defaultValue: "active",
39
+ validate: {
40
+ isIn: [["active", "inactive", "archived"]],
41
+ },
38
42
  },
39
43
  country: {
40
44
  type: DataTypes.STRING,
@@ -43,6 +47,7 @@ module.exports = (sequelize, DataTypes) => {
43
47
  vertical: {
44
48
  type: DataTypes.STRING,
45
49
  allowNull: false,
50
+ comment: "Maps to Article.category for dynamic selection",
46
51
  },
47
52
  freeText: {
48
53
  type: DataTypes.TEXT,
@@ -60,9 +65,10 @@ module.exports = (sequelize, DataTypes) => {
60
65
  type: DataTypes.ARRAY(DataTypes.STRING),
61
66
  allowNull: true,
62
67
  },
63
- finalLink: {
68
+ link: {
64
69
  type: DataTypes.STRING(1024),
65
70
  allowNull: true,
71
+ comment: "Campaign-specific URL based on article URL with parameters",
66
72
  },
67
73
  redirectLink: {
68
74
  type: DataTypes.STRING(1024),
@@ -116,6 +122,14 @@ module.exports = (sequelize, DataTypes) => {
116
122
  type: DataTypes.DATE,
117
123
  defaultValue: DataTypes.NOW,
118
124
  },
125
+ platform: {
126
+ type: DataTypes.STRING,
127
+ allowNull: false,
128
+ },
129
+ mediaBuyer: {
130
+ type: DataTypes.STRING,
131
+ allowNull: true,
132
+ },
119
133
  },
120
134
  {
121
135
  tableName: "rsoc_feed_campaigns",
@@ -140,32 +154,28 @@ module.exports = (sequelize, DataTypes) => {
140
154
  };
141
155
 
142
156
  RSOCFeedCampaign.beforeCreate(async (campaign) => {
143
- const AGRS_CID = campaign.getDataValue("AGRS_CID");
144
- if (AGRS_CID) {
145
- const redirectLink = `https://ktwrjqdfv.com/${AGRS_CID}?campaign_name={{campaign.name}}&adset_name={{adset.name}}&ad_name={{ad.name}}&campaign_id={{campaign.id}}&adset_id={{adset.id}}&ad_id={{ad.id}}_${AGRS_CID}&placement={{placement}}&site_source={{site_source}}&fbclid={{fbclid}}`;
146
- campaign.setDataValue("redirectLink", redirectLink);
147
- }
157
+ // Set redirectLink to null as requested
158
+ campaign.setDataValue("redirectLink", null);
148
159
 
149
160
  const channel = await sequelize.models.Channel.findOne({
150
161
  where: { channelId: campaign.channelId },
151
162
  });
152
163
  if (channel) {
153
164
  const connectedCampaigns = channel.connectedCampaigns || [];
154
- if (!connectedCampaigns.includes(campaign.AGRS_CID)) {
155
- connectedCampaigns.push(campaign.AGRS_CID);
156
- await channel.update({ connectedCampaigns });
165
+ if (!connectedCampaigns.some((c) => c.campaignId === campaign.AGRS_CID)) {
166
+ connectedCampaigns.push({
167
+ campaignId: campaign.AGRS_CID,
168
+ assignedAt: new Date(),
169
+ releasedAt: null,
170
+ });
171
+ await channel.update({ status: "used", connectedCampaigns });
157
172
  }
158
173
  }
159
174
  });
160
175
 
161
176
  RSOCFeedCampaign.beforeUpdate(async (campaign) => {
162
- if (campaign.changed("AGRS_CID")) {
163
- const AGRS_CID = campaign.getDataValue("AGRS_CID");
164
- if (AGRS_CID) {
165
- const redirectLink = `https://ktwrjqdfv.com/${AGRS_CID}?campaign_name={{campaign.name}}&adset_name={{adset.name}}&ad_name={{ad.name}}&campaign_id={{campaign.id}}&adset_id={{adset.id}}&ad_id={{ad.id}}_${AGRS_CID}&placement={{placement}}&site_source={{site_source}}&fbclid={{fbclid}}`;
166
- campaign.setDataValue("redirectLink", redirectLink);
167
- }
168
- }
177
+ // Ensure redirectLink remains null
178
+ campaign.setDataValue("redirectLink", null);
169
179
 
170
180
  if (campaign.changed("channelId")) {
171
181
  const oldChannelId = campaign.previous("channelId");
@@ -177,10 +187,17 @@ module.exports = (sequelize, DataTypes) => {
177
187
  });
178
188
  if (oldChannel) {
179
189
  const connectedCampaigns = oldChannel.connectedCampaigns || [];
180
- const updatedCampaigns = connectedCampaigns.filter(
181
- (id) => id !== campaign.AGRS_CID
182
- );
183
- await oldChannel.update({ connectedCampaigns: updatedCampaigns });
190
+ const updatedCampaigns = connectedCampaigns
191
+ .map((c) =>
192
+ c.campaignId === campaign.AGRS_CID
193
+ ? { ...c, releasedAt: new Date() }
194
+ : c
195
+ )
196
+ .filter((c) => c.releasedAt === null);
197
+ await oldChannel.update({
198
+ connectedCampaigns: updatedCampaigns,
199
+ status: updatedCampaigns.length > 0 ? "used" : "free",
200
+ });
184
201
  }
185
202
  }
186
203
 
@@ -189,21 +206,19 @@ module.exports = (sequelize, DataTypes) => {
189
206
  });
190
207
  if (newChannel) {
191
208
  const connectedCampaigns = newChannel.connectedCampaigns || [];
192
- if (!connectedCampaigns.includes(campaign.AGRS_CID)) {
193
- connectedCampaigns.push(campaign.AGRS_CID);
194
- await newChannel.update({ connectedCampaigns });
209
+ if (
210
+ !connectedCampaigns.some((c) => c.campaignId === campaign.AGRS_CID)
211
+ ) {
212
+ connectedCampaigns.push({
213
+ campaignId: campaign.AGRS_CID,
214
+ assignedAt: new Date(),
215
+ releasedAt: null,
216
+ });
217
+ await newChannel.update({ status: "used", connectedCampaigns });
195
218
  }
196
219
  }
197
220
  }
198
221
  });
199
222
 
200
- RSOCFeedCampaign.beforeSave(async (campaign) => {
201
- const AGRS_CID = campaign.getDataValue("AGRS_CID");
202
- if (AGRS_CID && !campaign.getDataValue("redirectLink")) {
203
- const redirectLink = `https://ktwrjqdfv.com/${AGRS_CID}?campaign_name={{campaign.name}}&adset_name={{adset.name}}&ad_name={{ad.name}}&campaign_id={{campaign.id}}&adset_id={{adset.id}}&ad_id={{ad.id}}_${AGRS_CID}&placement={{placement}}&site_source={{site_source}}&fbclid={{fbclid}}`;
204
- campaign.setDataValue("redirectLink", redirectLink);
205
- }
206
- });
207
-
208
223
  return RSOCFeedCampaign;
209
224
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agrs-sequelize-sdk",
3
- "version": "1.1.48",
3
+ "version": "1.1.49",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "start": "node index.js",