Skip to content

Commit 1347c76

Browse files
First commit
0 parents  commit 1347c76

39 files changed

+3352
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules/
2+
build/

package-lock.json

Lines changed: 2256 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"name": "nodejs-salesystem",
3+
"version": "1.0.0",
4+
"description": "salesystem",
5+
"main": "build/index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"clean": "rimraf build/",
9+
"build": "npm run clean && tsc && ncp ./src/uploads/ ./build/uploads",
10+
"dev": "nodemon src/index.ts --exec ts-node src/index.ts",
11+
"start": "node build/index.js"
12+
},
13+
"keywords": [
14+
"nodejs",
15+
"rest",
16+
"typescript"
17+
],
18+
"author": "Juan Falcón",
19+
"license": "MIT",
20+
"dependencies": {
21+
"bcrypt": "^4.0.1",
22+
"compression": "^1.7.4",
23+
"cors": "^2.8.5",
24+
"express": "^4.17.1",
25+
"express-fileupload": "^1.1.7-alpha.3",
26+
"jsonwebtoken": "^8.5.1",
27+
"mongoose": "^5.9.19",
28+
"mongoose-unique-validator": "^2.0.3",
29+
"morgan": "^1.10.0",
30+
"ncp": "^2.0.0",
31+
"nodemon": "^2.0.4",
32+
"rimraf": "^3.0.2",
33+
"uuid": "^8.1.0"
34+
},
35+
"devDependencies": {
36+
"@types/bcrypt": "^3.0.0",
37+
"@types/compression": "^1.7.0",
38+
"@types/cors": "^2.8.6",
39+
"@types/express": "^4.17.6",
40+
"@types/express-fileupload": "^1.1.3",
41+
"@types/jsonwebtoken": "^8.5.0",
42+
"@types/mongoose": "^5.7.24",
43+
"@types/mongoose-unique-validator": "^1.0.4",
44+
"@types/morgan": "^1.9.1",
45+
"@types/uuid": "^8.0.0",
46+
"ts-node": "^8.10.2",
47+
"typescript": "^3.9.5"
48+
}
49+
}

src/controllers/auth.controller.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { Request, Response } from "express";
2+
import {User} from '../models';
3+
import { verify ,generationToken} from "../helpers";
4+
5+
6+
class AuthController {
7+
constructor() {
8+
9+
}
10+
11+
async signin(req: Request, res: Response) {
12+
13+
const { email, password } = req.body;
14+
User.findOne({ email }).exec((err, user) => {
15+
if (err) {
16+
return res.status(500).json({
17+
ok: false,
18+
err: {
19+
message: `Verifique sus datos`
20+
}
21+
});
22+
}
23+
if(!user){
24+
return res.status(500).json({
25+
ok: false,
26+
err: {
27+
message: `Email* o password incorrecto`
28+
}
29+
});
30+
}
31+
if(!verify(password,user.password)){
32+
return res.status(500).json({
33+
ok: false,
34+
err: {
35+
message: `Email o password* incorrecto`
36+
}
37+
});
38+
}
39+
const token=generationToken(user);
40+
return res.status(202).json({
41+
ok: true,
42+
user,
43+
token
44+
});
45+
});
46+
47+
}
48+
}
49+
50+
export default AuthController;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { Request, Response } from "express";
2+
import { Client } from '../models';
3+
import { Schema } from "mongoose";
4+
class ClientController {
5+
6+
constructor() {
7+
8+
}
9+
10+
async getAll(req: Request, res: Response) {
11+
try {
12+
const clients = await Client.find({});
13+
return res.status(200).json({
14+
ok: true,
15+
clients
16+
});
17+
} catch (err) {
18+
return res.status(500).json({
19+
ok: false,
20+
err
21+
});
22+
}
23+
}
24+
25+
async get(req: Request, res: Response) {
26+
try {
27+
const { idClient } = req.params;
28+
const client = await Client.findById(idClient);
29+
return res.status(200).json({
30+
ok: true,
31+
client
32+
});
33+
34+
} catch (err) {
35+
return res.status(500).json({
36+
ok: false,
37+
err
38+
});
39+
}
40+
}
41+
42+
async post(req: Request, res: Response) {
43+
try {
44+
const { name, address, phone } = req.body;
45+
const newClient = new Client({ name, address, phone });
46+
const client = await newClient.save();
47+
return res.status(201).json({
48+
ok: true,
49+
client
50+
});
51+
} catch (err) {
52+
return res.status(500).json({
53+
ok: false,
54+
err
55+
});
56+
}
57+
}
58+
59+
}
60+
61+
export default ClientController;

