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 +64 -81
- package/models/Customer.js +1 -0
- package/models/Order.js +8 -0
- package/models/Website.js +1 -0
- package/package.json +1 -1
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
|
-
// ✅
|
|
17
|
-
client
|
|
18
|
-
client.on("
|
|
19
|
-
client.on("
|
|
20
|
-
client.on("
|
|
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
|
|
27
|
+
// ✅ Ensure Redis is connected once during app startup
|
|
23
28
|
const connectRedis = async () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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,
|
package/models/Customer.js
CHANGED
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
|
);
|