Bluesoft Bank es un banco tradicional que se encarga de guardar el dinero de sus ahorradores. Ofrece dos tipos de cuenta: ahorros para personas naturales y corrientes para empresas. Adicionalmente, para cada cuenta se pueden hacer consignaciones y retiros.
Además, debe soportar algunos requerimientos para sus ahorradores:
Consultar el saldo de la cuenta. Consultar los movimientos más recientes. Generar extractos mensuales. Reglas de negocio:
Una cuenta no puede tener un saldo negativo. El saldo de la cuenta siempre debe ser consistente frente a dos operaciones concurrentes (consignación, retiro). También se deben generar reportes en tiempo real como:
Listado de clientes con el número de transacciones para un mes en particular, organizado de manera descendente (primero el cliente con mayor número de transacciones en el mes). Clientes que retiran dinero fuera de la ciudad de origen de la cuenta con el valor total de los retiros realizados superior a $1.000.000. En base a lo anterior, por favor responde los siguientes puntos:
Crea un diagrama de clases que modele el problema, identifica los elementos principales y sus relaciones.
- Campos:
ID int64
— Identificador único de la cuenta.Balance float64
— Saldo actual de la cuenta.Customer Customer
— Referencia al cliente que posee la cuenta.
- Métodos:
GetBalance() float64
— Consulta el saldo de la cuenta.GetTransactions() []Transaction
— Consulta los movimientos más recientes de la cuenta.GenerateMonthlyStatement() []Transaction
— Genera el extracto mensual de la cuenta.
- Campos y Métodos: Hereda campos y métodos de
Account
. Representa una cuenta de ahorros para personas físicas.
- Campos y Métodos: Hereda campos y métodos de
Account
. Representa una cuenta corriente para empresas.
- Campos:
ID int64
— Identificador único del movimiento.Type string
— Tipo del movimiento (depósito o retiro).Amount float64
— Valor del movimiento.Date time.Time
— Fecha del movimiento.
- Métodos:
PerformDeposit(amount float64) error
— Realiza un depósito en la cuenta.PerformWithdrawal(amount float64) error
— Realiza un retiro en la cuenta.
- Campos:
ID int64
— Identificador único del cliente.Name string
— Nombre del cliente.City string
— Ciudad de origen del cliente.
- Métodos:
GetTransactionReport(month time.Month, year int) []Transaction
— Obtiene el informe de transacciones del cliente para un mes específico.
- Descripción: La aplicación se divide en servicios independientes, como gestión de cuentas, movimientos e informes. Cada microservicio es responsable de una parte específica del sistema, permitiendo escalabilidad y mantenimiento independientes.
- Capa de Presentación: La interfaz de usuario interactúa con la API.
- Capa de API: Implementada con Gin, gestiona las solicitudes y respuestas.
- Capa de Aplicación: Implementa la lógica de negocios.
- Capa de Persistencia: Gestionada por PostgreSQL para almacenar datos financieros.
- Capa de Mensajería: Usando Kafka para procesar eventos en tiempo real.
- Capa de Orquestación y Contenerización: Docker para contenedores y Kubernetes para orquestación.
- Lenguaje: Go (Golang)
- Justificación: Ideal para alto rendimiento y operaciones simultáneas con goroutines, manteniendo el código limpio y eficiente.
- Framework: Gin
- Justificación: Framework rápido y ligero para crear APIs RESTful, ofreciendo un rendimiento superior y facilidad de uso.
- Persistencia: PostgreSQL
- Justificación: Base de datos relacional confiable con soporte para transacciones ACID, capaz de manejar consultas complejas y escalabilidad.
- Mensajería: Kafka
- Justificación: Plataforma de streaming que procesa y transmite grandes volúmenes de datos en tiempo real, esencial para informes y eventos.
- Contenerización: Docker
- Justificación: Simplifica la creación y gestión de contenedores, garantizando consistencia entre entornos.
- Orquestación: Kubernetes
- Justificación: Gestiona contenedores a gran escala, automatizando la implementación y gestión, garantizando escalabilidad y disponibilidad.
- Plataforma en la Nube: Google Cloud
- Justificación: Ofrece servicios escalables y seguros para computación, almacenamiento y bases de datos, ideal para alojar el sistema bancario.
-
Creación del Directorio
cmd
y Archivomain.go
Se creó un directorio
cmd
y se añadió el archivomain.go
para configurar el servidor HTTP y las rutas de la API usando Gin. -
Creación del Directorio
internal
y SubdirectoriosSe creó una estructura de directorios
internal
con subdirectorios paraaccount
,customer
,transaction
,persistence
,messaging
yservices
. Dentro de estos directorios, se crearon archivos vacíos correspondientes. -
Contenido de los Archivos
account.go
: Define estructuras y métodos para cuentas, transacciones y tipos de cuentas.transaction.go
: Define funciones para realizar depósitos y retiros.customer.go
: Define la estructura deCustomer
y el método para obtener un informe de transacciones.postgres.go
: Define la función para conectar con una base de datos PostgreSQL.kafka.go
: Define la función para conectar con Kafka.account_service.go
: Define los manejadores de rutas para las operaciones de la API.
-
Archivos Dockerfile y
docker-compose.yml
Dockerfile
: Configura el entorno de ejecución de Docker para el aplicativo Go.docker-compose.yml
: Configura los servicios de Docker para el aplicativo, PostgreSQL y Kafka.
-
Configuración de la Base de Datos PostgreSQL
- Instalación en Windows: Descargue el instalador, ejecute la instalación y configure el PostgreSQL.
- Creación de la base de datos y tablas necesarias usando el pgAdmin.
-
Configuración de Kafka
- Kafka se gestiona a través de Docker. Se inicia Kafka utilizando Docker Compose.
-
Pruebas de Conexión
- Base de Datos: Se actualizó el archivo
postgres.go
para probar la conexión a la base de datos PostgreSQL y se creó un archivo de pruebatest_db_connection.go
para verificar la conexión. - Kafka: Se actualizó el archivo
kafka.go
y se creótest_kafka_connection.go
para probar la conexión con Kafka.
- Base de Datos: Se actualizó el archivo
-
Pruebas Adicionales
- Se escribieron pruebas unitarias para las funciones de servicio en
internal/services/account_service_test.go
.
- Se escribieron pruebas unitarias para las funciones de servicio en