view Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs @ 178:33e57fd1a6c9

Roles: en dominio y autoregistración
author nelopauselli
date Mon, 08 Aug 2011 12:30:37 -0300
parents f17252543cbf
children 222362c29416
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;

		public PersonaService(IPersonaRepository personaRepository)
		{
			_personaRepository = personaRepository;
		}

		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)
		{
			persona.Roles.Add(Roles.Usuario);

#if DEBUG
			var administradores = new[] {"nelopauselli", "alabras", "jjmoa", "jrowies"};
#else
			var administradores = new[] {"alabras", "jrowies", "jorgegamba"};
#endif
			if (administradores.Contains(persona.Twitter))
				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 Resultado Add(string nombre, string twitter, string mail, string blog)
        {
            var persona = new Persona(nombre) {Twitter = twitter, Mail = mail, Blog = blog};

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

			SetDefaultGroups(persona);

			_personaRepository.Save(persona);

            return new Resultado(true);
        }

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

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

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

	        return new Resultado(true);
	    }
	}
}