view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 53:d149bfea3892

Tratamos las validaciones como resultados y no como excepciones, dejamos las excepciones solo para lo que no esperamos que suceda.
author nelopauselli
date Sat, 14 May 2011 12:45:50 -0300
parents 3ebe89c88caa
children 3059a5f8930f
line wrap: on
line source

using System;
using System.Collections.Generic;
using AltNetHispano.Agendas.Domain.Exceptions;
using AltNetHispano.Agendas.Domain.Repositories;

namespace AltNetHispano.Agendas.Domain
{
	public class Agenda
	{
		private readonly IPublicador _publicador;
		private readonly IRecordador _recordador;
	    private readonly IEventoRepository _eventosRepository;
		private readonly IPonenteRepository _ponenteRepository;

		public Agenda(IPublicador publicador, IRecordador recordador, IEventoRepository eventosRepository, IPonenteRepository ponenteRepository)
		{
			_publicador = publicador;
			_ponenteRepository = ponenteRepository;
			_eventosRepository = eventosRepository;
			_recordador = recordador;
		}

        public Resultado Publicar(string titulo, string ponenteNombre, DateTime? fecha)
        {
        	var ponente = GetPonente(ponenteNombre);

        	var evento = _eventosRepository.GetPropuestaByTitulo(titulo) ?? new Evento (titulo);
            evento.Publicar(ponente, fecha);

			if (!evento.Fecha.HasValue)
				return new Resultado(false);
			if (string.IsNullOrWhiteSpace(evento.Ponente.Nombre))
				return new Resultado(false);

        	if (_publicador != null)
        		_publicador.Publicar(evento);

        	_eventosRepository.Save(evento);
        	_ponenteRepository.Save(ponente);

        	return new Resultado(true);
        }

		public void Recordar(Guid eventoId)
		{
			var evento = _eventosRepository.Get(eventoId);
			if (_recordador != null)
				_recordador.Recordar(evento);
		}

		public Resultado Proponer(string titulo, string ponenteNombre)
		{
			var ponente = GetPonente(ponenteNombre);
			var evento = new Evento (titulo);
		    evento.Actualizar(ponente);

			if (string.IsNullOrWhiteSpace(evento.Titulo))
				return new Resultado(false);

			_eventosRepository.Save(evento);
			_ponenteRepository.Save(ponente);

			return new Resultado(true);
		}

        public IList<Evento> GetEventosPropuestos()
        {
			return _eventosRepository.GetEventosSinFecha() ?? new List<Evento>();
        }

        public IList<Evento> GetEventosPublicados()
        {
            return _eventosRepository.GetEventosConFecha() ?? new List<Evento>();
        }

		public Resultado ModificarEvento(Guid id, string titulo, string ponenteNombre, DateTime? fecha)
		{
			var evento = _eventosRepository.Get(id);
			if (evento == null)
				throw new EventoNotFoundException(id);

			var ponente = GetPonente(ponenteNombre);

            if (evento.Titulo != titulo)
                evento.CambiarTitulo(titulo);

		    if (evento.Fecha != fecha || evento.Ponente != ponente)
                evento.Actualizar(ponente, fecha);

		    if (_publicador != null)
				_publicador.Publicar(evento);

			return new Resultado(true);
		}

		public Evento GetEvento(Guid id)
		{
			return _eventosRepository.Get(id);
		}

		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
		{
		    var ponente = new Ponente(nombre, mail, twitter, blog);
			_ponenteRepository.Save(ponente);
		}

		private Ponente GetPonente(string nombre)
		{
		    var ponente=_ponenteRepository.GetByNombre(nombre) ?? new Ponente(nombre);
            _ponenteRepository.Save(ponente);
		    return ponente;
		}

		public Resultado ModificarPropuesta(Guid id, string titulo, string ponenteNombre)
		{
			return ModificarEvento(id, titulo, ponenteNombre, null);
		}

	    public void RealizarEvento(Guid eventoId, string sintesis)
	    {
	        var evento = _eventosRepository.Get(eventoId);
            if (evento != null)
                evento.Realizado(sintesis);
	    }
	}
}