endpoint usuario y compras
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
# finanzas_api
|
# 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