From 5c1fdcd5e51a4d10f98dd15bdec582419e3e49f4 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 5 Jul 2018 11:21:23 -0400 Subject: [PATCH 1/5] Initial swagger doc for REST API --- backend/build.gradle | 3 + .../admin/ui/configuration/SwaggerConfig.java | 23 + ...DynamicHttpMetadataProviderController.java | 111 -- ...eBackedHttpMetadataProviderController.java | 110 -- ...ocalDynamicMetadataProviderController.java | 110 -- docs/swagger.yaml | 1159 +++++++++++++++++ 6 files changed, 1185 insertions(+), 331 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SwaggerConfig.java delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java create mode 100644 docs/swagger.yaml diff --git a/backend/build.gradle b/backend/build.gradle index 47dab440a..45a500c86 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -96,6 +96,9 @@ dependencies { runtimeOnly "org.postgresql:postgresql" runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:2.2.0' + //Swagger + compile 'io.springfox:springfox-swagger2:2.9.2' + testCompile "org.springframework.boot:spring-boot-starter-test" testCompile "org.spockframework:spock-core:1.1-groovy-2.4" testCompile "org.spockframework:spock-spring:1.1-groovy-2.4" diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SwaggerConfig.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SwaggerConfig.java new file mode 100644 index 000000000..1f48b6e2f --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/SwaggerConfig.java @@ -0,0 +1,23 @@ +package edu.internet2.tier.shibboleth.admin.ui.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.regex("/api/.*")) + .build(); + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java deleted file mode 100644 index 866f54231..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java +++ /dev/null @@ -1,111 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.DynamicHttpMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.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.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/DynamicHttp") -public class DynamicHttpMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(DynamicHttpMetadataProviderController.class); - - @Autowired - DynamicHttpMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - DynamicHttpMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - DynamicHttpMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody DynamicHttpMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - DynamicHttpMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody DynamicHttpMetadataResolver resolver) { - DynamicHttpMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - DynamicHttpMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(DynamicHttpMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/DynamicHttp/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } - -} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java deleted file mode 100644 index 5b8000482..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java +++ /dev/null @@ -1,110 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.FileBackedHttpMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.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.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/FileBackedHttp") -public class FileBackedHttpMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(FileBackedHttpMetadataProviderController.class); - - @Autowired - FileBackedHttpMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - FileBackedHttpMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - FileBackedHttpMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody FileBackedHttpMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - FileBackedHttpMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody FileBackedHttpMetadataResolver resolver) { - FileBackedHttpMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - FileBackedHttpMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(FileBackedHttpMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/FileBackedHttp/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } -} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java deleted file mode 100644 index 2d3a104ee..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java +++ /dev/null @@ -1,110 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.LocalDynamicMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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.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.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/LocalDynamic") -public class LocalDynamicMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(LocalDynamicMetadataProviderController.class); - - @Autowired - LocalDynamicMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - LocalDynamicMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - LocalDynamicMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody LocalDynamicMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - LocalDynamicMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody LocalDynamicMetadataResolver resolver) { - LocalDynamicMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - LocalDynamicMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(LocalDynamicMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/LocalDynamic/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } -} diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 000000000..142b6fe0c --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,1159 @@ +swagger: '2.0' +info: + description: Api Documentation + version: '1.0' + title: Api Documentation + termsOfService: 'urn:tos' + contact: {} + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0' +host: 'localhost:8080' +basePath: / +tags: + - name: entities-controller + description: Entities Controller + - name: entity-descriptor-controller + description: Entity Descriptor Controller + - name: entity-ids-search-controller + description: Entity Ids Search Controller + - name: metadata-filters-controller + description: Metadata Filters Controller + - name: metadata-providers-controller + description: Metadata Providers Controller + - name: metadata-resolvers-controller + description: Metadata Resolvers Controller +paths: + /api/EntityDescriptor: + post: + tags: + - entity-descriptor-controller + summary: create + operationId: createUsingPOST + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: edRepresentation + description: edRepresentation + required: true + schema: + $ref: '#/definitions/EntityDescriptorRepresentation' + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + '/api/EntityDescriptor/{resourceId}': + get: + tags: + - entity-descriptor-controller + summary: getOne + operationId: getOneUsingGET_1 + produces: + - application/xml + parameters: + - name: resourceId + in: path + description: resourceId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + put: + tags: + - entity-descriptor-controller + summary: update + operationId: updateUsingPUT + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: edRepresentation + description: edRepresentation + required: true + schema: + $ref: '#/definitions/EntityDescriptorRepresentation' + - name: resourceId + in: path + description: resourceId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + /api/EntityDescriptors: + get: + tags: + - entity-descriptor-controller + summary: getAll + operationId: getAllUsingGET + produces: + - '*/*' + responses: + '200': + description: OK + schema: + $ref: '#/definitions/EntityDescriptorRepresentation' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + /api/EntityIds/search: + get: + tags: + - entity-ids-search-controller + summary: search + operationId: searchUsingGET + produces: + - '*/*' + parameters: + - name: limit + in: query + description: limit + required: false + type: integer + format: int32 + - name: term + in: query + description: term + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + /api/MetadataResolvers: + get: + tags: + - metadata-resolvers-controller + summary: getAll + operationId: getAllUsingGET_2 + produces: + - '*/*' + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + post: + tags: + - metadata-resolvers-controller + summary: create + operationId: createUsingPOST_2 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: newResolver + description: newResolver + required: true + schema: + $ref: '#/definitions/MetadataResolver' + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + '/api/MetadataResolvers/{metadataResolverId}/Filters': + get: + tags: + - metadata-filters-controller + summary: getAll + operationId: getAllUsingGET_1 + produces: + - '*/*' + parameters: + - name: metadataResolverId + in: path + description: metadataResolverId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + post: + tags: + - metadata-filters-controller + summary: create + operationId: createUsingPOST_1 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: createdFilter + description: createdFilter + required: true + schema: + $ref: '#/definitions/MetadataFilter' + - name: metadataResolverId + in: path + description: metadataResolverId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + '/api/MetadataResolvers/{metadataResolverId}/Filters/{resourceId}': + get: + tags: + - metadata-filters-controller + summary: getOne + operationId: getOneUsingGET_2 + produces: + - '*/*' + parameters: + - name: metadataResolverId + in: path + description: metadataResolverId + required: true + type: string + - name: resourceId + in: path + description: resourceId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + put: + tags: + - metadata-filters-controller + summary: update + operationId: updateUsingPUT_1 + consumes: + - application/json + produces: + - '*/*' + parameters: + - name: metadataResolverId + in: path + description: metadataResolverId + required: true + type: string + - name: resourceId + in: path + description: resourceId + required: true + type: string + - in: body + name: updatedFilter + description: updatedFilter + required: true + schema: + $ref: '#/definitions/MetadataFilter' + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + '/api/MetadataResolvers/{resourceId}': + get: + tags: + - metadata-resolvers-controller + summary: getOne + operationId: getOneUsingGET_3 + produces: + - '*/*' + parameters: + - name: resourceId + in: path + description: resourceId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + put: + tags: + - metadata-resolvers-controller + summary: update + operationId: updateUsingPUT_2 + consumes: + - application/json + produces: + - '*/*' + parameters: + - name: resourceId + in: path + description: resourceId + required: true + type: string + - in: body + name: updatedResolver + description: updatedResolver + required: true + schema: + $ref: '#/definitions/MetadataResolver' + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + '/api/entities/{entityId}': + get: + tags: + - entities-controller + summary: getOne + operationId: getOneUsingGET + produces: + - '*/*' + parameters: + - name: entityId + in: path + description: entityId + required: true + type: string + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + /api/metadataProviders: + get: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingGET + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + head: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingHEAD + consumes: + - application/json + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + deprecated: false + post: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingPOST + consumes: + - application/json + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + put: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingPUT + consumes: + - application/json + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + deprecated: false + delete: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingDELETE + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + deprecated: false + options: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingOPTIONS + consumes: + - application/json + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + deprecated: false + patch: + tags: + - metadata-providers-controller + summary: getXml + operationId: getXmlUsingPATCH + consumes: + - application/json + produces: + - application/xml + responses: + '200': + description: OK + schema: + type: object + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + deprecated: false +definitions: + AssertionConsumerServiceRepresentation: + type: object + properties: + binding: + type: string + locationUrl: + type: string + makeDefault: + type: boolean + title: AssertionConsumerServiceRepresentation + ContactRepresentation: + type: object + properties: + displayName: + type: string + emailAddress: + type: string + name: + type: string + type: + type: string + url: + type: string + title: ContactRepresentation + DynamicHttpMetadataResolver: + title: DynamicHttpMetadataResolver + allOf: + - $ref: '#/definitions/MetadataResolver' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + criterionPredicateRegistryRef: + type: string + dynamicMetadataResolverAttributes: + $ref: '#/definitions/DynamicMetadataResolverAttributes' + failFastInitialization: + type: boolean + httpMetadataResolverAttributes: + $ref: '#/definitions/HttpMetadataResolverAttributes' + maxConnectionsPerRoute: + type: integer + format: int32 + maxConnectionsTotal: + type: integer + format: int32 + metadataFilters: + type: array + items: + $ref: '#/definitions/MetadataFilter' + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + requireValidMetadata: + type: boolean + resourceId: + type: string + satisfyAnyPredicates: + type: boolean + sortKey: + type: integer + format: int32 + supportedContentTypes: + type: array + items: + type: string + useDefaultPredicateRegistry: + type: boolean + version: + type: integer + format: int32 + title: DynamicHttpMetadataResolver + EntityAttributesFilter: + title: EntityAttributesFilter + allOf: + - $ref: '#/definitions/MetadataFilter' + - type: object + properties: + '@type': + type: string + attributeRelease: + type: array + items: + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + entityAttributesFilterTarget: + $ref: '#/definitions/EntityAttributesFilterTarget' + filterEnabled: + type: boolean + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + relyingPartyOverrides: + $ref: '#/definitions/RelyingPartyOverridesRepresentation' + resourceId: + type: string + version: + type: integer + format: int32 + title: EntityAttributesFilter + EntityDescriptorRepresentation: + type: object + properties: + assertionConsumerServices: + type: array + items: + $ref: '#/definitions/AssertionConsumerServiceRepresentation' + attributeRelease: + type: array + items: + type: string + contacts: + type: array + items: + $ref: '#/definitions/ContactRepresentation' + createdDate: + type: string + format: date-time + entityId: + type: string + id: + type: string + logoutEndpoints: + type: array + items: + $ref: '#/definitions/LogoutEndpointRepresentation' + mdui: + $ref: '#/definitions/MduiRepresentation' + modifiedDate: + type: string + format: date-time + organization: + $ref: '#/definitions/OrganizationRepresentation' + relyingPartyOverrides: + $ref: '#/definitions/RelyingPartyOverridesRepresentation' + securityInfo: + $ref: '#/definitions/SecurityInfoRepresentation' + serviceEnabled: + type: boolean + serviceProviderName: + type: string + serviceProviderSsoDescriptor: + $ref: '#/definitions/ServiceProviderSsoDescriptorRepresentation' + version: + type: integer + format: int32 + title: EntityDescriptorRepresentation + EntityRoleWhiteListFilter: + title: EntityRoleWhiteListFilter + allOf: + - $ref: '#/definitions/MetadataFilter' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + filterEnabled: + type: boolean + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + removeEmptyEntitiesDescriptors: + type: boolean + removeRolelessEntityDescriptors: + type: boolean + resourceId: + type: string + retainedRoles: + type: array + items: + type: string + version: + type: integer + format: int32 + title: EntityRoleWhiteListFilter + FileBackedHttpMetadataResolver: + title: FileBackedHttpMetadataResolver + allOf: + - $ref: '#/definitions/MetadataResolver' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + backingFile: + type: string + backupFileInitNextRefreshDelay: + type: string + createdBy: + type: string + createdDate: + type: string + format: date-time + criterionPredicateRegistryRef: + type: string + failFastInitialization: + type: boolean + httpMetadataResolverAttributes: + $ref: '#/definitions/HttpMetadataResolverAttributes' + initializeFromBackupFile: + type: boolean + metadataFilters: + type: array + items: + $ref: '#/definitions/MetadataFilter' + metadataURL: + type: string + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + reloadableMetadataResolverAttributes: + $ref: '#/definitions/ReloadableMetadataResolverAttributes' + requireValidMetadata: + type: boolean + resourceId: + type: string + satisfyAnyPredicates: + type: boolean + sortKey: + type: integer + format: int32 + useDefaultPredicateRegistry: + type: boolean + version: + type: integer + format: int32 + title: FileBackedHttpMetadataResolver + Iterable«EntityDescriptorRepresentation»: + type: object + title: Iterable«EntityDescriptorRepresentation» + LocalDynamicMetadataResolver: + title: LocalDynamicMetadataResolver + allOf: + - $ref: '#/definitions/MetadataResolver' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + criterionPredicateRegistryRef: + type: string + dynamicMetadataResolverAttributes: + $ref: '#/definitions/DynamicMetadataResolverAttributes' + failFastInitialization: + type: boolean + metadataFilters: + type: array + items: + $ref: '#/definitions/MetadataFilter' + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + requireValidMetadata: + type: boolean + resourceId: + type: string + satisfyAnyPredicates: + type: boolean + sortKey: + type: integer + format: int32 + sourceDirectory: + type: string + sourceKeyGeneratorRef: + type: string + sourceManagerRef: + type: string + useDefaultPredicateRegistry: + type: boolean + version: + type: integer + format: int32 + title: LocalDynamicMetadataResolver + LogoutEndpointRepresentation: + type: object + properties: + bindingType: + type: string + url: + type: string + title: LogoutEndpointRepresentation + MduiRepresentation: + type: object + properties: + description: + type: string + displayName: + type: string + informationUrl: + type: string + logoHeight: + type: integer + format: int32 + logoUrl: + type: string + logoWidth: + type: integer + format: int32 + privacyStatementUrl: + type: string + title: MduiRepresentation + MetadataFilter: + type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + filterEnabled: + type: boolean + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + resourceId: + type: string + version: + type: integer + format: int32 + title: MetadataFilter + MetadataResolver: + type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + criterionPredicateRegistryRef: + type: string + failFastInitialization: + type: boolean + metadataFilters: + type: array + items: + $ref: '#/definitions/MetadataFilter' + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + requireValidMetadata: + type: boolean + resourceId: + type: string + satisfyAnyPredicates: + type: boolean + sortKey: + type: integer + format: int32 + useDefaultPredicateRegistry: + type: boolean + version: + type: integer + format: int32 + title: MetadataResolver + OrganizationRepresentation: + type: object + properties: + displayName: + type: string + name: + type: string + url: + type: string + title: OrganizationRepresentation + RelyingPartyOverridesRepresentation: + type: object + properties: + authenticationMethods: + type: array + items: + type: string + dontSignResponse: + type: boolean + ignoreAuthenticationMethod: + type: boolean + nameIdFormats: + type: array + items: + type: string + omitNotBefore: + type: boolean + responderId: + type: string + signAssertion: + type: boolean + turnOffEncryption: + type: boolean + useSha: + type: boolean + title: RelyingPartyOverridesRepresentation + RequiredValidUntilFilter: + title: RequiredValidUntilFilter + allOf: + - $ref: '#/definitions/MetadataFilter' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + createdBy: + type: string + createdDate: + type: string + format: date-time + filterEnabled: + type: boolean + maxValidityInterval: + type: string + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + resourceId: + type: string + version: + type: integer + format: int32 + title: RequiredValidUntilFilter + SecurityInfoRepresentation: + type: object + properties: + authenticationRequestsSigned: + type: boolean + wantAssertionsSigned: + type: boolean + x509CertificateAvailable: + type: boolean + x509Certificates: + type: array + items: + $ref: '#/definitions/X509CertificateRepresentation' + title: SecurityInfoRepresentation + ServiceProviderSsoDescriptorRepresentation: + type: object + properties: + nameIdFormats: + type: array + items: + type: string + protocolSupportEnum: + type: string + title: ServiceProviderSsoDescriptorRepresentation + SignatureValidationFilter: + title: SignatureValidationFilter + allOf: + - $ref: '#/definitions/MetadataFilter' + - type: object + properties: + '@type': + type: string + audId: + type: integer + format: int64 + certificateFile: + type: string + createdBy: + type: string + createdDate: + type: string + format: date-time + defaultCriteriaRef: + type: string + dynamicTrustedNamesStrategyRef: + type: string + filterEnabled: + type: boolean + modifiedBy: + type: string + modifiedDate: + type: string + format: date-time + name: + type: string + publicKey: + type: string + requireSignedRoot: + type: boolean + resourceId: + type: string + signaturePrevalidatorRef: + type: string + trustEngineRef: + type: string + version: + type: integer + format: int32 + title: SignatureValidationFilter + X509CertificateRepresentation: + type: object + properties: + name: + type: string + type: + type: string + value: + type: string + title: X509CertificateRepresentation \ No newline at end of file From 3f2e1b894bec146170bd4ecc9195b3955c08ed30 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 9 Jul 2018 10:41:56 -0400 Subject: [PATCH 2/5] SHIBUI-619: fix tests --- ...HttpMetadataProviderControllerTests.groovy | 272 ----------------- ...HttpMetadataProviderControllerTests.groovy | 274 ----------------- ...amicMetadataProviderControllerTests.groovy | 276 ------------------ 3 files changed, 822 deletions(-) delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy deleted file mode 100644 index 5b10c9f6e..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,272 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.DynamicHttpMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -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 org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class DynamicHttpMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - def repository = Mock(DynamicHttpMetadataResolverRepository) - def controller - def mockMvc - - @Autowired - AttributeUtility attributeUtility - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new DynamicHttpMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.setVersion(resolver.hashCode()) - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/DynamicHttp/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - def resolverName = resolver.name - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.version = resolver.hashCode() - def resourceId = resolver.resourceId - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByResourceId(resourceId) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/$resourceId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.version = resolver.hashCode() - def resolverName = resolver.name - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/name/$resolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - def existingResolverJson = mapper.writeValueAsString(existingResolver) - - def updatedResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - updatedResolver.resourceId = existingResolver.resourceId - updatedResolver.version = existingResolver.version - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(existingResolver.resourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - - def updatedResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - updatedResolver.resourceId = existingResolver.resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(existingResolver.resourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByResourceId(resolver.resourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy deleted file mode 100644 index 99457a335..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,274 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.FileBackedHttpMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -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 org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class FileBackedHttpMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - @Autowired - AttributeUtility attributeUtility - - def repository = Mock(FileBackedHttpMetadataResolverRepository) - def controller - def mockMvc - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new FileBackedHttpMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/FileBackedHttp/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - def randomResolverName = existingResolver.name - def newResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - newResolver.name = randomResolverName - def postedJsonBody = mapper.writeValueAsString(newResolver) - - 1 * repository.findByName(randomResolverName) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def resolverJson = mapper.writeValueAsString(existingResolver) - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def randomResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - randomResolver.version = randomResolver.hashCode() - def randomResolverName = randomResolver.name - def resolverJson = mapper.writeValueAsString(randomResolver) - - 1 * repository.findByName(randomResolverName) >> randomResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - updatedResolver.version = existingResolver.version - updatedResolver.resourceId = existingResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - updatedResolver.version = updatedResolver.hashCode() - updatedResolver.resourceId = existingResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def randomResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - randomResolver.version = randomResolver.hashCode() - def randomResourceId = randomResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(randomResolver) - - 1 * repository.findByResourceId(randomResourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy deleted file mode 100644 index 14c925c5c..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,276 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.LocalDynamicMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -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 org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class LocalDynamicMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - def repository = Mock(LocalDynamicMetadataResolverRepository) - def controller - def mockMvc - - @Autowired - AttributeUtility attributeUtility - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new LocalDynamicMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/LocalDynamic/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.name) >> resolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def resolverJson = mapper.writeValueAsString(resolver) - def resolverId = resolver.resourceId - - 1 * repository.findByResourceId(resolverId) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/$resolverId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def resolverName = resolver.name - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/name/$resolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.setResourceId(resourceId) - updatedResolver.setVersion(existingResolver.hashCode()) - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.resourceId = resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.resourceId = resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} From 5be784a7d8b729ecbb62e9c3990924b5a7d6c83b Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 10 Jul 2018 07:30:56 -0400 Subject: [PATCH 3/5] To trigger the build --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7f5b9994..7ebba48b5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ There are currently 2 ways to run the application: 1. As an executable -1. deployed in a Java Servlet 3.0 container +2. deployed in a Java Servlet 3.0 container Note that some features require encoded slashes in the URL. In tomcat (which is embedded in the war), this can be allowed with: From d7f54a5ab0255d8ba7352a0056f267038bfca44b Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 10 Jul 2018 10:58:06 -0400 Subject: [PATCH 4/5] Revert back --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ebba48b5..a7f5b9994 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ There are currently 2 ways to run the application: 1. As an executable -2. deployed in a Java Servlet 3.0 container +1. deployed in a Java Servlet 3.0 container Note that some features require encoded slashes in the URL. In tomcat (which is embedded in the war), this can be allowed with: From 8175905c71d0249c3d777c3bde54fa664ec502b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 16 Jul 2018 09:17:00 -0400 Subject: [PATCH 5/5] Update swagger definition manually --- docs/swagger.yaml | 186 ++++++---------------------------------------- 1 file changed, 23 insertions(+), 163 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 142b6fe0c..230146dfa 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,6 +1,6 @@ swagger: '2.0' info: - description: Api Documentation + description: Shibboleth UI REST Api Documentation version: '1.0' title: Api Documentation termsOfService: 'urn:tos' @@ -32,8 +32,8 @@ paths: operationId: createUsingPOST consumes: - application/json - produces: - - '*/*' + - application/xml + - application/x-www-form-urlencoded parameters: - in: body name: edRepresentation @@ -42,10 +42,6 @@ paths: schema: $ref: '#/definitions/EntityDescriptorRepresentation' responses: - '200': - description: OK - schema: - type: object '201': description: Created '401': @@ -54,6 +50,8 @@ paths: description: Forbidden '404': description: Not Found + '409': + description: Already Exists deprecated: false '/api/EntityDescriptor/{resourceId}': get: @@ -63,6 +61,7 @@ paths: operationId: getOneUsingGET_1 produces: - application/xml + - application/json parameters: - name: resourceId in: path @@ -89,7 +88,7 @@ paths: consumes: - application/json produces: - - '*/*' + - application/json parameters: - in: body name: edRepresentation @@ -123,7 +122,7 @@ paths: summary: getAll operationId: getAllUsingGET produces: - - '*/*' + - application/json responses: '200': description: OK @@ -143,7 +142,7 @@ paths: summary: search operationId: searchUsingGET produces: - - '*/*' + - application/json parameters: - name: limit in: query @@ -165,8 +164,6 @@ paths: description: Unauthorized '403': description: Forbidden - '404': - description: Not Found deprecated: false /api/MetadataResolvers: get: @@ -175,7 +172,7 @@ paths: summary: getAll operationId: getAllUsingGET_2 produces: - - '*/*' + - application/json responses: '200': description: OK @@ -185,8 +182,6 @@ paths: description: Unauthorized '403': description: Forbidden - '404': - description: Not Found deprecated: false post: tags: @@ -195,8 +190,6 @@ paths: operationId: createUsingPOST_2 consumes: - application/json - produces: - - '*/*' parameters: - in: body name: newResolver @@ -205,10 +198,6 @@ paths: schema: $ref: '#/definitions/MetadataResolver' responses: - '200': - description: OK - schema: - type: object '201': description: Created '401': @@ -217,6 +206,8 @@ paths: description: Forbidden '404': description: Not Found + '409': + description: Already Exists deprecated: false '/api/MetadataResolvers/{metadataResolverId}/Filters': get: @@ -225,7 +216,7 @@ paths: summary: getAll operationId: getAllUsingGET_1 produces: - - '*/*' + - application/json parameters: - name: metadataResolverId in: path @@ -251,8 +242,6 @@ paths: operationId: createUsingPOST_1 consumes: - application/json - produces: - - '*/*' parameters: - in: body name: createdFilter @@ -266,10 +255,6 @@ paths: required: true type: string responses: - '200': - description: OK - schema: - type: object '201': description: Created '401': @@ -286,7 +271,7 @@ paths: summary: getOne operationId: getOneUsingGET_2 produces: - - '*/*' + - application/json parameters: - name: metadataResolverId in: path @@ -318,7 +303,7 @@ paths: consumes: - application/json produces: - - '*/*' + - application/json parameters: - name: metadataResolverId in: path @@ -341,14 +326,14 @@ paths: description: OK schema: type: object - '201': - description: Created '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found + '409': + description: Already Exists deprecated: false '/api/MetadataResolvers/{resourceId}': get: @@ -357,7 +342,7 @@ paths: summary: getOne operationId: getOneUsingGET_3 produces: - - '*/*' + - application/json parameters: - name: resourceId in: path @@ -384,7 +369,7 @@ paths: consumes: - application/json produces: - - '*/*' + - application/json parameters: - name: resourceId in: path @@ -410,6 +395,9 @@ paths: description: Forbidden '404': description: Not Found + '409': + description: Version conflict + deprecated: false '/api/entities/{entityId}': get: @@ -418,7 +406,7 @@ paths: summary: getOne operationId: getOneUsingGET produces: - - '*/*' + - application/json parameters: - name: entityId in: path @@ -457,134 +445,6 @@ paths: '404': description: Not Found deprecated: false - head: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingHEAD - consumes: - - application/json - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '204': - description: No Content - '401': - description: Unauthorized - '403': - description: Forbidden - deprecated: false - post: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingPOST - consumes: - - application/json - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '201': - description: Created - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not Found - deprecated: false - put: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingPUT - consumes: - - application/json - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '201': - description: Created - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not Found - deprecated: false - delete: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingDELETE - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '204': - description: No Content - '401': - description: Unauthorized - '403': - description: Forbidden - deprecated: false - options: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingOPTIONS - consumes: - - application/json - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '204': - description: No Content - '401': - description: Unauthorized - '403': - description: Forbidden - deprecated: false - patch: - tags: - - metadata-providers-controller - summary: getXml - operationId: getXmlUsingPATCH - consumes: - - application/json - produces: - - application/xml - responses: - '200': - description: OK - schema: - type: object - '204': - description: No Content - '401': - description: Unauthorized - '403': - description: Forbidden - deprecated: false definitions: AssertionConsumerServiceRepresentation: type: object