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

com.stytch.java.b2b.api.recoverycodes.RecoveryCodes.kt Maven / Gradle / Ivy

There is a newer version: 7.3.0
Show newest version
package com.stytch.java.b2b.api.recoverycodes

// !!!
// WARNING: This file is autogenerated
// Only modify code within MANUAL() sections
// or your changes may be overwritten later!
// !!!

import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import com.stytch.java.b2b.models.recoverycodes.GetRequest
import com.stytch.java.b2b.models.recoverycodes.GetResponse
import com.stytch.java.b2b.models.recoverycodes.RecoverRequest
import com.stytch.java.b2b.models.recoverycodes.RecoverResponse
import com.stytch.java.b2b.models.recoverycodes.RotateRequest
import com.stytch.java.b2b.models.recoverycodes.RotateResponse
import com.stytch.java.common.InstantAdapter
import com.stytch.java.common.StytchResult
import com.stytch.java.http.HttpClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.future.asCompletableFuture
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.concurrent.CompletableFuture

public interface RecoveryCodes {
    /**
     * Allows a Member to complete an MFA flow by consuming a recovery code. This consumes the recovery code and returns a
     * session token that can be used to authenticate the Member.
     */
    public suspend fun recover(data: RecoverRequest): StytchResult

    /**
     * Allows a Member to complete an MFA flow by consuming a recovery code. This consumes the recovery code and returns a
     * session token that can be used to authenticate the Member.
     */
    public fun recover(
        data: RecoverRequest,
        callback: (StytchResult) -> Unit,
    )

    /**
     * Allows a Member to complete an MFA flow by consuming a recovery code. This consumes the recovery code and returns a
     * session token that can be used to authenticate the Member.
     */
    public fun recoverCompletable(data: RecoverRequest): CompletableFuture>

    /**
     * Returns a Member's full set of active recovery codes.
     */
    public suspend fun get(data: GetRequest): StytchResult

    /**
     * Returns a Member's full set of active recovery codes.
     */
    public fun get(
        data: GetRequest,
        callback: (StytchResult) -> Unit,
    )

    /**
     * Returns a Member's full set of active recovery codes.
     */
    public fun getCompletable(data: GetRequest): CompletableFuture>

    /**
     * Rotate a Member's recovery codes. This invalidates all existing recovery codes and generates a new set of recovery
     * codes.
     */
    public suspend fun rotate(data: RotateRequest): StytchResult

    /**
     * Rotate a Member's recovery codes. This invalidates all existing recovery codes and generates a new set of recovery
     * codes.
     */
    public fun rotate(
        data: RotateRequest,
        callback: (StytchResult) -> Unit,
    )

    /**
     * Rotate a Member's recovery codes. This invalidates all existing recovery codes and generates a new set of recovery
     * codes.
     */
    public fun rotateCompletable(data: RotateRequest): CompletableFuture>
}

internal class RecoveryCodesImpl(
    private val httpClient: HttpClient,
    private val coroutineScope: CoroutineScope,
) : RecoveryCodes {
    private val moshi = Moshi.Builder().add(InstantAdapter()).build()

    override suspend fun recover(data: RecoverRequest): StytchResult =
        withContext(Dispatchers.IO) {
            var headers = emptyMap()

            val asJson = moshi.adapter(RecoverRequest::class.java).toJson(data)
            httpClient.post("/v1/b2b/recovery_codes/recover", asJson, headers)
        }

    override fun recover(
        data: RecoverRequest,
        callback: (StytchResult) -> Unit,
    ) {
        coroutineScope.launch {
            callback(recover(data))
        }
    }

    override fun recoverCompletable(data: RecoverRequest): CompletableFuture> =
        coroutineScope.async {
            recover(data)
        }.asCompletableFuture()

    override suspend fun get(data: GetRequest): StytchResult =
        withContext(Dispatchers.IO) {
            var headers = emptyMap()

            val asJson = moshi.adapter(GetRequest::class.java).toJson(data)
            val type = Types.newParameterizedType(Map::class.java, String::class.java, Any::class.java)
            val adapter: JsonAdapter> = moshi.adapter(type)
            val asMap = adapter.fromJson(asJson) ?: emptyMap()
            httpClient.get("/v1/b2b/recovery_codes/${data.organizationId}/${data.memberId}", asMap, headers)
        }

    override fun get(
        data: GetRequest,
        callback: (StytchResult) -> Unit,
    ) {
        coroutineScope.launch {
            callback(get(data))
        }
    }

    override fun getCompletable(data: GetRequest): CompletableFuture> =
        coroutineScope.async {
            get(data)
        }.asCompletableFuture()

    override suspend fun rotate(data: RotateRequest): StytchResult =
        withContext(Dispatchers.IO) {
            var headers = emptyMap()

            val asJson = moshi.adapter(RotateRequest::class.java).toJson(data)
            httpClient.post("/v1/b2b/recovery_codes/rotate", asJson, headers)
        }

    override fun rotate(
        data: RotateRequest,
        callback: (StytchResult) -> Unit,
    ) {
        coroutineScope.launch {
            callback(rotate(data))
        }
    }

    override fun rotateCompletable(data: RotateRequest): CompletableFuture> =
        coroutineScope.async {
            rotate(data)
        }.asCompletableFuture()
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy