Skip to content

Commit

Permalink
feat(unified_activity): AND-6643 Unified Activity (#4024)
Browse files Browse the repository at this point in the history
  • Loading branch information
dtverdota-bc committed Nov 4, 2022
1 parent 56380f4 commit 71f7d10
Show file tree
Hide file tree
Showing 33 changed files with 766 additions and 25 deletions.
14 changes: 13 additions & 1 deletion blockchainApi/src/main/java/com/blockchain/api/koin.kt
Expand Up @@ -40,6 +40,10 @@ import com.blockchain.api.paymentmethods.PaymentMethodsApi
import com.blockchain.api.payments.PaymentsApi
import com.blockchain.api.referral.ReferralApi
import com.blockchain.api.selfcustody.SelfCustodyApi
import com.blockchain.api.selfcustody.activity.activityDetailSerializer
import com.blockchain.api.selfcustody.activity.activityIconSerializer
import com.blockchain.api.selfcustody.activity.activityViewItemSerializer
import com.blockchain.api.selfcustody.activity.stackComponentSerializer
import com.blockchain.api.services.AddressMappingService
import com.blockchain.api.services.AddressVerificationApiService
import com.blockchain.api.services.AnalyticsService
Expand Down Expand Up @@ -125,11 +129,15 @@ val blockchainApiModule = module {
}

single(walletPubkeyApi) {
val json = Json {
ignoreUnknownKeys = true
coerceInputValues = true
}
Retrofit.Builder()
.baseUrl(getBaseUrl("wallet-pubkey-api"))
.client(get())
.addCallAdapterFactory(get<OutcomeCallAdapterFactory>())
.addConverterFactory(get(kotlinJsonConverterFactory))
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
.build()
}

Expand Down Expand Up @@ -202,6 +210,10 @@ val blockchainApiModule = module {
subclass(AssetInformationDto::class)
default { UnsupportedAsset.serializer() }
}
stackComponentSerializer()
activityViewItemSerializer()
activityIconSerializer()
activityDetailSerializer()
}
}
}
Expand Down
@@ -0,0 +1,39 @@
package com.blockchain.api.selfcustody

import com.blockchain.domain.wallet.PubKeyStyle
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ActivityRequest(
@SerialName("auth")
val auth: AuthInfo,
@SerialName("params")
val params: ActivityRequestParams,
@SerialName("nextPage")
val nextPage: String?
)

@Serializable
data class ActivityRequestParams(
@SerialName("timezoneIana")
val timezone: String,
@SerialName("fiatCurrency")
val fiatCurrency: String,
@SerialName("acceptLanguage")
val acceptLanguage: String,
@SerialName("network")
val networkTicker: String,
@SerialName("pubKeyInfo")
val pubKeyInfo: ActivityPubKeyInfo
)

@Serializable
data class ActivityPubKeyInfo(
@SerialName("pubKey")
val pubKey: String,
@SerialName("style")
val style: PubKeyStyle,
@SerialName("descriptor")
val descriptor: String
)
@@ -0,0 +1,15 @@
package com.blockchain.api.selfcustody

import com.blockchain.domain.wallet.PubKeyStyle
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PubKeyInfo(
@SerialName("pubKey")
val pubKey: String,
@SerialName("style")
val style: PubKeyStyle,
@SerialName("descriptor")
val descriptor: Int = 0
)
@@ -1,5 +1,6 @@
package com.blockchain.api.selfcustody

import com.blockchain.api.selfcustody.activity.ActivityResponse
import com.blockchain.outcome.Outcome
import retrofit2.http.Body
import retrofit2.http.POST
Expand Down Expand Up @@ -29,9 +30,11 @@ interface SelfCustodyApi {
@POST("tx-history")
suspend fun getTransactionHistory(
@Body request: TransactionHistoryRequest

): Outcome<Exception, TransactionHistoryResponse>

@POST("activity")
suspend fun getActivity(@Body request: ActivityRequest): Outcome<Exception, ActivityResponse>

@POST("buildTx")
suspend fun buildTransaction(@Body request: BuildTxRequest): Outcome<Exception, BuildTxResponse>

Expand Down
Expand Up @@ -50,13 +50,3 @@ data class AccountInfo(
@SerialName("name")
val name: String
)

@Serializable
data class PubKeyInfo(
@SerialName("pubKey")
val pubKey: String,
@SerialName("style")
val style: String,
@SerialName("descriptor")
val descriptor: Int = 0
)
@@ -0,0 +1,45 @@
package com.blockchain.api.selfcustody.activity

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

@Serializable
sealed interface ActivityDetailGroupsDto {
@Serializable
@SerialName("GROUPED_ITEMS")
data class GroupedItems(
@SerialName("title")
val title: String,
@SerialName("subtitle")
val subtitle: String,
@SerialName("icon")
val icon: ActivityIconDto,
@SerialName("itemGroups")
val items: List<DetailGroup>,
@SerialName("floatingActions")
val floatingActions: List<ActivityViewItemDto>
) : ActivityDetailGroupsDto {

@Serializable
data class DetailGroup(
@SerialName("title")
val title: String?,
@SerialName("itemGroup")
val itemGroup: List<ActivityViewItemDto>
)
}

@Serializable
@SerialName("UNKNOWN")
object Unknown : ActivityDetailGroupsDto
}

fun SerializersModuleBuilder.activityDetailSerializer() {
polymorphic(ActivityDetailGroupsDto::class) {
subclass(ActivityDetailGroupsDto.GroupedItems::class)
default { ActivityDetailGroupsDto.Unknown.serializer() }
}
}
@@ -0,0 +1,43 @@
package com.blockchain.api.selfcustody.activity

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

@Serializable
sealed interface ActivityIconDto {
@Serializable
@SerialName("SMALL_TAG")
data class SmallTag(
val main: String,
val tag: String
) : ActivityIconDto

@Serializable
@SerialName("OVERLAPPING_PAIR")
data class OverlappingPair(
val front: String,
val back: String
) : ActivityIconDto

@Serializable
@SerialName("SINGLE_ICON")
data class SingleIcon(
val url: String
) : ActivityIconDto

@Serializable
@SerialName("UNKNOWN")
object Unknown : ActivityIconDto
}

fun SerializersModuleBuilder.activityIconSerializer() {
polymorphic(ActivityIconDto::class) {
subclass(ActivityIconDto.SmallTag::class)
subclass(ActivityIconDto.OverlappingPair::class)
subclass(ActivityIconDto.SingleIcon::class)
default { ActivityIconDto.Unknown.serializer() }
}
}
@@ -0,0 +1,28 @@
package com.blockchain.api.selfcustody.activity

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ActivityResponse(
@SerialName("activity")
val activity: List<ActivityItemDto>,
@SerialName("nextPage")
val nextPage: String?
)

@Serializable
data class ActivityItemDto(
@SerialName("id")
val id: String,
@SerialName("externalUrl")
val externalUrl: String,
@SerialName("item")
val summary: ActivityViewItemDto,
@SerialName("detail")
val detail: ActivityDetailGroupsDto,
@SerialName("state")
val status: String,
@SerialName("timestamp")
val timestamp: Long
)
@@ -0,0 +1,46 @@
package com.blockchain.api.selfcustody.activity

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

@Serializable
sealed interface ActivityViewItemDto {
@Serializable
@SerialName("STACK_VIEW")
data class Stack(
@SerialName("leadingImage")
val leadingImage: ActivityIconDto?,
@SerialName("leading")
val leading: List<StackComponentDto>,
@SerialName("trailing")
val trailing: List<StackComponentDto>,
) : ActivityViewItemDto

@Serializable
@SerialName("BUTTON")
data class Button(
@SerialName("text")
val value: String,
@SerialName("buttonStyle")
val style: String,
@SerialName("actionType")
val actionType: String,
@SerialName("actionData")
val actionData: String
) : ActivityViewItemDto

@Serializable
@SerialName("UNKNOWN")
object Unknown : ActivityViewItemDto
}

fun SerializersModuleBuilder.activityViewItemSerializer() {
polymorphic(ActivityViewItemDto::class) {
subclass(ActivityViewItemDto.Stack::class)
subclass(ActivityViewItemDto.Button::class)
default { ActivityViewItemDto.Unknown.serializer() }
}
}
@@ -0,0 +1,50 @@
package com.blockchain.api.selfcustody.activity

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

@Serializable
data class ActivityTextStyleDto(
@SerialName("style")
val style: String,
@SerialName("color")
val color: String,
@SerialName("strikethrough")
val strikethrough: Boolean
)

@Serializable
sealed interface StackComponentDto {
@Serializable
@SerialName("TEXT")
data class Text(
@SerialName("value")
val value: String,
@SerialName("style")
val style: ActivityTextStyleDto
) : StackComponentDto

@Serializable
@SerialName("BADGE")
data class Tag(
@SerialName("value")
val value: String,
@SerialName("style")
val style: String
) : StackComponentDto

@Serializable
@SerialName("UNKNOWN")
object Unknown : StackComponentDto
}

fun SerializersModuleBuilder.stackComponentSerializer() {
polymorphic(StackComponentDto::class) {
subclass(StackComponentDto.Text::class)
subclass(StackComponentDto.Tag::class)
default { StackComponentDto.Unknown.serializer() }
}
}

0 comments on commit 71f7d10

Please sign in to comment.