diff --git a/src/main/resources/swagger/api-docs.yaml b/src/main/resources/swagger/api-docs.yaml index f637361b0b..ca3c22db89 100755 --- a/src/main/resources/swagger/api-docs.yaml +++ b/src/main/resources/swagger/api-docs.yaml @@ -200,6 +200,38 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorReport' + /api/admin/v1/resources/{resourceTypeName}/{resourceId}: + delete: + tags: + - Admin + summary: Delete a resource + operationId: adminDeleteResource + parameters: + - name: resourceTypeName + in: path + description: Type of resource + required: true + schema: + type: string + - name: resourceId + in: path + description: Id of resource + required: true + schema: + type: string + responses: + 204: + description: Resource successfully deleted + content: {} + 403: + description: You do not have admin privileges + content: {} + 500: + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorReport' /api/admin/v1/resources/{resourceTypeName}/{resourceId}/policies: get: tags: diff --git a/src/main/scala/org/broadinstitute/dsde/workbench/sam/api/AdminRoutes.scala b/src/main/scala/org/broadinstitute/dsde/workbench/sam/api/AdminRoutes.scala index 0a2e8dbb70..59d931e078 100644 --- a/src/main/scala/org/broadinstitute/dsde/workbench/sam/api/AdminRoutes.scala +++ b/src/main/scala/org/broadinstitute/dsde/workbench/sam/api/AdminRoutes.scala @@ -119,46 +119,59 @@ trait AdminRoutes extends SecurityDirectives with SamRequestContextDirectives wi } def adminResourcesRoutes(user: SamUser, samRequestContext: SamRequestContext): server.Route = - pathPrefix("resources" / Segment / Segment / "policies") { case (resourceTypeName, resourceId) => - withNonAdminResourceType(ResourceTypeName(resourceTypeName)) { resourceType => - val resource = FullyQualifiedResourceId(resourceType.name, ResourceId(resourceId)) - pathEndOrSingleSlash { - get { - requireAdminResourceAction(adminReadPolicies, resourceType, user, samRequestContext) { - complete { - resourceService - .listResourcePolicies(resource, samRequestContext) - .map(response => OK -> response.toSet) - } + pathPrefix("resources" / Segment / Segment) { case (resourceTypeName, resourceId) => + pathEndOrSingleSlash { + asWorkbenchAdmin(user) { + delete { + complete { + resourceService + .deleteResource(FullyQualifiedResourceId(ResourceTypeName(resourceTypeName), ResourceId(resourceId)), samRequestContext) + .map(_ => NoContent) } } - } ~ - pathPrefix(Segment / "memberEmails" / Segment) { case (policyName, userEmail) => - val policyId = FullyQualifiedPolicyId(resource, AccessPolicyName(policyName)) + } + } ~ + pathPrefix("policies") { + withNonAdminResourceType(ResourceTypeName(resourceTypeName)) { resourceType => + val resource = FullyQualifiedResourceId(resourceType.name, ResourceId(resourceId)) pathEndOrSingleSlash { - withSubject(WorkbenchEmail(userEmail), samRequestContext) { subject => - put { - requireAdminResourceAction(adminAddMember, resourceType, user, samRequestContext) { - complete { - resourceService - .addSubjectToPolicy(policyId, subject, samRequestContext) - .as(NoContent) - } + get { + requireAdminResourceAction(adminReadPolicies, resourceType, user, samRequestContext) { + complete { + resourceService + .listResourcePolicies(resource, samRequestContext) + .map(response => OK -> response.toSet) } - } ~ - delete { - requireAdminResourceAction(adminRemoveMember, resourceType, user, samRequestContext) { - complete { - resourceService - .removeSubjectFromPolicy(policyId, subject, samRequestContext) - .as(NoContent) + } + } + } ~ + pathPrefix(Segment / "memberEmails" / Segment) { case (policyName, userEmail) => + val policyId = FullyQualifiedPolicyId(resource, AccessPolicyName(policyName)) + pathEndOrSingleSlash { + withSubject(WorkbenchEmail(userEmail), samRequestContext) { subject => + put { + requireAdminResourceAction(adminAddMember, resourceType, user, samRequestContext) { + complete { + resourceService + .addSubjectToPolicy(policyId, subject, samRequestContext) + .as(NoContent) + } + } + } ~ + delete { + requireAdminResourceAction(adminRemoveMember, resourceType, user, samRequestContext) { + complete { + resourceService + .removeSubjectFromPolicy(policyId, subject, samRequestContext) + .as(NoContent) + } + } } - } } + } } - } } - } + } } def adminResourceTypesRoutes(user: SamUser, samRequestContext: SamRequestContext): server.Route =