changeset 182:beeb48ddb44a

Warning con los errores que se guarden en el log del track de un evento durante una notificación (twitter, calendar, blog)
author nelopauselli
date Mon, 08 Aug 2011 21:57:10 -0300
parents 6ee05ceea8c3
children 212c664db5aa
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Domain/Resultado.cs Agendas/trunk/src/Agendas.Domain/Track.cs Agendas/trunk/src/Agendas.Domain/TrackLog.cs Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml
diffstat 8 files changed, 202 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -46,7 +46,7 @@
             return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
         }
 
-        public Resultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion)
+		public EventoResultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion)
         {
             Evento evento = GetEvento(eventoId);
             Persona persona = _personaRepository.Get(ponenteId);
@@ -61,15 +61,17 @@
 
             Notify(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion)
         {
             return ModificarEvento(id, titulo, ponenteId, null, urlInvitacion);
         }
 
-        public Resultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo)
+		public EventoResultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo)
         {
             Persona persona = null;
             if (ponenteId.HasValue)
@@ -78,23 +80,25 @@
             var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo);
 
             if (string.IsNullOrWhiteSpace(evento.Titulo))
-                return new Resultado(false);
+                return new EventoResultado(false, null);
 
             Notify(evento);
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo)
         {
             if (!fecha.HasValue)
-                return new Resultado(false);
+                return new EventoResultado(false, null);
 
             Persona persona = _personaRepository.Get(ponenteId);
             if (persona == null)
-                return new Resultado(false)
+                return new EventoResultado(false, null)
                            {Message = string.Format("No se encontró el ponente indicado ({0})", ponenteId)};
 
             Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
@@ -107,10 +111,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado Confirmar(Guid eventoId)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado Confirmar(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
@@ -120,10 +126,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
+
+			return new EventoResultado(true, warnings);
         }
 
-        public Resultado Publicar(Guid eventoId, short numeroOrden, string urlWiki, TimeSpan duracion)
+		public EventoResultado Publicar(Guid eventoId, short numeroOrden, string urlWiki, TimeSpan duracion)
         {
             if (numeroOrden <= 0)
                 throw new ArgumentOutOfRangeException("numeroOrden");
@@ -142,23 +150,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        private void Notify(Evento evento)
-        {
-            var tracks = evento.GetTrackNews();
-            if (_publicador != null)
-                _publicador.Publicar(tracks);
-        }
+			return new EventoResultado(true, warnings);
+		}
 
-        public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
-        {
-            var ponente = new Persona(nombre, mail, twitter, blog);
-            _personaRepository.Save(ponente);
-        }
-
-        public Resultado Cancelar(Guid eventoId)
+		public EventoResultado Cancelar(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
@@ -168,10 +165,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado Descartar(Guid eventoId)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado Descartar(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
@@ -181,10 +180,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado ReProponer(Guid eventoId)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado ReProponer(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
@@ -194,10 +195,12 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
 
-        public Resultado ReAgendar(Guid eventoId)
+			return new EventoResultado(true, warnings);
+		}
+
+		public EventoResultado ReAgendar(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
@@ -207,8 +210,10 @@
 
             _eventosRepository.Save(evento);
 
-            return new Resultado(true);
-        }
+			var warnings = evento.GetLogsNews().Where(l => !l.Successful);
+
+			return new EventoResultado(true, warnings);
+		}
 
         public void IndicarPatrocinadores(Guid eventoId, IEnumerable<Guid> patrocinadores)
         {
@@ -238,5 +243,20 @@
             foreach (var patrocinador in quitar)
                 evento.RemovePatrocinador(patrocinador);
         }
-    }
+
+		private void Notify(Evento evento)
+		{
+			var tracks = evento.GetTrackNews();
+			if (_publicador != null)
+				_publicador.Publicar(tracks);
+		}
+
+		//TODO: este método ya no se debería usar
+		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
+		{
+			var ponente = new Persona(nombre, mail, twitter, blog);
+			_personaRepository.Save(ponente);
+		}
+
+	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -14,7 +15,7 @@
 		#region Propiedades del Evento
 
 		private readonly IList<Track> _tracks;
-		private ICollection<Track> _newTracks = new List<Track>();
+		private readonly ICollection<Track> _newTracks = new List<Track>();
 
 		/// <summary>
 		/// Título del evento
@@ -207,5 +208,13 @@
 		{
 			return _newTracks;
 		}
+
+		public virtual IEnumerable<TrackLog> GetLogsNews()
+		{
+			var logs = new List<TrackLog>();
+			foreach (var track in _newTracks)
+				logs.AddRange(track.GetLogsNews());
+			return logs;
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Resultado.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Resultado.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -1,4 +1,6 @@
-namespace AltNetHispano.Agendas.Domain
+using System.Collections.Generic;
+
+namespace AltNetHispano.Agendas.Domain
 {
 	public class Resultado
 	{
@@ -9,5 +11,16 @@
 
 		public bool Succeful { get; private set; }
         public string Message { get; internal set; }
-    }
+	}
+
+	public class EventoResultado : Resultado
+	{
+		public EventoResultado(bool succeful, IEnumerable<TrackLog> warnings)
+		: base(succeful)
+		{
+			Warnings = warnings ?? new List<TrackLog>();
+		}
+
+		public IEnumerable<TrackLog> Warnings { get; set; }
+	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Track.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Track.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -6,6 +6,7 @@
 	public class Track : Identificable
 	{
 		private readonly IList<TrackLog> _logs;
+		private readonly ICollection<TrackLog> _newLogs = new List<TrackLog>();
 
 		protected Track()
 		{
@@ -34,6 +35,13 @@
 		{
 			trackLog.Track = this;
 			_logs.Add(trackLog);
+			_newLogs.Add(trackLog);
+
+		}
+
+		public virtual IEnumerable<TrackLog> GetLogsNews()
+		{
+			return _newLogs;
 		}
 	}
 
--- a/Agendas/trunk/src/Agendas.Domain/TrackLog.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/TrackLog.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -8,29 +8,58 @@
 		{
 		}
 
-		public TrackLog(TrackLogPropietario propietario, string mensaje, Persona usuario, bool successful)
+		private TrackLog(TrackLogPropietario propietario, Persona usuario)
 		{
 			Propietario = propietario;
+			Usuario = usuario;
+			Fecha = DateTime.Now;
+		}
+
+		public TrackLog(TrackLogPropietario propietario, string mensaje, Persona usuario, bool successful)
+			: this(propietario, usuario)
+		{
 			Mensaje = mensaje;
-		  Fecha = DateTime.Now;
-		  Usuario = usuario;
-		  Successful = successful;
+			Successful = successful;
+		}
+
+		public TrackLog(TrackLogPropietario propietario, Persona usuario, Exception exception)
+			: this(propietario, usuario)
+		{
+			while (exception.InnerException != null)
+				exception = exception.InnerException;
+
+			Mensaje = exception.Message;
 		}
 
 		public virtual TrackLogPropietario Propietario { get; set; }
 		public virtual string Mensaje { get; set; }
 		public virtual Track Track { get; set; }
-    public virtual Persona Usuario { get; set; }
-	  public virtual bool Successful { get; set; }
-	  public virtual DateTime Fecha { get; set; }
+		public virtual Persona Usuario { get; set; }
+		public virtual bool Successful { get; set; }
+		public virtual DateTime Fecha { get; set; }
+
+		public virtual string WarningMessage
+		{
+			get
+			{
+				switch (Propietario)
+				{
+					case TrackLogPropietario.Twitter:
+						return "No se pudo enviar los twitters: " + Mensaje;
+					case TrackLogPropietario.Calendario:
+						return "No se pudo escribir en el calendario: " + Mensaje;
+					case TrackLogPropietario.Blog:
+						return "No se pudo escribir en el blog: " + Mensaje;
+				}
+				return Mensaje;
+			}
+		}
 	}
 
 	public enum TrackLogPropietario
 	{
 		Twitter = 1,
-        Blog = 2,
-        Calendario = 3
+		Blog = 2,
+		Calendario = 3
 	}
-
-
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using AltNetHispano.Agendas.Configurations;
 using AltNetHispano.Agendas.Domain;
@@ -43,9 +44,16 @@
 				var twitt = BuildTwitt(track);
 				if (!string.IsNullOrWhiteSpace(twitt))
 				{
-					string message;
-					bool success = _twitterAdapter.Update(twitt, out message);
-					track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success));
+					try
+					{
+						string message;
+						bool success = _twitterAdapter.Update(twitt, out message);
+						track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success));
+					}
+					catch(Exception ex)
+					{
+						track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, track.Usuario, ex));
+					}
 				}
 			}
 		}
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Aug 08 21:57:10 2011 -0300
@@ -56,6 +56,8 @@
 				if (r.Succeful)
 				{
 					this.AddNotification("Evento creado");
+					foreach (var log in r.Warnings)
+						this.AddWarning(log.WarningMessage);
 					return RedirectToAction("Index");
 				}
 				ModelState.AddModelError("error", r.ToString());
@@ -70,7 +72,11 @@
 			
 			var r = agenda.Confirmar(new Guid(id));
 			if (r.Succeful)
+			{
 				this.AddNotification("Evento confirmado");
+				foreach (var log in r.Warnings)
+					this.AddWarning(log.WarningMessage);
+			}
 			else
 				this.AddError("Evento confirmado");
 
@@ -106,6 +112,8 @@
 				if (r.Succeful)
 				{
 					this.AddNotification(string.Format("Evento publicado {0}", model.Titulo));
+					foreach (var log in r.Warnings)
+						this.AddWarning(log.WarningMessage);
 					return RedirectToAction("Index");
 				}
 				ModelState.AddModelError("error", r.ToString());
@@ -142,6 +150,8 @@
 				if (r.Succeful)
 				{
 					this.AddNotification("evento modificado");
+					foreach (var log in r.Warnings)
+						this.AddWarning(log.WarningMessage);
 					return RedirectToAction("Index");
 				}
 				ModelState.AddModelError("error", r.ToString());
@@ -178,6 +188,8 @@
 				if (r.Succeful)
 				{
 					this.AddNotification("evento agendado");
+					foreach (var log in r.Warnings)
+						this.AddWarning(log.WarningMessage);
 					return RedirectToAction("Index");
 				}
 				ModelState.AddModelError("error", r.ToString());
