view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 80:c2d98fd6593f

Track como objeto identificable y con referencia al evento correspondiente. Puede que con estos cambios sea necesario borrar las tablas en la db y dejar que se vuelvan a generar, ya sea en los test o en la aplicación web
author nelopauselli
date Tue, 24 May 2011 18:25:57 -0300
parents 8df9db937434
children c76661cff260
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 IEventoRepository _eventosRepository;
		private readonly IPonenteRepository _ponenteRepository;
		private readonly IPublicador _publicador;
		private readonly IRecordador _recordador;

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

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

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

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

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

			Ponente ponente = null;
			if (!string.IsNullOrWhiteSpace(ponenteNombre))
				ponente = GetPonente(ponenteNombre);

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

			if (evento.Fecha == null && fecha != null)
				evento.Agendar(ponente, fecha, urlInvitacion);
			else if (evento.Fecha != fecha || evento.Ponente != ponente || evento.UrlInvitacion != urlInvitacion)
				evento.Actualizar(ponente, fecha, urlInvitacion);

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

			return new Resultado(true);
		}

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

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

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

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

			return new Resultado(true);
		}

		public Resultado Agendar(string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion)
		{
			if (!fecha.HasValue)
				return new Resultado(false);
			if (string.IsNullOrWhiteSpace(ponenteNombre))
				return new Resultado(false);

			Ponente ponente = GetPonente(ponenteNombre);

			Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
			if (evento == null)
				evento = Evento.Agendar(titulo, ponente, fecha.Value, urlInvitacion);
			else
				evento.Agendar(ponente, fecha, urlInvitacion);

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

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

			return new Resultado(true);
		}

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

		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)
		{
			Ponente ponente = _ponenteRepository.GetByNombre(nombre) ?? new Ponente(nombre);
			_ponenteRepository.Save(ponente);
			return ponente;
		}
	}
}