Filter owning-entities from /category_parameter by permissions
[vid.git] / vid-app-common / src / main / java / org / onap / vid / services / CategoryParameterServiceWithRoles.kt
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceWithRoles.kt b/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceWithRoles.kt
new file mode 100644 (file)
index 0000000..f059e59
--- /dev/null
@@ -0,0 +1,60 @@
+package org.onap.vid.services
+
+import com.fasterxml.jackson.annotation.JsonIgnore
+import org.onap.vid.category.CategoryParameterOptionRep
+import org.onap.vid.category.CategoryParametersResponse
+import org.onap.vid.model.CategoryParameter
+import org.onap.vid.roles.RoleProvider
+import org.onap.vid.roles.WithPermissionPropertiesOwningEntity
+import org.springframework.beans.factory.annotation.Qualifier
+import org.springframework.stereotype.Service
+import org.togglz.core.manager.FeatureManager
+import javax.servlet.http.HttpServletRequest
+
+@Service
+@Qualifier("WithRoles")
+class CategoryParameterServiceWithRoles(
+        private val categoryParameterService: CategoryParameterService,
+        private val featureManager: FeatureManager,
+        private val roleProvider: RoleProvider,
+        private val request: HttpServletRequest
+) : CategoryParameterService by categoryParameterService {
+
+    private val owningEntityKey = "owningEntity"
+
+    private fun shouldTreatPermissions() = false
+
+    override fun getCategoryParameters(familyName: CategoryParameter.Family?): CategoryParametersResponse {
+        val categoryParameters =
+                categoryParameterService.getCategoryParameters(familyName)
+
+        return if (shouldTreatPermissions()) {
+            treatPermissions(categoryParameters)
+        } else {
+            categoryParameters
+        }
+    }
+
+    internal fun treatPermissions(categoryParametersResponse: CategoryParametersResponse): CategoryParametersResponse {
+        val extractedCategoryParameters = categoryParametersResponse.categoryParameters
+        val owningEntities = extractedCategoryParameters[owningEntityKey]
+
+        return CategoryParametersResponse(
+                extractedCategoryParameters + (owningEntityKey to removeNonPermitted(owningEntities)))
+    }
+
+    private fun removeNonPermitted(owningEntities: MutableList<CategoryParameterOptionRep>?): List<CategoryParameterOptionRep>? {
+        val userRolesValidator = roleProvider.getUserRolesValidator(request)
+        return owningEntities
+                ?.map { OwningEntityOptionRep(it) }
+                ?.filter { userRolesValidator.isServicePermitted(it) }
+    }
+
+
+    class OwningEntityOptionRep(categoryParameterOptionRep: CategoryParameterOptionRep) :
+            CategoryParameterOptionRep(categoryParameterOptionRep.id, categoryParameterOptionRep.name),
+            WithPermissionPropertiesOwningEntity {
+        override val owningEntityId: String?
+            @JsonIgnore get() = id
+    }
+}