Skip to content

Commit b49a272

Browse files
authored
Merge pull request #27 from yamilt351/development
Development
2 parents 970f683 + c86e0f1 commit b49a272

40 files changed

+124
-184
lines changed

README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<img src="https://github.com/yamilt351/api-rest/assets/88646148/6fa7be51-ea03-4be7-9f31-3b6365e68f46" width="100" height="100" align="center">
22

33

4-
54
# INDEX
65
- [About this project](#About-this-project)
76
- [Development Environment Setup](#Development-Environment-Setup)
@@ -45,6 +44,15 @@ STRIPE_TOKEN=sk_text_YourStripeToken
4544
4645
```
4746

47+
```
48+
SECRET:your_google_oauth_secret
49+
```
50+
51+
```
52+
CLIENTID:your_google_oauth_cliendId
53+
```
54+
55+
4856
- Start the application using `npm run dev` or `yarn run dev` to launch the application.
4957
- Access the application in a web browser using the provided URL or port number.
5058

@@ -55,12 +63,20 @@ STRIPE_TOKEN=sk_text_YourStripeToken
5563
## Tests
5664

5765
- The aplication was tested with [Jest](https://jestjs.io/) and [Supertest](https://www.npmjs.com/package/supertest)
58-
5966
```
60-
npm test
67+
npm run test
6168
6269
```
6370

71+
# Live demo & Product Explanation.
72+
73+
[Demo](https://ciervademo.onrender.com/)
74+
This a simple demo.
75+
Shoping Cart State is hanlde by the frontend, so you can store the shoping cart items init and still keep it even if the user is not loged into the app.
76+
This guarantee an excelent user experience btw, bc the user can explore your site before making orders.
77+
The backend provide pagination for some routes, for more info [check the Documentation](https://documenter.getpostman.com/view/21643141/2s93sXcaLf#f3eb5112-676b-46c6-89a2-f5dd6b6c0927)
78+
79+
6480
# Contribution.
6581

6682
- Read The Documentation

index.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import express from 'express';
2-
import importMiddlewares from './middlewaresHandler.js';
3-
import { connect } from './server.js';
4-
import { config } from 'dotenv';
2+
import importMiddlewares from './server/config/middlewaresConfig.js';
3+
import { connect } from './server/config/serverConfig.js';
54
import { errorHandler } from './server/helpers/errorHandler.js';
6-
import apiRouthes from './server/api/routes.js';
5+
import apiRouthes from './server/config/endpointsConfig.js';
6+
import envConfig from './server/config/envConfig.js';
77

88
//config
9-
10-
config();
119
const app = express();
1210
const PORT = process.env.PORT;
13-
export const JWT_TOKEN = process.env.JWT_TOKEN;
11+
export const JWT_TOKEN = envConfig.JWT;
1412

1513
// importing middlewares
1614
const middlewares = await importMiddlewares();

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"type": "module",
77
"scripts": {
8-
"test": "jest",
8+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
99
"start": "node index.js",
1010
"dev": "nodemon index.js"
1111
},

server/api/routes.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

server/Comments/commentController.js renamed to server/application/comments/commentController.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Comment from './commentModel.js';
22
import commentService from './commentService.js';
33
// function to check ownership
4-
import isResourceOwner from '../helpers/isOwner.js';
4+
import isResourceOwner from '../../helpers/isOwner.js';
55

66
const commentController = {
77
createComment,

server/Comments/commentsRoutes.js renamed to server/application/comments/commentsRoutes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import commentController from './commentController.js';
22
import express from 'express';
3-
import { cleanBody } from '../helpers/sanitizer.js';
4-
import authMiddleware from '../helpers/jwt.js';
3+
import { cleanBody } from '../../helpers/sanitizer.js';
4+
import authMiddleware from '../../helpers/jwt.js';
55
const router = express.Router();
66

77
router.post(

server/Products/productRoutes.js renamed to server/application/products/productRoutes.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Router } from 'express';
2-
import authMiddleware from '../helpers/jwt.js';
3-
import adminCheck from '../helpers/adminCheck.js';
2+
import authMiddleware from '../../helpers/jwt.js';
3+
import adminCheck from '../../helpers/adminCheck.js';
4+
import { caching } from '../../helpers/cache.js';
5+
import { cleanBody, validateQuery } from '../../helpers/sanitizer.js';
46
import productController from './productController.js';
5-
import { caching } from '../helpers/cache.js';
6-
import { cleanBody, validateQuery } from '../helpers/sanitizer.js';
77

88
const router = Router();
99

@@ -51,4 +51,4 @@ router.delete(
5151
cleanBody,
5252
productController.deleteProduct,
5353
);
54-
export default router;
54+
export default router;

server/Products/productService.js renamed to server/application/products/productService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Product from './productModel.js';
22
import mongoose from 'mongoose';
3-
import { NotFoundError } from '../helpers/errorHandler.js';
3+
import { NotFoundError } from '../../helpers/errorHandler.js';
44

55
const productService = {
66
getProduct,

server/Purchases/purchasesRoutes.js renamed to server/application/purchases/purchasesRoutes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Router } from 'express';
22
import purchaseController from './purchasesController.js';
3-
import authMiddleware from '../helpers/jwt.js';
4-
import adminCheck from '../helpers/adminCheck.js';
3+
import authMiddleware from '../../helpers/jwt.js';
4+
import adminCheck from '../../helpers/adminCheck.js';
55
const router = Router();
66

77
router.post('/create', authMiddleware, purchaseController.createPurchase);

server/Purchases/purchasesService.js renamed to server/application/purchases/purchasesService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Purchase from './purchasesModel.js';
2-
import StripePaymentProvider from '../helpers/stripe.js';
2+
import StripePaymentProvider from '../../helpers/stripe.js';
33
const paymentProvider = new StripePaymentProvider();
44

55
const purchaseService = {

server/Responses/responsesController.js renamed to server/application/responses/responsesController.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import responseService from './responsesService.js';
22
import Response from './responsesModel.js';
33
// function to check ownership
4-
import isResourceOwner from '../helpers/isOwner.js';
4+
import isResourceOwner from '../../helpers/isOwner.js';
55

66
const responseControllers = {
77
createResponse,

server/Responses/responsesRoutes.js renamed to server/application/responses/responsesRoutes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import responseControllers from './responsesController.js';
22
import express from 'express';
3-
import { cleanBody } from '../helpers/sanitizer.js';
4-
import authMiddleware from '../helpers/jwt.js';
3+
import { cleanBody } from '../../helpers/sanitizer.js';
4+
import authMiddleware from '../../helpers/jwt.js';
55
const router = express.Router();
66
router.get('/getAll', authMiddleware, responseControllers.getAllResponse);
77
router.post(

server/ShopingCart/shopingCartController.js renamed to server/application/shopingCart/shopingCartController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import cartService from './shopingCartService.js';
22
// function to check ownership
3-
import isResourceOwner from '../helpers/isOwner.js';
4-
import Cart from '../ShopingCart/shopinCartModel.js';
3+
import isResourceOwner from '../../helpers/isOwner.js';
4+
import Cart from './shopinCartModel.js';
55

66
const cartController = {
77
createCart,

server/ShopingCart/shopingCartService.js renamed to server/application/shopingCart/shopingCartService.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ShoppingCart from './shopinCartModel.js';
2-
import userService from '../Users/usersService.js';
2+
import userService from '../users/usersService.js';
3+
34
const cartService = {
45
createCart,
56
editCart,

server/ShopingCart/shoppingCartRoutes.js renamed to server/application/shopingCart/shoppingCartRoutes.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Router } from 'express';
22
import cartController from './shopingCartController.js';
3-
import authMiddleware from '../helpers/jwt.js';
4-
import adminCheck from '../helpers/adminCheck.js';
5-
import { cleanBody } from '../helpers/sanitizer.js';
3+
import authMiddleware from '../../helpers/jwt.js';
4+
import adminCheck from '../../helpers/adminCheck.js';
5+
import { cleanBody } from '../../helpers/sanitizer.js';
66
const router = Router();
77

88
router.post('/create', authMiddleware, cleanBody, cartController.createCart);
File renamed without changes.

server/Users/userRoutes.js renamed to server/application/users/userRoutes.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Router } from 'express';
22
import usersController from './usersControllers.js';
3-
import adminCheck from '../helpers/adminCheck.js';
4-
import authMiddleware from '../helpers/jwt.js';
5-
import { cleanBody } from '../helpers/sanitizer.js';
3+
import adminCheck from '../../helpers/adminCheck.js'
4+
import authMiddleware from '../../helpers/jwt.js';
5+
import { cleanBody } from '../../helpers/sanitizer.js';
66
const router = Router();
77

88
router.post('/signIn', cleanBody, usersController.signIn);

server/Users/usersControllers.js renamed to server/application/users/usersControllers.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
11
import userService from './usersService.js';
22
const maxAge = 24 * 60 * 60 * 1000;
33

4-
const usersController = {
5-
signIn,
6-
signUp,
7-
getUser,
8-
getStat,
9-
googleToken,
10-
findByEmail,
11-
};
12-
134
function signIn(req, res, next) {
14-
console.log("aca");
5+
console.log('aca');
156
userService
167
.signIn(req.body)
178
.then(({ user, sendToken }) => {
@@ -31,6 +22,7 @@ console.log("aca");
3122
}
3223

3324
function signUp(req, res, next) {
25+
console.log('controller');
3426
userService
3527
.signUp(req.body)
3628
.then((user) => res.json(user))
@@ -65,4 +57,12 @@ function googleToken(req, res, next) {
6557
.catch((error) => next(error));
6658
}
6759

60+
const usersController = {
61+
signIn,
62+
signUp,
63+
getUser,
64+
getStat,
65+
googleToken,
66+
findByEmail,
67+
};
6868
export default usersController;

server/Users/usersService.js renamed to server/application/users/usersService.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import Encrypt from '../helpers/bcrypt.js';
21
import User from './userModel.js';
3-
import { JWT_TOKEN } from '../../index.js';
4-
import Token from '../helpers/token.js';
2+
import { JWT_TOKEN } from '../../../index.js';
3+
import Token from '../../helpers/token.js';
4+
import Encrypt from '../../helpers/bcrypt.js';
55
import {
66
BadRequestError,
77
NotFoundError,
88
UnauthorizedError,
9-
} from '../helpers/errorHandler.js';
9+
} from '../../helpers/errorHandler.js';
1010
import { OAuth2Client } from 'google-auth-library';
11-
const SECRET = process.env.SECRET;
12-
const CLIENTID = process.env.CLIENTID;
11+
import envConfig from '../../config/envConfig.js';
12+
13+
const SECRET = envConfig.SECRET;
14+
const CLIENTID = envConfig.CLIENTID;
1315

1416
//config
1517
const userService = {
@@ -31,7 +33,7 @@ async function findByEmail(email) {
3133
if (alreadyExist) {
3234
return alreadyExist;
3335
} else {
34-
return null;
36+
throw new NotFoundError(`user with ${email} not found`);
3537
}
3638
}
3739

@@ -64,22 +66,21 @@ async function checkLength(item, num) {
6466

6567
async function signUp(user) {
6668
const allowedFields = ['email', 'password', 'username'];
67-
6869
const filteredUser = Object.keys(user) //check if user contains allowedFields
6970
.filter((key) => allowedFields.includes(key))
7071
.reduce((obj, key) => {
7172
obj[key] = user[key];
7273
return obj;
7374
}, {});
75+
await checkLength(filteredUser.password, 8);
7476

75-
const validatePass = await checkLength(filteredUser.password, 8);
76-
if (validatePass) {
77+
try {
7778
const encryptPassword = await encrypt.hashPassword(filteredUser.password);
7879
const createUser = new User({ ...filteredUser, password: encryptPassword });
7980
const newUser = await createUser.save();
8081
return newUser;
81-
} else {
82-
throw new BadRequestError('password does not match');
82+
} catch (error) {
83+
throw new BadRequestError(error.message);
8384
}
8485
}
8586

server/config/endpointsConfig.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import user from '../application/users/userRoutes.js';
2+
import cart from '../application/shopingCart/shoppingCartRoutes.js';
3+
import product from '../application/products/productRoutes.js';
4+
import purchase from '../application/purchases/purchasesRoutes.js';
5+
import comment from '../application/comments/commentsRoutes.js';
6+
import response from '../application/responses/responsesRoutes.js';
7+
8+
const apiRouthes = [
9+
{ route: '/api/users', controller: user },
10+
{ route: '/api/carts', controller: cart },
11+
{ route: '/api/purchases', controller: purchase },
12+
{ route: '/api/products', controller: product },
13+
{ route: '/api/comments', controller: comment },
14+
{ route: '/api/responses', controller: response },
15+
];
16+
export default apiRouthes

server/config/envConfig.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { config } from 'dotenv';
2+
config();
3+
4+
const envConfig = {
5+
PORT: process.env.PORT,
6+
JWT: process.env.JWT_TOKEN,
7+
SERVER: process.env.MONGO,
8+
STRIPE: process.env.STRIPE_TOKEN,
9+
SECRET: process.env.SECRET,
10+
CLIENTID: process.env.CLIENTID,
11+
};
12+
export default envConfig;

middlewaresHandler.js renamed to server/config/middlewaresConfig.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'url';
55
const __dirname = path.dirname(fileURLToPath(import.meta.url));
66

77
//middleware Files
8-
const middlewareDir = path.join(__dirname, 'server/middlewares');
8+
const middlewareDir = path.join(__dirname, '../middlewares');
99

1010
//put the middleware files into the array & export it
1111
const importMiddlewares = async () => {
@@ -14,7 +14,7 @@ const importMiddlewares = async () => {
1414

1515
for (const file of middlewareFiles) {
1616
console.log(`./server/middlewares/${file}`);
17-
const middleware = await import(`./server/middlewares/${file}`);
17+
const middleware = await import(`../middlewares/${file}`);
1818
middlewareArray.push(middleware.default);
1919
}
2020

server.js renamed to server/config/serverConfig.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import mongoose from 'mongoose';
2-
import { config } from 'dotenv';
3-
config();
2+
import envConfig from './envConfig.js';
3+
const db = envConfig.SERVER;
44
const server = mongoose;
55

66
export const connect = () => {
77
server
8-
.connect(process.env.MONGO)
8+
.connect(db)
99
.then(() => {
1010
console.log('connected to mongoose');
1111
})

server/helpers/adminCheck.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import User from '../Users/userModel.js';
1+
import User from '../application/users/userModel.js';
22
import { UnauthorizedError } from './errorHandler.js';
33

44
async function adminCheck(req, res, next) {

0 commit comments

Comments
 (0)