https://github.com/potier97/redbicis
Proyecto de Node con Express, App de Bicis para que sean alquiladas. Puesta en Producción en Heroku: Ubicado en https://bicired.herokuapp.com/
https://github.com/potier97/redbicis
api-rest backend cicd express mongodb mongoose oauth2
Last synced: 3 months ago
JSON representation
Proyecto de Node con Express, App de Bicis para que sean alquiladas. Puesta en Producción en Heroku: Ubicado en https://bicired.herokuapp.com/
- Host: GitHub
- URL: https://github.com/potier97/redbicis
- Owner: potier97
- License: mit
- Created: 2020-10-27T08:29:05.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-10-27T21:08:36.000Z (over 5 years ago)
- Last Synced: 2025-06-20T03:08:58.131Z (about 1 year ago)
- Topics: api-rest, backend, cicd, express, mongodb, mongoose, oauth2
- Language: JavaScript
- Homepage: https://bicired.herokuapp.com/
- Size: 3.04 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README

BICI RED
Este es un proyecto para la creacion de una app Web del lado del servidor utilizando Node y Express, bajo la arquitectura MVC, se encuentra alojado en Heroku: [Bici Red](https://bicired.herokuapp.com/)
## Instalación
Utiliza [nmp](https://npm.com) para manejar las dependencias e instalarlas.
```bash
npm install
```
## Principal
```js
require('dotenv').config();
require('newrelic');
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require("express-session");
var mongoDBStore = require("connect-mongodb-session")(session);
var jwt = require("jsonwebtoken");
var passport = require("./config/passport");
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bicicletaRouter = require('./routes/bicicletas')
var bicicletaAPIRouter = require('./routes/api/bicicletas')
var usuariosAPIRouter = require('./routes/api/usuarios')
var authAPIRouter = require("./routes/api/");
var tokenRouter = require("./routes/token");
var usuariosRouter = require("./routes/usuarios");
const Usuario = require("./models/usuario");
const Token = require("./models/token");
let store
if (process.env.NODE_ENV === "development") {
store = new session.MemoryStore();
} else {
store = new mongoDBStore({
uri: process.env.MONGO_URI,
collection: "sessions",
});
store.on("error", function (error) {
assert.ifError(error);
assert.ok(false);
});
}
var app = express();
app.set("secretKey", "sdcss9scss.dcsd12");
app.use(
session({
cookie: { maxAge: 240 * 60 * 60 * 1000 },
store,
saveUninitialized: true,
resave: true,
secret: "red_bicicletas!!!_1987",
})
);
//Conexión a db
var mongoose = require('mongoose');
var mongoDB = 'mongodb://localhost/red_bicicletas';
//mongoose.connect(mongoDB, { useNewUrlParser: true});
mongoose.connect(mongoDB, { useNewUrlParser: true, useUnifiedTopology: true});
mongoose.Promise = global.Promise;
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB Conection error: '))
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/usuarios', usuariosRouter);
app.use('/token', tokenRouter);
app.use('/users', usersRouter);
app.use('/bicicletas', bicicletaRouter);
app.use('/api/bicicletas', bicicletaAPIRouter);
app.use('/api/usuarios', usuariosAPIRouter);
app.get("/login", function (req, res) {
res.render("session/login");
});
app.post("/login", function (req, res, next) {
passport.authenticate("local", function (err, usuario, info) {
if (err) return next(err);
if (!usuario) return res.render("session/login", { info });
req.logIn(usuario, function (err) {
if (err) next(err);
return res.redirect("/");
});
})(req, res, next);
});
app.get("/logout", function (req, res) {
req.logOut();
res.redirect("/login");
});
app.get("/forgotPassword", function (req, res) {
res.render("session/forgotPassword");
});
app.post("/forgotPassword", function (req, res, next) {
const { email } = req.body;
Usuario.findOne({ email }, function (err, usuario) {
if (!usuario)
return res.render("session/forgotPassword", {
info: { message: "Ese correo no está registrado" },
});
usuario.resetPassword(function (err) {
if (err) return next(err);
console.log("session/forgotPasswordMessage");
});
res.render("session/forgotPasswordMessage");
});
});
app.get("/resetPassword/:token", function (req, res, next) {
const { token } = req.params;
Token.findOne({ token }, function (err, token) {
if (!token)
return res
.status(400)
.send({ type: "not-verified", msg: "Token inválido." });
Usuario.findById(token._userId, function (err, usuario) {
if (!usuario)
return res
.status(400)
.send({ type: "not-verified", msg: "Token inválido." });
res.render("session/resetPassword", { errors: {}, usuario });
});
});
});
app.post("/resetPassword", function (req, res) {
const { email, password, confirm_password } = req.body;
if (password !== confirm_password) {
res.render("session/resetPassword", {
errors: { confirm_password: "No coincide la contraseña" },
usuario: new Usuario({ email }),
});
return;
}
Usuario.findOne({ email }, function (err, usuario) {
usuario.password = password;
usuario.save(function (err) {
if (err) {
res.render("session/resetPassword", {
errors: err.errors,
usuario: new Usuario({ email }),
});
} else {
res.redirect("/login");
}
});
});
});
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/bicicletas', loggedIn, bicicletaRouter);
app.use('/api/bicicletas', validarUsuario, bicicletaAPIRouter);
app.use("/api/auth", authAPIRouter);
app.use('/api/usuarios',usuariosAPIRouter);
app.use("/usuarios", usuariosRouter);
app.use("/token", tokenRouter);
app.get(
"/auth/google",
passport.authenticate("google", {
scope: [
'https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/plus.profile.emails.read',
'profile',
'email'
],
})
);
app.get(
"/auth/google/callback",
passport.authenticate("google", {
successRedirect: "/bicicletas",
failureRedirect: "/error,",
})
);
app.use('/privacy_policy', (req, res) => {
res.sendFile('public/privacy_policy.html');
});
app.use('/google41ce4fbadbeb6963', (req, res) => {
res.sendFile('public/google41ce4fbadbeb6963.html');
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
function loggedIn(req, res, next) {
if (req.user) next();
else res.redirect("/login");
}
function validarUsuario(req, res, next) {
jwt.verify(req.headers["x-access-token"], req.app.get("secretKey"), function (
err,
decoded
) {
if (err) res.json({ status: "error", message: err.message, data: null });
else {
req.body.userId = decoded.id;
console.log("jwt-verify", decoded);
next();
}
});
}
module.exports = app;
```
## Contributing
Todas tus contribuciones son bienvenidas, puedes contactarme para cualquier clase de comentario, necesidad, ayuda o inquietud acerca del proyecto
## License
Este proyecto tiene la licencia [MIT](https://github.com/potier97/RedBicis/blob/master/LICENSE)