Practica 1 correccion REST

parent 0f8213ee
package com.ayto.incidencias;
import com.ayto.incidencias.web.AuthInterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class App implements WebMvcConfigurer {
private final AuthInterceptor auth;
public App(AuthInterceptor auth){ this.auth = auth; }
public class App {
public static void main(String[] args){ SpringApplication.run(App.class, args); }
public static void main(String[] args){
SpringApplication.run(App.class, args);
@Override public void addInterceptors(InterceptorRegistry reg){
reg.addInterceptor(auth).addPathPatterns("/api/**");
}
}
\ No newline at end of file
......@@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
@Repository
public class IncidenciaRepoMem implements IncidenciaRepo {
......@@ -23,7 +24,7 @@ public class IncidenciaRepoMem implements IncidenciaRepo {
public List<Incidencia> findByAutor(Long uid){
return datos.values().stream()
.filter(i -> i.getAutor()!=null && i.getAutor().getId().equals(uid))
.toList();
.collect(Collectors.toList());
}
public List<Incidencia> findAll(){ return new ArrayList<>(datos.values()); }
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class ServicioIncidencias {
......@@ -32,18 +33,18 @@ public class ServicioIncidencias {
return incidencias.findAll().stream()
.filter(i -> tipoId==null || (i.getTipo()!=null && i.getTipo().getId().equals(tipoId)))
.filter(i -> estado==null || i.getEstado()==estado)
.toList();
.collect(Collectors.toList());
}
public void borrarSiPendiente(Long autorId, Long incId){
TipoIncidencia inc = incidencias.findById(incId).orElseThrow().getTipo();
Incidencia inc = incidencias.findById(incId).orElseThrow();
if(!inc.getAutor().getId().equals(autorId)) throw new SecurityException("No puedes borrar de otros");
if(inc.getEstado()!=EstadoIncidencia.PENDIENTE) throw new IllegalStateException("Sólo PENDIENTE");
incidencias.delete(incId);
}
public Incidencia adminCambiarEstado(Long id, EstadoIncidencia nuevo){
TipoIncidencia inc = incidencias.findById(id).orElseThrow().getTipo();
Incidencia inc = incidencias.findById(id).orElseThrow();
inc.setEstado(nuevo);
return incidencias.save(inc);
}
......
package com.ayto.incidencias.web;
import com.ayto.incidencias.dominio.Usuario;
import com.ayto.incidencias.servicio.ServicioUsuarios;
import jakarta.servlet.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class AuthInterceptor implements HandlerInterceptor {
public static final String ATTR_USER = "AUTH_USER";
private final ServicioUsuarios usuarios;
public AuthInterceptor(ServicioUsuarios usuarios){ this.usuarios = usuarios; }
@Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler){
// Permite registrar sin credenciales
if(req.getMethod().equals("POST") && req.getRequestURI().equals("/api/usuarios/registro")) return true;
String login = req.getHeader("X-Login");
String pass = req.getHeader("X-Password");
try {
Usuario u = usuarios.autenticar(login, pass);
req.setAttribute(ATTR_USER, u);
return true;
} catch(Exception e){
res.setStatus(401);
return false;
}
}
}
\ No newline at end of file
package com.ayto.incidencias.web;
import com.ayto.incidencias.dominio.*;
import com.ayto.incidencias.servicio.ServicioIncidencias;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController @RequestMapping("/api/incidencias")
public class IncidenciaController {
private final ServicioIncidencias svc;
public IncidenciaController(ServicioIncidencias svc){ this.svc = svc; }
@PostMapping
public Incidencia crear(HttpServletRequest req,
@RequestParam Long tipoId,
@RequestParam String descripcion,
@RequestParam String calle, @RequestParam String numero,
@RequestParam String ciudad, @RequestParam String provincia, @RequestParam String cp,
@RequestParam(required=false) Double lat, @RequestParam(required=false) Double lon){
var u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
var dir = new Direccion(); dir.setCalle(calle); dir.setNumero(numero);
dir.setCiudad(ciudad); dir.setProvincia(provincia); dir.setCp(cp);
CoordenadaGPS gps = (lat!=null && lon!=null) ? new CoordenadaGPS() : null;
if(gps!=null){ gps.setLatitud(lat); gps.setLongitud(lon); }
return svc.crearIncidencia(u, tipoId, descripcion, dir, gps);
}
@GetMapping("/mias")
public List<Incidencia> mias(HttpServletRequest req){
var u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
return svc.listarMisIncidencias(u.getId());
}
@GetMapping
public List<Incidencia> buscar(@RequestParam(required=false) Long tipoId,
@RequestParam(required=false) EstadoIncidencia estado){
return svc.buscar(tipoId, estado);
}
@DeleteMapping("/{id}")
public void borrarPropia(HttpServletRequest req, @PathVariable Long id){
Usuario u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
svc.borrarSiPendiente(u.getId(), id);
}
@PatchMapping("/{id}/estado")
public Incidencia cambiarEstado(HttpServletRequest req, @PathVariable Long id, @RequestParam EstadoIncidencia estado){
Usuario u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
if(u.getRol()!=RolUsuario.ADMIN) throw new SecurityException("Sólo admin");
return svc.adminCambiarEstado(id, estado);
}
@DeleteMapping("/{id}/admin")
public void borrarAdmin(HttpServletRequest req, @PathVariable Long id){
Usuario u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
if(u.getRol()!=RolUsuario.ADMIN) throw new SecurityException("Sólo admin");
svc.adminBorrar(id);
}
}
\ No newline at end of file
package com.ayto.incidencias.web;
import com.ayto.incidencias.dominio.*;
import com.ayto.incidencias.servicio.ServicioTiposIncidencia;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController @RequestMapping("/api/tipos")
public class TipoIncidenciaController {
private final ServicioTiposIncidencia tipos;
public TipoIncidenciaController(ServicioTiposIncidencia tipos){ this.tipos = tipos; }
@GetMapping public List<TipoIncidencia> listar(){ return tipos.listar(); }
@PostMapping
public TipoIncidencia crear(HttpServletRequest req, @RequestParam String nombre, @RequestParam String descripcion){
Usuario u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
if(u.getRol()!=RolUsuario.ADMIN) throw new SecurityException("Sólo admin");
return tipos.crear(nombre, descripcion);
}
@DeleteMapping("/{id}")
public void eliminar(HttpServletRequest req, @PathVariable Long id){
Usuario u = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
if(u.getRol()!=RolUsuario.ADMIN) throw new SecurityException("Sólo admin");
tipos.eliminar(id);
}
}
\ No newline at end of file
package com.ayto.incidencias.web;
import com.ayto.incidencias.dominio.Usuario;
import com.ayto.incidencias.servicio.ServicioUsuarios;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
@RestController @RequestMapping("/api/usuarios")
public class UsuarioController {
private final ServicioUsuarios svc;
public UsuarioController(ServicioUsuarios svc){ this.svc = svc; }
@PostMapping("/registro")
public Usuario registrar(@RequestBody Usuario u){ return svc.registrar(u); }
@PutMapping("/me")
public Usuario actualizar(HttpServletRequest req, @RequestBody Usuario u){
Usuario actual = (Usuario) req.getAttribute(AuthInterceptor.ATTR_USER);
u.setId(actual.getId()); u.setLogin(actual.getLogin()); u.setRol(actual.getRol());
return svc.actualizar(u);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment