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

agregado de tipo de evento (van, cafe, grupoestudio) agregado de tipo de evento en el alta de evento y en el alta de propuestas desde la app web algunas correcciones en el publicador del blog agregado de textos para publicar en el blog eventos de tipo alt.net cafe
author jorge.rowies
date Mon, 06 Jun 2011 14:07:12 -0300
parents 1d820f17fc75
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;
		}
	}
}