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

commonMain.com.algolia.search.endpoint.internal.EndpointAPIKey.kt Maven / Gradle / Ivy

@file:Suppress("FunctionName")

package com.algolia.search.endpoint.internal

import com.algolia.search.configuration.CallType
import com.algolia.search.endpoint.EndpointAPIKey
import com.algolia.search.model.APIKey
import com.algolia.search.model.apikey.APIKeyParams
import com.algolia.search.model.internal.request.RequestAPIKey
import com.algolia.search.model.response.ResponseAPIKey
import com.algolia.search.model.response.ResponseListAPIKey
import com.algolia.search.model.response.creation.Creation
import com.algolia.search.model.response.creation.CreationAPIKey
import com.algolia.search.model.response.deletion.Deletion
import com.algolia.search.model.response.deletion.DeletionAPIKey
import com.algolia.search.model.response.revision.RevisionAPIKey
import com.algolia.search.serialize.internal.Key
import com.algolia.search.serialize.internal.Route
import com.algolia.search.serialize.internal.stringify
import com.algolia.search.serialize.internal.toJsonNoDefaults
import com.algolia.search.serialize.internal.urlEncode
import com.algolia.search.transport.RequestOptions
import com.algolia.search.transport.internal.Transport
import io.ktor.http.HttpMethod
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive

internal class EndpointAPIKeyImpl(
    private val transport: Transport,
) : EndpointAPIKey {

    override suspend fun addAPIKey(
        params: APIKeyParams,
        restrictSources: String?,
        requestOptions: RequestOptions?,
    ): CreationAPIKey {
        val query = mutableMapOf().run {
            restrictSources?.let { put(Key.RestrictSources, JsonPrimitive(it)) }
            params.query?.toJsonNoDefaults()?.let { putAll(it) }
            JsonObject(this)
        }
        val body = RequestAPIKey(
            ACLs = params.ACLs,
            indices = params.indices,
            description = params.description,
            maxHitsPerQuery = params.maxHitsPerQuery,
            maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour,
            validity = params.validity,
            query = if (query.isNotEmpty()) query.urlEncode() else null,
            referers = params.referers
        ).stringify()

        return transport.request(HttpMethod.Post, CallType.Write, Route.KeysV1, requestOptions, body)
    }

    override suspend fun updateAPIKey(
        apiKey: APIKey,
        params: APIKeyParams,
        requestOptions: RequestOptions?,
    ): RevisionAPIKey {
        val body = RequestAPIKey(
            ACLs = params.ACLs,
            indices = params.indices,
            description = params.description,
            maxHitsPerQuery = params.maxHitsPerQuery,
            maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour,
            validity = params.validity,
            query = params.query?.toJsonNoDefaults()?.urlEncode(),
            referers = params.referers
        ).stringify()

        return transport.request(HttpMethod.Put, CallType.Write, "${Route.KeysV1}/$apiKey", requestOptions, body)
    }

    override suspend fun deleteAPIKey(apiKey: APIKey, requestOptions: RequestOptions?): DeletionAPIKey {
        return DeletionAPIKey(
            transport.request(
                HttpMethod.Delete, CallType.Write, "${Route.KeysV1}/$apiKey", requestOptions
            ).deletedAt,
            apiKey
        )
    }

    override suspend fun restoreAPIKey(apiKey: APIKey, requestOptions: RequestOptions?): CreationAPIKey {
        return CreationAPIKey(
            apiKey,
            transport.request(
                HttpMethod.Post, CallType.Write, "${Route.KeysV1}/$apiKey/restore", requestOptions, ""
            ).createdAt
        )
    }

    override suspend fun listAPIKeys(requestOptions: RequestOptions?): ResponseListAPIKey {
        return transport.request(HttpMethod.Get, CallType.Read, Route.KeysV1, requestOptions)
    }

    override suspend fun getAPIKey(
        apiKey: APIKey,
        requestOptions: RequestOptions?,
    ): ResponseAPIKey {
        return transport.request(HttpMethod.Get, CallType.Read, "${Route.KeysV1}/$apiKey", requestOptions)
    }
}

/**
 * Create an [EndpointAPIKey] instance.
 */
internal fun EndpointAPIKey(
    transport: Transport,
): EndpointAPIKey = EndpointAPIKeyImpl(transport)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy