view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 120:c3573defd18f

Agregado de Fecha, Usuario y Successful en TrackLog Modificacion de publicador de blog para usar TrackLog Agregado de TrackLog en el test de crud de eventos Fix en publicador de twitter para que no twitee si ya se encuentra en TrackLog pero con Successful en true
author Jorge@Jorge-PC
date Fri, 24 Jun 2011 21:18:21 -0300
parents 80c22175c9b5
children b74734a1a755
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.Ponente != 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, TipoEvento tipo)
		{
			Persona persona = GetPonente(ponenteNombre);
      var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo);

			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, TipoEvento tipo)
		{
			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, tipo);
			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, short numeroOrden, string urlWiki)
		{
			Evento evento = GetEvento(eventoId);

			evento.Publicar(numeroOrden, urlWiki);

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