powr-sdk-api 4.1.10 → 4.3.0
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/dist/index.js +7 -5
- package/dist/{services → managers}/functions.js +1 -1
- package/dist/managers/index.js +26 -0
- package/dist/{services/scheduledTasks.js → managers/tasks.js} +123 -143
- package/dist/{services → managers}/tools.js +1 -1
- package/dist/middleware/projectId.js +1 -1
- package/dist/routes/functions.js +3 -1
- package/dist/routes/index.js +3 -27
- package/dist/routes/tasks.js +304 -0
- package/dist/routes/tools.js +21 -8
- package/package.json +69 -71
- package/dist/admin/activities.js +0 -81
- package/dist/admin/auth.js +0 -234
- package/dist/admin/blogs.js +0 -94
- package/dist/admin/comments.js +0 -83
- package/dist/admin/files.js +0 -56
- package/dist/admin/forms.js +0 -242
- package/dist/admin/index.js +0 -53
- package/dist/admin/invoice.js +0 -163
- package/dist/admin/likes.js +0 -126
- package/dist/admin/notifications.js +0 -93
- package/dist/admin/plexx.js +0 -53
- package/dist/admin/ratings.js +0 -189
- package/dist/admin/routes.js +0 -132
- package/dist/admin/slides.js +0 -101
- package/dist/admin/users.js +0 -175
- package/dist/admin/waitlists.js +0 -94
- package/dist/logger/gcs.js +0 -78
- package/dist/logger/s3.js +0 -78
- package/dist/middleware/auth.js +0 -76
- package/dist/middleware/logger.js +0 -45
- package/dist/middleware/response.js +0 -53
- package/dist/routes/admin/index.js +0 -520
- package/dist/routes/blogs.js +0 -94
- package/dist/routes/invoice.js +0 -167
- package/dist/routes/plexx.js +0 -269
- package/dist/routes/routes.js +0 -143
- package/dist/routes/scheduledTasks.js +0 -240
- package/dist/scripts/update-tools-schema.js +0 -157
- package/dist/services/dbService.js +0 -42
- package/dist/services/logger.js +0 -35
- package/dist/services/plexx.js +0 -229
- package/dist/utils/auth.js +0 -19
- package/dist/utils/logger.js +0 -57
- package/dist/utils/s3-transport.js +0 -61
- package/dist/utils/s3.js +0 -78
package/dist/admin/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const express = require('express');
|
|
4
|
-
|
|
5
|
-
// Import all route modules
|
|
6
|
-
const commentsRoutes = require('./comments');
|
|
7
|
-
// const filesRoutes = require('./files'); // Commented out for now
|
|
8
|
-
const formsRoutes = require('./forms');
|
|
9
|
-
const invoiceRoutes = require('./invoice');
|
|
10
|
-
const likesRoutes = require('./likes');
|
|
11
|
-
const plexxRoutes = require('./plexx');
|
|
12
|
-
const ratingsRoutes = require('./ratings');
|
|
13
|
-
const usersRoutes = require('./users');
|
|
14
|
-
const waitlistsRoutes = require('./waitlists');
|
|
15
|
-
const activitiesRoutes = require('./activities');
|
|
16
|
-
const authRoutes = require('./auth');
|
|
17
|
-
const blogsRoutes = require('./blogs');
|
|
18
|
-
const slidesRoutes = require('./slides');
|
|
19
|
-
const notificationsRoutes = require('./notifications');
|
|
20
|
-
const createPowrRoutes = () => {
|
|
21
|
-
// Get config from environment variables
|
|
22
|
-
const {
|
|
23
|
-
getConfig
|
|
24
|
-
} = require('../config');
|
|
25
|
-
const config = getConfig();
|
|
26
|
-
const router = express.Router();
|
|
27
|
-
|
|
28
|
-
// Middleware to inject projectId into all requests
|
|
29
|
-
router.use((req, res, next) => {
|
|
30
|
-
req.projectId = config.projectId;
|
|
31
|
-
next();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// Mount all route modules
|
|
35
|
-
router.use('/comments', commentsRoutes);
|
|
36
|
-
// router.use('/files', filesRoutes); // Commented out for now
|
|
37
|
-
router.use('/forms', formsRoutes);
|
|
38
|
-
router.use('/invoice', invoiceRoutes);
|
|
39
|
-
router.use('/likes', likesRoutes);
|
|
40
|
-
router.use('/plexx', plexxRoutes);
|
|
41
|
-
router.use('/ratings', ratingsRoutes);
|
|
42
|
-
router.use('/users', usersRoutes);
|
|
43
|
-
router.use('/waitlists', waitlistsRoutes);
|
|
44
|
-
router.use('/activities', activitiesRoutes);
|
|
45
|
-
router.use('/auth', authRoutes);
|
|
46
|
-
router.use('/blogs', blogsRoutes);
|
|
47
|
-
router.use('/slides', slidesRoutes);
|
|
48
|
-
router.use('/notifications', notificationsRoutes);
|
|
49
|
-
return router;
|
|
50
|
-
};
|
|
51
|
-
module.exports = {
|
|
52
|
-
createPowrRoutes
|
|
53
|
-
};
|
package/dist/admin/invoice.js
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
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.get('/', async (req, res) => {
|
|
12
|
-
const {
|
|
13
|
-
projectId
|
|
14
|
-
} = req.query;
|
|
15
|
-
try {
|
|
16
|
-
const query = {
|
|
17
|
-
projectId
|
|
18
|
-
};
|
|
19
|
-
if (!projectId) {
|
|
20
|
-
return res.status(400).json({
|
|
21
|
-
success: false,
|
|
22
|
-
message: 'projectId is required.'
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
const invoiceData = await getDb().collection("invoices").find(query).toArray();
|
|
26
|
-
return res.status(200).json({
|
|
27
|
-
success: true,
|
|
28
|
-
invoices: invoiceData
|
|
29
|
-
});
|
|
30
|
-
} catch (error) {
|
|
31
|
-
console.error("Error retrieving invoices :", error);
|
|
32
|
-
return res.status(500).json({
|
|
33
|
-
success: false,
|
|
34
|
-
message: "Failed to retrieve invoices ."
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
router.get('/:invoiceId', async (req, res) => {
|
|
39
|
-
const {
|
|
40
|
-
invoiceId
|
|
41
|
-
} = req.params;
|
|
42
|
-
const {
|
|
43
|
-
projectId
|
|
44
|
-
} = req.query;
|
|
45
|
-
try {
|
|
46
|
-
if (!projectId) {
|
|
47
|
-
return res.status(400).json({
|
|
48
|
-
success: false,
|
|
49
|
-
message: 'projectId is required.'
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
const _id = new ObjectId(invoiceId);
|
|
53
|
-
const invoiceData = await getDb().collection("invoices").findOne({
|
|
54
|
-
_id,
|
|
55
|
-
projectId
|
|
56
|
-
});
|
|
57
|
-
return res.status(200).json({
|
|
58
|
-
success: true,
|
|
59
|
-
invoice: invoiceData
|
|
60
|
-
});
|
|
61
|
-
} catch (error) {
|
|
62
|
-
console.error("Error retrieving invoice :", error);
|
|
63
|
-
return res.status(500).json({
|
|
64
|
-
success: false,
|
|
65
|
-
message: "Failed to retrieve invoice."
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
router.post('/', async (req, res) => {
|
|
70
|
-
const {
|
|
71
|
-
projectId
|
|
72
|
-
} = req.query;
|
|
73
|
-
const {
|
|
74
|
-
invoiceNumber,
|
|
75
|
-
dateOfIssue,
|
|
76
|
-
paymentStatus,
|
|
77
|
-
customerInfo,
|
|
78
|
-
serviceSection,
|
|
79
|
-
paymentSection
|
|
80
|
-
} = req.body;
|
|
81
|
-
if (!projectId) {
|
|
82
|
-
return res.status(400).json({
|
|
83
|
-
success: false,
|
|
84
|
-
message: "projectId is required."
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const invoice = {
|
|
88
|
-
invoiceNumber,
|
|
89
|
-
dateOfIssue,
|
|
90
|
-
paymentStatus,
|
|
91
|
-
customerInfo,
|
|
92
|
-
serviceSection,
|
|
93
|
-
paymentSection,
|
|
94
|
-
createdAt: new Date()
|
|
95
|
-
};
|
|
96
|
-
invoice.projectId = projectId;
|
|
97
|
-
try {
|
|
98
|
-
const result = await getDb().collection("invoices").insertOne(invoice);
|
|
99
|
-
if (result && result.insertedId) {
|
|
100
|
-
return res.status(201).json({
|
|
101
|
-
success: true,
|
|
102
|
-
message: "Invoice created successfully.",
|
|
103
|
-
invoiceId: result.insertedId,
|
|
104
|
-
invoice
|
|
105
|
-
});
|
|
106
|
-
} else {
|
|
107
|
-
return res.status(500).json({
|
|
108
|
-
success: false,
|
|
109
|
-
message: "Invoice could not be added."
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
} catch (error) {
|
|
113
|
-
console.error("Error adding invoice:", error);
|
|
114
|
-
return res.status(500).json({
|
|
115
|
-
success: false,
|
|
116
|
-
message: "Failed to add invoice due to a server error."
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
router.put('/:invoiceId', async (req, res) => {
|
|
121
|
-
const {
|
|
122
|
-
invoiceId
|
|
123
|
-
} = req.params;
|
|
124
|
-
const {
|
|
125
|
-
projectId
|
|
126
|
-
} = req.query;
|
|
127
|
-
if (!projectId) {
|
|
128
|
-
return res.status(400).json({
|
|
129
|
-
success: false,
|
|
130
|
-
message: "projectId is required."
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
let filter;
|
|
134
|
-
try {
|
|
135
|
-
filter = {
|
|
136
|
-
_id: new ObjectId(invoiceId),
|
|
137
|
-
projectId: projectId
|
|
138
|
-
};
|
|
139
|
-
} catch (e) {
|
|
140
|
-
return res.status(400).json({
|
|
141
|
-
success: false,
|
|
142
|
-
message: "Invalid invoiceId format."
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
const updateData = req.body;
|
|
146
|
-
try {
|
|
147
|
-
const result = await getDb().collection("invoices").updateOne(filter, {
|
|
148
|
-
$set: updateData
|
|
149
|
-
});
|
|
150
|
-
return res.status(200).json({
|
|
151
|
-
success: true,
|
|
152
|
-
message: "Invoice updated successfully.",
|
|
153
|
-
result: result
|
|
154
|
-
});
|
|
155
|
-
} catch (error) {
|
|
156
|
-
console.error("Error updating invoice:", error);
|
|
157
|
-
return res.status(500).json({
|
|
158
|
-
success: false,
|
|
159
|
-
message: "Failed to update invoice due to a server error."
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
module.exports = router;
|
package/dist/admin/likes.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
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
|
-
// Like/Unlike endpoint
|
|
13
|
-
router.post('/', async (req, res) => {
|
|
14
|
-
const {
|
|
15
|
-
liked
|
|
16
|
-
} = req.body;
|
|
17
|
-
const {
|
|
18
|
-
userId,
|
|
19
|
-
projectId,
|
|
20
|
-
contentId
|
|
21
|
-
} = req.query;
|
|
22
|
-
if (!userId || typeof liked !== 'boolean' || !projectId) {
|
|
23
|
-
return res.status(400).json({
|
|
24
|
-
success: false,
|
|
25
|
-
message: 'userId and projectId are required in query, liked (boolean) is required in body.'
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const query = {
|
|
30
|
-
userId: new ObjectId(userId),
|
|
31
|
-
projectId
|
|
32
|
-
};
|
|
33
|
-
const setObj = {
|
|
34
|
-
liked
|
|
35
|
-
};
|
|
36
|
-
if (contentId) {
|
|
37
|
-
query.contentId = contentId;
|
|
38
|
-
setObj.contentId = contentId;
|
|
39
|
-
}
|
|
40
|
-
const response = await getDb().collection('likes').updateOne(query, {
|
|
41
|
-
$set: setObj
|
|
42
|
-
}, {
|
|
43
|
-
upsert: true
|
|
44
|
-
});
|
|
45
|
-
return res.status(200).json({
|
|
46
|
-
success: true,
|
|
47
|
-
message: liked ? 'Liked.' : 'Unliked.',
|
|
48
|
-
response
|
|
49
|
-
});
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error('Error updating like status:', error);
|
|
52
|
-
return res.status(500).json({
|
|
53
|
-
success: false,
|
|
54
|
-
message: 'Failed to update like status.'
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
router.get('/', async (req, res) => {
|
|
59
|
-
const {
|
|
60
|
-
projectId,
|
|
61
|
-
contentId
|
|
62
|
-
} = req.query;
|
|
63
|
-
if (!projectId) {
|
|
64
|
-
return res.status(400).json({
|
|
65
|
-
success: false,
|
|
66
|
-
message: 'projectId is required in query.'
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const query = {
|
|
71
|
-
projectId
|
|
72
|
-
};
|
|
73
|
-
if (contentId) {
|
|
74
|
-
query.contentId = contentId;
|
|
75
|
-
}
|
|
76
|
-
const likes = await getDb().collection('likes').find(query).toArray();
|
|
77
|
-
const likesCount = likes.filter(like => like.liked === true).length;
|
|
78
|
-
const unlikesCount = likes.filter(like => like.liked === false).length;
|
|
79
|
-
return res.status(200).json({
|
|
80
|
-
success: true,
|
|
81
|
-
likes,
|
|
82
|
-
likesCount,
|
|
83
|
-
unlikesCount
|
|
84
|
-
});
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.error('Error fetching likes:', error);
|
|
87
|
-
return res.status(500).json({
|
|
88
|
-
success: false,
|
|
89
|
-
message: 'Failed to fetch likes.'
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
router.get('/:likeId', async (req, res) => {
|
|
94
|
-
const {
|
|
95
|
-
likeId
|
|
96
|
-
} = req.params;
|
|
97
|
-
const {
|
|
98
|
-
projectId,
|
|
99
|
-
contentId
|
|
100
|
-
} = req.query;
|
|
101
|
-
try {
|
|
102
|
-
const filter = {
|
|
103
|
-
userId: new ObjectId(likeId)
|
|
104
|
-
};
|
|
105
|
-
if (projectId) filter.projectId = projectId;
|
|
106
|
-
if (contentId) filter.contentId = contentId;
|
|
107
|
-
const like = await getDb().collection('likes').findOne(filter);
|
|
108
|
-
if (!like) {
|
|
109
|
-
return res.status(404).json({
|
|
110
|
-
success: false,
|
|
111
|
-
message: 'Like not found.'
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
return res.status(200).json({
|
|
115
|
-
success: true,
|
|
116
|
-
like
|
|
117
|
-
});
|
|
118
|
-
} catch (error) {
|
|
119
|
-
console.error('Error fetching like by id:', error);
|
|
120
|
-
return res.status(500).json({
|
|
121
|
-
success: false,
|
|
122
|
-
message: 'Failed to fetch like.'
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
module.exports = router;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const express = require('express');
|
|
4
|
-
const router = express.Router();
|
|
5
|
-
const {
|
|
6
|
-
getDb
|
|
7
|
-
} = require('../services/mongo');
|
|
8
|
-
// const tokenService = require('../services/tokenService');
|
|
9
|
-
|
|
10
|
-
// Get notifications
|
|
11
|
-
router.get('/', async (req, res) => {
|
|
12
|
-
const {
|
|
13
|
-
projectId
|
|
14
|
-
} = req.query;
|
|
15
|
-
try {
|
|
16
|
-
const query = {
|
|
17
|
-
projectId
|
|
18
|
-
};
|
|
19
|
-
console.log("Filter.....:", query);
|
|
20
|
-
const notificationData = await getDb().collection('notifications').find(query).toArray();
|
|
21
|
-
if (!notificationData || notificationData.length === 0) {
|
|
22
|
-
console.log("Data not found.");
|
|
23
|
-
return res.status(200).json({
|
|
24
|
-
success: true,
|
|
25
|
-
notification: []
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
const sortedData = notificationData.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));
|
|
29
|
-
console.log("Notifications retrieved and sorted:", sortedData);
|
|
30
|
-
return res.status(200).json({
|
|
31
|
-
success: true,
|
|
32
|
-
notification: sortedData
|
|
33
|
-
});
|
|
34
|
-
} catch (error) {
|
|
35
|
-
console.error("Error retrieving notifications:", error);
|
|
36
|
-
return res.status(500).json({
|
|
37
|
-
success: false,
|
|
38
|
-
message: "Failed to retrieve notifications."
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Send notification
|
|
44
|
-
router.post('/', async (req, res) => {
|
|
45
|
-
const {
|
|
46
|
-
projectId,
|
|
47
|
-
title,
|
|
48
|
-
description,
|
|
49
|
-
filter,
|
|
50
|
-
imgurl
|
|
51
|
-
} = req.body;
|
|
52
|
-
if (typeof filter !== 'object' || Array.isArray(filter) || filter === null) {
|
|
53
|
-
return res.status(400).json({
|
|
54
|
-
success: false,
|
|
55
|
-
message: "Filter should be a valid object."
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
const notificationData = {
|
|
59
|
-
projectId,
|
|
60
|
-
filter,
|
|
61
|
-
imgurl,
|
|
62
|
-
title,
|
|
63
|
-
description,
|
|
64
|
-
createdAt: new Date()
|
|
65
|
-
};
|
|
66
|
-
try {
|
|
67
|
-
const result = await getDb().collection('notifications').insertOne(notificationData);
|
|
68
|
-
if (result && result.insertedId) {
|
|
69
|
-
console.log("Notification added with ID:", result.insertedId);
|
|
70
|
-
|
|
71
|
-
// await tokenService.sendNotificationsToProjectUsers(projectId, notificationData);
|
|
72
|
-
|
|
73
|
-
return res.status(200).json({
|
|
74
|
-
success: true,
|
|
75
|
-
message: "Notification added and sent successfully.",
|
|
76
|
-
notificationId: result.insertedId
|
|
77
|
-
});
|
|
78
|
-
} else {
|
|
79
|
-
console.error("Insert operation failed. Result:", result);
|
|
80
|
-
return res.status(500).json({
|
|
81
|
-
success: false,
|
|
82
|
-
message: "Notification could not be added."
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.error("Error adding notification:", error);
|
|
87
|
-
return res.status(500).json({
|
|
88
|
-
success: false,
|
|
89
|
-
message: "Failed to add notification due to a server error."
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
module.exports = router;
|
package/dist/admin/plexx.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const express = require("express");
|
|
4
|
-
const router = express.Router();
|
|
5
|
-
const {
|
|
6
|
-
getDb
|
|
7
|
-
} = require("../services/mongo");
|
|
8
|
-
const data = [{
|
|
9
|
-
age: 12
|
|
10
|
-
}, {
|
|
11
|
-
age: 45
|
|
12
|
-
}];
|
|
13
|
-
router.get("/:route", async (req, res) => {
|
|
14
|
-
const {
|
|
15
|
-
route
|
|
16
|
-
} = req.params;
|
|
17
|
-
const {
|
|
18
|
-
name,
|
|
19
|
-
projectId
|
|
20
|
-
} = req.query;
|
|
21
|
-
if (!projectId) {
|
|
22
|
-
return res.status(400).json({
|
|
23
|
-
success: false,
|
|
24
|
-
message: 'projectId is required.'
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
const logicEntry = await getDb().collection("routes").findOne({
|
|
28
|
-
route,
|
|
29
|
-
projectId
|
|
30
|
-
});
|
|
31
|
-
if (!logicEntry) {
|
|
32
|
-
return res.status(404).json({
|
|
33
|
-
success: false,
|
|
34
|
-
message: "Logic not found"
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
const codeString = logicEntry.code;
|
|
38
|
-
try {
|
|
39
|
-
const logicFunction = new Function("age", codeString);
|
|
40
|
-
const status = logicFunction(name);
|
|
41
|
-
return res.status(200).json({
|
|
42
|
-
success: true,
|
|
43
|
-
data: status
|
|
44
|
-
});
|
|
45
|
-
} catch (err) {
|
|
46
|
-
console.error("Error executing logic:", err);
|
|
47
|
-
return res.status(500).json({
|
|
48
|
-
success: false,
|
|
49
|
-
message: "Error executing logic"
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
module.exports = router;
|
package/dist/admin/ratings.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
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
|
-
itemId,
|
|
16
|
-
rating,
|
|
17
|
-
review,
|
|
18
|
-
userId
|
|
19
|
-
} = req.body;
|
|
20
|
-
const projectId = req.projectId;
|
|
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 db = await getDb();
|
|
37
|
-
const result = await db.collection("ratings").insertOne(ratingData);
|
|
38
|
-
if (result && result.insertedId) {
|
|
39
|
-
console.log("ratings added with ID:", result.insertedId);
|
|
40
|
-
return res.status(200).json({
|
|
41
|
-
success: true,
|
|
42
|
-
message: "rating added successfully.",
|
|
43
|
-
ratingId: result.insertedId
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
console.error("Insert operation failed. Result:", result);
|
|
47
|
-
return res.status(500).json({
|
|
48
|
-
success: false,
|
|
49
|
-
message: "ratings/reviews could not be added."
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error("Error adding ratings:", error);
|
|
54
|
-
return res.status(500).json({
|
|
55
|
-
success: false,
|
|
56
|
-
message: "Failed to add ratings/reviews due to a server error."
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
//get ratings
|
|
62
|
-
router.get("/", async (req, res) => {
|
|
63
|
-
const {
|
|
64
|
-
itemId,
|
|
65
|
-
userId
|
|
66
|
-
} = req.query;
|
|
67
|
-
const projectId = req.projectId;
|
|
68
|
-
if (!projectId) {
|
|
69
|
-
return res.status(400).json({
|
|
70
|
-
success: false,
|
|
71
|
-
message: "projectId is required."
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
try {
|
|
75
|
-
const query = {
|
|
76
|
-
projectId
|
|
77
|
-
};
|
|
78
|
-
if (itemId) query.itemId = itemId;
|
|
79
|
-
if (userId) query.userId = userId;
|
|
80
|
-
console.log("Filter....:", query);
|
|
81
|
-
const db = await getDb();
|
|
82
|
-
const ratingData = await db.collection("ratings").find(query).toArray();
|
|
83
|
-
if (!ratingData || ratingData.length === 0) {
|
|
84
|
-
console.log("Data not found.");
|
|
85
|
-
return res.status(200).json({
|
|
86
|
-
success: true,
|
|
87
|
-
ratings: []
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
return res.status(200).json({
|
|
91
|
-
success: true,
|
|
92
|
-
ratings: ratingData
|
|
93
|
-
});
|
|
94
|
-
} catch (error) {
|
|
95
|
-
console.error("Error retrieving ratings:", error);
|
|
96
|
-
return res.status(500).json({
|
|
97
|
-
success: false,
|
|
98
|
-
message: "Failed to retrieve ratings."
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// delete ratings
|
|
104
|
-
router.delete("/", async (req, res) => {
|
|
105
|
-
const {
|
|
106
|
-
ratingId
|
|
107
|
-
} = req.query;
|
|
108
|
-
const projectId = req.projectId;
|
|
109
|
-
if (!ratingId || !projectId) {
|
|
110
|
-
return res.status(400).json({
|
|
111
|
-
success: false,
|
|
112
|
-
message: "Both ratingId and projectId are required to delete a rating."
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
const db = await getDb();
|
|
117
|
-
const result = await db.collection("ratings").deleteOne({
|
|
118
|
-
_id: new ObjectId(ratingId),
|
|
119
|
-
projectId: projectId
|
|
120
|
-
});
|
|
121
|
-
if (result.deletedCount === 0) {
|
|
122
|
-
return res.status(404).json({
|
|
123
|
-
success: false,
|
|
124
|
-
message: "Rating not found for the given ratingId and projectId."
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
return res.status(200).json({
|
|
128
|
-
success: true,
|
|
129
|
-
message: "Rating deleted successfully."
|
|
130
|
-
});
|
|
131
|
-
} catch (error) {
|
|
132
|
-
console.error("Error deleting rating:", error);
|
|
133
|
-
return res.status(500).json({
|
|
134
|
-
success: false,
|
|
135
|
-
message: "Failed to delete rating due to a server error."
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
// Calculate average rating
|
|
141
|
-
router.get("/average", async (req, res) => {
|
|
142
|
-
const {
|
|
143
|
-
itemId
|
|
144
|
-
} = req.query;
|
|
145
|
-
const projectId = req.projectId;
|
|
146
|
-
if (!projectId || !itemId) {
|
|
147
|
-
return res.status(400).json({
|
|
148
|
-
success: false,
|
|
149
|
-
message: "Both projectId and itemId are required."
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
try {
|
|
153
|
-
const db = await getDb();
|
|
154
|
-
const result = await db.collection("ratings").aggregate([{
|
|
155
|
-
$match: {
|
|
156
|
-
projectId,
|
|
157
|
-
itemId
|
|
158
|
-
}
|
|
159
|
-
}, {
|
|
160
|
-
$group: {
|
|
161
|
-
_id: null,
|
|
162
|
-
averageRating: {
|
|
163
|
-
$avg: "$rating"
|
|
164
|
-
},
|
|
165
|
-
totalRatings: {
|
|
166
|
-
$sum: 1
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}]).toArray();
|
|
170
|
-
if (result.length === 0) {
|
|
171
|
-
return res.status(404).json({
|
|
172
|
-
success: false,
|
|
173
|
-
message: "No ratings found for the given projectId and itemId."
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
return res.status(200).json({
|
|
177
|
-
success: true,
|
|
178
|
-
averageRating: result[0].averageRating.toFixed(2),
|
|
179
|
-
totalRatings: result[0].totalRatings
|
|
180
|
-
});
|
|
181
|
-
} catch (error) {
|
|
182
|
-
console.error("Error calculating average rating:", error);
|
|
183
|
-
return res.status(500).json({
|
|
184
|
-
success: false,
|
|
185
|
-
message: "Failed to calculate average rating."
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
module.exports = router;
|