Este proyecto tiene como objetivo indexar y visualizar una base de datos de correos electrónicos con el dataset de Enron Corp utilizando ZincSearch como motor de búsqueda. La aplicación permite a los usuarios buscar y visualizar correos electrónicos a través de una interfaz web simple.
- Se indexaron los contenidos del dataset Enron Mail Dataset (423MB) en ZincSearch usando un programa en GO.
- Se realizó profilling al indexador siguiendo la documentación de GO Profiling y se generaron gráficos para cpu, memoria, y go routines.
- Se creó una interfaz simple con Vue, y tailwind para visualizar y buscar contenidos.
- En progreso - Usar el profilling de la parte 2 para optimizar mi código y documentar las mejoras de optimización que encontré.
- El backend con GO y la base de datos con ZincSearch se encuentra desplegadas en una instancia AWS EC2 y el frontent con Vue se encuentra desplegado con Vercel.
El proyecto puede visualizarse en una URL segura en: https://swe-challenge-zinc-gavrojas.vercel.app/
- Lenguaje Backend: Go
- Base de Datos: ZincSearch
- API Router: chi
- Interfaz: Vue 3, Pinia, Vue Router, Vuetify,
- CSS: Tailwind
- Despliegue Docker, AWS EC2, Vercel
El proyecto está dividido en cuatro partes: el frontend, el backend, el indexador y el entorno de Docker.
- Interfaz de Usuario: Desarrollada con Vue 3, permite a los usuarios buscar correos electrónicos de manera intuitiva.
- Autenticación: Sistema básico de registro y login con usuario y contraseña.
- Gestión de Sesión: Manejo de tokens JWT
- Búsqueda de correos: Filtros por campos to, from, body y subject
- Visualización de correos: Resultados de los primeros correos que coinciden con los campos de búsqueda y con opción de ver más, opción de visualizar contenido del correo.
Estructura de Directorios Frontend
src/
├── components/
│ ├── EmailList.vue
│ ├── EmailView.vue
│ ├── FoldersSidebar.vue
│ ├── LoginForm.vue
│ ├── RegisterForm.vue
│ ├── SearchCard.vue
│ └── Snackbar.vue
├── router/
│ └── index.ts
├── services/
│ ├── auth.ts
│ ├── email.ts
│ └── utils.ts
├── stores/
│ ├── auth.ts
│ └── emails.ts
├── types/
│ └── index.ts
├── views/
│ ├── FolderView.vue
│ ├── HomeView.vue
│ ├── LoginView.vue
│ └── RegisterView.vue
├── assets/
│ ├── base.css
│ ├── logo.svg
│ └── login.svg
└── main.ts
- API: Implementada en Go, maneja las solicitudes de búsqueda de emails y autenticación de usuarios.
- Autenticación:
- Registro y login de usuarios
- Generación y validación de JWT
- Manejo de Errores: Respuestas adecuadas para errores en la carga y búsqueda de correos.
- Búsqueda de emails por campos específicos
Estructura de Directorios Backend
mail_api/
├── auth/
│ ├── handlers.go
│ └── router.go
├── emails/
│ ├── handler.go
│ └── router.go
├── models/
│ ├── emails.go
│ ├── users.go
│ └── zinc.go
├── shared/
│ ├── jwt.go
│ ├── middlewares.go
│ └── sessions.go
├── users/
│ ├── handler.go
│ └── router.go
├── zinc/
│ └── zinc.go
├── Dockerfile
├── go.mod
├── go.sum
└── main.go
- Indexer: Programa que toma la base de datos de correos y la indexa en ZincSearch para facilitar la búsqueda.
Estructura de Directorios Indexador
zinc/
├── config/
│ └── config.go
├── data/
│ └── enron_mail_20110402
├── mails/
│ └── mails.go
├── utils/
│ └── fileUtils.go
├── zinc/
│ ├── bulk.go
│ ├── client.go
│ ├── index.go
│ └── types.go
├── go.mod
└── main.go
Configuración para el despliegue de la aplicación usando Docker Compose:
- ZincSearch para base de datos
- Servidor Go para la API
- Configuración de red y volúmenes
Estructura de Directorios Docker
mail_tools/mail_tools/
├── docker-compose.yml
└── README.md
En el directorio zinc:
- Ejecutar: ./get_data.sh Esto traerá toda la data y la dejará descomprimida para trabajar con ella.
Teniendo Docker instalado y corriendo:
- Ejecutar: docker compose build
- Ejecutar: docker compose up zinc -d
- Ejecutar: docker compose up api -d
Esto levantará:
- el servicio de zincSearch en http://localhost:4080/
- el servidor de Go en: http://localhost:8080/
En el directorio zinc ejecutar:
- ./indexer -cpuprofile=cpu.prof -memprofile=mem.prof -goroutineprofile=goroutine.prof data/enron_mail_20110402 > logsIndexer.txt 2>&1 & Esto ejecutará el indexador en segundo plano,guardará los logs en un archivo llamado logsIndexer.txt y además guardará el profilling para cpu, memoria y goroutines
Después de tener los registros en ZincSearch, dirigirse al directorio mail_app y ejecutar:
- ./enron_mails
Esto levantará el servicio de visualización (frontend) en http://localhost:5173/
Para mas información puedes escribirme a mi correo [email protected] o contactarme por LinkedIn