-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
130 lines (111 loc) · 3.67 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const express = require('express')
const app = express()
const admin = require('firebase-admin')
const { v4: uuidv4 } = require('uuid')
const qr = require('qrcode')
require('dotenv').config()
// Configuración de archivos estáticos
app.use(express.static('public'))
// Configuración de Firebase
const serviceAccount = {
type: 'service_account',
project_id: process.env.FIREBASE_PROJECT_ID,
private_key_id: process.env.FIREBASE_PRIVATE_KEY_ID,
private_key: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
client_email: process.env.FIREBASE_CLIENT_EMAIL,
client_id: process.env.FIREBASE_CLIENT_ID,
auth_uri: process.env.FIREBASE_AUTH_URI,
token_uri: process.env.FIREBASE_TOKEN_URI,
auth_provider_x509_cert_url: process.env.FIREBASE_AUTH_PROVIDER_CERT_URL,
client_x509_cert_url: process.env.FIREBASE_CLIENT_CERT_URL,
universe_domain: 'googleapis.com'
}
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
})
// Middleware para procesar datos del formulario
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
// Ruta para la página principal
app.get('/', (req, res) => {
res.render('crear_url', { shortenedURL: null, qrCodeDataURL: null })
})
// Ruta para las redirecciones y la página de creación de URLs
app.get('/:code', async (req, res) => {
const code = req.params.code
if (!code.includes('/')) {
// Redirigir si se encuentra una URL válida
const db = admin.firestore()
const docRef = db.collection('urls').doc(code)
try {
const doc = await docRef.get()
if (doc.exists) {
const originalURL = doc.data().originalURL
res.redirect(originalURL)
} else {
res.status(404).send('URL no encontrada.')
}
} catch (error) {
console.error('Error al obtener la URL:', error)
res.status(500).send('Error interno del servidor.')
}
} else {
// Mostrar la interfaz de creación de URLs
res.render('crear_url', { shortenedURL: null, qrCodeDataURL: null })
}
})
// Ruta para manejar la creación de URLs acortadas
app.post('/crear', async (req, res) => {
const originalURL = req.body.url
const protocol = req.protocol
const domain = req.get('host')
// Generar código único para la URL acortada
const code = generateUniqueCode(protocol, domain)
const db = admin.firestore()
const docRef = db.collection('urls').doc(code)
try {
// Guardar la URL original en Firestore
await docRef.set({
originalURL
})
const shortenedURL = `${protocol}://${domain}/${code}`
// Generar el código QR para la URL acortada
const qrCodeDataURL = await generateQRCode(shortenedURL)
res.render('crear_url', { shortenedURL, qrCodeDataURL })
} catch (error) {
console.error('Error al guardar la URL:', error)
res.status(500).send('Error interno del servidor.')
}
})
// Función para generar un código único
function generateUniqueCode(protocol, domain) {
return uuidv4().substring(0, 6)
}
// Función para generar un código QR
async function generateQRCode(url) {
try {
const options = {
errorCorrectionLevel: 'H',
type: 'image/png',
color: {
dark: '#16222a',
light: '#ffffff'
},
width: 300,
height: 300
}
// Generar código QR como imagen en formato Data URL
const qrCodeDataURL = await qr.toDataURL(url, options)
return qrCodeDataURL
} catch (error) {
console.error('Error al generar el código QR:', error)
return null
}
}
// Configuración del servidor
const port = process.env.PORT || 3000
app.set('view engine', 'ejs')
app.use(express.static('public'))
app.listen(port, () => {
console.log(`Servidor escuchando en el puerto ${port}`)
})