powr-sdk-api 2.0.2 → 2.0.4
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/README.md +50 -66
- package/dist/admin/activities.js +81 -0
- package/dist/admin/auth.js +234 -0
- package/dist/admin/blogs.js +94 -0
- package/dist/admin/comments.js +83 -0
- package/dist/admin/files.js +56 -0
- package/dist/admin/forms.js +240 -0
- package/dist/admin/index.js +44 -0
- package/dist/admin/invoice.js +163 -0
- package/dist/admin/likes.js +126 -0
- package/dist/admin/notifications.js +93 -0
- package/dist/admin/plexx.js +53 -0
- package/dist/admin/ratings.js +185 -0
- package/dist/admin/routes.js +132 -0
- package/dist/admin/slides.js +101 -0
- package/dist/admin/users.js +175 -0
- package/dist/admin/waitlists.js +94 -0
- package/dist/config.js +23 -0
- package/dist/index.js +10 -10
- package/dist/logger/index.js +6 -4
- package/dist/middleware/jwtToken.js +18 -0
- package/dist/services/dbService.js +40 -0
- package/dist/services/gcs.js +78 -0
- package/dist/services/mongo.js +36 -0
- package/dist/services/s3.js +78 -0
- package/dist/swagger/index.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
const {
|
|
6
|
+
getDb
|
|
7
|
+
} = require("../services/mongo");
|
|
8
|
+
const {
|
|
9
|
+
ObjectId
|
|
10
|
+
} = require("mongodb");
|
|
11
|
+
|
|
12
|
+
//add ratings
|
|
13
|
+
router.post("/", async (req, res) => {
|
|
14
|
+
const {
|
|
15
|
+
projectId,
|
|
16
|
+
itemId,
|
|
17
|
+
rating,
|
|
18
|
+
review,
|
|
19
|
+
userId
|
|
20
|
+
} = req.body;
|
|
21
|
+
if (!rating || !review) {
|
|
22
|
+
return res.status(400).json({
|
|
23
|
+
success: false,
|
|
24
|
+
message: "All fields are required."
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const ratingData = {
|
|
28
|
+
projectId,
|
|
29
|
+
itemId,
|
|
30
|
+
rating,
|
|
31
|
+
review,
|
|
32
|
+
userId,
|
|
33
|
+
createdAt: new Date()
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const result = await getDb().collection("ratings").insertOne(ratingData);
|
|
37
|
+
if (result && result.insertedId) {
|
|
38
|
+
console.log("ratings added with ID:", result.insertedId);
|
|
39
|
+
return res.status(200).json({
|
|
40
|
+
success: true,
|
|
41
|
+
message: "rating added successfully.",
|
|
42
|
+
ratingId: result.insertedId
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
console.error("Insert operation failed. Result:", result);
|
|
46
|
+
return res.status(500).json({
|
|
47
|
+
success: false,
|
|
48
|
+
message: "ratings/reviews could not be added."
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error("Error adding ratings:", error);
|
|
53
|
+
return res.status(500).json({
|
|
54
|
+
success: false,
|
|
55
|
+
message: "Failed to add ratings/reviews due to a server error."
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
//get ratings
|
|
61
|
+
router.get("/", async (req, res) => {
|
|
62
|
+
const {
|
|
63
|
+
projectId,
|
|
64
|
+
itemId,
|
|
65
|
+
userId
|
|
66
|
+
} = req.query;
|
|
67
|
+
if (!projectId) {
|
|
68
|
+
return res.status(400).json({
|
|
69
|
+
success: false,
|
|
70
|
+
message: "projectId is required in query params."
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const query = {
|
|
75
|
+
projectId
|
|
76
|
+
};
|
|
77
|
+
if (itemId) query.itemId = itemId;
|
|
78
|
+
if (userId) query.userId = userId;
|
|
79
|
+
console.log("Filter....:", query);
|
|
80
|
+
const ratingData = await getDb().collection("ratings").find(query).toArray();
|
|
81
|
+
if (!ratingData || ratingData.length === 0) {
|
|
82
|
+
console.log("Data not found.");
|
|
83
|
+
return res.status(200).json({
|
|
84
|
+
success: true,
|
|
85
|
+
ratings: []
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return res.status(200).json({
|
|
89
|
+
success: true,
|
|
90
|
+
ratings: ratingData
|
|
91
|
+
});
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.error("Error retrieving ratings:", error);
|
|
94
|
+
return res.status(500).json({
|
|
95
|
+
success: false,
|
|
96
|
+
message: "Failed to retrieve ratings."
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// delete ratings
|
|
102
|
+
router.delete("/", async (req, res) => {
|
|
103
|
+
const {
|
|
104
|
+
ratingId,
|
|
105
|
+
projectId
|
|
106
|
+
} = req.query;
|
|
107
|
+
if (!ratingId || !projectId) {
|
|
108
|
+
return res.status(400).json({
|
|
109
|
+
success: false,
|
|
110
|
+
message: "Both ratingId and projectId are required to delete a rating."
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const result = await getDb().collection("ratings").deleteOne({
|
|
115
|
+
_id: new ObjectId(ratingId),
|
|
116
|
+
projectId: projectId
|
|
117
|
+
});
|
|
118
|
+
if (result.deletedCount === 0) {
|
|
119
|
+
return res.status(404).json({
|
|
120
|
+
success: false,
|
|
121
|
+
message: "Rating not found for the given ratingId and projectId."
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return res.status(200).json({
|
|
125
|
+
success: true,
|
|
126
|
+
message: "Rating deleted successfully."
|
|
127
|
+
});
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error("Error deleting rating:", error);
|
|
130
|
+
return res.status(500).json({
|
|
131
|
+
success: false,
|
|
132
|
+
message: "Failed to delete rating due to a server error."
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Calculate average rating
|
|
138
|
+
router.get("/average", async (req, res) => {
|
|
139
|
+
const {
|
|
140
|
+
projectId,
|
|
141
|
+
itemId
|
|
142
|
+
} = req.query;
|
|
143
|
+
if (!projectId || !itemId) {
|
|
144
|
+
return res.status(400).json({
|
|
145
|
+
success: false,
|
|
146
|
+
message: "Both projectId and itemId are required."
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const result = await getDb().collection("ratings").aggregate([{
|
|
151
|
+
$match: {
|
|
152
|
+
projectId,
|
|
153
|
+
itemId
|
|
154
|
+
}
|
|
155
|
+
}, {
|
|
156
|
+
$group: {
|
|
157
|
+
_id: null,
|
|
158
|
+
averageRating: {
|
|
159
|
+
$avg: "$rating"
|
|
160
|
+
},
|
|
161
|
+
totalRatings: {
|
|
162
|
+
$sum: 1
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}]).toArray();
|
|
166
|
+
if (result.length === 0) {
|
|
167
|
+
return res.status(404).json({
|
|
168
|
+
success: false,
|
|
169
|
+
message: "No ratings found for the given projectId and itemId."
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return res.status(200).json({
|
|
173
|
+
success: true,
|
|
174
|
+
averageRating: result[0].averageRating.toFixed(2),
|
|
175
|
+
totalRatings: result[0].totalRatings
|
|
176
|
+
});
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error("Error calculating average rating:", error);
|
|
179
|
+
return res.status(500).json({
|
|
180
|
+
success: false,
|
|
181
|
+
message: "Failed to calculate average rating."
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
module.exports = router;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
const {
|
|
6
|
+
getDb
|
|
7
|
+
} = require("../services/dbService");
|
|
8
|
+
|
|
9
|
+
// Get all routes entries
|
|
10
|
+
router.get('/', async (req, res) => {
|
|
11
|
+
const {
|
|
12
|
+
projectId
|
|
13
|
+
} = req.query;
|
|
14
|
+
try {
|
|
15
|
+
const query = {
|
|
16
|
+
projectId
|
|
17
|
+
};
|
|
18
|
+
if (!projectId) {
|
|
19
|
+
return res.status(400).json({
|
|
20
|
+
success: false,
|
|
21
|
+
message: 'projectId is required.'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const routesData = await getDb().collection("routes").find(query).toArray();
|
|
25
|
+
return res.status(200).json({
|
|
26
|
+
success: true,
|
|
27
|
+
allroutes: routesData
|
|
28
|
+
});
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error("Error retrieving routes entries:", error);
|
|
31
|
+
return res.status(500).json({
|
|
32
|
+
success: false,
|
|
33
|
+
message: "Failed to retrieve routes entries."
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Create a new route
|
|
39
|
+
router.post('/', async (req, res) => {
|
|
40
|
+
try {
|
|
41
|
+
const {
|
|
42
|
+
projectId
|
|
43
|
+
} = req.query;
|
|
44
|
+
if (!projectId) {
|
|
45
|
+
return res.status(400).json({
|
|
46
|
+
success: false,
|
|
47
|
+
message: 'projectId is required.'
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const newRoute = req.body;
|
|
51
|
+
newRoute.projectId = projectId;
|
|
52
|
+
if (!newRoute || Object.keys(newRoute).length === 0) {
|
|
53
|
+
return res.status(400).json({
|
|
54
|
+
success: false,
|
|
55
|
+
message: 'Request body is empty or invalid.'
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const result = await getDb().collection('routes').insertOne(newRoute);
|
|
59
|
+
return res.status(201).json({
|
|
60
|
+
success: true,
|
|
61
|
+
entry: result.ops ? result.ops[0] : newRoute
|
|
62
|
+
});
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('Error inserting route entry:', error);
|
|
65
|
+
return res.status(500).json({
|
|
66
|
+
success: false,
|
|
67
|
+
message: 'Failed to insert route entry.'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Update route code
|
|
73
|
+
router.put('/:route', async (req, res) => {
|
|
74
|
+
try {
|
|
75
|
+
const {
|
|
76
|
+
route
|
|
77
|
+
} = req.params;
|
|
78
|
+
const {
|
|
79
|
+
code
|
|
80
|
+
} = req.body;
|
|
81
|
+
const {
|
|
82
|
+
projectId
|
|
83
|
+
} = req.query;
|
|
84
|
+
if (!projectId) {
|
|
85
|
+
return res.status(400).json({
|
|
86
|
+
success: false,
|
|
87
|
+
message: 'projectId is required.'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (!code) {
|
|
91
|
+
return res.status(400).json({
|
|
92
|
+
success: false,
|
|
93
|
+
message: 'Code field is required.'
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const query = {
|
|
97
|
+
route,
|
|
98
|
+
projectId
|
|
99
|
+
};
|
|
100
|
+
const existingRoute = await getDb().collection('routes').findOne(query);
|
|
101
|
+
if (!existingRoute) {
|
|
102
|
+
return res.status(404).json({
|
|
103
|
+
success: false,
|
|
104
|
+
message: 'Route not found.'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const result = await getDb().collection('routes').updateOne(query, {
|
|
108
|
+
$set: {
|
|
109
|
+
code
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
if (result.matchedCount === 0) {
|
|
113
|
+
return res.status(404).json({
|
|
114
|
+
success: false,
|
|
115
|
+
message: 'Route not found.'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const updatedRoute = await getDb().collection('routes').findOne(query);
|
|
119
|
+
return res.status(200).json({
|
|
120
|
+
success: true,
|
|
121
|
+
entry: updatedRoute
|
|
122
|
+
});
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.error('Error updating route code:', error);
|
|
125
|
+
return res.status(500).json({
|
|
126
|
+
success: false,
|
|
127
|
+
message: 'Failed to update route code.',
|
|
128
|
+
error: error.message
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
module.exports = router;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const express = require('express');
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
const {
|
|
6
|
+
getDb
|
|
7
|
+
} = require('../services/mongo');
|
|
8
|
+
|
|
9
|
+
// Get slides
|
|
10
|
+
router.get('/', async (req, res) => {
|
|
11
|
+
const {
|
|
12
|
+
projectId,
|
|
13
|
+
tag
|
|
14
|
+
} = req.query;
|
|
15
|
+
try {
|
|
16
|
+
const query = {
|
|
17
|
+
projectId
|
|
18
|
+
};
|
|
19
|
+
if (tag) {
|
|
20
|
+
query.tag = tag;
|
|
21
|
+
}
|
|
22
|
+
console.log("Filter.....:", query);
|
|
23
|
+
const slidesData = await getDb().collection('slides').find(query).toArray();
|
|
24
|
+
if (!slidesData || slidesData.length === 0) {
|
|
25
|
+
console.log("Data not found.");
|
|
26
|
+
return res.status(200).json({
|
|
27
|
+
success: true,
|
|
28
|
+
slides: []
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const sortedData = slidesData.sort((a, b) => new Date(b === null || b === void 0 ? void 0 : b.createdAt) - new Date(a === null || a === void 0 ? void 0 : a.createdAt));
|
|
32
|
+
console.log("Slides retrieved and sorted:", sortedData);
|
|
33
|
+
return res.status(200).json({
|
|
34
|
+
success: true,
|
|
35
|
+
slides: sortedData
|
|
36
|
+
});
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("Error retrieving slides:", error);
|
|
39
|
+
return res.status(500).json({
|
|
40
|
+
success: false,
|
|
41
|
+
message: "Failed to retrieve slides."
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Add slide
|
|
47
|
+
router.post('/', async (req, res) => {
|
|
48
|
+
const {
|
|
49
|
+
projectId,
|
|
50
|
+
tag,
|
|
51
|
+
city,
|
|
52
|
+
url,
|
|
53
|
+
title,
|
|
54
|
+
description,
|
|
55
|
+
expiry
|
|
56
|
+
} = req.body;
|
|
57
|
+
if (!url || !title || !description || !expiry) {
|
|
58
|
+
return res.status(400).json({
|
|
59
|
+
success: false,
|
|
60
|
+
message: "All fields are required."
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const slideData = {
|
|
64
|
+
projectId,
|
|
65
|
+
url,
|
|
66
|
+
title,
|
|
67
|
+
description,
|
|
68
|
+
expiry,
|
|
69
|
+
createdAt: new Date()
|
|
70
|
+
};
|
|
71
|
+
if (city) {
|
|
72
|
+
slideData.city = city;
|
|
73
|
+
}
|
|
74
|
+
if (tag) {
|
|
75
|
+
slideData.tag = tag;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const result = await getDb().collection('slides').insertOne(slideData);
|
|
79
|
+
if (result && result.insertedId) {
|
|
80
|
+
console.log("Slide added with ID:", result.insertedId);
|
|
81
|
+
return res.status(200).json({
|
|
82
|
+
success: true,
|
|
83
|
+
message: "Slide added successfully.",
|
|
84
|
+
slideId: result.insertedId
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
console.error("Insert operation failed. Result:", result);
|
|
88
|
+
return res.status(500).json({
|
|
89
|
+
success: false,
|
|
90
|
+
message: "Slide could not be added."
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error("Error adding slide:", error);
|
|
95
|
+
return res.status(500).json({
|
|
96
|
+
success: false,
|
|
97
|
+
message: "Failed to add slide due to a server error."
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
module.exports = router;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
const {
|
|
6
|
+
getDb
|
|
7
|
+
} = require("../services/mongo");
|
|
8
|
+
const {
|
|
9
|
+
ObjectId
|
|
10
|
+
} = require("mongodb");
|
|
11
|
+
router.post("/", async (req, res) => {
|
|
12
|
+
const {
|
|
13
|
+
projectId,
|
|
14
|
+
phoneNumber,
|
|
15
|
+
email,
|
|
16
|
+
...userData
|
|
17
|
+
} = req.body;
|
|
18
|
+
if (!phoneNumber && !email) {
|
|
19
|
+
return res.status(400).json({
|
|
20
|
+
success: false,
|
|
21
|
+
message: "phoneNumber or email is required."
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const user = {
|
|
25
|
+
projectId,
|
|
26
|
+
phoneNumber,
|
|
27
|
+
email,
|
|
28
|
+
...userData,
|
|
29
|
+
createdAt: new Date()
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
const usersCollection = getDb().collection("users");
|
|
33
|
+
if (phoneNumber) {
|
|
34
|
+
const existingByPhone = await usersCollection.findOne({
|
|
35
|
+
projectId,
|
|
36
|
+
phoneNumber
|
|
37
|
+
});
|
|
38
|
+
if (existingByPhone) {
|
|
39
|
+
return res.status(409).json({
|
|
40
|
+
success: false,
|
|
41
|
+
message: "Phone number already exists."
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (email) {
|
|
46
|
+
const existingByEmail = await usersCollection.findOne({
|
|
47
|
+
projectId,
|
|
48
|
+
email
|
|
49
|
+
});
|
|
50
|
+
if (existingByEmail) {
|
|
51
|
+
return res.status(409).json({
|
|
52
|
+
success: false,
|
|
53
|
+
message: "Email already exists."
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const result = await getDb().collection("users").insertOne(user);
|
|
58
|
+
return res.status(200).json({
|
|
59
|
+
success: true,
|
|
60
|
+
message: "User created successfully.",
|
|
61
|
+
userId: result.insertedId
|
|
62
|
+
});
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error("Error creating user:", error);
|
|
65
|
+
return res.status(500).json({
|
|
66
|
+
success: false,
|
|
67
|
+
message: "Internal server error."
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
router.get("/", async (req, res) => {
|
|
72
|
+
const {
|
|
73
|
+
projectId,
|
|
74
|
+
_id,
|
|
75
|
+
phoneNumber,
|
|
76
|
+
email
|
|
77
|
+
} = req.query;
|
|
78
|
+
if (!_id && !phoneNumber && !email) {
|
|
79
|
+
return res.status(400).json({
|
|
80
|
+
success: false,
|
|
81
|
+
message: "no filters provided.",
|
|
82
|
+
users: []
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const filter = {
|
|
86
|
+
projectId
|
|
87
|
+
};
|
|
88
|
+
if (_id) {
|
|
89
|
+
try {
|
|
90
|
+
filter._id = new ObjectId(_id);
|
|
91
|
+
} catch (e) {
|
|
92
|
+
return res.status(400).json({
|
|
93
|
+
success: false,
|
|
94
|
+
message: "Invalid _id format."
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (phoneNumber) {
|
|
99
|
+
filter.phoneNumber = phoneNumber;
|
|
100
|
+
}
|
|
101
|
+
if (email) {
|
|
102
|
+
filter.email = email;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const users = await getDb().collection("users").find(filter).toArray();
|
|
106
|
+
return res.status(200).json({
|
|
107
|
+
success: true,
|
|
108
|
+
message: "Users fetched successfully.",
|
|
109
|
+
users
|
|
110
|
+
});
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error("Error fetching users:", error);
|
|
113
|
+
return res.status(500).json({
|
|
114
|
+
success: false,
|
|
115
|
+
message: "Internal server error."
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
router.post("/getOrCreate", async (req, res) => {
|
|
120
|
+
const {
|
|
121
|
+
projectId,
|
|
122
|
+
phoneNumber,
|
|
123
|
+
email,
|
|
124
|
+
...userData
|
|
125
|
+
} = req.body;
|
|
126
|
+
if (!phoneNumber && !email) {
|
|
127
|
+
return res.status(400).json({
|
|
128
|
+
success: false,
|
|
129
|
+
message: "phoneNumber or email is required."
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const user = {
|
|
133
|
+
projectId,
|
|
134
|
+
phoneNumber,
|
|
135
|
+
email,
|
|
136
|
+
...userData,
|
|
137
|
+
createdAt: new Date()
|
|
138
|
+
};
|
|
139
|
+
try {
|
|
140
|
+
const usersCollection = getDb().collection("users");
|
|
141
|
+
let existingUser = null;
|
|
142
|
+
if (phoneNumber) {
|
|
143
|
+
existingUser = await usersCollection.findOne({
|
|
144
|
+
projectId,
|
|
145
|
+
phoneNumber
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if (!existingUser && email) {
|
|
149
|
+
existingUser = await usersCollection.findOne({
|
|
150
|
+
projectId,
|
|
151
|
+
email
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (existingUser) {
|
|
155
|
+
return res.status(200).json({
|
|
156
|
+
success: true,
|
|
157
|
+
message: "User already exists.",
|
|
158
|
+
userId: existingUser._id
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const result = await usersCollection.insertOne(user);
|
|
162
|
+
return res.status(200).json({
|
|
163
|
+
success: true,
|
|
164
|
+
message: "User created successfully.",
|
|
165
|
+
userId: result.insertedId
|
|
166
|
+
});
|
|
167
|
+
} catch (error) {
|
|
168
|
+
console.error("Error creating or fetching user:", error);
|
|
169
|
+
return res.status(500).json({
|
|
170
|
+
success: false,
|
|
171
|
+
message: "Internal server error."
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
module.exports = router;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
const router = express.Router();
|
|
5
|
+
const {
|
|
6
|
+
getDb
|
|
7
|
+
} = require("../services/mongo");
|
|
8
|
+
|
|
9
|
+
// Get waitlist entries
|
|
10
|
+
router.get('/', async (req, res) => {
|
|
11
|
+
const {
|
|
12
|
+
projectId
|
|
13
|
+
} = req.query;
|
|
14
|
+
try {
|
|
15
|
+
const query = {
|
|
16
|
+
projectId
|
|
17
|
+
};
|
|
18
|
+
console.log("Filter.....:", query);
|
|
19
|
+
const waitlistData = await getDb().collection("waitlists").find(query).toArray();
|
|
20
|
+
if (!waitlistData || waitlistData.length === 0) {
|
|
21
|
+
console.log("Data not found.");
|
|
22
|
+
return res.status(200).json({
|
|
23
|
+
success: true,
|
|
24
|
+
entries: []
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const sortedData = waitlistData.sort((a, b) => new Date(b === null || b === void 0 ? void 0 : b.createdAt) - new Date(a === null || a === void 0 ? void 0 : a.createdAt));
|
|
28
|
+
console.log("Waitlist entries retrieved and sorted:", sortedData);
|
|
29
|
+
return res.status(200).json({
|
|
30
|
+
success: true,
|
|
31
|
+
entries: sortedData
|
|
32
|
+
});
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error("Error retrieving waitlist entries:", error);
|
|
35
|
+
return res.status(500).json({
|
|
36
|
+
success: false,
|
|
37
|
+
message: "Failed to retrieve waitlist entries."
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Original POST endpoint for adding to waitlist
|
|
43
|
+
router.post("/", async (req, res) => {
|
|
44
|
+
const {
|
|
45
|
+
projectId,
|
|
46
|
+
email
|
|
47
|
+
} = req.body;
|
|
48
|
+
try {
|
|
49
|
+
const existingEntry = await getDb().collection("waitlists").findOne({
|
|
50
|
+
projectId,
|
|
51
|
+
email
|
|
52
|
+
});
|
|
53
|
+
if (existingEntry) {
|
|
54
|
+
return res.status(400).json({
|
|
55
|
+
success: false,
|
|
56
|
+
message: "You are already in the waitlist "
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error("Error checking waitlist:", error);
|
|
61
|
+
return res.status(500).json({
|
|
62
|
+
success: false,
|
|
63
|
+
message: "Failed to check waitlist due to a server error."
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const waitListData = {
|
|
67
|
+
projectId,
|
|
68
|
+
email,
|
|
69
|
+
createdAt: new Date()
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
const result = await getDb().collection("waitlists").insertOne(waitListData);
|
|
73
|
+
if (result && result.insertedId) {
|
|
74
|
+
return res.status(200).json({
|
|
75
|
+
success: true,
|
|
76
|
+
message: "you are added in the waitist",
|
|
77
|
+
userId: result.insertedId
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
console.error("Insert operation failed. Result:", result);
|
|
81
|
+
return res.status(500).json({
|
|
82
|
+
success: false,
|
|
83
|
+
message: "user could not be added."
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error("Error adding user:", error);
|
|
88
|
+
return res.status(500).json({
|
|
89
|
+
success: false,
|
|
90
|
+
message: "Failed to add user due to a server error."
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
module.exports = router;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Config for powr-sdk-api
|
|
4
|
+
// Uses environment variables from host project
|
|
5
|
+
|
|
6
|
+
const getConfig = () => {
|
|
7
|
+
const config = {
|
|
8
|
+
mongoUri: process.env.MONGODB_URI,
|
|
9
|
+
jwtToken: process.env.JWT_TOKEN
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// Validate required configs
|
|
13
|
+
if (!config.mongoUri) {
|
|
14
|
+
throw new Error('MONGODB_URI environment variable is required');
|
|
15
|
+
}
|
|
16
|
+
if (!config.jwtToken) {
|
|
17
|
+
throw new Error('JWT_TOKEN environment variable is required');
|
|
18
|
+
}
|
|
19
|
+
return config;
|
|
20
|
+
};
|
|
21
|
+
module.exports = {
|
|
22
|
+
getConfig
|
|
23
|
+
};
|