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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
22
|
+
// ✅ Ensure Redis is connected before performing operations
|
|
28
23
|
const connectRedis = async () => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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,
|
package/models/Customer.js
CHANGED
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: "" },
|