Skip to content

Commit

Permalink
Merge pull request #23 from andela/ft-user-create-articles-166816105
Browse files Browse the repository at this point in the history
#166816105 User can create, read, update and delete articles
  • Loading branch information
nedemenang committed Jul 15, 2019
2 parents 52c619d + 1c857e6 commit 9c47b15
Show file tree
Hide file tree
Showing 25 changed files with 1,513 additions and 64 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ lib-cov
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
dist
uploads

# Dependency directory
node_modules
Expand Down
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"description": "A Social platform for the creative at heart",
"main": "index.js",
"scripts": {
"test": "NODE_ENV=test npm run migration-rollback && npm run db-migration && nyc mocha src/**/*.spec.js --require @babel/register --exit --timeout 100000|| true",
"test": "NODE_ENV=test npm run db:drop && npm run migration-rollback && npm run db-migration && nyc mocha src/**/*.spec.js --require @babel/register --exit --timeout 100000|| true",
"test-watch": "nodemon --exec \"npm test\"",
"start": "nodemon --exec babel-node src/index.js",
"build": "npm run db-migration && npm run clean && npm run babel-build",
Expand All @@ -13,7 +13,8 @@
"heroku-postbuild": "echo skip post-build",
"coverage": "nyc report --reporter=text-lcov | coveralls",
"db-migration": "sequelize db:migrate",
"migration-rollback": "sequelize db:migrate:undo:all"
"migration-rollback": "sequelize db:migrate:undo:all",
"db:drop": "sequelize db:drop && sequelize db:create"
},
"author": "Andela Simulations Programme",
"license": "MIT",
Expand Down Expand Up @@ -46,6 +47,7 @@
"pg-hstore": "^2.3.3",
"sequelize": "^5.8.12",
"sequelize-cli": "^5.5.0",
"sequelize-slugify": "^0.7.0",
"sequelize-test-helpers": "^1.1.2",
"sinon": "^7.3.2",
"sinon-chai": "^3.3.0",
Expand Down
260 changes: 260 additions & 0 deletions src/controllers/article.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
import {
createArticleService,
getArticleService,
userGetDraftArticleService,
getAllPublishedArticleService,
userGetPublishedArticleService,
getSingleUserPublishedArticleService,
publishArticleService,
unPublishArticleService,
updateArticleService,
deleteArticleService
} from '../services/article.service';
import Helper from '../services/helper';
import models from '../db/models';

const { Article } = models;
/* istanbul ignore next */
export default {
/**
* @method createArticle
* @description Creates a new article
* Route: POST: /articles
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async createArticle(request, response) {
try {
const article = await createArticleService(request);
return Helper.successResponse(response, 201, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method getArticle
* @description fetch a single article
* Route: GET: /articles/:slug
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async getArticle(request, response) {
try {
const article = await getArticleService(request);
if (!article) {
return Helper.failResponse(response, 404, {
message: 'Article does not exist'
});
}
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method userGetAllDraftArticles
* @description fetch all draft articles
* Route: GET: /articles/draft
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async userGetAllDraftArticles(request, response) {
try {
const article = await userGetDraftArticleService(request);
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method userGetAllPublishedArticles
* @description fetch all published articles
* Route: GET: /articles/publish
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async userGetAllPublishedArticles(request, response) {
try {
const article = await userGetPublishedArticleService(request);
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method getUserPublishedArticles
* @description fetch all published articles
* Route: GET: /articles/publish
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async getUserPublishedArticles(request, response) {
try {
const article = await getSingleUserPublishedArticleService(request);
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method getAllPublishedArticles
* @description fetch all articles published
* Route: GET: /articles
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/
async getAllPublishedArticles(request, response) {
try {
const article = await getAllPublishedArticleService();
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method updateArticles
* @description update a single article
* Route: PUT: /articles/:slug
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async updateArticle(request, response) {
try {
const authorArticle = await Article.findOne({
where: { slug: request.params.slug }
});
if (!authorArticle) {
return Helper.failResponse(response, 404, {
message: 'Article does not exist'
});
}
const article = await updateArticleService(request);
if (!article) {
return Helper.failResponse(response, 403, {
message: 'Forbidden, you can not edit this resource'
});
}
return Helper.successResponse(response, 200, article);
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method deleteArticle
* @description delete a single article
* Route: DELETE: /articles/:slug
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async deleteArticle(request, response) {
try {
const authorArticle = await Article.findOne({
where: { slug: request.params.slug }
});
if (!authorArticle) {
return Helper.failResponse(response, 404, {
message: 'Article does not exist'
});
}
const article = await deleteArticleService(request);
if (!article) {
return Helper.failResponse(response, 403, {
message: 'Forbidden, you can not delete this resource'
});
}
return Helper.successResponse(response, 200, {
message: 'Article deleted successfully'
});
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method publishArticle
* @description publish a single article
* Route: PUT: /articles/publish/:slug
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async publishArticle(request, response) {
try {
const authorArticle = await Article.findOne({
where: { slug: request.params.slug }
});
if (!authorArticle) {
return Helper.failResponse(response, 404, {
message: 'Article does not exist'
});
}
const article = await publishArticleService(request);
if (!article) {
return Helper.failResponse(response, 403, {
message: 'Forbidden, you can not publish this resource'
});
}
return Helper.successResponse(response, 200, {
message: 'Article published successfully'
});
} catch (error) {
return Helper.failResponse(response, 500, error);
}
},

/**
* @method unPublishArticle
* @description unpublish a single article
* Route: PUT: /articles/publish/:slug
* @param {Object} request request object
* @param {Object} response request object
* @returns {Response} response object
*/

async unPublishArticle(request, response) {
try {
const authorArticle = await Article.findOne({
where: { slug: request.params.slug }
});
if (!authorArticle) {
return Helper.failResponse(response, 404, {
message: 'Article does not exist'
});
}
const article = await unPublishArticleService(request);
if (!article) {
return Helper.failResponse(response, 403, {
message: 'Forbidden, you can not publish this resource'
});
}
return Helper.successResponse(response, 200, {
message: 'Article unpublished successfully'
});
} catch (error) {
return Helper.failResponse(response, 500, error);
}
}
};
7 changes: 6 additions & 1 deletion src/controllers/auth.controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,11 @@ export default {
if (request.file) {
imagePath = request.file.path;
imageUniqueName = request.file.originalname;
const imageResponse = await upload(imagePath, imageUniqueName);
const imageResponse = await upload(
imagePath,
imageUniqueName,
'avatar'
);
uploadedImage = imageResponse.secure_url;
}

Expand All @@ -155,6 +159,7 @@ export default {
image: updatedUser.dataValues.image
});
} catch (error) {
/* istanbul ignore next */
next(error);
}
},
Expand Down
1 change: 1 addition & 0 deletions src/controllers/user.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const getUsers = async (request, response) => {

return Helper.successResponse(response, 200, value);
} catch (error) {
/* istanbul ignore next */
return Helper.failResponse(response, 400, error);
}
};
Expand Down
Loading

0 comments on commit 9c47b15

Please sign in to comment.