endpoint usuario y compras
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
# finanzas_api
|
||||
|
||||
Api para una aplicación de finanzas
|
||||
Api para una aplicación de finanzas
|
||||
|
||||
npx mongoku start
|
||||
|
||||
|
||||
62
index.js
Normal file
62
index.js
Normal 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));
|
||||
|
||||
|
||||
23
middlewares/authentication.js
Normal file
23
middlewares/authentication.js
Normal 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
9
models/categorias.js
Executable 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
13
models/compras.js
Normal 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
12
models/ingresos.js
Executable 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
21
models/presupuestoMes.js
Executable 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
22
models/user.js
Executable 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
11818
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
33
package.json
Normal file
33
package.json
Normal 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
22
routes/compras.js
Normal 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
72
routes/users.js
Normal 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;
|
||||
Reference in New Issue
Block a user