view Agendas/trunk/src/Agendas.Domain/Agenda.cs @ 14:ed6d842abf42

Modificar evento
author nelo@MTEySS.neluz.int
date Sun, 13 Mar 2011 20:49:15 -0300
parents 05996fa19e04
children 08b9e96132a5
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Linq;
using AltNetHispano.Agendas.Domain.Exceptions;

namespace AltNetHispano.Agendas.Domain
{
	public class Agenda
	{
        private readonly IList<Evento> _eventosPropuestos;
        private readonly IList<Evento> _eventosPublicados;
		private readonly IPublicador _publicador;
		private readonly IRecordador _recordador;
        private readonly ISeguridad _seguridad;

        public Agenda(IPublicador publicador, IRecordador recordador, ISeguridad seguridad)
		{
			_publicador = publicador;
			_recordador = recordador;
            _seguridad = seguridad;
			_eventosPropuestos = new List<Evento>();
            _eventosPublicados = new List<Evento>();
		}

		public Guid Id { get; set; }

        public void Publicar(string titulo, string ponente, DateTime? fecha)
		{
            var evento = new Evento{Titulo=titulo, Ponente = ponente, Fecha = fecha};

			if (!evento.Fecha.HasValue)
				throw new ValidationException();
			if (_publicador != null)
				_publicador.Publicar(evento);
            if (NoEstaAutenticado(_seguridad))
                throw new UsuarioNoAutenticadoException();
            if (string.IsNullOrWhiteSpace(evento.Ponente))
                throw new ValidationException();

			//TODO: persistir el evento!
			if (evento.Id==Guid.Empty) evento.Id = Guid.NewGuid();

            _eventosPublicados.Add(evento);
		}

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

		public void Proponer(Evento evento)
		{
			if (string.IsNullOrWhiteSpace(evento.Titulo))
				throw new ValidationException();
            if (NoEstaAutenticado(_seguridad))
                throw new ValidationException();
			_eventosPropuestos.Add(evento);
		}

        public IList<Evento> GetEventosPropuestos()
        {
            return _eventosPropuestos;
        }

        public IList<Evento> GetEventosPublicados()
        {
            return _eventosPublicados;
        }

        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 ponente, DateTime? fecha)
		{
			var evento = _eventosPublicados.SingleOrDefault(e => e.Id == id);
			if (evento == null)
				throw new EventoNotFoundException();
			evento.Titulo = titulo;
			evento.Ponente = ponente;
			evento.Fecha = fecha;
		}

		public Evento GetEventoPublicado(Guid id)
		{
			return _eventosPublicados.SingleOrDefault(e => e.Id == id);
		}
	}

	public class EventoNotFoundException : Exception
	{
	}

	public class UsuarioNoAutenticadoException : Exception
    {
    }
}