view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 94:db4b1e2cae49

Cambio del nombre de la clase Ponente a Persona Se agrega la clase Cuenta para identificar cada una de las cuentas con que se puede autenticar una persona Alta Automatica de cuentas de twitter creando la persona
author Nelo@Kenia.neluz.int
date Sat, 04 Jun 2011 12:11:17 -0300
parents 26d0513a8410
children 2434c2323f3d
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 IPersonaRepository _personaRepository;
		private readonly IPublicador _publicador;

		public Agenda(IPublicador publicador, IEventoRepository eventosRepository,
		              IPersonaRepository personaRepository)
		{
			_publicador = publicador;
			_personaRepository = personaRepository;
			_eventosRepository = eventosRepository;
		}

		public Evento GetEvento(Guid eventoId)
		{
			Evento evento =_eventosRepository.Get(eventoId);
			if (evento == null)
				throw new EventoNotFoundException(eventoId);
			return evento;
		}

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

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

		public Resultado ModificarEvento(Guid eventoId, string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion)
		{
			Evento evento = GetEvento(eventoId);

			Persona persona = null;
			if (!string.IsNullOrWhiteSpace(ponenteNombre))
				persona = GetPonente(ponenteNombre);

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

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

			Notify(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)
		{
			Persona persona = GetPonente(ponenteNombre);
			var evento = Evento.Proponer(titulo, persona, urlInvitacion);

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

			Notify(evento);

			_eventosRepository.Save(evento);
			_personaRepository.Save(persona);

			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);

			Persona persona = GetPonente(ponenteNombre);

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

			Notify(evento);

			_eventosRepository.Save(evento);
			_personaRepository.Save(persona);

			return new Resultado(true);
		}

		public Resultado Confirmar(Guid eventoId)
		{
			Evento evento = GetEvento(eventoId);

			evento.Confirmar();

			Notify(evento);

			_eventosRepository.Save(evento);

			return new Resultado(true);
		}

		public Resultado Publicar(Guid eventoId)
		{
			Evento evento = GetEvento(eventoId);

			evento.Publicar();

			Notify(evento);

			_eventosRepository.Save(evento);

			return new Resultado(true);
		}

		private void Notify(Evento evento)
		{
			var tracks = evento.GetTrackNews();
			if (_publicador != null)
				_publicador.Publicar(tracks);
		}

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

		private Persona GetPonente(string nombre)
		{
			Persona persona = _personaRepository.GetByNombre(nombre) ?? new Persona(nombre);
			_personaRepository.Save(persona);
			return persona;
		}
	}
}