All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pubnub.internal.models.server.access_manager.v3.GrantTokenRequestBody.kt Maven / Gradle / Ivy

package com.pubnub.internal.models.server.access_manager.v3

import com.pubnub.api.PubNubException
import com.pubnub.api.models.TokenBitmask
import com.pubnub.api.models.consumer.access_manager.v3.ChannelGrant
import com.pubnub.api.models.consumer.access_manager.v3.ChannelGroupGrant
import com.pubnub.api.models.consumer.access_manager.v3.PNGrant
import com.pubnub.api.models.consumer.access_manager.v3.PNPatternGrant
import com.pubnub.api.models.consumer.access_manager.v3.UUIDGrant

data class GrantTokenRequestBody(
    val ttl: Int,
    val permissions: GrantTokenPermissions,
) {
    data class GrantTokenPermissions(
        val resources: GrantTokenPermission,
        val patterns: GrantTokenPermission,
        val meta: Any? = null,
        val uuid: String? = null,
    )

    data class GrantTokenPermission(
        val channels: Map = emptyMap(),
        val groups: Map = emptyMap(),
        val uuids: Map = emptyMap(),
        val spaces: Map = emptyMap(),
        val users: Map = emptyMap(),
    )

    companion object {
        @Throws(PubNubException::class)
        fun of(
            ttl: Int,
            channels: List,
            groups: List,
            uuids: List,
            meta: Any?,
            uuid: String?,
        ): GrantTokenRequestBody {
            val resources =
                GrantTokenPermission(
                    getResources(channels),
                    getResources(groups),
                    getResources(uuids),
                )
            val patterns =
                GrantTokenPermission(
                    getPatterns(channels),
                    getPatterns(groups),
                    getPatterns(uuids),
                )
            val permissions = GrantTokenPermissions(resources, patterns, meta ?: emptyMap(), uuid)
            return GrantTokenRequestBody(ttl, permissions)
        }

        private fun  getResources(resources: List): Map {
            return resources
                .filter { it !is PNPatternGrant }
                .associate { it.id to calculateBitmask(it) }
        }

        private fun  getPatterns(resources: List): Map {
            return resources
                .filterIsInstance()
                .associate { it.id to calculateBitmask(it) }
        }

        private fun calculateBitmask(resource: PNGrant): Int {
            var sum = 0
            if (resource.read) {
                sum = sum or TokenBitmask.READ
            }
            if (resource.write) {
                sum = sum or TokenBitmask.WRITE
            }
            if (resource.manage) {
                sum = sum or TokenBitmask.MANAGE
            }
            if (resource.delete) {
                sum = sum or TokenBitmask.DELETE
            }
            if (resource.create) {
                sum = sum or TokenBitmask.CREATE
            }
            if (resource.get) {
                sum = sum or TokenBitmask.GET
            }
            if (resource.join) {
                sum = sum or TokenBitmask.JOIN
            }
            if (resource.update) {
                sum = sum or TokenBitmask.UPDATE
            }
            return sum
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy