Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
basshamut committed Jun 24, 2024
1 parent d280277 commit 3f8a3b5
Show file tree
Hide file tree
Showing 24 changed files with 5,300 additions and 11 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ dist-ssr
*.njsproj
*.sln
*.sw?
.idea
16 changes: 16 additions & 0 deletions backend/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module.exports = {
env: {
node: true, // Indica que estás en un entorno de Node.js
es2021: true // O la versión de ECMAScript que estés usando
},
extends: [
'eslint:recommended', // Usar las configuraciones recomendadas por ESLint
],
parserOptions: {
ecmaVersion: 12, // O la versión de ECMAScript que estés usando
sourceType: 'module',
},
rules: {
// Aquí puedes añadir o sobrescribir reglas específicas
},
};
30 changes: 30 additions & 0 deletions backend/config/database/database.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const {Sequelize} = require('sequelize');

const connection = 'postgresql://test_db_owner:Lqn84hbsNPvG@ep-purple-voice-a5bgc10s.us-east-2.aws.neon.tech/test_db?sslmode=require'

const sequelize = new Sequelize(connection, {
dialect: 'postgres',
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false
}
}
});

// Synchronize all models
try {
sequelize.authenticate()
sequelize.sync({alter: true}) // force: true elimina las tablas existentes y las vuelve a crear, usa con precaución
.then(() => {
console.log('Database & tables created!')
})
.catch(error => {
console.error('Unable to create tables, shutting down...', error)
})
console.log('Connection to the database has been established successfully.')
} catch (error) {
console.error('Unable to connect to the database:', error)
}

module.exports = sequelize;
40 changes: 40 additions & 0 deletions backend/controller/MeetController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const express = require("express")
const meetService = require('../service/MeetService')

const router = express.Router()

router.post('/', (request, response) => {
response.setHeader('Content-Type', 'application/json')

const meet = {
meetUrl: request.body.meetUrl,
meetDate: request.body.meetDate,
price: request.body.price
}

const newMeet = meetService.save(meet)

response.status(201).send(newMeet)
})

router.get('/', async (request, response) => {
const url = request.query.url

if (!url) {
response.status(400).send({message: 'Url parameter is required'})
return
}

const meet = await meetService.getByUrl(url)
if (meet) {
response.status(200).send(meet)
} else {
response.status(404).send({message: 'Meet not found'})
}
})
router.get('/all', async (request, response) => {
const meets = await meetService.getAll()
response.status(200).send(meets)
})

module.exports = router
15 changes: 15 additions & 0 deletions backend/controller/PurchaseController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const express = require("express")
const router = express.Router()

const PurchaseService = require("../service/PurchaseService");
router.post('/', async (req, res) => {
try {
const purchase = req.body;
const savedPurchase = await PurchaseService.save(purchase);
res.json(savedPurchase);
} catch (error) {
res.status(500).json({error: error.message});
}
})

module.exports = router
30 changes: 30 additions & 0 deletions backend/controller/StripeController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const express = require("express")
const router = express.Router()

const stripe = require('stripe')('sk_test_51PSHknKnVUk9u0R7NE00UeVyiOzpnfGxGYnLG6ViHxy2eOpDXfYCQTU28Xnfuh9MPvg7qwi5hQp4ArEBjJhjv73z005BOmZJSK')

router.post('/create-checkout-session', async (req, res) => {
//TODO encriptar y parsear a bse64 datos del retorno de la respuesta
try {
const meetId = req.body.meetId
const userId = req.body.userId
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [
{
price: 'price_1PSI1tKnVUk9u0R7xH1FCwss',
quantity: 1,
},
],
mode: 'payment',
success_url: 'http://localhost:5173/dashboard?state=succeeded&meetId=' + meetId + '&userId=' + userId,
cancel_url: 'http://localhost:5173/dashboard?state=canceled&meetId=' + meetId + '&userId=' + userId,
})

res.json({sessionId: session.id})
} catch (error) {
res.status(500).json({error: error.message})
}
})

module.exports = router
86 changes: 86 additions & 0 deletions backend/controller/UserController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
const express = require("express")
const router = express.Router()
const userService = require("../service/UserService");

function validateEmail(email) {
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
return re.test(email)
}

function validatePassword(password) {
return password.length >= 8
}

router.post('/register', async (req, res) => {
const {user, date, password} = req.body

const errors = {}

if (!user) {
errors.user = "El email es requerido"
} else if (!validateEmail(user)) {
errors.user = "El formato del email no es válido"
}

const today = new Date()
const majorityAgeDate = new Date(today.getFullYear() - 18, 0, 1)

if (!date) {
errors.date = "La fecha de nacimiento es requerida"
} else {
const userDate = new Date(date)
if (userDate > majorityAgeDate) {
errors.date = "Debes ser mayor de 18 años"
}
}

if (!password) {
errors.password = "La contraseña es requerida"
} else if (!validatePassword(password)) {
errors.password = "La contraseña debe tener al menos 8 caracteres"
}

if (Object.keys(errors).length > 0) {
return res.status(400).json({errors})
}

const userFound = await userService.save({email: user, birthDate: date, password})
if (userFound === null) {
const errorResponse = {message: 'El email ya está registrado'}
return res.status(409).json(errorResponse)
}

res.status(201).json({message: 'Registro exitoso'})
})

router.post('/login', async (req, res) => {
const { user, password } = req.body

const errors = {}

if (!user) {
errors.user = "El email es requerido"
} else if (!validateEmail(user)) {
errors.user = "El formato del email no es válido"
}

if (!password) {
errors.password = "La contraseña es requerida"
}

if (Object.keys(errors).length > 0) {
return res.status(400).json({ errors })
}

const userFound = await userService.login(user, password)

if (!userFound) {
return res.status(404).json({ message: 'Usuario o contraseña incorrectos' })
}

res.status(200).json(userFound)
})

//TODO agregar endpoint que consulte el rol desde la DB

module.exports = router
37 changes: 37 additions & 0 deletions backend/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
require('dotenv').config()

const express = require("express")
const cors = require('cors')

const meetController = require('./controller/MeetController')
const stripeController = require('./controller/StripeController')
const userController = require('./controller/UserController')
const purchaseController = require('./controller/PurchaseController')

const app = express()
const port = process.env.PORT ? process.env.PORT : 5000

const corsOptions = {
origin: '*',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
}

app.use(cors(corsOptions))
app.use(express.json())

app.use('/api/meets', meetController)
app.use('/api/users', userController)
app.use('/api/stripe', stripeController)
app.use('/api/purchases', purchaseController)


app.get('/', (request, response) => {
response.status(200).json({
message: "Service is up!"
})
})

app.listen(port, async function () {
console.log(" ➜ Local: Server Listening on port " + port + " (http://localhost:" + port + ")")
})
Loading

0 comments on commit 3f8a3b5

Please sign in to comment.