endpoint usuario y compras

This commit is contained in:
2021-04-18 20:24:56 -05:00
parent 4766d0ef3c
commit 4a7fb24eb2
13 changed files with 12114 additions and 1 deletions

3
.babelrc Normal file
View File

@@ -0,0 +1,3 @@
{
"presets":["@babel/preset-env"]
}

View File

@@ -1,3 +1,6 @@
# finanzas_api
Api para una aplicación de finanzas
npx mongoku start

62
index.js Normal file
View File

@@ -0,0 +1,62 @@
if(process.env.NODE_ENV=='development'){
require('dotenv').config();
console.log('Ejecutando en modo: ',process.env.NODE_ENV)
}
else{
console.log('Ejecutando en modo: ',process.env.NODE_ENV)
}
const express = require('express');
const mongoose = require('mongoose');
const morgan = require("morgan")
const colors = require('colors')
const cors = require('cors')
const app = express();
// express config
app.use(morgan("tiny"));
app.use(express.json());
app.use(express.urlencoded({
extended:true
}));
app.set('port',process.env.PORT || 4000);
app.use(cors());
//Rutas
app.use('/api',require('./routes/users'));
app.use('/api',require('./routes/compras'))
module.exports = app;
app.listen(app.get('port') ,() => console.log("service startes, listening on the port: ",app.get('port')))
//Mongo conecction
var uri;
if(process.env.NODE_ENV=='development'){
uri=process.env.MONGOOSE_URI_LOCAL
}
else{
uri=process.env.MONGOOSE_URI_PRODUCCION
}
const options={
useNewUrlParser:true,
useCreateIndex:true,
useUnifiedTopology:true,
authSource:"admin"
};
const db = mongoose.connect(uri,options).then(()=>{
console.log("Successful connection to Mongo".green);
},(err)=> console.log(`Fail conecction to Mongo: ${err}`.red));

View File

@@ -0,0 +1,23 @@
const jwt = require('jsonwebtoken')
let checkAuth = (req,res,next)=>{
let token = req.get('token');
jwt.verify(token,"api finanzas mdchaparror @4050#",(err,decoded)=>{
if(err){
return res.status(401).json({
status:"Fail",
error:err
})
}
req.userData = decoded.userData;
next();
})
}
module.exports = {checkAuth};

9
models/categorias.js Executable file
View File

@@ -0,0 +1,9 @@
const mongoose = require('mongoose');
const {Schema} =mongoose;
const categoriaShema=new Schema({
categoria:{type:String,required:true},
user:{type:String, required:true}
});
module.exports=mongoose.model('categoria',categoriaShema);

13
models/compras.js Normal file
View File

@@ -0,0 +1,13 @@
const mongoose = require('mongoose');
const {Schema} =mongoose;
const CompraSchema=new Schema({
fecha: {type: String, required:true},
detalle: {type:String,required:true},
valor: {type:Number, required:true},
metodopago:{type:String, required:true},
categoria:{type:String,required:true},
user:{type:String, required:true}
});
module.exports=mongoose.model('Compras',CompraSchema);

12
models/ingresos.js Executable file
View File

@@ -0,0 +1,12 @@
const mongoose = require('mongoose');
const {Schema} =mongoose;
const IngresoSchema=new Schema({
fecha: {type: String, required:true},
detalle: {type:String,required:true},
valor: {type:Number, required:true},
user:{type:String, required:true}
});
module.exports=mongoose.model('Ingresos',IngresoSchema);

21
models/presupuestoMes.js Executable file
View File

@@ -0,0 +1,21 @@
const mongoose = require('mongoose');
const {Schema} =mongoose;
const itemSchema = new Schema({
detalle:{type:String},
valor:{type:Number},
tipo:{type:String, required:true}
})
const PresupuestoSchema=new Schema({
date: {type: Date, default: Date.now},
nombrePresupuesto: {type:String,required:true},
datos:[itemSchema],
user:{type:String, required:true},
child:itemSchema
});
module.exports.Presupuesto=mongoose.model('presupuestoMes',PresupuestoSchema);
module.exports.itemPresupuesto=mongoose.model('itemPresupuestoMensual',itemSchema);

22
models/user.js Executable file
View File

@@ -0,0 +1,22 @@
const mongoose = require('mongoose');
const {Schema} =mongoose;
const bscryptjs = require('bcrypt');
const UserSchema=new Schema({
name: {type:String,required:true},
email: {type:String, required:true},
password:{type:String, required:true},
date: {type: Date, default: Date.now}
});
UserSchema.methods.encryptPassword = async (password)=>{
const salt=await bscryptjs.genSalt(10);
const hash=await bscryptjs.hash(password,salt);
return hash;
};
UserSchema.methods.matchPassword=async function (password){
return await bscryptjs.compare(password,this.password);
};
const User = mongoose.model('Users',UserSchema);
export default User;

11818
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

33
package.json Normal file
View File

@@ -0,0 +1,33 @@
{
"name": "API",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "cross-env NODE_ENV=production node index",
"dev": "cross-env NODE_ENV=development nodemon index --exec babel-node"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"bcrypt": "^5.0.1",
"colors": "^1.4.0",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.12.4",
"mongoose-unique-validator": "^2.0.3",
"morgan": "^1.10.0"
},
"devDependencies": {
"@babel/cli": "^7.13.14",
"@babel/core": "^7.13.15",
"@babel/node": "^7.13.13",
"@babel/preset-env": "^7.13.15",
"babel-plugin-component": "^1.1.1",
"nodemon": "^2.0.7"
}
}

22
routes/compras.js Normal file
View File

@@ -0,0 +1,22 @@
const router = require("express").Router();
const Compra = require("../models/compras");
const { checkAuth } = require("../middlewares/authentication");
router.get("/compras", checkAuth, async (req, res) => {
var compras;
compras = await Compra.find({ user: req.userData._id }).sort({
fecha: "desc",
});
return res.send(
{
status:"ok",
data:compras
}
)
});
module.exports = router;

72
routes/users.js Normal file
View File

@@ -0,0 +1,72 @@
const express = require("express");
const router = express.Router();
const jwt = require("jsonwebtoken");
const bcrypt = require("bcrypt");
import User from "../models/user.js";
//AUTH
router.post("/register", async (req, res) => {
const { name, email, password } = req.body;
const passEncrypted = bcrypt.hashSync(password, 10);
const newUser = new User({
name: name,
email: email,
password: password,
});
const emailUser = await User.findOne({ email: email });
if (emailUser) {
return res
.status(500)
.json({ status: "fail", error: "email already exists" });
}
try {
newUser.password = await newUser.encryptPassword(password);
await newUser.save();
res.json({
status: "ok",
msg: "Usuario creado",
});
} catch (error) {
return res
.status(500)
.json({ status: "fail", error: `internal error:${error}` });
}
});
router.post("/login", async (req, res) => {
const { email, password } = req.body;
var user = await User.findOne({ email: email });
if (!user) {
res.status(401).json({ status: "fail", error: "Invalid credentials email" });
return;
}
if (! await user.matchPassword(password)) {
return res.status(401).json({ status: "fail", error: "Invalid credentials pass" });
}
user.set("password", undefined, { strict: false });
const token = jwt.sign(
{
userData: user,
},
"api finanzas mdchaparror @4050#",
{ expiresIn: 60 * 60 * 24 * 30 }
);
const toSend = {
status: "ok",
userData: user,
token: token,
};
res.json(toSend);
});
//CRUD USER
module.exports = router;