shuttlepro-shared 1.3.16 → 1.3.18

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/config/redis.js CHANGED
@@ -8,53 +8,51 @@ const client = createClient({
8
8
  url: REDIS_URL,
9
9
  socket: { reconnectStrategy: (retries) => Math.min(retries * 50, 1000) }, // Exponential backoff
10
10
  });
11
-
12
- // ✅ Create separate Pub/Sub clients
13
11
  const publisher = client.duplicate();
14
12
  const subscriber = client.duplicate();
15
13
 
16
- // ✅ Handle Redis Connection Events
17
- client.on("error", (err) => console.error("Redis Error:", err));
18
- client.on("connect", () => console.log("✅ Redis Connected"));
19
- client.on("ready", () => console.log("🚀 Redis Ready to use"));
20
- client.on("end", () => console.log("❗ Redis Connection Closed"));
14
+ // ✅ Redis Events
15
+ const handleEvents = (client, label = "Redis") => {
16
+ client.on("error", (err) => console.error(`❌ ${label} Error:`, err));
17
+ client.on("connect", () => console.log(`✅ ${label} Connected`));
18
+ client.on("ready", () => console.log(`🚀 ${label} Ready to use`));
19
+ client.on("end", () => console.log(`❗ ${label} Connection Closed`));
20
+ client.on("reconnecting", () => console.warn(`🔄 ${label} Reconnecting...`));
21
+ };
22
+
23
+ handleEvents(client, "Main Redis");
24
+ handleEvents(publisher, "Publisher Redis");
25
+ handleEvents(subscriber, "Subscriber Redis");
21
26
 
