view Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs @ 274:72a96459f910

Ticket #123: Patrocinadores de las vans.
author juanjose.montesdeocaarbos
date Wed, 30 Nov 2011 08:56:01 -0300
parents dba5d41bc7bf
children
line wrap: on
line source

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

namespace AltNetHispano.Agendas.Domain.Services
{
	public class PersonaService
	{
		private readonly IPersonaRepository _personaRepository;
	    private readonly IEventoRepository _eventoRepository;

		public PersonaService(IPersonaRepository personaRepository, IEventoRepository eventoRepository)
		{
			_personaRepository = personaRepository;
		    _eventoRepository = eventoRepository;
		}

		public bool CreateIfNotExist(IdentityProviderEnum identityProvider, string username, string nombre)
		{
			var cuenta = _personaRepository.GetCuenta(identityProvider, username);
            if (cuenta == null)
            {
                Persona persona = null;
                if (identityProvider == IdentityProviderEnum.Twitter)
                    persona = _personaRepository.GetByTwitter(username);
                
                if(persona==null)
                    persona = IdentityContext.IsAuthenticated() ? IdentityContext.GetUsuario() : new Persona(nombre);

                persona.AddCuenta(new Cuenta(identityProvider, username));

                if (identityProvider == IdentityProviderEnum.Twitter)
                    persona.Twitter = username;

            	SetDefaultGroups(persona);

                _personaRepository.Save(persona);
            }
		    return true;
		}

		private static void SetDefaultGroups(Persona persona)
		{
#if DEBUG
			var administradores = new[] {"nelopauselli", "alabras", "jjmoa", "jrowies"};
#else
			var administradores = new[] {"nelopauselli", "alabras", "jrowies", "jorgegamba"};
#endif
			if (administradores.Contains(persona.Twitter))
			{
				persona.Roles.Add(Roles.Usuario);
				persona.Roles.Add(Roles.Administrador);
			}
		}

		public void AddCuenta(IdentityProviderEnum identityProvider, string username)
		{
			var persona = IdentityContext.GetUsuario();
			persona.AddCuenta(new Cuenta(identityProvider, username));

			if (identityProvider == IdentityProviderEnum.Twitter)
				persona.Twitter = username;
		}

		public void RemoveCuenta(IdentityProviderEnum identityProvider, string username)
		{
			var persona = IdentityContext.GetUsuario();
			var cuenta = persona.Cuentas.FirstOrDefault(c => c.IdentityProvider == identityProvider && c.LogonName == username);
			if (cuenta != null)
				persona.RemoveCuenta(cuenta);
		}

	    public IEnumerable<Persona> GetAll()
	    {
	        return _personaRepository.GetAll();
	    }

	    public Persona GetById(Guid id)
	    {
	        return _personaRepository.Get(id);
	    }

		public ResultadoAdd Add(string nombre, string twitter, string mail, string blog, IEnumerable<string> roles)
		{
            if (twitter.StartsWith("@"))
                return new ResultadoAdd("No debe ingresar el arroba al escribir la cuenta de twitter.");

			var persona = _personaRepository.GetByNombre(nombre);
			if (persona!=null)
				return new ResultadoAdd("Ya existe una persona con el nombre " + nombre);

			persona = _personaRepository.GetByTwitter(twitter);
			if (persona != null)
				return new ResultadoAdd("Ya existe una persona con el twitter " + twitter);

			persona = new Persona(nombre) {Twitter = twitter, Mail = mail, Blog = blog};

			if (!string.IsNullOrWhiteSpace(twitter))
				persona.AddCuenta(new Cuenta(IdentityProviderEnum.Twitter, twitter));

			SetDefaultGroups(persona);

			if (roles != null)
			{
				persona.Roles.Clear();
				foreach (var rol in roles)
				{
					persona.Roles.Add(rol);
				}
			}

			_personaRepository.Save(persona);

			return new ResultadoAdd(true, "Persona Agregada", persona.Id, persona.Nombre);
        }

		public Resultado Update(Guid id, string nombre, string twitter, string mail, string blog, IEnumerable<string> roles)
	    {
	        var persona = _personaRepository.Get(id);
            if (persona == null)
                return new Resultado(false, string.Format("No se pudo encontrar la persona cuyo Id sea {0}", id));

            if (twitter.StartsWith("@"))
                return new ResultadoAdd("No debe ingresar el arroba al escribir la cuenta de twitter.");

            persona = _personaRepository.GetByTwitter(twitter);
            if (persona != null && !persona.Id.Equals(id))
                return new Resultado(false, string.Format("Ya existe una persona con el twitter {0}", twitter));

            persona.Nombre = nombre;
	        persona.Twitter = twitter;
	        persona.Mail = mail;
			persona.Blog = blog;

			//TODO: ¿que hacemos con la cuenta de twitter asociada?

			if (roles!=null)
			{
				persona.Roles.Clear();
				foreach (var rol in roles)
				{
					persona.Roles.Add(rol);
				}
			}

			return new Resultado(true, "Datos actualizados");
	    }

        public Resultado Delete(Guid id)
        {
            var persona = _personaRepository.Get(id);
            if (persona == null)
                return new Resultado(false, string.Format("No se pudo encontrar la persona cuyo Id sea {0}", id));

            var existeEnEvento = _eventoRepository.ExistePonente(persona);
            if (existeEnEvento)
                return new Resultado(false,
                                     string.Format(
                                         "La persona {0} está asociada a un Evento por lo que es imposible eliminarla.",
                                         persona.Nombre));

            _personaRepository.Delete(persona);
            return new Resultado(true, "");
        }
	}
}