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.
Files changed (46) hide show
  1. package/dist/index.js +7 -5
  2. package/dist/{services → managers}/functions.js +1 -1
  3. package/dist/managers/index.js +26 -0
  4. package/dist/{services → managers}/tasks.js +123 -143
  5. package/dist/{services → managers}/tools.js +1 -1
  6. package/dist/routes/functions.js +3 -1
  7. package/dist/routes/index.js +2 -17
  8. package/dist/routes/tasks.js +184 -63
  9. package/dist/routes/tools.js +21 -8
  10. package/package.json +69 -71
  11. package/dist/admin/activities.js +0 -81
  12. package/dist/admin/auth.js +0 -234
  13. package/dist/admin/blogs.js +0 -94
  14. package/dist/admin/comments.js +0 -83
  15. package/dist/admin/files.js +0 -56
  16. package/dist/admin/forms.js +0 -242
  17. package/dist/admin/index.js +0 -53
  18. package/dist/admin/invoice.js +0 -163
  19. package/dist/admin/likes.js +0 -126
  20. package/dist/admin/notifications.js +0 -93
  21. package/dist/admin/plexx.js +0 -53
  22. package/dist/admin/ratings.js +0 -189
  23. package/dist/admin/routes.js +0 -132
  24. package/dist/admin/slides.js +0 -101
  25. package/dist/admin/users.js +0 -175
  26. package/dist/admin/waitlists.js +0 -94
  27. package/dist/logger/gcs.js +0 -78
  28. package/dist/logger/s3.js +0 -78
  29. package/dist/middleware/auth.js +0 -76
  30. package/dist/middleware/logger.js +0 -45
  31. package/dist/middleware/response.js +0 -53
  32. package/dist/routes/admin/index.js +0 -520
  33. package/dist/routes/blogs.js +0 -94
  34. package/dist/routes/invoice.js +0 -167
  35. package/dist/routes/plexx.js +0 -269
  36. package/dist/routes/routes.js +0 -143
  37. package/dist/routes/scheduledTasks.js +0 -240
  38. package/dist/scripts/update-tools-schema.js +0 -157
  39. package/dist/services/dbService.js +0 -42
  40. package/dist/services/logger.js +0 -35
  41. package/dist/services/plexx.js +0 -229
  42. package/dist/services/scheduledTasks.js +0 -459
  43. package/dist/utils/auth.js +0 -19
  44. package/dist/utils/logger.js +0 -57
  45. package/dist/utils/s3-transport.js +0 -61
  46. package/dist/utils/s3.js +0 -78
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;