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()); }
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)); }
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); }