Skip to content

Commit 545a21e

Browse files
committed
Added membership endpoint
1 parent 7719de9 commit 545a21e

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import createError from 'http-errors';
2+
import System from '../../../models/schemas/System.js';
3+
4+
// Get membership details
5+
const getMembership = async (req, res, next) => {
6+
const key = req.headers.key;
7+
8+
// Check for valid access key in headers
9+
if (!key || key !== process.env.ACCESS_KEY) {
10+
return res.status(401).json({
11+
message: 'Unauthorized',
12+
});
13+
}
14+
15+
try {
16+
// Check if any data exists
17+
let membershipData = await System.findOne({}, { membership: 1, _id: 0 });
18+
19+
// If no data exists, insert sample data (only runs once)
20+
if (!membershipData) {
21+
membershipData = await System.findOne({}, { membership: 1, _id: 0 });
22+
}
23+
24+
// Get valid keys dynamically from schema data
25+
const validFields = Object.keys(membershipData.membership);
26+
// Parse query parameters correctly
27+
const queryParams = req.query.q ? req.query.q.split(',').map(param => param.trim()) : [];
28+
// If no query params, return full membership object
29+
if (queryParams.length === 0) {
30+
return res.status(200).json(membershipData);
31+
}
32+
33+
// Validate query parameters
34+
const selectedFields = queryParams.filter(field => validFields.includes(field));
35+
36+
if (selectedFields.length === 0) {
37+
return res.status(400).json({ message: 'Invalid query parameter(s)' });
38+
}
39+
40+
// Construct projection object dynamically
41+
const projection = selectedFields.reduce((acc, field) => ({ ...acc, [`membership.${field}`]: 1 }), { _id: 0 });
42+
43+
// Fetch only the requested fields
44+
const result = await System.findOne({}, projection);
45+
46+
if (!result) {
47+
return next(createError(404, 'No membership data found'));
48+
}
49+
50+
res.status(200).json(result);
51+
} catch (error) {
52+
return next(error);
53+
}
54+
};
55+
56+
export { getMembership };

src/routes/v4/index.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,22 @@ import statsRoutes from './internal/stats.js';
12081208
*/
12091209
router.use('/stats', statsRoutes);
12101210

1211+
import membershipRoutes from './internal/membership.js';
1212+
1213+
/**
1214+
* @api {use} Mount Membership Routes
1215+
* @apiDescription Mount the membership-related routes for handling interactions.
1216+
* @apiName UseMembershipRoutes
1217+
* @apiGroup Routes
1218+
*
1219+
* @apiSuccess {Object} routes Membership-related routes mounted on the parent router.
1220+
*
1221+
* @function createMembershipRoutes
1222+
* @description Creates and returns a set of routes for handling interactions related to Membership.
1223+
* @returns {Object} Membership-related routes.
1224+
*/
1225+
router.use('/membership', membershipRoutes);
1226+
12111227
/**
12121228
* Exporting the router for use in other parts of the application.
12131229
* @exports {Router} router - Express Router instance with mounted routes.

src/routes/v4/internal/membership.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Router } from 'express';
2+
import { getMembership } from '../../../controllers/v4/internal/membership.js';
3+
import createRateLimiter from '../../../middlewares/rateLimit.js';
4+
5+
const router = Router();
6+
7+
router
8+
.route('/')
9+
/**
10+
* @api {get} v4/membership Get Membership Details
11+
* @apiDescription Retrieve membership details, including plans and features.
12+
* @apiName getMembership
13+
* @apiGroup Membership
14+
* @apiPermission user
15+
*
16+
* @apiHeader {String} Authorization System access token.
17+
*
18+
* @apiParam {String} [q] Optional query parameter to filter results.
19+
* @apiParamExample {json} Request Example:
20+
* GET /membership?q=plans&features
21+
*
22+
* @apiSuccess {Object} membership Membership object.
23+
* @apiSuccessExample {json} Success Response:
24+
* {
25+
* "membership": {
26+
* "plans": [...],
27+
* "features": [...]
28+
* }
29+
* }
30+
*
31+
* @apiError (Unauthorized 401) Unauthorized Only authenticated users can access the data.
32+
* @apiError (Forbidden 403) Forbidden Only authorized users can access the data.
33+
* @apiError (Too Many Requests 429) TooManyRequests The client has exceeded the allowed number of requests within the time window.
34+
* @apiError (Bad Request 400) BadRequest Invalid query parameter(s) provided.
35+
* @apiError (Internal Server Error 500) InternalServerError An error occurred while processing the request.
36+
*/
37+
.get(createRateLimiter(), getMembership);
38+
39+
// Export the router
40+
export default router;

0 commit comments

Comments
 (0)