22
- // ✅ Ensure Redis is connected before performing operations
27
+ // ✅ Ensure Redis is connected once during app startup
23
28
  const connectRedis = async () => {
24
- if (!client.isOpen) {
25
- try {
26
- await client.connect();
27
- await publisher.connect();
28
- await subscriber.connect();
29
- } catch (err) {
30
- console.error("❌ Failed to connect to Redis:", err);
29
+ try {
30
+ if (!client.isOpen) await client.connect();
31
+ if (!publisher.isOpen) await publisher.connect();
32
+ if (!subscriber.isOpen) await subscriber.connect();
33
+
34
+ // Set keyspace events only once
35
+ const config = await client.configGet("notify-keyspace-events");
36
+ if (!config["notify-keyspace-events"]?.includes("Ex")) {
37
+ await client.configSet("notify-keyspace-events", "Ex");
31
38
  }
39
+ } catch (err) {
40
+ console.error("❌ Failed to connect to Redis:", err);
32
41
  }
33
- await client.configSet("notify-keyspace-events", "Ex");
34
42
  };
35
43
 
36
- /**
37
- * ✅ Publish Data to a Channel
38
- * @param {string} channel - The Redis Pub/Sub channel
39
- * @param {any} message - The message to send
40
- */
44
+ // ✅ Publish Data to a Channel
41
45
  const publishToChannel = async (channel, message) => {
42
46
  try {
43
- await connectRedis();
44
47
  await publisher.publish(channel, JSON.stringify(message));
45
48
  } catch (err) {
46
49
  console.error("❌ Error publishing message:", err);
47
50
  }
48
51
  };
49
52
 
50
- /**
51
- * ✅ Subscribe & Listen for Messages
52
- * @param {string} channel - The Redis Pub/Sub channel
53
- * @param {function} callback - Callback function to handle messages
54
- */
53
+ // ✅ Subscribe & Listen for Messages
55
54
  const subscribeToChannel = async (channel, callback, expiry = false) => {
56
55
  try {
57
- await connectRedis();
58
56
  await subscriber.subscribe(channel, (message) => {
59
57
  if (expiry) callback(message);
60
58
  else callback(JSON.parse(message));
@@ -64,13 +62,7 @@ const subscribeToChannel = async (channel, callback, expiry = false) => {
64
62
  }
65
63
  };
66
64
 
67
- /**
68
- * ✅ Set Data in Redis (Supports String & Hash)
69
- * @param {string} key - The Redis key
70
- * @param {any} value - The value to store
71
- * @param {string|null} field - Optional field for Hash storage
72
- * @param {number} expiryInSeconds - Expiry time in seconds (default: 3600)
73
- */
65
+ // ✅ Set Data in Redis (Supports String & Hash)
74
66
  const setRedisData = async (
75
67
  key,
76
68
  value,
@@ -78,7 +70,6 @@ const setRedisData = async (
78
70
  expiryInSeconds = 3600
79
71
  ) => {
80
72
  try {
81
- await connectRedis();
82
73
  const stringifiedValue = JSON.stringify(value);
83
74
  let result;
84
75
 
@@ -99,43 +90,12 @@ const setRedisData = async (
99
90
  }
100
91
  };
101
92
 
102
- const addDataToRedisSet = async (key, value) => {
103
- try {
104
- await connectRedis();
105
- await client.sAdd(key, value);
106
- return true;
107
- } catch (err) {
108
- return false;
109
- }
110
- };
111
-
112
- const removeDataFromRedisSet = async (key, value) => {
113
- try {
114
- await connectRedis();
115
- await client.sRem(key, value);
116
- return true;
117
- } catch (err) {
118
- return false;
119
- }
120
- };
121
- const isMemberOfRedisSet = async (key, value) => {
122
- try {
123
- await connectRedis();
124
- return await client.sIsMember(key, value);
125
- } catch (err) {
126
- console.log(err, "err");
127
- return false;
128
- }
129
- };
130
- /**
131
- * ✅ Get Data from Redis (Supports String & Hash)
132
- * @param {string} key - The Redis key
133
- * @param {string|null} field - Optional field for Hash retrieval
134
- */
93
+ // Get Data from Redis (Supports String & Hash)
135
94
  const getRedisData = async (key, field = null) => {
136
95
  try {
137
- await connectRedis();
138
- let result = field ? await client.hGet(key, field) : await client.get(key);
96
+ const result = field
97
+ ? await client.hGet(key, field)
98
+ : await client.get(key);
139
99
  return result ? JSON.parse(result) : null;
140
100
  } catch (err) {
141
101
  console.error("❌ Error getting Redis data:", err);
@@ -158,14 +118,9 @@ const getRedisDataTime = async (key) => {
158
118
  }
159
119
  };
160
120
 
161
- /**
162
- * ✅ Delete Data from Redis (Supports String & Hash)
163
- * @param {string} key - The Redis key
164
- * @param {string|null} field - Optional field for Hash deletion
165
- */
121
+ // ✅ Delete Data from Redis (Supports String & Hash)
166
122
  const deleteRedisData = async (key, field = null) => {
167
123
  try {
168
- await connectRedis();
169
124
  return field ? await client.hDel(key, field) : await client.del(key);
170
125
  } catch (err) {
171
126
  console.error("❌ Error deleting Redis data:", err);
@@ -173,9 +128,37 @@ const deleteRedisData = async (key, field = null) => {
173
128
  }
174
129
  };
175
130
 
176
- /**
177
- * Graceful Shutdown Handling
178
- */
131
+ // ✅ Redis Set Operations
132
+ const addDataToRedisSet = async (key, value) => {
133
+ try {
134
+ await client.sAdd(key, value);
135
+ return true;
136
+ } catch (err) {
137
+ console.error("❌ Error adding to Redis set:", err);
138
+ return false;
139
+ }
140
+ };
141
+
142
+ const removeDataFromRedisSet = async (key, value) => {
143
+ try {
144
+ await client.sRem(key, value);
145
+ return true;
146
+ } catch (err) {
147
+ console.error("❌ Error removing from Redis set:", err);
148
+ return false;
149
+ }
150
+ };
151
+
152
+ const isMemberOfRedisSet = async (key, value) => {
153
+ try {
154
+ return await client.sIsMember(key, value);
155
+ } catch (err) {
156
+ console.error("❌ Error checking membership in Redis set:", err);
157
+ return false;
158
+ }
159
+ };
160
+
161
+ // ✅ Graceful Shutdown
179
162
  const closeClients = async () => {
180
163
  if (client.isOpen) await client.quit();
181
164
  if (publisher.isOpen) await publisher.quit();
@@ -199,13 +182,13 @@ module.exports = {
199
182
  client,
200
183
  publisher,
201
184
  subscriber,
185
+ connectRedis,
202
186
  setRedisData,
203
187
  getRedisDataTime,
204
188
  getRedisData,
205
189
  deleteRedisData,
206
190
  publishToChannel,
207
191
  subscribeToChannel,
208
- connectRedis,
209
192
  addDataToRedisSet,
210
193
  removeDataFromRedisSet,
211
194
  isMemberOfRedisSet,
@@ -11,6 +11,7 @@ const CustomerSchema = new Schema(
11
11
  defaultAddress: { type: String, default: "" },
12
12
  currentShippingAddress: {},
13
13
  addresses: [],
14
+ webCustomerId: { type: String, default: "" },
14
15
  workspaceId: {
15
16
  type: Schema.Types.ObjectId,
16
17
  ref: "Workspace",
package/models/Order.js CHANGED
@@ -136,6 +136,14 @@ const OrderSchema = new Schema(
136
136
  paymentDate: { type: String, default: "" },
137
137
  paymentDetails: {},
138
138
  },
139
+ merged: {
140
+ status: { type: String, default: "open" },
141
+ webOrderNumbers: [],
142
+ orderNumbers: [],
143
+ localOrderIds: [],
144
+ webOrderIds: [],
145
+ details: [],
146
+ },
139
147
  credentials: {},
140
148
  ticketId: { type: String, default: "" },
141
149
  sender: { type: String, default: "" },
package/models/Website.js CHANGED
@@ -29,6 +29,7 @@ const websiteSchema = new mongoose.Schema(
29
29
  },
30
30
  importStatus: { type: Boolean, default: false },
31
31
  mode: { type: String, default: "read" },
32
+ details: { type: mongoose.Schema.Types.Mixed, default: {} },
32
33
  },
33
34
  { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
34
35
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.3.16",
3
+ "version": "1.3.18",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {