public async Task <IActionResult> PostUsuario(EntUsuarioCreacion entrada)
        {
            // Se eliminan los usuarios que no validaron sus correos después de un día...
            List <Usuario> usuariosSinConfirmar = await _context.Usuario
                                                  .Where(u =>
                                                         u.TokenVerificador != null &&
                                                         u.TokenVerificador.Length > 0 &&
                                                         u.FechaCreacion.AddMinutes(_tiempoValidacionUsuarioMinutos).CompareTo(DateTime.Now) <= 0)
                                                  .ToListAsync();

            _context.Usuario.RemoveRange(usuariosSinConfirmar);
            await _context.SaveChangesAsync();

            // Se valida que el correo no se encuentre registrado...
            entrada.Correo = entrada.Correo.Trim();
            Usuario usuarioExistente = await _context.Usuario
                                       .SingleOrDefaultAsync(u => u.Correo.Equals(entrada.Correo));

            if (usuarioExistente != null)
            {
                ModelState.AddModelError(
                    nameof(EntUsuarioCreacion.Correo),
                    "El correo ingresado ya se encuentra registrado en nuestros sistemas.");
                return(ValidationProblem());
            }

            Usuario nuevoUsuario = new Usuario();

            // Se genera token para verificar correo electrónico...
            byte[] randomBytes = new byte[72];
            using (var rng = RandomNumberGenerator.Create()) {
                rng.GetBytes(randomBytes);
            }

            // Se genera hash de la contraseña...
            var    hasher       = new PasswordHasher <Usuario>();
            string hashPassword = hasher.HashPassword(nuevoUsuario, entrada.Contrasenna);

            // Se genera el nuevo usuario...
            nuevoUsuario.Correo           = entrada.Correo;
            nuevoUsuario.Nombre           = entrada.Nombre.Trim();
            nuevoUsuario.HashContrasenna  = hashPassword;
            nuevoUsuario.FechaCreacion    = DateTime.Now;
            nuevoUsuario.TokenVerificador = Convert.ToBase64String(randomBytes);
            await _context.Usuario.AddAsync(nuevoUsuario);

            await _context.SaveChangesAsync();

            EnviarCorreo enviarCorreo = new EnviarCorreo(_configuration, this);

            enviarCorreo.EnviarCorreoVerificarDireccionCorreo(nuevoUsuario);

            return(Ok());
        }
Beispiel #2
0
        public async Task <ActionResult <SalMuroConTareas> > ModificarTareas(EntMuroSoloId entradaMuro)
        {
            // Se valida que el usuario tenga permisos de edición en el muro...
            UsuarioMuro usuarioMuro = await _context.UsuarioMuro
                                      .Include(um => um.IdMuroNavigation)
                                      .SingleOrDefaultAsync(um =>
                                                            um.IdMuro == entradaMuro.Id &&
                                                            um.IdDuenno == Conectado.ID(this) &&
                                                            (um.Permiso == 1 ||
                                                             um.Permiso == 2)
                                                            );

            if (usuarioMuro == null)
            {
                ModelState.AddModelError(
                    nameof(entradaMuro.Id),
                    "El muro ingresado no existe o no tienes permisos sobre éste.");
                return(ValidationProblem());
            }

            // Se valida que todas las etapas sean parte del muro a editar...
            foreach (EntEtapaSoloId entradaEtapa in entradaMuro.Etapas)
            {
                Etapa etapa = await _context.Etapa
                              .SingleOrDefaultAsync(e =>
                                                    e.Id == entradaEtapa.Id &&
                                                    e.IdMuro == entradaMuro.Id
                                                    );

                if (etapa == null)
                {
                    ModelState.AddModelError(
                        nameof(entradaEtapa.Id),
                        "Una de las etapas ingresadas no pertenece al muro...");
                    return(ValidationProblem());
                }
            }

            // Se eliminan las tareas que no son recibidas desde el cliente...
            List <Tarea> tareasExistentes = await _context.Tarea
                                            .Include(t => t.IdEtapaNavigation)
                                            .Where(t => t.IdEtapaNavigation.IdMuro == entradaMuro.Id)
                                            .ToListAsync();

            foreach (Tarea tareaExistente in tareasExistentes)
            {
                bool existeTarea = false;

                foreach (EntEtapaSoloId entradaEtapa in entradaMuro.Etapas)
                {
                    foreach (EntTareaBase entradaTarea in entradaEtapa.Tareas)
                    {
                        if (tareaExistente.Id == entradaTarea.Id)
                        {
                            existeTarea = true;
                            break;
                        }
                    }
                    if (existeTarea)
                    {
                        break;
                    }
                    ;
                }

                if (!existeTarea)
                {
                    _context.Tarea.Remove(tareaExistente);
                }
            }

            // Se agregan o modifican el resto de tareas...
            foreach (EntEtapaSoloId entradaEtapa in entradaMuro.Etapas)
            {
                foreach (EntTareaBase entradaTarea in entradaEtapa.Tareas)
                {
                    Tarea tareaOriginal = await _context.Tarea
                                          .Include(t => t.IdEtapaNavigation)
                                          .SingleOrDefaultAsync(t =>
                                                                t.Id == entradaTarea.Id &&
                                                                t.IdEtapaNavigation.IdMuro == entradaMuro.Id
                                                                );

                    if (tareaOriginal == null)
                    {
                        // Se agregan las tareas que no existen en la base de datos...
                        Tarea nuevaTarea = new Tarea()
                        {
                            Titulo      = entradaTarea.Titulo,
                            Descripcion = entradaTarea.Descripcion,
                            IdEtapa     = entradaEtapa.Id,
                            Posicion    = entradaTarea.Posicion,
                            Familia     = entradaTarea.Familia,
                            Red         = entradaTarea.Red,
                            Green       = entradaTarea.Green,
                            Blue        = entradaTarea.Blue
                        };
                        _context.Tarea.Add(nuevaTarea);
                    }
                    else
                    {
                        tareaOriginal.Titulo      = entradaTarea.Titulo;
                        tareaOriginal.Descripcion = entradaTarea.Descripcion;
                        tareaOriginal.IdEtapa     = entradaEtapa.Id;
                        tareaOriginal.Posicion    = entradaTarea.Posicion;
                        tareaOriginal.Familia     = entradaTarea.Familia;
                        tareaOriginal.Red         = entradaTarea.Red;
                        tareaOriginal.Green       = entradaTarea.Green;
                        tareaOriginal.Blue        = entradaTarea.Blue;
                        _context.Tarea.Update(tareaOriginal);
                    }
                }
            }

            // Se modifica la fecha de última actualización...
            Muro muro = await _context.Muro.SingleOrDefaultAsync(m => m.Id == entradaMuro.Id);

            muro.FechaUltimaModificacion = DateTime.Now;
            await _context.SaveChangesAsync();

            return(await ObtenerTareas(entradaMuro.Id));
        }
