Skip to content

Commit

Permalink
feat: added POST /api/v1/categories route
Browse files Browse the repository at this point in the history
  • Loading branch information
julianlam committed Oct 8, 2020
1 parent a5af2dc commit dc666fd
Show file tree
Hide file tree
Showing 7 changed files with 281 additions and 58 deletions.
145 changes: 140 additions & 5 deletions openapi.yaml
Expand Up @@ -8,11 +8,15 @@ info:
license:
name: MIT
url: 'https://opensource.org/licenses/MIT'
servers:
- url: /api/v1
tags:
- name: users
description: 'Account related calls (create, modify, delete, etc.)'
- name: categories
description: Administrative calls to manage categories
paths:
/:
/users/:
post:
tags:
- users
Expand Down Expand Up @@ -94,7 +98,7 @@ paths:
$ref: '#/components/schemas/Status'
response:
type: object
'/{uid}':
'/users/{uid}':
put:
tags:
- users
Expand Down Expand Up @@ -155,7 +159,7 @@ paths:
$ref: '#/components/schemas/Status'
response:
type: object
'/{uid}/password':
'/users/{uid}/password':
put:
tags:
- users
Expand Down Expand Up @@ -195,7 +199,7 @@ paths:
$ref: '#/components/schemas/Status'
response:
type: object
'/{uid}/follow':
'/users/{uid}/follow':
post:
tags:
- users
Expand Down Expand Up @@ -242,7 +246,7 @@ paths:
$ref: '#/components/schemas/Status'
response:
type: object
'/{uid}/ban':
'/users/{uid}/ban':
put:
tags:
- users
Expand Down Expand Up @@ -302,6 +306,65 @@ paths:
$ref: '#/components/schemas/Status'
response:
type: object
/categories/:
post:
tags:
- categories
summary: creates a category
description: This operation creates a new category
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description:
type: string
parentCid:
type: number
cloneFromCid:
type: number
icon:
type: string
description: A ForkAwesome icon without the `fa-` prefix
bgColor:
type: string
color:
type: string
link:
type: string
class:
type: string
backgroundImage:
type: string
required:
- name
example:
name: My New Category
description: Lorem ipsum, dolor sit amet
parentCid: 0
cloneFromCid: 0
icon: bullhorn
bgColor: '#ffffff'
color: '#000000'
link: 'https://example.org'
class: 'col-md-3 col-xs-6'
backgroundImage: '/assets/relative/path/to/image'
responses:
'200':
description: category successfully created
content:
application/json:
schema:
type: object
properties:
status:
$ref: '#/components/schemas/Status'
response:
$ref: '#/components/schemas/CategoryObj'
components:
schemas:
Status:
Expand Down Expand Up @@ -479,6 +542,78 @@ components:
This is a paragraph all about how my life got twist-turned upside-down
and I'd like to take a minute and sit right here,
to tell you all about how I because the administrator of NodeBB
CategoryObj:
properties:
cid:
type: number
example: 1
name:
type: string
example: My New Category
description:
type: string
example: Lorem ipsum, dolor sit amet
descriptionParsed:
type: string
example: Lorem ipsum, dolor sit amet
icon:
type: string
example: bullhorn
bgColor:
type: string
example: '#ffffff'
color:
type: string
example: '#000000'
slug:
type: string
example: 1/my-new-category
parentCid:
type: number
example: 0
topic_count:
type: number
example: 0
post_count:
type: number
example: 0
disabled:
type: number
example: 0
order:
type: number
example: 5
link:
type: number
example: 'https://example.org'
numRecentReplies:
type: number
example: 1
class:
type: string
example: col-md-3 col-xs-6
imageClass:
type: string
example: cover
isSection:
type: number
example: 0
totalPostCount:
type: number
example: 0
totalTopicCount:
type: number
example: 0
tagWhitelist:
type: array
example:
- some-tag
- another-tag
unread-class:
type: string
backgroundImage:
type: string
example: '/assets/images/covers/Circuit1.png'
responses:
'400':
description: Bad Request
Expand Down
13 changes: 13 additions & 0 deletions src/controllers/write/categories.js
@@ -0,0 +1,13 @@
'use strict';