@@ -206,6 +218,8 @@
 				if (r.Succeful)
 				{
 					this.AddNotification("Evento propuesto");
+					foreach (var log in r.Warnings)
+						this.AddWarning(log.WarningMessage);
 					return RedirectToAction("Index");
 				}
 				ModelState.AddModelError("error", r.ToString());
@@ -217,19 +231,32 @@
 	    public ActionResult Cancelar(string id)
 	    {
             var agenda = AgendaFactory.GetAgenda();
-            agenda.Cancelar(new Guid(id));
+            var r = agenda.Cancelar(new Guid(id));
 
-            this.AddNotification("Evento cancelado");
-            return RedirectToAction("Index");
+			if (r.Succeful)
+			{
+				this.AddNotification("Evento cancelado");
+				foreach (var log in r.Warnings)
+					this.AddWarning(log.WarningMessage);
+			}
+			else
+			this.AddError(r.Message);
+			return RedirectToAction("Index");
 	    }
 
 		[CustomAuthorize(Roles = Roles.Administrador)]
 	    public ActionResult Descartar(string id)
 	    {
             var agenda = AgendaFactory.GetAgenda();
-            agenda.Descartar(new Guid(id));
+            var r = agenda.Descartar(new Guid(id));
 
-            this.AddNotification("Evento descartado");
+			if (r.Succeful)
+            {this.AddNotification("Evento descartado");
+			foreach (var log in r.Warnings)
+				this.AddWarning(log.WarningMessage);
+			}
+			else
+				this.AddError(r.Message);
             return RedirectToAction("Index");
 	    }
 
@@ -237,9 +264,16 @@
 	    public ActionResult ReAgendar(string id)
 	    {
             var agenda = AgendaFactory.GetAgenda();
-            agenda.ReAgendar(new Guid(id));
+            var r = agenda.ReAgendar(new Guid(id));
 
-            this.AddNotification("Evento re-agendado");
+			if (r.Succeful)
+            {this.AddNotification("Evento re-agendado");
+			foreach (var log in r.Warnings)
+				this.AddWarning(log.WarningMessage);
+			}
+			else
+				this.AddError(r.Message);
+
             return RedirectToAction("Index");
 	    }
 
@@ -247,9 +281,16 @@
 	    public ActionResult ReProponer(string id)
 	    {
             var agenda = AgendaFactory.GetAgenda();
-            agenda.ReProponer(new Guid(id));
+            var r = agenda.ReProponer(new Guid(id));
 
-            this.AddNotification("Evento re-propuesto");
+			if (r.Succeful)
+			{
+				this.AddNotification("Evento re-propuesto");
+				foreach (var log in r.Warnings)
+					this.AddWarning(log.WarningMessage);
+			}
+			else
+				this.AddError(r.Message);
             return RedirectToAction("Index");
 	    }
 	}
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml	Mon Aug 08 20:08:31 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml	Mon Aug 08 21:57:10 2011 -0300
@@ -2,11 +2,11 @@
 {
 	<div class="errorbox"><label>@TempData["error"]</label></div>
 }
+@if (TempData.ContainsKey("notification"))
+{
+	<div class="notificationbox"><label>@TempData["notification"]</label></div>
+}
 @if (TempData.ContainsKey("warning"))
 {
 	<div class="warningbox"><label>@TempData["warning"]</label></div>
-}
-@if (TempData.ContainsKey("notification"))
-{
-	<div class="notificationbox"><label>@TempData["notification"]</label></div>
 }
\ No newline at end of file