{"id":20822348,"url":"https://github.com/potier97/redbicis","last_synced_at":"2026-04-11T02:56:54.656Z","repository":{"id":169231791,"uuid":"307633259","full_name":"potier97/RedBicis","owner":"potier97","description":"Proyecto de Node con Express, App de Bicis para que sean alquiladas. Puesta en Producción en Heroku: Ubicado en https://bicired.herokuapp.com/","archived":false,"fork":false,"pushed_at":"2020-10-27T21:08:36.000Z","size":3187,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-20T03:08:58.131Z","etag":null,"topics":["api-rest","backend","cicd","express","mongodb","mongoose","oauth2"],"latest_commit_sha":null,"homepage":"https://bicired.herokuapp.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/potier97.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-27T08:29:05.000Z","updated_at":"2020-10-27T21:08:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"43a8ad17-5c23-4f7a-8bd8-f816ee886289","html_url":"https://github.com/potier97/RedBicis","commit_stats":null,"previous_names":["potier97/redbicis"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/potier97/RedBicis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2FRedBicis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2FRedBicis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2FRedBicis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2FRedBicis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/potier97","download_url":"https://codeload.github.com/potier97/RedBicis/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2FRedBicis/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265106019,"owners_count":23712249,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","backend","cicd","express","mongodb","mongoose","oauth2"],"created_at":"2024-11-17T22:14:41.463Z","updated_at":"2026-04-11T02:56:49.637Z","avatar_url":"https://github.com/potier97.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"public\\images\\14886.png\"/\u003e\u003cbr/\u003e\n  \u003ca href=\"https://bicired.herokuapp.com/\"\u003eBICI RED\u003c/a\u003e\n\u003c/h1\u003e \n\nEste 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/)\n\n\n\n\n## Instalación\n\nUtiliza [nmp](https://npm.com) para manejar las dependencias e instalarlas.\n\n```bash\nnpm install\n```\n\n\n\n## Principal\n\n```js\nrequire('dotenv').config();\nrequire('newrelic');\n\nvar createError = require('http-errors');\nvar express = require('express');\nvar path = require('path');\nvar cookieParser = require('cookie-parser');\nvar logger = require('morgan');\nvar session = require(\"express-session\");\nvar mongoDBStore = require(\"connect-mongodb-session\")(session);\nvar jwt = require(\"jsonwebtoken\");\nvar passport = require(\"./config/passport\"); \n\n\n\nvar indexRouter = require('./routes/index');\nvar usersRouter = require('./routes/users');\nvar bicicletaRouter = require('./routes/bicicletas')\nvar bicicletaAPIRouter = require('./routes/api/bicicletas')\nvar usuariosAPIRouter = require('./routes/api/usuarios')\nvar authAPIRouter = require(\"./routes/api/\");\nvar tokenRouter = require(\"./routes/token\");\nvar usuariosRouter = require(\"./routes/usuarios\");\n\nconst Usuario = require(\"./models/usuario\");\nconst Token = require(\"./models/token\");\n\n\n\nlet store  \nif (process.env.NODE_ENV === \"development\") {\n  store = new session.MemoryStore();\n} else {\n  store = new mongoDBStore({\n    uri: process.env.MONGO_URI,\n    collection: \"sessions\",\n  });\n  store.on(\"error\", function (error) {\n    assert.ifError(error);\n    assert.ok(false);\n  });\n}\n\n\nvar app = express();\napp.set(\"secretKey\", \"sdcss9scss.dcsd12\");\napp.use(\n  session({\n    cookie: { maxAge: 240 * 60 * 60 * 1000 },\n    store,\n    saveUninitialized: true,\n    resave: true,\n    secret: \"red_bicicletas!!!_1987\",\n  })\n);\n\n\n\n//Conexión a db\nvar mongoose = require('mongoose');\nvar mongoDB = 'mongodb://localhost/red_bicicletas';\n//mongoose.connect(mongoDB, { useNewUrlParser: true});\nmongoose.connect(mongoDB, { useNewUrlParser: true, useUnifiedTopology: true});\nmongoose.Promise = global.Promise;\nvar db = mongoose.connection;\ndb.on('error', console.error.bind(console, 'MongoDB Conection error: '))\n\n\n\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'pug');\n\napp.use(logger('dev'));\napp.use(express.json());\napp.use(express.urlencoded({ extended: false }));\napp.use(cookieParser());\napp.use(passport.initialize());\napp.use(passport.session());\napp.use(express.static(path.join(__dirname, 'public')));\n\n\n\napp.use('/', indexRouter);\napp.use('/usuarios', usuariosRouter);\napp.use('/token', tokenRouter);\napp.use('/users', usersRouter);\napp.use('/bicicletas', bicicletaRouter);\napp.use('/api/bicicletas', bicicletaAPIRouter);\napp.use('/api/usuarios', usuariosAPIRouter);\n\n\n\napp.get(\"/login\", function (req, res) {\n  res.render(\"session/login\");\n});\n\napp.post(\"/login\", function (req, res, next) {\n  passport.authenticate(\"local\", function (err, usuario, info) {\n    if (err) return next(err);\n    if (!usuario) return res.render(\"session/login\", { info });\n    req.logIn(usuario, function (err) {\n      if (err) next(err);\n      return res.redirect(\"/\");\n    });\n  })(req, res, next);\n});\n\napp.get(\"/logout\", function (req, res) {\n  req.logOut();\n  res.redirect(\"/login\");\n});\n\napp.get(\"/forgotPassword\", function (req, res) {\n  res.render(\"session/forgotPassword\");\n});\n\napp.post(\"/forgotPassword\", function (req, res, next) {\n  const { email } = req.body; \n  Usuario.findOne({ email }, function (err, usuario) {\n    if (!usuario)\n      return res.render(\"session/forgotPassword\", {\n        info: { message: \"Ese correo no está registrado\" },\n      });\n    usuario.resetPassword(function (err) {\n      if (err) return next(err);\n      console.log(\"session/forgotPasswordMessage\");\n    });\n    res.render(\"session/forgotPasswordMessage\");\n  });\n});\n\napp.get(\"/resetPassword/:token\", function (req, res, next) {\n  const { token } = req.params;\n  Token.findOne({ token }, function (err, token) {\n    if (!token)\n      return res\n        .status(400)\n        .send({ type: \"not-verified\", msg: \"Token inválido.\" });\n    Usuario.findById(token._userId, function (err, usuario) {\n      if (!usuario)\n        return res\n          .status(400)\n          .send({ type: \"not-verified\", msg: \"Token inválido.\" });\n      res.render(\"session/resetPassword\", { errors: {}, usuario });\n    });\n  });\n});\n\napp.post(\"/resetPassword\", function (req, res) {\n  const { email, password, confirm_password } = req.body;\n  if (password !== confirm_password) {\n    res.render(\"session/resetPassword\", {\n      errors: { confirm_password: \"No coincide la contraseña\" },\n      usuario: new Usuario({ email }),\n    });\n    return;\n  }\n  Usuario.findOne({ email }, function (err, usuario) {\n    usuario.password = password;\n    usuario.save(function (err) {\n      if (err) {\n        res.render(\"session/resetPassword\", {\n          errors: err.errors,\n          usuario: new Usuario({ email }),\n        });\n      } else {\n        res.redirect(\"/login\");\n      }\n    });\n  });\n});\n\n\n \napp.use('/', indexRouter);\napp.use('/users', usersRouter);\napp.use('/bicicletas', loggedIn, bicicletaRouter);\napp.use('/api/bicicletas', validarUsuario, bicicletaAPIRouter);\napp.use(\"/api/auth\", authAPIRouter);\napp.use('/api/usuarios',usuariosAPIRouter);\napp.use(\"/usuarios\", usuariosRouter);\napp.use(\"/token\", tokenRouter);\n\n\napp.get(\n  \"/auth/google\",\n  passport.authenticate(\"google\", {\n    scope: [\n      'https://www.googleapis.com/auth/plus.login',\n      'https://www.googleapis.com/auth/plus.profile.emails.read',\n      'profile',\n      'email'\n    ],\n  })\n);\n\napp.get(\n  \"/auth/google/callback\",\n  passport.authenticate(\"google\", {\n    successRedirect: \"/bicicletas\",\n    failureRedirect: \"/error,\",\n  })\n);\n\napp.use('/privacy_policy', (req, res) =\u003e {\n  res.sendFile('public/privacy_policy.html');\n});\n\napp.use('/google41ce4fbadbeb6963', (req, res) =\u003e {\n  res.sendFile('public/google41ce4fbadbeb6963.html');\n});\n\n\n\n// catch 404 and forward to error handler\napp.use(function(req, res, next) {\n  next(createError(404));\n});\n\n// error handler\napp.use(function(err, req, res, next) {\n  // set locals, only providing error in development\n  res.locals.message = err.message;\n  res.locals.error = req.app.get('env') === 'development' ? err : {};\n\n  // render the error page\n  res.status(err.status || 500);\n  res.render('error');\n});\n\nfunction loggedIn(req, res, next) {\n  if (req.user) next();\n  else res.redirect(\"/login\");\n}\n\nfunction validarUsuario(req, res, next) {\n  jwt.verify(req.headers[\"x-access-token\"], req.app.get(\"secretKey\"), function (\n    err,\n    decoded\n  ) {\n    if (err) res.json({ status: \"error\", message: err.message, data: null });\n    else {\n      req.body.userId = decoded.id;\n      console.log(\"jwt-verify\", decoded);\n      next();\n    }\n  });\n}\n\nmodule.exports = app;\n\n```\n\n## Contributing\nTodas tus contribuciones son bienvenidas, puedes contactarme para cualquier clase de comentario, necesidad, ayuda o inquietud acerca del proyecto\n\n## License\nEste proyecto tiene la licencia [MIT](https://github.com/potier97/RedBicis/blob/master/LICENSE)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpotier97%2Fredbicis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpotier97%2Fredbicis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpotier97%2Fredbicis/lists"}