const categories = require('../../categories');

const helpers = require('../helpers');

const Categories = module.exports;

Categories.create = async (req, res) => {
const response = await categories.create(req.body);
const categoryObjs = await categories.getCategories([response.cid]);
helpers.formatApiResponse(200, res, categoryObjs[0]);
};
1 change: 1 addition & 0 deletions src/controllers/write/index.js
Expand Up @@ -3,3 +3,4 @@
const Write = module.exports;

Write.users = require('./users');
Write.categories = require('./categories');
86 changes: 86 additions & 0 deletions src/routes/write/categories.js
@@ -0,0 +1,86 @@
'use strict';

const router = require('express').Router();
const middleware = require('../../middleware');
const controllers = require('../../controllers');
const routeHelpers = require('../../routes/helpers');

const setupApiRoute = routeHelpers.setupApiRoute;

module.exports = function () {
const middlewares = [middleware.authenticate];

setupApiRoute(router, '/', middleware, [...middlewares, middleware.checkRequired.bind(null, ['name'])], 'post', controllers.write.categories.create);

// app.post('/', apiMiddleware.requireUser, apiMiddleware.requireAdmin, function(req, res) {
// if (!utils.checkRequired(['name'], req, res)) {
// return false;
// }

// Categories.create(req.body, function(err, categoryObj) {
// return errorHandler.handle(err, res, categoryObj);
// });
// });

// app.route('/:cid')
// .put(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCid, function(req, res) {
// var payload = {};
// payload[req.params.cid] = req.body;

// Categories.update(payload, function(err) {
// return errorHandler.handle(err, res);
// });
// })
// .delete(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCid, function(req, res) {
// Categories.purge(req.params.cid, req.user.uid, function(err) {
// return errorHandler.handle(err, res);
// });
// });

// app.route('/:cid/state')
// .put(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCid, function(req, res) {
// var payload = {};
// payload[req.params.cid] = {
// disabled: 0
// };

// Categories.update(payload, function(err) {
// return errorHandler.handle(err, res);
// });
// })
// .delete(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCid, function(req, res) {
// var payload = {};
// payload[req.params.cid] = {
// disabled: 1
// };

// Categories.update(payload, function(err) {
// return errorHandler.handle(err, res);
// });
// });

// app.route('/:cid/privileges')
// .put(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCidIncludingGlobal, function(req, res) {
// changeGroupMembership(req.params.cid, req.body.privileges, req.body.groups, 'join', function(err) {
// return errorHandler.handle(err, res);
// });
// })
// .delete(apiMiddleware.requireUser, apiMiddleware.requireAdmin, apiMiddleware.validateCidIncludingGlobal, function(req, res) {
// changeGroupMembership(req.params.cid, req.body.privileges, req.body.groups, 'leave', function(err) {
// return errorHandler.handle(err, res);
// });
// });

// function changeGroupMembership(cid, privileges, groups, action, callback) {
// privileges = Array.isArray(privileges) ? privileges : [privileges];
// groups = Array.isArray(groups) ? groups : [groups];

// async.each(groups, function(group, groupCb) {
// async.each(privileges, function(privilege, privilegeCb) {
// Groups[action]('cid:' + cid + ':privileges:' + privilege, group, privilegeCb);
// }, groupCb);
// }, callback);
// }

return router;
};
2 changes: 1 addition & 1 deletion src/routes/write/index.js
Expand Up @@ -24,7 +24,7 @@ Write.reload = (params) => {
// router.use('/groups', require('./groups')(coreMiddleware));
// router.use('/posts', require('./posts')(coreMiddleware));
// router.use('/topics', require('./topics')(coreMiddleware));
// router.use('/categories', require('./categories')(coreMiddleware));
router.use('/api/v1/categories', require('./categories')());
// router.use('/util', require('./util')(coreMiddleware));

router.get('/api/v1/ping', function (req, res) {
Expand Down

0 comments on commit dc666fd

Please sign in to comment.