Venues Service
1. Descripción
Microservicio responsable de la gestión de recintos físicos (venues), incluyendo zonas, aforo y disponibilidad. Administra los espacios donde se realizan los eventos físicos.
Bounded Context: Gestión de Eventos
Repository: eventmesh-lab/venues-service
2. Responsabilidades
- Registrar y administrar recintos físicos
- Gestionar zonas y distribución de asientos
- Controlar disponibilidad y calendario de ocupación
- Proveer información de capacidad y características
- Validar compatibilidad venue-evento
3. Modelo de Dominio
3.1 Agregado: Venue
Root Aggregate: Venue
Entidades
Venue
public class Venue : AggregateRoot
{
public Guid Id { get; private set; }
public string Nombre { get; private set; }
public Direccion Ubicacion { get; private set; }
public int CapacidadTotal { get; private set; }
public TipoVenue Tipo { get; private set; }
public EstadoVenue Estado { get; private set; }
public IReadOnlyList<Zona> Zonas { get; private set; }
public IReadOnlyList<Caracteristica> Caracteristicas { get; private set; }
}
Zona
public class Zona : Entity
{
public Guid Id { get; private set; }
public string Nombre { get; private set; }
public int Capacidad { get; private set; }
public TipoDistribucion Distribucion { get; private set; } // Numerado, General
public IReadOnlyList<Asiento> Asientos { get; private set; }
}
Asiento
public class Asiento : Entity
{
public Guid Id { get; private set; }
public string Identificador { get; private set; } // "A-12", "B-5"
public string Fila { get; private set; }
public int Numero { get; private set; }
public bool Accesible { get; private set; }
}
Value Objects
Direccion
public record Direccion
{
public string Calle { get; init; }
public string Ciudad { get; init; }
public string Estado { get; init; }
public string CodigoPostal { get; init; }
public string Pais { get; init; }
public Coordenadas Geolocalizacion { get; init; }
}
TipoVenue
public enum TipoVenue
{
Teatro,
Estadio,
Arena,
SalonEventos,
CentroConvenciones,
ClubNocturno,
AireLibre
}
EstadoVenue
public enum EstadoVenue
{
Activo,
Inactivo,
EnMantenimiento
}
TipoDistribucion
public enum TipoDistribucion
{
Numerado, // Asientos específicos
General // Entrada general sin asiento asignado
}
4. Comandos del Dominio
RegistrarVenue
Descripción: Registra un nuevo recinto en el sistema.
Input:
public record RegistrarVenueCommand
{
public string Nombre { get; init; }
public DireccionDto Ubicacion { get; init; }
public TipoVenue Tipo { get; init; }
public List<ZonaDto> Zonas { get; init; }
public List<string> Caracteristicas { get; init; }
}
Validaciones: - El nombre debe ser único - La capacidad total debe coincidir con la suma de capacidades de zonas - Cada zona debe tener al menos 1 asiento
Emite: VenueRegistrado
ActualizarVenue
Descripción: Actualiza información del venue.
Input:
public record ActualizarVenueCommand
{
public Guid VenueId { get; init; }
public string Nombre { get; init; }
public DireccionDto Ubicacion { get; init; }
public List<string> Caracteristicas { get; init; }
}
Emite: VenueActualizado
AgregarZona
Descripción: Añade una nueva zona al venue.
Input:
public record AgregarZonaCommand
{
public Guid VenueId { get; init; }
public string Nombre { get; init; }
public int Capacidad { get; init; }
public TipoDistribucion Distribucion { get; init; }
public List<AsientoDto> Asientos { get; init; }
}
Validaciones: - El nombre de zona debe ser único dentro del venue - Si es distribución numerada, debe incluir todos los asientos
Emite: ZonaAgregada
DesactivarVenue
Descripción: Marca el venue como inactivo.
Input:
public record DesactivarVenueCommand
{
public Guid VenueId { get; init; }
public string Razon { get; init; }
}
Validaciones: - No debe tener eventos futuros programados
Emite: VenueDesactivado
5. Eventos de Dominio
VenueRegistrado
public record VenueRegistrado : DomainEvent
{
public Guid VenueId { get; init; }
public string Nombre { get; init; }
public int CapacidadTotal { get; init; }
}
Suscriptores:
- analytics-service: Registra nuevo venue en estadísticas
ZonaAgregada
public record ZonaAgregada : DomainEvent
{
public Guid VenueId { get; init; }
public Guid ZonaId { get; init; }
public string Nombre { get; init; }
public int Capacidad { get; init; }
}
6. Consultas (Queries)
ObtenerVenuePorId
Retorna toda la información del venue incluyendo zonas y asientos.
ListarVenuesDisponibles
Lista venues activos con filtros por tipo, ubicación y capacidad.
VerificarDisponibilidad
Valida si un venue está disponible para una fecha específica.
7. Reglas de Negocio
-
Capacidad coherente: La capacidad total del venue debe ser igual a la suma de capacidades de todas sus zonas.
-
Distribución numerada: Si una zona es de tipo
Numerado, debe tener definidos todos los asientos con sus identificadores únicos. -
Disponibilidad: Un venue puede tener múltiples eventos, pero no en horarios solapados.
-
Estado activo: Solo venues en estado
Activopueden ser asignados a nuevos eventos.
8. Persistencia
Base de Datos: PostgreSQL
Tabla: venues
CREATE TABLE venues (
id UUID PRIMARY KEY,
nombre VARCHAR(200) NOT NULL UNIQUE,
direccion_calle VARCHAR(200),
direccion_ciudad VARCHAR(100),
direccion_estado VARCHAR(100),
direccion_codigo_postal VARCHAR(20),
direccion_pais VARCHAR(100),
latitud DECIMAL(10, 8),
longitud DECIMAL(11, 8),
capacidad_total INT NOT NULL,
tipo VARCHAR(50) NOT NULL,
estado VARCHAR(20) NOT NULL,
fecha_creacion TIMESTAMP NOT NULL
);
Tabla: zonas
CREATE TABLE zonas (
id UUID PRIMARY KEY,
venue_id UUID NOT NULL REFERENCES venues(id),
nombre VARCHAR(100) NOT NULL,
capacidad INT NOT NULL,
distribucion VARCHAR(20) NOT NULL,
UNIQUE(venue_id, nombre)
);
Tabla: asientos
CREATE TABLE asientos (
id UUID PRIMARY KEY,
zona_id UUID NOT NULL REFERENCES zonas(id),
identificador VARCHAR(20) NOT NULL,
fila VARCHAR(10),
numero INT,
accesible BOOLEAN DEFAULT FALSE,
UNIQUE(zona_id, identificador)
);
9. API Endpoints
POST /api/venues
Registra un nuevo venue.
GET /api/venues/{id}
Obtiene detalles completos de un venue.
GET /api/venues
Lista venues con filtros.
Query Params:
- tipo: Filtra por tipo de venue
- ciudad: Filtra por ciudad
- capacidadMinima: Filtra por capacidad
- estado: Filtra por estado (Activo, Inactivo)
PUT /api/venues/{id}
Actualiza información del venue.
POST /api/venues/{id}/zonas
Agrega una nueva zona al venue.
GET /api/venues/{id}/disponibilidad
Verifica disponibilidad en un rango de fechas.
Query Params:
- fechaInicio
- fechaFin
10. Tecnologías
- .NET 8 (Minimal APIs)
- Entity Framework Core 8 (PostgreSQL)
- MediatR (CQRS)
- FluentValidation
- NetTopologySuite (Geolocalización)
- Serilog