From d6625a1a6fb68e5913e0d62c63ac5c09cfb290c9 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 5 May 2021 17:25:26 -0700 Subject: [PATCH] SHIBUI-1734 Added service and controller to expose API for CRUD operations around custom attribute definitions --- .../CustomAttributesController.java | 104 ++++++++++++++++++ .../repository/CustomAttributeRepository.java | 6 - .../ui/service/CustomAttributesService.java | 17 +++ .../service/CustomAttributesServiceImpl.java | 36 ++++++ 4 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomAttributesController.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesService.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesServiceImpl.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomAttributesController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomAttributesController.java new file mode 100644 index 000000000..31d6ca809 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/CustomAttributesController.java @@ -0,0 +1,104 @@ +package edu.internet2.tier.shibboleth.admin.ui.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition; +import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor; +import edu.internet2.tier.shibboleth.admin.ui.service.CustomAttributesService; + +@Controller +@RequestMapping(value = "/api/custom") +public class CustomAttributesController { + @Autowired + private CustomAttributesService caService; + + @PostMapping("/attribute") + @Transactional + public ResponseEntity create(@RequestBody CustomAttributeDefinition definition) { + // If already defined, we can't create a new one, nor will this call update the definition + CustomAttributeDefinition cad = caService.find(definition.getName()); + + if (cad != null) { + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute").build().toUri()); + + return ResponseEntity.status(HttpStatus.CONFLICT).headers(headers) + .body(new ErrorResponse(String.valueOf(HttpStatus.CONFLICT.value()), + String.format("The custom attribute definition with name: [%s] already exists.", definition.getName()))); + } + + CustomAttributeDefinition result = caService.createOrUpdateDefinition(definition); + return ResponseEntity.status(HttpStatus.CREATED).body(result); + } + + @PutMapping("/attribute") + @Transactional + public ResponseEntity update(@RequestBody CustomAttributeDefinition definition) { + CustomAttributeDefinition cad = caService.find(definition.getName()); + if (cad == null) { + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute").build().toUri()); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers) + .body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()), + String.format("The custom attribute definition with name: [%s] does not already exist.", definition.getName()))); + } + + CustomAttributeDefinition result = caService.createOrUpdateDefinition(definition); + return ResponseEntity.ok(result); + } + + @GetMapping("/attributes") + @Transactional(readOnly = true) + public ResponseEntity getAll() { + return ResponseEntity.ok(caService.getAllDefinitions()); + } + + @GetMapping("/attribute/{name}") + @Transactional(readOnly = true) + public ResponseEntity getOne(@PathVariable String name) { + CustomAttributeDefinition cad = caService.find(name); + if (cad == null) { + HttpHeaders headers = new HttpHeaders(); + headers.setLocation( + ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute/" + name).build().toUri()); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers) + .body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()), + String.format("The custom attribute definition with name: [%s] does not already exist.", name))); + } + return ResponseEntity.ok(cad); + } + + @DeleteMapping("/attribute/{name}") + @Transactional + public ResponseEntity delete(@PathVariable String name) { + CustomAttributeDefinition cad = caService.find(name); + if (cad == null) { + HttpHeaders headers = new HttpHeaders(); + headers.setLocation( + ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute/" + name).build().toUri()); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers) + .body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()), + String.format("The custom attribute definition with name: [%s] does not already exist.", name))); + } + caService.deleteDefinition(cad); + return ResponseEntity.noContent().build(); + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java index ba6385154..3470e9834 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java @@ -1,14 +1,8 @@ package edu.internet2.tier.shibboleth.admin.ui.repository; -import java.util.Date; import java.util.List; -import javax.transaction.Transactional; - import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesService.java new file mode 100644 index 000000000..6e2436bdf --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesService.java @@ -0,0 +1,17 @@ +package edu.internet2.tier.shibboleth.admin.ui.service; + +import java.util.List; + +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition; + +public interface CustomAttributesService { + + CustomAttributeDefinition createOrUpdateDefinition(CustomAttributeDefinition definition); + + void deleteDefinition(CustomAttributeDefinition definition); + + CustomAttributeDefinition find(String name); + + List getAllDefinitions(); + +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesServiceImpl.java new file mode 100644 index 000000000..1dba4dae5 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/CustomAttributesServiceImpl.java @@ -0,0 +1,36 @@ +package edu.internet2.tier.shibboleth.admin.ui.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition; +import edu.internet2.tier.shibboleth.admin.ui.repository.CustomAttributeRepository; + +@Service +public class CustomAttributesServiceImpl implements CustomAttributesService { + @Autowired + private CustomAttributeRepository repository; + + @Override + public CustomAttributeDefinition createOrUpdateDefinition(CustomAttributeDefinition definition) { + return repository.save(definition); + } + + @Override + public void deleteDefinition(CustomAttributeDefinition definition) { + repository.delete(definition); + } + + @Override + public CustomAttributeDefinition find(String name) { + return repository.findByName(name); + } + + @Override + public List getAllDefinitions() { + return repository.findAll(); + } + +}