Requerimiento: Desarrollo de Microservicio de Email para SnappyCommerce
Objetivo:
Se requiere la creación de un microservicio que permita gestionar el envío y recepción de correos electrónicos para los clientes de SnappyCommerce. El microservicio deberá proporcionar las siguientes funcionalidades principales:
Recepción y almacenamiento de emails:
El microservicio deberá ser capaz de recibir correos electrónicos enviados por nuestros clientes.
El microservicio debe poder conectarse a los servidores de correo de los clientes utilizando el protocolo IMAP debido a que permite la sincronización de correos y facilita el acceso simultáneo desde múltiples clientes.
Cada tienda en Snappycommerce configurara su credenciales de imap/smpt y snappycommerce le enviara via post la relacion entre el correo y el storeuuid, la cual será utilizada para recibir correos electrónicos.
El microservicio debe ser capaz de identificar el StoreUuid en función de la dirección de correo a la que se envió el correo (por ejemplo, el store123 en
support@store123.snappycommerce.com).
Deberá almacenar una copia de cada correo y su relación con el StoreUuid en una base de datos, para que puedan ser consultados posteriormente a través de la plataforma de SnappyCommerce.
Se deberá exponer un endpoint que, dado uno o varios StoreUuid y filtros opcionales (por ejemplo, fecha, asunto, remitente), devuelva un array de los correos electrónicos almacenados para dichos clientes (StoreUuid).
Envío de correos electrónicos:
El microservicio debe ser capaz de enviar correos electrónicos utilizando el protocolo SMTP. Se proporcionarán las credenciales SMTP del cliente en cada solicitud para autenticarse contra el servidor de correo.
A través de un endpoint, se deberá recibir la siguiente información para el envío de correos:
subject (asunto del correo),
body (cuerpo del mensaje),
from (dirección de correo del remitente),
to (lista de direcciones de correo del destinatario),
credentials (credenciales del servidor SMTP del cliente, como usuario, contraseña, host y puerto).
El microservicio enviará el correo utilizando las credenciales provistas, y almacenará una copia en la base de datos para su consulta futura.
Detalles técnicos de implementación:
Protocolos de correo electrónico:
imap para la recepción de correos electrónicos:
imap: proporciona acceso bidireccional a los correos, permitiendo que los correos permanezcan en el servidor para ser consultados desde otros dispositivos.
SMTP para el envío de correos electrónicos:
Autenticación basada en credenciales provistas por el cliente (usuario, contraseña, host SMTP, puerto).
Manejo de tls/ssl para asegurar la comunicación con el servidor smtp.
Autenticación y Seguridad:
Los endpoints para el envío y la consulta de correos deben ser seguros, utilizando OAuth o API keys para la autenticación de las solicitudes..
Gestión de Conexiones:
Implementar un sistema de gestión de conexiones eficiente para IMAP, reutilizando conexiones siempre que sea posible y evitando abrir múltiples conexiones simultáneas al mismo servidor.
Uso de librerías especializadas como node-imap, imap-simple o nodemailer para facilitar la integración con los protocolos de correo.
Manejo de errores y reintentos automáticos en caso de fallos en la conexión con los servidores de correo.
Persistencia de Datos:
Los correos electrónicos recibidos (tanto el encabezado como el cuerpo) deberán almacenarse en la base de datos seleccionada (por ejemplo, PostgreSQL, MongoDB).
Se recomienda que los adjuntos de los correos electrónicos sean almacenados en buckets compatibles con S3 para optimizar el almacenamiento en la base de datos. En este caso, solo se almacenarán metadatos en la base de datos y los archivos en un sistema de almacenamiento de objetos.
La estructura de la base de datos debería incluir:
Tabla o colección de correos electrónicos (ID, StoreUuid, asunto, remitente, destinatario(s), fecha, cuerpo, referencia al adjunto en el bucket).
Archivo env donde estarán las credenciales y url del resto de los microservicios a utilizar
requisitos técnicos:
lenguaje:
el desarrollo debe realizarse en typescript.
Motor de ejecución:
Preferentemente se debe utilizar
Bun.sh para la ejecución, aunque también es aceptable
Node.js en caso de ser necesario.
Base de datos:
La elección de la base de datos queda abierta, pudiendo utilizarse PostgreSQL, Redis o MongoDB, según sea más apropiado para la solución.
Compatibilidad con Docker:
El microservicio debe ser compatible con Docker, facilitando su despliegue y ejecución en entornos estandarizados.
Arquitectura:
El diseño del microservicio debe seguir un enfoque orientado a objetos utilizando clases para la organización y encapsulación del código.
Linting:
Se deberá utilizar el linting provisto por SnappyCommerce para garantizar la calidad y consistencia del código.
Tests unitarios:
Es indispensable que el microservicio cuente con tests unitarios que cubran sus principales funcionalidades para asegurar su correcto funcionamiento.
Almacenamiento adicional (opcional):
Si el microservicio requiere almacenamiento adicional, deberá integrarse con servicios de almacenamiento en buckets compatibles con S3.
Consideraciones adicionales:
El microservicio debe ser escalable y de fácil mantenimiento, permitiendo futuras extensiones o modificaciones.
Se valorará la eficiencia en el manejo de grandes volúmenes de correos electrónicos, así como la optimización del uso de la base de datos.
Plazo de Entrega: No definido