powr-sdk-api 4.2.0 → 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 → managers}/tasks.js +123 -143
- package/dist/{services → managers}/tools.js +1 -1
- package/dist/routes/functions.js +3 -1
- package/dist/routes/index.js +2 -17
- package/dist/routes/tasks.js +184 -63
- 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/services/scheduledTasks.js +0 -459
- 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/auth.js
DELETED
|
@@ -1,234 +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
|
-
const bcrypt = require("bcrypt");
|
|
12
|
-
const {
|
|
13
|
-
generateJWTToken
|
|
14
|
-
} = require("../middleware/jwtToken");
|
|
15
|
-
const {
|
|
16
|
-
config
|
|
17
|
-
} = require("../config");
|
|
18
|
-
|
|
19
|
-
// Register User
|
|
20
|
-
router.post("/register", async (req, res) => {
|
|
21
|
-
const {
|
|
22
|
-
fullName,
|
|
23
|
-
username,
|
|
24
|
-
password
|
|
25
|
-
} = req.body;
|
|
26
|
-
try {
|
|
27
|
-
if (!fullName || !username || !password) {
|
|
28
|
-
return res.status(400).json({
|
|
29
|
-
success: false,
|
|
30
|
-
message: "Full name, username and password are required"
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
const existingUser = await getDb().collection("users").findOne({
|
|
34
|
-
username: username
|
|
35
|
-
});
|
|
36
|
-
if (existingUser) {
|
|
37
|
-
return res.status(400).json({
|
|
38
|
-
success: false,
|
|
39
|
-
message: "The username is already taken"
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
const saltRounds = 10;
|
|
43
|
-
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
|
44
|
-
const newUser = {
|
|
45
|
-
fullName,
|
|
46
|
-
username,
|
|
47
|
-
password: hashedPassword,
|
|
48
|
-
createdAt: new Date()
|
|
49
|
-
};
|
|
50
|
-
const result = await getDb().collection("users").insertOne(newUser);
|
|
51
|
-
return res.status(201).json({
|
|
52
|
-
success: true,
|
|
53
|
-
message: "User registered successfully",
|
|
54
|
-
userId: result.insertedId
|
|
55
|
-
});
|
|
56
|
-
} catch (error) {
|
|
57
|
-
console.error("Error creating user:", error);
|
|
58
|
-
return res.status(500).json({
|
|
59
|
-
success: false,
|
|
60
|
-
message: "Failed to create user."
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// Login User
|
|
66
|
-
router.post("/login", async (req, res) => {
|
|
67
|
-
const {
|
|
68
|
-
username,
|
|
69
|
-
password
|
|
70
|
-
} = req.body;
|
|
71
|
-
try {
|
|
72
|
-
if (!username || !password) {
|
|
73
|
-
return res.status(400).json({
|
|
74
|
-
success: false,
|
|
75
|
-
message: "Username and password are required"
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
const user = await getDb().collection("users").findOne({
|
|
79
|
-
username: username
|
|
80
|
-
});
|
|
81
|
-
if (!user) {
|
|
82
|
-
return res.status(401).json({
|
|
83
|
-
success: false,
|
|
84
|
-
message: "Invalid username or password."
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const isPasswordValid = await bcrypt.compare(password, user.password);
|
|
88
|
-
if (!isPasswordValid) {
|
|
89
|
-
return res.status(401).json({
|
|
90
|
-
success: false,
|
|
91
|
-
message: "Invalid username or password."
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
const token = generateJWTToken(user);
|
|
95
|
-
const {
|
|
96
|
-
password: _,
|
|
97
|
-
...userWithoutPassword
|
|
98
|
-
} = user;
|
|
99
|
-
return res.status(200).json({
|
|
100
|
-
success: true,
|
|
101
|
-
message: "Login successful",
|
|
102
|
-
user: userWithoutPassword,
|
|
103
|
-
token: token
|
|
104
|
-
});
|
|
105
|
-
} catch (error) {
|
|
106
|
-
console.error("Error logging in:", error);
|
|
107
|
-
return res.status(500).json({
|
|
108
|
-
success: false,
|
|
109
|
-
message: "Failed to login."
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Forgot Password
|
|
115
|
-
router.post("/forgot-password", async (req, res) => {
|
|
116
|
-
const {
|
|
117
|
-
username
|
|
118
|
-
} = req.body;
|
|
119
|
-
try {
|
|
120
|
-
if (!username) {
|
|
121
|
-
return res.status(400).json({
|
|
122
|
-
success: false,
|
|
123
|
-
message: "Username is required"
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
const user = await getDb().collection("users").findOne({
|
|
127
|
-
username: username
|
|
128
|
-
});
|
|
129
|
-
if (!user) {
|
|
130
|
-
return res.status(404).json({
|
|
131
|
-
success: false,
|
|
132
|
-
message: "User not found."
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
const jwt = require('jsonwebtoken');
|
|
136
|
-
const resetPayload = {
|
|
137
|
-
userId: user._id.toString(),
|
|
138
|
-
type: 'reset',
|
|
139
|
-
iat: Math.floor(Date.now() / 1000),
|
|
140
|
-
exp: Math.floor(Date.now() / 1000) + 60 * 60
|
|
141
|
-
};
|
|
142
|
-
const resetToken = jwt.sign(resetPayload, config.jwtToken);
|
|
143
|
-
await getDb().collection("users").updateOne({
|
|
144
|
-
_id: user._id
|
|
145
|
-
}, {
|
|
146
|
-
$set: {
|
|
147
|
-
resetToken: resetToken,
|
|
148
|
-
resetTokenExpiry: new Date(Date.now() + 3600000)
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
return res.status(200).json({
|
|
152
|
-
success: true,
|
|
153
|
-
message: "Password reset token generated successfully",
|
|
154
|
-
resetToken: resetToken
|
|
155
|
-
});
|
|
156
|
-
} catch (error) {
|
|
157
|
-
console.error("Error in forgot password:", error);
|
|
158
|
-
return res.status(500).json({
|
|
159
|
-
success: false,
|
|
160
|
-
message: "Failed to process forgot password request."
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// Reset Password
|
|
166
|
-
router.post("/reset-password", async (req, res) => {
|
|
167
|
-
const {
|
|
168
|
-
resetToken,
|
|
169
|
-
newPassword
|
|
170
|
-
} = req.body;
|
|
171
|
-
try {
|
|
172
|
-
if (!resetToken || !newPassword) {
|
|
173
|
-
return res.status(400).json({
|
|
174
|
-
success: false,
|
|
175
|
-
message: "Reset token and new password are required"
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
const jwt = require('jsonwebtoken');
|
|
179
|
-
let decoded;
|
|
180
|
-
try {
|
|
181
|
-
decoded = jwt.verify(resetToken, config.jwtToken);
|
|
182
|
-
} catch (jwtError) {
|
|
183
|
-
return res.status(401).json({
|
|
184
|
-
success: false,
|
|
185
|
-
message: "Invalid or expired reset token"
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
if (!decoded || decoded.type !== 'reset' || !decoded.userId) {
|
|
189
|
-
return res.status(401).json({
|
|
190
|
-
success: false,
|
|
191
|
-
message: "Invalid reset token type or missing user ID"
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
const user = await getDb().collection("users").findOne({
|
|
195
|
-
_id: new ObjectId(decoded.userId),
|
|
196
|
-
resetToken: resetToken,
|
|
197
|
-
resetTokenExpiry: {
|
|
198
|
-
$gt: new Date()
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
if (!user) {
|
|
202
|
-
return res.status(401).json({
|
|
203
|
-
success: false,
|
|
204
|
-
message: "Invalid or expired reset token."
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Hash the new password
|
|
209
|
-
const saltRounds = 10;
|
|
210
|
-
const hashedPassword = await bcrypt.hash(newPassword, saltRounds);
|
|
211
|
-
await getDb().collection("users").updateOne({
|
|
212
|
-
_id: user._id
|
|
213
|
-
}, {
|
|
214
|
-
$set: {
|
|
215
|
-
password: hashedPassword
|
|
216
|
-
},
|
|
217
|
-
$unset: {
|
|
218
|
-
resetToken: "",
|
|
219
|
-
resetTokenExpiry: ""
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
return res.status(200).json({
|
|
223
|
-
success: true,
|
|
224
|
-
message: "Password reset successfully"
|
|
225
|
-
});
|
|
226
|
-
} catch (error) {
|
|
227
|
-
console.error("Error resetting password:", error);
|
|
228
|
-
return res.status(500).json({
|
|
229
|
-
success: false,
|
|
230
|
-
message: "Failed to reset password."
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
module.exports = router;
|
package/dist/admin/blogs.js
DELETED
|
@@ -1,94 +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
|
-
router.post('/', async (req, res) => {
|
|
9
|
-
const {
|
|
10
|
-
projectId
|
|
11
|
-
} = req.query;
|
|
12
|
-
const {
|
|
13
|
-
title,
|
|
14
|
-
author,
|
|
15
|
-
date,
|
|
16
|
-
description,
|
|
17
|
-
tags,
|
|
18
|
-
imageUrl
|
|
19
|
-
} = req.body;
|
|
20
|
-
if (!projectId || !title || !author || !date || !description) {
|
|
21
|
-
return res.status(400).json({
|
|
22
|
-
success: false,
|
|
23
|
-
message: 'projectId, title, author, date,and description are required.'
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
const blog = {
|
|
27
|
-
title,
|
|
28
|
-
author,
|
|
29
|
-
date,
|
|
30
|
-
description,
|
|
31
|
-
tags: tags || '',
|
|
32
|
-
imageUrl,
|
|
33
|
-
projectId,
|
|
34
|
-
createdAt: new Date()
|
|
35
|
-
};
|
|
36
|
-
try {
|
|
37
|
-
const result = await getDb().collection('blogs').insertOne(blog);
|
|
38
|
-
if (result && result.insertedId) {
|
|
39
|
-
return res.status(201).json({
|
|
40
|
-
success: true,
|
|
41
|
-
message: 'Blog created successfully.',
|
|
42
|
-
blogId: result.insertedId,
|
|
43
|
-
blog
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
return res.status(500).json({
|
|
47
|
-
success: false,
|
|
48
|
-
message: 'Blog could not be created.'
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
} catch (error) {
|
|
52
|
-
console.error('Error while creating blog:', error);
|
|
53
|
-
return res.status(500).json({
|
|
54
|
-
success: false,
|
|
55
|
-
message: 'Failed to create blog due to a server error.'
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
router.get('/', async (req, res) => {
|
|
60
|
-
const {
|
|
61
|
-
projectId,
|
|
62
|
-
contentId,
|
|
63
|
-
userId
|
|
64
|
-
} = req.query;
|
|
65
|
-
if (!projectId) {
|
|
66
|
-
return res.status(400).json({
|
|
67
|
-
success: false,
|
|
68
|
-
message: 'projectId is required in query.'
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
const query = {
|
|
73
|
-
projectId
|
|
74
|
-
};
|
|
75
|
-
if (contentId) {
|
|
76
|
-
query.contentId = contentId;
|
|
77
|
-
}
|
|
78
|
-
if (userId) {
|
|
79
|
-
query.author = userId;
|
|
80
|
-
}
|
|
81
|
-
const blogs = await getDb().collection('blogs').find(query).toArray();
|
|
82
|
-
return res.status(200).json({
|
|
83
|
-
success: true,
|
|
84
|
-
blogs: blogs
|
|
85
|
-
});
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('Error fetching blogs:', error);
|
|
88
|
-
return res.status(500).json({
|
|
89
|
-
success: false,
|
|
90
|
-
message: 'Failed to fetch blogs.'
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
module.exports = router;
|
package/dist/admin/comments.js
DELETED
|
@@ -1,83 +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
|
-
|
|
9
|
-
// Get comments
|
|
10
|
-
router.get("/", async (req, res) => {
|
|
11
|
-
const {
|
|
12
|
-
projectId,
|
|
13
|
-
contentId
|
|
14
|
-
} = req.query;
|
|
15
|
-
try {
|
|
16
|
-
const query = {
|
|
17
|
-
projectId
|
|
18
|
-
};
|
|
19
|
-
if (contentId) {
|
|
20
|
-
query.contentId = contentId;
|
|
21
|
-
}
|
|
22
|
-
console.log("Filter.....:", query);
|
|
23
|
-
const commentData = await getDb().collection("comments").find(query).toArray();
|
|
24
|
-
if (!commentData || commentData.length === 0) {
|
|
25
|
-
console.log("Data not found.");
|
|
26
|
-
return res.status(200).json({
|
|
27
|
-
success: true,
|
|
28
|
-
comments: []
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return res.status(200).json({
|
|
32
|
-
success: true,
|
|
33
|
-
comments: commentData
|
|
34
|
-
});
|
|
35
|
-
} catch (error) {
|
|
36
|
-
console.error("Error retrieving comments:", error);
|
|
37
|
-
return res.status(500).json({
|
|
38
|
-
success: false,
|
|
39
|
-
message: "Failed to retrieve comments."
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// Add comment
|
|
45
|
-
router.post("/", async (req, res) => {
|
|
46
|
-
const {
|
|
47
|
-
projectId,
|
|
48
|
-
contentId,
|
|
49
|
-
comment,
|
|
50
|
-
...customFields
|
|
51
|
-
} = req.body;
|
|
52
|
-
const commentData = {
|
|
53
|
-
projectId,
|
|
54
|
-
contentId,
|
|
55
|
-
comment,
|
|
56
|
-
...customFields,
|
|
57
|
-
createdAt: new Date()
|
|
58
|
-
};
|
|
59
|
-
try {
|
|
60
|
-
const result = await getDb().collection("comments").insertOne(commentData);
|
|
61
|
-
if (result && result.insertedId) {
|
|
62
|
-
console.log("Comment added with ID:", result.insertedId);
|
|
63
|
-
return res.status(200).json({
|
|
64
|
-
success: true,
|
|
65
|
-
message: "Comment added successfully.",
|
|
66
|
-
commentId: result.insertedId
|
|
67
|
-
});
|
|
68
|
-
} else {
|
|
69
|
-
console.error("Insert operation failed. Result:", result);
|
|
70
|
-
return res.status(500).json({
|
|
71
|
-
success: false,
|
|
72
|
-
message: "Comment could not be added."
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
console.error("Error adding comment:", error);
|
|
77
|
-
return res.status(500).json({
|
|
78
|
-
success: false,
|
|
79
|
-
message: "Failed to add comment due to a server error."
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
module.exports = router;
|
package/dist/admin/files.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const express = require('express');
|
|
4
|
-
const multer = require('multer');
|
|
5
|
-
// const { uploadToGCS, bucket } = require('../uploadToGCS')
|
|
6
|
-
const {
|
|
7
|
-
bucket,
|
|
8
|
-
uploadToGCS,
|
|
9
|
-
bucketName
|
|
10
|
-
} = require('../uploadToGCS.js');
|
|
11
|
-
// const uploadToGCS = require('../uploadToGCS.js')
|
|
12
|
-
|
|
13
|
-
const router = express.Router();
|
|
14
|
-
const upload = multer();
|
|
15
|
-
router.post('/', upload.single('file'), async (req, res) => {
|
|
16
|
-
try {
|
|
17
|
-
if (!req.file) {
|
|
18
|
-
return res.status(400).json({
|
|
19
|
-
status: 'error',
|
|
20
|
-
message: 'No file uploaded'
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
const url = await uploadToGCS(req.file);
|
|
24
|
-
return res.status(200).json({
|
|
25
|
-
status: 'success',
|
|
26
|
-
message: 'File uploaded successfully',
|
|
27
|
-
url
|
|
28
|
-
});
|
|
29
|
-
} catch (err) {
|
|
30
|
-
console.error('Error uploading file:', err);
|
|
31
|
-
return res.status(500).json({
|
|
32
|
-
status: 'error',
|
|
33
|
-
message: 'File upload failed',
|
|
34
|
-
error: err.message || 'Unknown error occurred'
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
router.get('/', async (req, res) => {
|
|
39
|
-
try {
|
|
40
|
-
const [files] = await bucket.getFiles();
|
|
41
|
-
const bucketName = bucket.name;
|
|
42
|
-
const imageUrls = files.map(file => `https://storage.googleapis.com/${bucketName}/${file.name}`);
|
|
43
|
-
return res.status(200).json({
|
|
44
|
-
message: 'Images fetched successfully',
|
|
45
|
-
images: imageUrls
|
|
46
|
-
});
|
|
47
|
-
} catch (err) {
|
|
48
|
-
console.error('Error listing files from GCS:', err);
|
|
49
|
-
return res.status(500).json({
|
|
50
|
-
status: 'error',
|
|
51
|
-
message: 'Failed to fetch images',
|
|
52
|
-
error: err.message || 'Unknown error occurred'
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
module.exports = router;
|
package/dist/admin/forms.js
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const express = require("express");
|
|
4
|
-
const router = express.Router();
|
|
5
|
-
const multer = require('multer');
|
|
6
|
-
const path = require('path');
|
|
7
|
-
const {
|
|
8
|
-
getDb
|
|
9
|
-
} = require('../services/dbService');
|
|
10
|
-
const upload = multer({
|
|
11
|
-
storage: multer.memoryStorage(),
|
|
12
|
-
fileFilter: function (req, file, cb) {
|
|
13
|
-
if (file.mimetype === 'application/json' || path.extname(file.originalname).toLowerCase() === '.json') {
|
|
14
|
-
cb(null, true);
|
|
15
|
-
} else {
|
|
16
|
-
cb(new Error('Only JSON files are allowed!'), false);
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
limits: {
|
|
20
|
-
fileSize: 5 * 1024 * 1024
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
// GET all powrForm data based on projectId
|
|
25
|
-
router.get("/powrform", async (req, res) => {
|
|
26
|
-
const projectId = req.projectId;
|
|
27
|
-
try {
|
|
28
|
-
const db = await getDb();
|
|
29
|
-
const collection = db.collection("powrForm");
|
|
30
|
-
const forms = await collection.find({
|
|
31
|
-
projectId
|
|
32
|
-
}).toArray();
|
|
33
|
-
res.status(200).json({
|
|
34
|
-
success: true,
|
|
35
|
-
message: "Fetching powrForm data",
|
|
36
|
-
count: forms.length,
|
|
37
|
-
data: forms
|
|
38
|
-
});
|
|
39
|
-
} catch (error) {
|
|
40
|
-
res.status(500).json({
|
|
41
|
-
success: false,
|
|
42
|
-
message: "Internal server error",
|
|
43
|
-
error: error.message
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// GET specific form by formName and projectId
|
|
49
|
-
router.get('/:formName', async (req, res) => {
|
|
50
|
-
try {
|
|
51
|
-
const {
|
|
52
|
-
formName
|
|
53
|
-
} = req.params;
|
|
54
|
-
const projectId = req.projectId;
|
|
55
|
-
if (!projectId) {
|
|
56
|
-
return res.status(400).json({
|
|
57
|
-
success: false,
|
|
58
|
-
message: 'projectId is required'
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
const db = await getDb();
|
|
62
|
-
const collection = db.collection("powrForm");
|
|
63
|
-
const formData = await collection.findOne({
|
|
64
|
-
formName,
|
|
65
|
-
projectId
|
|
66
|
-
});
|
|
67
|
-
if (!formData) {
|
|
68
|
-
return res.status(404).json({
|
|
69
|
-
success: false,
|
|
70
|
-
message: 'Form not found'
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
res.status(200).json({
|
|
74
|
-
success: true,
|
|
75
|
-
message: "Form fetched successfully",
|
|
76
|
-
data: formData
|
|
77
|
-
});
|
|
78
|
-
} catch (error) {
|
|
79
|
-
res.status(500).json({
|
|
80
|
-
success: false,
|
|
81
|
-
message: 'Error fetching form',
|
|
82
|
-
error: error.message
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// POST /studentform
|
|
88
|
-
router.post('/studentform', async (req, res) => {
|
|
89
|
-
try {
|
|
90
|
-
const formData = req.body;
|
|
91
|
-
const projectId = req.projectId;
|
|
92
|
-
const {
|
|
93
|
-
whatsapp,
|
|
94
|
-
formName,
|
|
95
|
-
email,
|
|
96
|
-
...otherFormFields
|
|
97
|
-
} = formData;
|
|
98
|
-
const db = await getDb();
|
|
99
|
-
const studentsFormCollection = db.collection('studentsForm');
|
|
100
|
-
const existingForm = await studentsFormCollection.findOne({
|
|
101
|
-
whatsapp: whatsapp,
|
|
102
|
-
projectId: projectId,
|
|
103
|
-
email: email,
|
|
104
|
-
formName: formName
|
|
105
|
-
});
|
|
106
|
-
if (existingForm) {
|
|
107
|
-
return res.status(409).json({
|
|
108
|
-
message: 'You have already submitted this form. Only one submission per form type is allowed.',
|
|
109
|
-
existingFormId: existingForm._id,
|
|
110
|
-
submittedAt: existingForm.submittedAt
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
const studentFormData = {
|
|
114
|
-
whatsapp: whatsapp,
|
|
115
|
-
formName: formName,
|
|
116
|
-
projectId: projectId,
|
|
117
|
-
email: email,
|
|
118
|
-
...otherFormFields,
|
|
119
|
-
submittedAt: new Date()
|
|
120
|
-
};
|
|
121
|
-
const formResult = await studentsFormCollection.insertOne(studentFormData);
|
|
122
|
-
res.status(201).json({
|
|
123
|
-
success: true,
|
|
124
|
-
message: 'Student form submitted successfully',
|
|
125
|
-
submittedFormId: formResult.insertedId,
|
|
126
|
-
data: studentFormData
|
|
127
|
-
});
|
|
128
|
-
} catch (error) {
|
|
129
|
-
res.status(500).json({
|
|
130
|
-
success: false,
|
|
131
|
-
message: 'Error submitting student form',
|
|
132
|
-
error: error.message
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
//get form
|
|
138
|
-
router.get('/getCount/:formName', async (req, res) => {
|
|
139
|
-
try {
|
|
140
|
-
const {
|
|
141
|
-
formName
|
|
142
|
-
} = req.params;
|
|
143
|
-
const {
|
|
144
|
-
projectId
|
|
145
|
-
} = req.query;
|
|
146
|
-
const studentsFormCollection = getDb().collection('studentsForm');
|
|
147
|
-
|
|
148
|
-
// Build query object
|
|
149
|
-
let query = {
|
|
150
|
-
formName
|
|
151
|
-
};
|
|
152
|
-
if (projectId) {
|
|
153
|
-
query.projectId = projectId;
|
|
154
|
-
}
|
|
155
|
-
const submissions = await studentsFormCollection.find(query).toArray();
|
|
156
|
-
res.status(200).json({
|
|
157
|
-
success: true,
|
|
158
|
-
message: 'Submission count retrieved successfully',
|
|
159
|
-
formName: formName,
|
|
160
|
-
projectId: projectId,
|
|
161
|
-
count: submissions.length,
|
|
162
|
-
data: submissions
|
|
163
|
-
});
|
|
164
|
-
} catch (error) {
|
|
165
|
-
res.status(500).json({
|
|
166
|
-
success: false,
|
|
167
|
-
message: 'Error counting form submissions',
|
|
168
|
-
error: error.message
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
// POST /create-form - Upload JSON file and store form data
|
|
174
|
-
router.post('/create-form', upload.single('jsonFile'), async (req, res) => {
|
|
175
|
-
try {
|
|
176
|
-
const {
|
|
177
|
-
projectId
|
|
178
|
-
} = req.query;
|
|
179
|
-
if (!projectId) {
|
|
180
|
-
return res.status(400).json({
|
|
181
|
-
success: false,
|
|
182
|
-
message: 'projectId is required as query parameter'
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
if (!req.file) {
|
|
186
|
-
return res.status(400).json({
|
|
187
|
-
success: false,
|
|
188
|
-
message: 'JSON file is required'
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
let formData;
|
|
192
|
-
try {
|
|
193
|
-
const fileContent = req.file.buffer.toString('utf8');
|
|
194
|
-
formData = JSON.parse(fileContent);
|
|
195
|
-
} catch (parseError) {
|
|
196
|
-
return res.status(400).json({
|
|
197
|
-
success: false,
|
|
198
|
-
message: 'Invalid JSON file format',
|
|
199
|
-
error: parseError.message
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
if (!formData.formName) {
|
|
203
|
-
return res.status(400).json({
|
|
204
|
-
success: false,
|
|
205
|
-
message: 'formName is required in JSON data'
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
const powrFormCollection = getDb().collection('powrForm');
|
|
209
|
-
const existingForm = await powrFormCollection.findOne({
|
|
210
|
-
formName: formData.formName,
|
|
211
|
-
projectId: projectId
|
|
212
|
-
});
|
|
213
|
-
if (existingForm) {
|
|
214
|
-
return res.status(409).json({
|
|
215
|
-
success: false,
|
|
216
|
-
message: 'Form with this name already exists for this project',
|
|
217
|
-
existingFormId: existingForm._id
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
const finalFormData = {
|
|
221
|
-
...formData,
|
|
222
|
-
projectId: projectId,
|
|
223
|
-
createdAt: new Date()
|
|
224
|
-
};
|
|
225
|
-
const result = await powrFormCollection.insertOne(finalFormData);
|
|
226
|
-
res.status(201).json({
|
|
227
|
-
success: true,
|
|
228
|
-
message: 'Form created and stored successfully',
|
|
229
|
-
formId: result.insertedId,
|
|
230
|
-
formName: formData.formName,
|
|
231
|
-
projectId: projectId,
|
|
232
|
-
data: finalFormData
|
|
233
|
-
});
|
|
234
|
-
} catch (error) {
|
|
235
|
-
res.status(500).json({
|
|
236
|
-
success: false,
|
|
237
|
-
message: 'Error creating form',
|
|
238
|
-
error: error.message
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
module.exports = router;
|