shuttlepro-shared 1.3.11 → 1.3.13

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.
@@ -12,7 +12,12 @@ const getCachedAllIntegrations = async () => {
12
12
  integrations = await Integration.find({}).lean().exec();
13
13
  await setRedisData(CACHE_KEY_ALL, integrations);
14
14
  }
15
- return integrations;
15
+ return integrations?.map((x) => {
16
+ return {
17
+ ...x,
18
+ _id: x?._id?.toString(),
19
+ };
20
+ });
16
21
  };
17
22
 
18
23
  /**
@@ -74,6 +74,11 @@ const findAllWorkspaces = async (filter = {}) => {
74
74
  Object.entries(filter).every(([key, value]) => ws[key] === value)
75
75
  );
76
76
  };
77
+ const updateWorkspaceCache = async (id = "") => {
78
+ const workspace = await Workspace.findById(id).lean().exec();
79
+ await updateCachedWorkspaces();
80
+ return workspace;
81
+ };
77
82
 
78
83
  const updateWorkspace = async (id, data) => {
79
84
  const updatedWorkspace = await Workspace.findByIdAndUpdate(id, data, {
@@ -138,4 +143,5 @@ module.exports = {
138
143
  updateOneWorkspace,
139
144
  updateManyWorkspaces,
140
145
  deleteWorkspace,
146
+ updateWorkspaceCache,
141
147
  };
package/config/redis.js CHANGED
@@ -8,51 +8,53 @@ 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
11
13
  const publisher = client.duplicate();
12
14
  const subscriber = client.duplicate();
13
15
 
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");
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"));
26
21
 
27
- // ✅ Ensure Redis is connected once during app startup
22
+ // ✅ Ensure Redis is connected before performing operations
28
23
  const connectRedis = async () => {
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");
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);
38
31
  }
39
- } catch (err) {
40
- console.error("❌ Failed to connect to Redis:", err);
41
32
  }
33
+ await client.configSet("notify-keyspace-events", "Ex");
42
34
  };
43
35
 
44
- // ✅ Publish Data to a Channel
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
+ */
45
41
  const publishToChannel = async (channel, message) => {
46
42
  try {
43
+ await connectRedis();
47
44
  await publisher.publish(channel, JSON.stringify(message));
48
45
  } catch (err) {
49
46
  console.error("❌ Error publishing message:", err);
50
47
  }
51
48
  };
52
49
 
53
- // ✅ Subscribe & Listen for Messages
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
+ */
54
55
  const subscribeToChannel = async (channel, callback, expiry = false) => {
55
56
  try {
57
+ await connectRedis();
56
58
  await subscriber.subscribe(channel, (message) => {
57
59
  if (expiry) callback(message);
58
60
  else callback(JSON.parse(message));
@@ -62,7 +64,13 @@ const subscribeToChannel = async (channel, callback, expiry = false) => {
62
64
  }
63
65
  };
64
66
 
65
- // ✅ Set Data in Redis (Supports String & Hash)
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
+ */
66
74
  const setRedisData = async (
67
75
  key,
68
76
  value,
@@ -70,6 +78,7 @@ const setRedisData = async (
70
78
  expiryInSeconds = 3600
71
79
  ) => {
72
80
  try {
81
+ await connectRedis();
73
82
  const stringifiedValue = JSON.stringify(value);
74
83
  let result;
75
84
 
@@ -90,60 +99,68 @@ const setRedisData = async (
90
99
  }
91
100
  };
92
101
 
93
- // ✅ Get Data from Redis (Supports String & Hash)
94
- const getRedisData = async (key, field = null) => {
95
- try {
96
- const result = field
97
- ? await client.hGet(key, field)
98
- : await client.get(key);
99
- return result ? JSON.parse(result) : null;
100
- } catch (err) {
101
- console.error("❌ Error getting Redis data:", err);
102
- return null;
103
- }
104
- };
105
-
106
- // ✅ Delete Data from Redis (Supports String & Hash)
107
- const deleteRedisData = async (key, field = null) => {
108
- try {
109
- return field ? await client.hDel(key, field) : await client.del(key);
110
- } catch (err) {
111
- console.error("❌ Error deleting Redis data:", err);
112
- return null;
113
- }
114
- };
115
-
116
- // ✅ Redis Set Operations
117
102
  const addDataToRedisSet = async (key, value) => {
118
103
  try {
104
+ await connectRedis();
119
105
  await client.sAdd(key, value);
120
106
  return true;
121
107
  } catch (err) {
122
- console.error("❌ Error adding to Redis set:", err);
123
108
  return false;
124
109
  }
125
110
  };
126
111
 
127
112
  const removeDataFromRedisSet = async (key, value) => {
128
113
  try {
114
+ await connectRedis();
129
115
  await client.sRem(key, value);
130
116
  return true;
131
117
  } catch (err) {
132
- console.error("❌ Error removing from Redis set:", err);
133
118
  return false;
134
119
  }
135
120
  };
136
-
137
121
  const isMemberOfRedisSet = async (key, value) => {
138
122
  try {
123
+ await connectRedis();
139
124
  return await client.sIsMember(key, value);
140
125
  } catch (err) {
141
- console.error("❌ Error checking membership in Redis set:", err);
126
+ console.log(err, "err");
142
127
  return false;
143
128
  }
144
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
+ */
135
+ const getRedisData = async (key, field = null) => {
136
+ try {
137
+ await connectRedis();
138
+ let result = field ? await client.hGet(key, field) : await client.get(key);
139
+ return result ? JSON.parse(result) : null;
140
+ } catch (err) {
141
+ console.error("❌ Error getting Redis data:", err);
142
+ return null;
143
+ }
144
+ };
145
145
 
146
- // ✅ Graceful Shutdown
146
+ /**
147
+ * ✅ Delete Data from Redis (Supports String & Hash)
148
+ * @param {string} key - The Redis key
149
+ * @param {string|null} field - Optional field for Hash deletion
150
+ */
151
+ const deleteRedisData = async (key, field = null) => {
152
+ try {
153
+ await connectRedis();
154
+ return field ? await client.hDel(key, field) : await client.del(key);
155
+ } catch (err) {
156
+ console.error("❌ Error deleting Redis data:", err);
157
+ return null;
158
+ }
159
+ };
160
+
161
+ /**
162
+ * ✅ Graceful Shutdown Handling
163
+ */
147
164
  const closeClients = async () => {
148
165
  if (client.isOpen) await client.quit();
149
166
  if (publisher.isOpen) await publisher.quit();
@@ -167,12 +184,12 @@ module.exports = {
167
184
  client,
168
185
  publisher,
169
186
  subscriber,
170
- connectRedis,
171
187
  setRedisData,
172
188
  getRedisData,
173
189
  deleteRedisData,
174
190
  publishToChannel,
175
191
  subscribeToChannel,
192
+ connectRedis,
176
193
  addDataToRedisSet,
177
194
  removeDataFromRedisSet,
178
195
  isMemberOfRedisSet,
@@ -11,7 +11,6 @@ const CustomerSchema = new Schema(
11
11
  defaultAddress: { type: String, default: "" },
12
12
  currentShippingAddress: {},
13
13
  addresses: [],
14
- webCustomerId: { type: String, default: "" },
15
14
  workspaceId: {
16
15
  type: Schema.Types.ObjectId,
17
16
  ref: "Workspace",
package/models/Order.js CHANGED
@@ -136,14 +136,6 @@ 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
- },
147
139
  credentials: {},
148
140
  ticketId: { type: String, default: "" },
149
141
  sender: { type: String, default: "" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.3.11",
3
+ "version": "1.3.13",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {