diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index d2890fb93..d6f0e6a26 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -1,7 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; +import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; +import lombok.extern.log4j.Log4j; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -9,32 +15,75 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.net.URI; @RestController @RequestMapping("/api") +@Slf4j public class MetadataResolversController { + @Autowired + MetadataResolverRepository resolverRepository; + @GetMapping("/MetadataResolvers") + @Transactional(readOnly = true) ResponseEntity getAll() { - //TODO implement - return ResponseEntity.ok().build(); + Iterable resolvers = resolverRepository.findAll(); + resolvers.forEach(MetadataResolver::updateVersion); + return ResponseEntity.ok(resolvers); } @GetMapping("/MetadataResolvers/{resourceId}") + @Transactional(readOnly = true) ResponseEntity getOne(@PathVariable String resourceId) { - //TODO implement - return ResponseEntity.ok().build(); + MetadataResolver resolver = resolverRepository.findByResourceId(resourceId); + if (resolver == null) { + return ResponseEntity.notFound().build(); + } + resolver.updateVersion(); + return ResponseEntity.ok(resolver); } @PostMapping("/MetadataResolvers") + @Transactional ResponseEntity create(@RequestBody MetadataResolver newResolver) { - //TODO implement - return ResponseEntity.ok().build(); + //TODO disregard attached filters if any sent from UI? + //Only deal with filters via filters endpoints? + MetadataResolver persistedResolver = resolverRepository.save(newResolver); + persistedResolver.updateVersion(); + + return ResponseEntity.created(getResourceUriFor(persistedResolver)).body(persistedResolver); } @PutMapping("/MetadataResolvers/{resourceId}") + @Transactional ResponseEntity update(@PathVariable String resourceId, @RequestBody MetadataResolver updatedResolver) { - //TODO implement - return ResponseEntity.ok().build(); + //TODO disregard attached filters if any sent from UI? + //Only deal with filters via filters endpoints? And here only update the resolver pieces?? + MetadataResolver existingResolver = resolverRepository.findByResourceId(resourceId); + if (existingResolver == null) { + return ResponseEntity.notFound().build(); + } + if (existingResolver.hashCode() != updatedResolver.getVersion()) { + log.info("Metadata Resolver version conflict. Latest resolver in database version: {}. Resolver version sent from UI: {}", + existingResolver.hashCode(), updatedResolver.getVersion()); + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } + + updatedResolver.setAudId(existingResolver.getAudId()); + MetadataResolver persistedResolver = resolverRepository.save(updatedResolver); + persistedResolver.updateVersion(); + + return ResponseEntity.ok(persistedResolver); + } + + private static URI getResourceUriFor(MetadataResolver resolver) { + return ServletUriComponentsBuilder + .fromCurrentServletMapping().path("/api/MetadataResolvers/") + .pathSegment(resolver.getResourceId()) + .build() + .toUri(); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index 44d8c6e97..0062c9def 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -64,4 +64,8 @@ public class MetadataResolver extends AbstractAuditable { @Transient private int version; + + public void updateVersion() { + this.version = hashCode(); + } }