view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 29:016b9b9b8d3a

Cuando se publica una van con el mismo titulo que una propuesta, se utiliza esta última promoviendola a evento publicado.
author nelo@MTEySS.neluz.int
date Wed, 16 Mar 2011 08:25:02 -0300
parents 71b02443450a
children 65bbf1ab2b24
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 ISeguridad _seguridad;
		private readonly IEventoRepository _eventosRepository;
		private readonly IPonenteRepository _ponenteRepository;

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

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


        	var evento = _eventosRepository.GetPropuestaByTitulo(titulo) ?? new Evento {Titulo = titulo};
        	evento.Ponente = ponente;
        	evento.Fecha = fecha;


        	if (!evento.Fecha.HasValue)
        		throw new ValidationException();
        	if (NoEstaAutenticado(_seguridad))
        		throw new UsuarioNoAutenticadoException();
        	if (string.IsNullOrWhiteSpace(evento.Ponente.Nombre))
        		throw new ValidationException();

        	if (_publicador != null)
        		_publicador.Publicar(evento);
        	_eventosRepository.Save(evento);
        	_ponenteRepository.Save(ponente);
        }

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

		public void Proponer(string titulo, string ponenteNombre)
		{
			var ponente = GetPonente(ponenteNombre);
			var evento = new Evento {Titulo = titulo, Ponente = ponente};

			if (string.IsNullOrWhiteSpace(evento.Titulo))
				throw new ValidationException();
            if (NoEstaAutenticado(_seguridad))
                throw new UsuarioNoAutenticadoException();
			_eventosRepository.Save(evento);
			_ponenteRepository.Save(ponente);
		}

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

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

        private static bool NoEstaAutenticado(ISeguridad seguridad)
        {
            return seguridad == null || seguridad.GetPrincipal() == null || seguridad.GetPrincipal().Identity == null
                || string.IsNullOrWhiteSpace(seguridad.GetPrincipal().Identity.Name);
        }

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

			var ponente = GetPonente(ponenteNombre);

			evento.Titulo = titulo;
			evento.Ponente = ponente;
			evento.Fecha = fecha;
		}

		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 = nombre, Mail = mail, Twitter = twitter, Blog = blog};
			_ponenteRepository.Save(ponente);
		}

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

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

	public class EventoNotFoundException : Exception
	{
	}

	public class UsuarioNoAutenticadoException : Exception
    {
    }
}