src/controllers/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import UserController from "./user.controller";
2+
import AuthController from "./auth.controller";
3+
import ProductController from "./product.controller";
4+
import ClientController from "./client.controller";
5+
import SaleController from "./sale.controller";
6+
7+
export{
8+
UserController,
9+
AuthController,
10+
ProductController,
11+
ClientController,
12+
SaleController
13+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { Request, Response } from "express";
2+
import { UploadedFile } from 'express-fileupload';
3+
import { v4 as uuidv4 } from 'uuid';
4+
import path from 'path';
5+
import fs from 'fs';
6+
//user fs-extra en caso quieras usar await
7+
import { Product } from "../models";
8+
9+
class ProductController {
10+
11+
constructor() {
12+
13+
}
14+
15+
async get(req: Request, res: Response) {
16+
try {
17+
const { idProduct } = req.params;
18+
const product = await Product.findById(idProduct);
19+
return res.status(200).json({
20+
ok: true,
21+
product
22+
});
23+
} catch (err) {
24+
return res.status(500).json({
25+
ok: false,
26+
err
27+
});
28+
}
29+
}
30+
31+
async getAll(req: Request, res: Response) {
32+
try {
33+
const products = await Product.find({}).sort({ name: 1 });
34+
return res.status(200).json({
35+
ok: true,
36+
products
37+
});
38+
} catch (err) {
39+
return res.status(500).json({
40+
ok: false,
41+
err
42+
});
43+
}
44+
}
45+
46+
async post(req: Request, res: Response) {
47+
try {
48+
const { name, price, category, quantity } = req.body;
49+
const photo = <UploadedFile>req.files?.photo;
50+
const namePhoto = `${uuidv4().toLowerCase()}${path.extname(photo.name)}`;
51+
const newProduct = new Product({ name, price, category, quantity, photo: namePhoto });
52+
const product = await newProduct.save();
53+
await photo.mv(`src/uploads/products/${namePhoto}`);
54+
return res.status(201).json({
55+
ok: true,
56+
product
57+
});
58+
59+
} catch (err) {
60+
return res.status(500).json({
61+
ok: false,
62+
err
63+
});
64+
}
65+
}
66+
67+
async getImage(req: Request, res: Response) {
68+
try {
69+
const { img } = req.params;
70+
const route = path.join(__dirname, './../uploads/products/', img);
71+
if (!fs.existsSync(route)) {
72+
return res.sendFile(path.join(__dirname, './../uploads/products/', 'no-photo.png'));
73+
}
74+
return res.sendFile(route);
75+
} catch (err) {
76+
return res.status(500).json({
77+
ok: false,
78+
err
79+
});
80+
}
81+
}
82+
83+
}
84+
85+
export default ProductController

src/controllers/sale.controller.ts

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { Request, Response } from "express";
2+
import { Sale } from '../models';
3+
import { validQuantity } from "../helpers";
4+
5+
class SaleController {
6+
7+
constructor() {
8+
9+
}
10+
11+
async getAll(req: Request, res: Response) {
12+
13+
try {
14+
const sales = await Sale.find({}).populate('client').populate('products.product');
15+
return res.status(200).json({
16+
ok: true,
17+
sales
18+
});
19+
} catch (err) {
20+
return res.status(500).json({
21+
ok: false,
22+
err
23+
});
24+
}
25+
26+
}
27+
28+
async get(req: Request, res: Response) {
29+
try {
30+
const { idSale } = req.params;
31+
const sale = await Sale.findById(idSale);
32+
return res.status(200).json({
33+
ok: true,
34+
sale
35+
});
36+
} catch (err) {
37+
return res.status(500).json({
38+
ok: false,
39+
err
40+
});
41+
}
42+
}
43+
44+
45+
46+
47+
48+
async post(req: Request, res: Response) {
49+
50+
try {
51+
//falta validar que no se ejecute la venta si un producto falla
52+
const { totalValue, client, products } = req.body;
53+
await validQuantity(products, async (resp: any) => {
54+
if (resp === false) {
55+
return res.status(400).json({
56+
ok: false,
57+
err: {
58+
message: `No hay productos para guardar`
59+
}
60+
});
61+
}
62+
63+
64+
const newSale = new Sale({
65+
totalValue,
66+
client,
67+
products: resp
68+
});
69+
newSale.createdAt = await newSale._id.getTimestamp();
70+
const sale = await (await newSale.save()).populate('client').populate('products.product').execPopulate();
71+
return res.status(201).json({
72+
ok: true,
73+
sale
74+
});
75+
});
76+
77+
78+
79+
} catch (err) {
80+
return res.status(500).json({
81+
ok: false,
82+
err
83+
});
84+
}
85+
}
86+
87+
88+
89+
}
90+
91+
export default SaleController;

0 commit comments

Comments
 (0)