Translate

domingo, 11 de julio de 2021

Web API en Groovy, Spring boot y H2

Vamos a hacer una web API con Groovy, Spring boot y H2 (como dice el título)

Primero vamos a bajar nuestro proyecto de https://start.spring.io/ bien no sé como indicar lo que hay que seleccionar. Pero creo que es bastante fácil, groovy, h2, etc. Voy a utilizar maven y dejo el link al final del repositorio y pueden ver el pom. 

Para comenzar vamos a hacer nuestras entidades : 

@Entity
@Table(name = 'Demos')
class Demo {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id

@Column
String unTexto

@Column
Boolean isUnCampoBool

@Column
LocalDate unaFecha

@OneToMany(cascade = CascadeType.ALL)
List<DemoItem> items = new ArrayList<>()

}

y

@Entity
@Table(name = 'DemoItems')
class DemoItem {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id

@Column
String unTexto
}

Luego el repositorio : 

@Repository
interface DemoRepository extends JpaRepository<Demo, Integer> {}

Ahora el servicio con su implementación: 

interface DemoService {

List<Demo> findAll()

Optional<Demo> findById(Integer todoId)

Demo insert(Demo demo)

Demo update(Demo demo)

Optional<Demo> delete(Integer id)

}
@Service
class DemoServiceImpl implements DemoService {

@Autowired
DemoRepository repository

@Override
List<Demo> findAll() {
return repository.findAll()
}

@Override
Optional<Demo> findById(Integer id) {
return repository.findById(id)
}

@Override
Demo insert(Demo demo) {
return repository.save(demo)
}

@Override
Demo update(Demo demo) {
return repository.save(demo)
}

@Override
Optional<Demo> delete(Integer id) {
Optional<Demo> demo = repository.findById(id)
if (demo.isPresent()) {
repository.delete(demo.get())
}
return demo
}
}

Y por ultimo el controller : 

@RestController
@RequestMapping('demo')
class DemoController {

@Autowired
DemoService service

@GetMapping
List<Demo> findAll(){
service.findAll()
}

@PostMapping
Demo save(@RequestBody Demo demo){
service.insert(demo)
}

@PutMapping
Demo update(@RequestBody Demo demo){
service.update(demo)
}

@DeleteMapping('/{id}')
delete(@PathVariable Integer id){
Optional<Demo> demo = service.delete(id)
if (!demo.isPresent()) {
throw new NotFoundException<Demo>(id)
}
return demo.get()
}

@GetMapping('/{id}')
Demo getById(@PathVariable Integer id){
Optional<Demo> demo = service.findById(id)
if (!demo.isPresent()) {
throw new NotFoundException<Demo>(id)
}
return demo.get()
}

}

Y el controller lanza una excepción cuando no encuntra elementos que es esta : 

@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "not found")
class NotFoundException<T> extends RuntimeException {

private Long id

NotFoundException() {}

NotFoundException(Long id) {
this.id = id
}

@Override
String getMessage() {
return T + " not found"
}
}

Y listo!!!

Dejo el repositorio Github : https://github.com/emanuelpeg/GroovyWebAPI