Added openapi documentation

This commit is contained in:
Ceferino Patino 2022-07-18 23:13:58 -05:00
commit 0e071fc339
16 changed files with 1065 additions and 26 deletions

View file

@ -28,7 +28,7 @@
"error": "Request failed. Please check form and try again."
},
"errorNotFound": {
"error": "That object was not found. Please check the URI and try again."
"error": "That resource was not found. Please check the URI and try again."
},
"errorUnauthed": {
"error": "You are unauthenticated, please include your JWT."

View file

@ -21,7 +21,7 @@ async function tokenAuth(req, res, next) {
date.setDate(date.getDate + 1) > result.createdAt
) {
await Token.findOneAndDelete({ token });
return res.status(401).send(config.errorFailed);
return res.status(401).send(config.errorUnauthed);
}
const decoded = jwt.verify(result.token, result.id);

1024
server/openapi.yml Normal file

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@ const tokenAuth = require('../middleware/tokenAuth');
const GetMail = require('./mail/Get');
const SendMail = require('./mail/Send');
router.post('/', tokenAuth, SendMail);
router.get('/', tokenAuth, GetMail);
router.post('/', tokenAuth, SendMail);
module.exports = router;

View file

@ -7,10 +7,7 @@ async function Send(req, res, next) {
const { reciever, subject, text } = req.body;
if (!reciever | !subject | !text) {
return res.status(400).send({
success: false,
error: 'Your message is missing information.',
});
return res.status(400).send(config.errorIncomplete);
}
const { success, message } = await createRequest('post', `/mail`, {

View file

@ -1,17 +1,31 @@
const Answer = require('../../db/models/Answer');
const Question = require('../../db/models/Question');
const config = require('../../config.json');
const getUserLevel = require('../../utils/getUserLevel');
async function CreateAnswer(req, res, next) {
const user = req.user;
const { title, text } = req.body;
const { text } = req.body;
const { questionID } = req.params;
if (getUserLevel(user.points) < 1) {
return res.status(403).send(config.errorForbidden);
}
if (!title || !text) {
const cachedQuestion = await Question.findById(questionID);
if (cachedQuestion.status === 'closed') {
return res.status(403).send(config.errorForbidden);
}
if (
cachedQuestion.status === 'protected' &&
getUserLevel(user.points) < 5
) {
return res.status(403).send(config.errorForbidden);
}
if (!text) {
return res.status(400).send(config.errorIncomplete);
}

View file

@ -3,9 +3,11 @@ const config = require('../../config.json');
async function EditAnswer(req, res, next) {
const user = req.user;
const body = req.body;
const { text } = req.body;
const { questionID, answerID } = req.params;
if (!text) return res.status(400).send(config.errorIncomplete);
const answerPull = await createRequest(
'get',
`/questions/${questionID}/answers/${answerID}`

View file

@ -8,6 +8,8 @@ async function EditAnswerVote(req, res, next) {
const { questionID, answerID, commentID } = req.params;
const { operation } = req.body;
if (!operation) return res.status(400).send(config.errorIncomplete);
const userLevel = getUserLevel(user.points);
if (operation === 'upvote' && userLevel < 2) {
return res.status(403).send(config.errorForbidden);
@ -19,8 +21,6 @@ async function EditAnswerVote(req, res, next) {
const URL = `/questions/${questionID}/answerID/${answerID}/comments/${commentID}/vote/${user.username}`;
if (!operation) return res.status(400).send(config.errorIncomplete);
var cachedVote = await Vote.findOneAndDelete({
parentID: commentID,
creator: user.username,

View file

@ -3,13 +3,15 @@ const config = require('../../config.json');
const getUserLevel = require('../../utils/getUserLevel');
const Vote = require('../../db/models/Vote');
const Answer = require('../../db/mdoels/Answer');
const Answer = require('../../db/models/Answer');
async function EditAnswerVote(req, res, next) {
const user = req.user;
const { questionID, answerID } = req.params;
const { operation } = req.body;
if (!operation) return res.status(400).send(config.errorIncomplete);
const userLevel = getUserLevel(user.points);
if (operation === 'upvote' && userLevel < 2) {
return res.status(403).send(config.errorForbidden);
@ -21,8 +23,6 @@ async function EditAnswerVote(req, res, next) {
const URL = `/questions/${questionID}/answers/${answerID}/vote/${user.username}`;
if (!operation) return res.status(400).send(config.errorIncomplete);
const cachedAnswer = await Answer.findById(answerID);
var cachedVote = await Vote.findOneAndDelete({
parentID: answerID,

View file

@ -8,6 +8,8 @@ async function EditAnswerVote(req, res, next) {
const { questionID, commentID } = req.params;
const { operation } = req.body;
if (!operation) return res.status(400).send(config.errorIncomplete);
const userLevel = getUserLevel(user.points);
if (operation === 'upvote' && userLevel < 2) {
return res.status(403).send(config.errorForbidden);
@ -19,8 +21,6 @@ async function EditAnswerVote(req, res, next) {
const URL = `/questions/${questionID}/comments/${commentID}/vote/${user.username}`;
if (!operation) return res.status(400).send(config.errorIncomplete);
var cachedVote = await Vote.findOneAndDelete({
parentID: commentID,
creator: user.username,

View file

@ -3,9 +3,11 @@ const config = require('../../config.json');
async function EditAnswer(req, res, next) {
const user = req.user;
const { token, ...body } = req.body;
const { text } = req.body;
const { questionID } = req.params;
if (!text) return res.status(400).send(config.errorIncomplete);
const questionPull = await createRequest('get', `/questions/${questionID}`);
if (!questionPull.success) return res.status(500).send(config.errorGeneric);

View file

@ -9,6 +9,8 @@ async function EditQuestionVote(req, res, next) {
const { questionID } = req.params;
const { operation } = req.body;
if (!operation) return res.status(400).send(config.errorIncomplete);
const userLevel = getUserLevel(user.points);
if (operation === 'upvote' && userLevel < 2) {
return res.status(403).send(config.errorForbidden);
@ -20,8 +22,6 @@ async function EditQuestionVote(req, res, next) {
const URL = `/questions/${questionID}/vote/${user.username}`;
if (!operation) return res.status(400).send(config.errorIncomplete);
const cachedQuestion = await Question.findByID(questionID);
var cachedVote = await Vote.findOneAndDelete({
parentID: questionID,

View file

@ -17,10 +17,10 @@ const ResetPassword = require('./user/ResetPassword');
router.get('/:username', GetUser);
router.get('/questions', tokenAuth, Questions);
router.get('/answers', tokenAuth, Answers);
router.get('/logout', tokenAuth, Logout);
router.get('/reset', RequestReset);
router.post('/login', basicAuth, Login);
router.post('/register', Register);
router.post('/login', basicAuth, Login);
router.delete('/logout', tokenAuth, Logout);
router.get('/reset', RequestReset);
router.post('/reset/:id', ResetPassword);
router.patch('/', tokenAuth, Edit);

View file

@ -37,7 +37,7 @@ async function Answers(req, res, next) {
creator: user.username,
}).sort({ createdAt: 'desc' });
return res.send(cachedAnswers);
return res.send({ answers: cachedAnswers });
}
module.exports = Answers;

View file

@ -3,7 +3,7 @@ const Token = require('../../db/models/Token');
async function Logout(req, res, next) {
const user = req.user;
await Token.findByIdAndDelete(user.token);
await Token.findOne({ user: user.id });
return res.sendStatus(200);
}

View file

@ -8,7 +8,7 @@ async function Questions(req, res, next) {
creator: user.username,
}).sort({ createdAt: 'desc' });
return res.send(cachedQuestions);
return res.send({ questions: cachedQuestions });
}
module.exports = Questions;