From 171b3243dbf82caf59fb7419867d1118399005d7 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 31 Mar 2021 14:50:28 -0700 Subject: [PATCH 1/3] SHIBUI-1786 SHIBUI-1734 Created entity for custom entity attributes and JPA repo for operations --- .../admin/ui/domain/CustomAttribute.java | 44 +++++ .../repository/CustomAttributeRepository.java | 26 +++ .../CustomAttributeRepositoryTests.groovy | 156 ++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java create mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java new file mode 100644 index 000000000..9c1574be6 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java @@ -0,0 +1,44 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; + +import org.hibernate.envers.Audited; + +import lombok.Data; + +@Entity(name = "custom_attribute") +@Audited +@Data +public class CustomAttribute { + @Id + @Column(nullable = false) + String name; + + @Column(name = "help_text", nullable = true) + String helpText; + + @Column(name = "attribute_type", nullable = false) + CustomAttributeType attributeType; + + @Column(name = "default_value", nullable = true) + String defaultValue; + + @ElementCollection + @CollectionTable(name = "custom_attr_values", joinColumns = @JoinColumn(name = "name")) + @Column(name = "value", nullable = false) + Set customAttrValues = new HashSet<>(); + + // @TODO: logic to ensure defaultValue matches an item from the list of values when SELECTION_LIST is the type ?? +} + +enum CustomAttributeType { + BOOLEAN, INTEGER, LONG, DOUBLE, DURATION, SELECTION_LIST, SPRING_BEAN_ID +} 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 new file mode 100644 index 000000000..edbc4cd9b --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepository.java @@ -0,0 +1,26 @@ +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.CustomAttribute; + +/** + * Repository to manage {@link CustomAttribute} instances. + */ +public interface CustomAttributeRepository extends JpaRepository { + + List findAll(); + + CustomAttribute findByName(String name); + + @SuppressWarnings("unchecked") + CustomAttribute save(CustomAttribute attribute); +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy new file mode 100644 index 000000000..9aa14cab0 --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy @@ -0,0 +1,156 @@ +package edu.internet2.tier.shibboleth.admin.ui.repository + +import javax.persistence.EntityManager + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.data.jpa.repository.config.EnableJpaRepositories +import org.springframework.test.context.ContextConfiguration + +import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttribute +import spock.lang.Specification + +/** + * Tests to validate the repo and model for custom entity attributes + * @author chasegawa + */ +@DataJpaTest +@ContextConfiguration(classes=[InternationalizationConfiguration]) +@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) +@EntityScan("edu.internet2.tier.shibboleth.admin.ui") +class CustomAttributeRepositoryTests extends Specification { + + @Autowired + CustomAttributeRepository repo + + @Autowired + EntityManager entityManager + + def "basic CRUD operations validated"() { + given: + def setItems = new HashSet(["val1", "val2", "val3"]) + def ca = new CustomAttribute().with { + it.name = "ca-name" + it.attributeType = "SELECTION_LIST" + it.customAttrValues = setItems + it + } + + // Confirm empty state + when: + def atts = repo.findAll() + + then: + atts.size() == 0 + + // save check + when: + repo.save(ca) + entityManager.flush() + entityManager.clear() + + then: + // save check + def cas = repo.findAll() + cas.size() == 1 + def caFromDb1 = cas.get(0).asType(CustomAttribute) + caFromDb1.equals(ca) == true + + // fetch checks + repo.findByName("not a name") == null + repo.findByName("ca-name").equals(ca) + + // update check + caFromDb1.with { + it.helpText = "some new text that wasn't there before" + } + caFromDb1.equals(ca) == false + + when: + repo.save(caFromDb1) + entityManager.flush() + entityManager.clear() + + then: + def cas2 = repo.findAll() + cas2.size() == 1 + def caFromDb2 = cas2.get(0).asType(CustomAttribute) + caFromDb2.equals(ca) == false + caFromDb2.equals(caFromDb1) == true + + // delete tests + when: + def delByName = new CustomAttribute().with { + it.name = "ca-name" + it + } + repo.delete(delByName) + entityManager.flush() + entityManager.clear() + + then: + repo.findAll().size() == 0 + } + + def "attribute list tests"() { + given: + def setItems2 = new HashSet(["val2", "val1"]) + def setItems3 = new HashSet(["val1", "val2", "val3"]) + def setItems4 = new HashSet(["val1", "val2", "val3", "val4"]) + def ca2 = new CustomAttribute().with { + it.name = "ca-name" + it.attributeType = "SELECTION_LIST" + it.customAttrValues = setItems2 + it + } + def ca3 = new CustomAttribute().with { + it.name = "ca-name" + it.attributeType = "SELECTION_LIST" + it.customAttrValues = setItems3 + it + } + def ca4 = new CustomAttribute().with { + it.name = "ca-name" + it.attributeType = "SELECTION_LIST" + it.customAttrValues = setItems4 + it + } + + when: + repo.save(ca3) + entityManager.flush() + entityManager.clear() + + then: + def cas = repo.findAll() + cas.size() == 1 + def caFromDb = cas.get(0).asType(CustomAttribute) + caFromDb.equals(ca3) == true + + // now update the attribute list items + caFromDb.with { + it.customAttrValues = setItems4 + it + } + repo.save(caFromDb) + entityManager.flush() + entityManager.clear() + + def caFromDb4 = repo.findAll().get(0).asType(CustomAttribute) + caFromDb4.equals(ca4) == true + + // now remove items + caFromDb.with { + it.customAttrValues = setItems2 + it + } + repo.save(caFromDb) + entityManager.flush() + entityManager.clear() + + def caFromDb2 = repo.findAll().get(0).asType(CustomAttribute) + caFromDb2.equals(ca2) == true + } +} \ No newline at end of file From ed2ec50d180280acc5dcc1f34f1d2359ae04230f Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 16 Apr 2021 08:06:59 -0700 Subject: [PATCH 2/3] SHIBUI-1734 Commit to branch - incomplete task --- ...te.java => CustomAttributeDefinition.java} | 8 ++--- .../repository/CustomAttributeRepository.java | 12 +++---- .../CustomAttributeRepositoryTests.groovy | 34 +++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) rename backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/{CustomAttribute.java => CustomAttributeDefinition.java} (80%) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttributeDefinition.java similarity index 80% rename from backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java rename to backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttributeDefinition.java index 9c1574be6..03b9db95d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttribute.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomAttributeDefinition.java @@ -14,10 +14,10 @@ import lombok.Data; -@Entity(name = "custom_attribute") +@Entity(name = "custom_attribute_definition") @Audited @Data -public class CustomAttribute { +public class CustomAttributeDefinition { @Id @Column(nullable = false) String name; @@ -32,9 +32,9 @@ public class CustomAttribute { String defaultValue; @ElementCollection - @CollectionTable(name = "custom_attr_values", joinColumns = @JoinColumn(name = "name")) + @CollectionTable(name = "custom_attr_list_defs", joinColumns = @JoinColumn(name = "name")) @Column(name = "value", nullable = false) - Set customAttrValues = new HashSet<>(); + Set customAttrListDefinitions = new HashSet<>(); // @TODO: logic to ensure defaultValue matches an item from the list of values when SELECTION_LIST is the type ?? } 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 edbc4cd9b..ba6385154 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 @@ -10,17 +10,17 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttribute; +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition; /** - * Repository to manage {@link CustomAttribute} instances. + * Repository to manage {@link CustomAttributeDefinition} instances. */ -public interface CustomAttributeRepository extends JpaRepository { +public interface CustomAttributeRepository extends JpaRepository { - List findAll(); + List findAll(); - CustomAttribute findByName(String name); + CustomAttributeDefinition findByName(String name); @SuppressWarnings("unchecked") - CustomAttribute save(CustomAttribute attribute); + CustomAttributeDefinition save(CustomAttributeDefinition attribute); } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy index 9aa14cab0..f9af4b2a4 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/CustomAttributeRepositoryTests.groovy @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories import org.springframework.test.context.ContextConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration -import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttribute +import edu.internet2.tier.shibboleth.admin.ui.domain.CustomAttributeDefinition import spock.lang.Specification /** @@ -31,10 +31,10 @@ class CustomAttributeRepositoryTests extends Specification { def "basic CRUD operations validated"() { given: def setItems = new HashSet(["val1", "val2", "val3"]) - def ca = new CustomAttribute().with { + def ca = new CustomAttributeDefinition().with { it.name = "ca-name" it.attributeType = "SELECTION_LIST" - it.customAttrValues = setItems + it.customAttrListDefinitions = setItems it } @@ -55,7 +55,7 @@ class CustomAttributeRepositoryTests extends Specification { // save check def cas = repo.findAll() cas.size() == 1 - def caFromDb1 = cas.get(0).asType(CustomAttribute) + def caFromDb1 = cas.get(0).asType(CustomAttributeDefinition) caFromDb1.equals(ca) == true // fetch checks @@ -76,13 +76,13 @@ class CustomAttributeRepositoryTests extends Specification { then: def cas2 = repo.findAll() cas2.size() == 1 - def caFromDb2 = cas2.get(0).asType(CustomAttribute) + def caFromDb2 = cas2.get(0).asType(CustomAttributeDefinition) caFromDb2.equals(ca) == false caFromDb2.equals(caFromDb1) == true // delete tests when: - def delByName = new CustomAttribute().with { + def delByName = new CustomAttributeDefinition().with { it.name = "ca-name" it } @@ -99,22 +99,22 @@ class CustomAttributeRepositoryTests extends Specification { def setItems2 = new HashSet(["val2", "val1"]) def setItems3 = new HashSet(["val1", "val2", "val3"]) def setItems4 = new HashSet(["val1", "val2", "val3", "val4"]) - def ca2 = new CustomAttribute().with { + def ca2 = new CustomAttributeDefinition().with { it.name = "ca-name" it.attributeType = "SELECTION_LIST" - it.customAttrValues = setItems2 + it.customAttrListDefinitions = setItems2 it } - def ca3 = new CustomAttribute().with { + def ca3 = new CustomAttributeDefinition().with { it.name = "ca-name" it.attributeType = "SELECTION_LIST" - it.customAttrValues = setItems3 + it.customAttrListDefinitions = setItems3 it } - def ca4 = new CustomAttribute().with { + def ca4 = new CustomAttributeDefinition().with { it.name = "ca-name" it.attributeType = "SELECTION_LIST" - it.customAttrValues = setItems4 + it.customAttrListDefinitions = setItems4 it } @@ -126,31 +126,31 @@ class CustomAttributeRepositoryTests extends Specification { then: def cas = repo.findAll() cas.size() == 1 - def caFromDb = cas.get(0).asType(CustomAttribute) + def caFromDb = cas.get(0).asType(CustomAttributeDefinition) caFromDb.equals(ca3) == true // now update the attribute list items caFromDb.with { - it.customAttrValues = setItems4 + it.customAttrListDefinitions = setItems4 it } repo.save(caFromDb) entityManager.flush() entityManager.clear() - def caFromDb4 = repo.findAll().get(0).asType(CustomAttribute) + def caFromDb4 = repo.findAll().get(0).asType(CustomAttributeDefinition) caFromDb4.equals(ca4) == true // now remove items caFromDb.with { - it.customAttrValues = setItems2 + it.customAttrListDefinitions = setItems2 it } repo.save(caFromDb) entityManager.flush() entityManager.clear() - def caFromDb2 = repo.findAll().get(0).asType(CustomAttribute) + def caFromDb2 = repo.findAll().get(0).asType(CustomAttributeDefinition) caFromDb2.equals(ca2) == true } } \ No newline at end of file From d6625a1a6fb68e5913e0d62c63ac5c09cfb290c9 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 5 May 2021 17:25:26 -0700 Subject: [PATCH 3/3] 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(); + } + +}