Beispiel #3
0
        public async Task <IActionResult> Registrarse(RegistrarseViewModel model)
        {
            if (!ModelState.IsValid)
            {
                throw new ExcepcionMuroAgil(ModelState.Values
                                            .SelectMany(v => v.Errors)
                                            .Select(e => e.ErrorMessage)
                                            .First());
            }

            //Se elimina a los usuarios cuyas direcciones de correo no han sido confirmados.
            List <Usuario> usuariosSinConfirmar = _dbContext.Usuario
                                                  .Where(u =>
                                                         u.TokenVerificador != null &&
                                                         u.TokenVerificador.Length > 0 &&
                                                         u.FechaCreacion.AddDays(1).CompareTo(DateTime.Now) <= 0)
                                                  .ToList();

            _dbContext.Usuario.RemoveRange(usuariosSinConfirmar);
            await _dbContext.SaveChangesAsync();

            model.Codigo = model.Codigo.Trim();
            model.Nombre = model.Nombre.Trim();

            var targetUser = _dbContext.Usuario
                             .SingleOrDefault(u => u.Correo.Equals(model.Codigo));

            if (targetUser != null)
            {
                throw new ExcepcionMuroAgil("Ya existe un usuario con dicho nombre de usuario.");
            }

            if (model.Contrasenna.Length < 8)
            {
                throw new ExcepcionMuroAgil("La contraseña seleccionada debe tener 8 o más caracteres.");
            }

            if (!model.Contrasenna.Equals(model.RepContrasenna))
            {
                throw new ExcepcionMuroAgil("Las contraseñas ingresadas no coinciden.");
            }

            byte[] randomBytes = new byte[72];
            using (var rng = RandomNumberGenerator.Create()) {
                rng.GetBytes(randomBytes);
            }

            targetUser = new Usuario {
                Correo           = model.Codigo,
                Nombre           = model.Nombre,
                FechaCreacion    = DateTime.Now,
                TokenVerificador = Convert.ToBase64String(randomBytes)
            };

            var hasher = new PasswordHasher <Usuario>();

            targetUser.HashContrasenna = hasher.HashPassword(targetUser, model.Contrasenna);

            await _dbContext.Usuario.AddAsync(targetUser);

            await _dbContext.SaveChangesAsync();

            EnviarCorreoVerificador(targetUser);

            return(View("RegistroCompleto"));
        }
        public async Task <ActionResult <SalPermisoLista> > PostUsuarioMuro(EntPermisoRelacion permisoRelacion)
        {
            permisoRelacion.Correo = permisoRelacion.Correo.Trim();

            // Se valida que el muro pertenezca al usuario que inició sesión...
            UsuarioMuro usuarioMuro = await _context.UsuarioMuro
                                      .SingleOrDefaultAsync(um =>
                                                            um.IdMuro == permisoRelacion.IdMuro &&
                                                            um.IdDuenno == Conectado.ID(this) &&
                                                            um.Permiso == 1
                                                            );

            if (usuarioMuro == null)
            {
                ModelState.AddModelError(
                    nameof(permisoRelacion.IdMuro),
                    "El muro ingresado no existe, o no te pertenece.");
                return(ValidationProblem());
            }

            // Se valida que el correo ingresado este registrado, y no sea el mismo del usuario que inició sesión...
            Usuario usuario = await _context.Usuario.SingleOrDefaultAsync(u =>
                                                                          u.Correo == permisoRelacion.Correo &&
                                                                          u.Id != Conectado.ID(this));

            if (usuario == null)
            {
                ModelState.AddModelError(
                    nameof(permisoRelacion.Correo),
                    "El correo ingresado no es válido.");
                return(ValidationProblem());
            }

            // Se valida que la relación Muro/Usuario no existiese de antes...
            usuarioMuro = await _context.UsuarioMuro
                          .SingleOrDefaultAsync(um =>
                                                um.IdMuro == permisoRelacion.IdMuro &&
                                                um.IdDuenno == usuario.Id
                                                );

            if (usuarioMuro != null)
            {
                ModelState.AddModelError(
                    nameof(permisoRelacion.Correo),
                    "El usuario ingresado ya tiene permisos sobre el muro.");
                return(ValidationProblem());
            }

            // Se crea la nueva relación...
            usuarioMuro = new UsuarioMuro {
                IdDuenno = usuario.Id,
                IdMuro   = permisoRelacion.IdMuro,
                Permiso  = permisoRelacion.Permiso
            };
            await _context.UsuarioMuro.AddAsync(usuarioMuro);

            await _context.SaveChangesAsync();

            SalPermisoLista salida = new SalPermisoLista()
            {
                IdUsuario     = usuarioMuro.IdDuenno,
                NombreUsuario = usuario.Nombre,
                CorreoUsuario = usuario.Correo,
                Permiso       = usuarioMuro.Permiso
            };

            return(salida);
        }