powr-sdk-api 4.3.12 → 4.3.13

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.
@@ -0,0 +1,81 @@
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 activities
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 activities = await getDb().collection("activities").find(query).toArray();
24
+ if (!activities || activities.length === 0) {
25
+ console.log("Data not found.");
26
+ return res.status(200).json({
27
+ success: true,
28
+ activities: []
29
+ });
30
+ }
31
+ return res.status(200).json({
32
+ success: true,
33
+ activities: activities
34
+ });
35
+ } catch (error) {
36
+ console.error("Error retrieving activities:", error);
37
+ return res.status(500).json({
38
+ success: false,
39
+ message: "Failed to retrieve activities."
40
+ });
41
+ }
42
+ });
43
+
44
+ // Add activity
45
+ router.post("/", async (req, res) => {
46
+ const {
47
+ projectId,
48
+ contentId,
49
+ activity
50
+ } = req.body;
51
+ const activityData = {
52
+ projectId,
53
+ contentId,
54
+ activity,
55
+ createdAt: new Date()
56
+ };
57
+ try {
58
+ const result = await getDb().collection("activities").insertOne(activityData);
59
+ if (result && result.insertedId) {
60
+ console.log("Activity added with ID:", result.insertedId);
61
+ return res.status(200).json({
62
+ success: true,
63
+ message: "Activity added successfully.",
64
+ activityId: result.insertedId
65
+ });
66
+ } else {
67
+ console.error("Insert operation failed. Result:", result);
68
+ return res.status(500).json({
69
+ success: false,
70
+ message: "Activity could not be added."
71
+ });
72
+ }
73
+ } catch (error) {
74
+ console.error("Error adding activity:", error);
75
+ return res.status(500).json({
76
+ success: false,
77
+ message: "Failed to add activity due to a server error."
78
+ });
79
+ }
80
+ });
81
+ module.exports = router;
@@ -0,0 +1,234 @@
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;
@@ -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
+ 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;
@@ -0,0 +1,83 @@
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;
@@ -0,0 +1,56 @@
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;