Skip to content

Commit ba320b9

Browse files
committed
MOBILE-386 | Added support for ETH Music NFT's
1 parent 78b0e7a commit ba320b9

18 files changed

Lines changed: 723 additions & 89 deletions

newm-server/src/main/kotlin/io/newm/server/Application.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.newm.server.features.collaboration.createCollaborationRoutes
1717
import io.newm.server.features.distribution.createDistributionRoutes
1818
import io.newm.server.features.doc.createOpenApiDocumentationRoutes
1919
import io.newm.server.features.earnings.createEarningsRoutes
20+
import io.newm.server.features.ethereum.createEthereumRoutes
2021
import io.newm.server.features.idenfy.createIdenfyRoutes
2122
import io.newm.server.features.marketplace.createMarketplaceRoutes
2223
import io.newm.server.features.playlist.createPlaylistRoutes
@@ -77,6 +78,7 @@ fun Application.module() {
7778
createAuthenticationRoutes()
7879
createUserRoutes()
7980
createCardanoRoutes()
81+
createEthereumRoutes()
8082
createSongRoutes()
8183
createCollaborationRoutes()
8284
createPlaylistRoutes()

newm-server/src/main/kotlin/io/newm/server/di/DependencyInjectionInstall.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.newm.server.features.distribution.distributionKoinModule
1717
import io.newm.server.features.dripdropz.dripDropzKoinModule
1818
import io.newm.server.features.earnings.earningsKoinModule
1919
import io.newm.server.features.email.emailKoinModule
20+
import io.newm.server.features.ethereum.ethereumKoinModule
2021
import io.newm.server.features.idenfy.idenfyKoinModule
2122
import io.newm.server.features.marketplace.marketplaceKoinModule
2223
import io.newm.server.features.minting.mintingKoinModule
@@ -59,6 +60,7 @@ fun Application.installDependencyInjection() {
5960
awsKoinModule,
6061
idenfyKoinModule,
6162
cardanoKoinModule,
63+
ethereumKoinModule,
6264
daemonsKoinModule,
6365
distributionKoinModule,
6466
arweaveKoinModule,

newm-server/src/main/kotlin/io/newm/server/features/cardano/CardanoRoutes.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ fun Routing.createCardanoRoutes() {
154154
get("nft/songs") {
155155
try {
156156
respond(
157-
cardanoRepository.getWalletNFTSongs(
157+
cardanoRepository.getWalletNftSongs(
158158
userId = myUserId,
159159
includeLegacy = parameters["legacy"]?.toBoolean() == true,
160160
useDripDropz = parameters["dripDropz"]?.toBoolean() == true

newm-server/src/main/kotlin/io/newm/server/features/cardano/model/NFTSong.kt renamed to newm-server/src/main/kotlin/io/newm/server/features/cardano/model/CardanoNftSong.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable
55
import java.util.UUID
66

77
@Serializable
8-
data class NFTSong(
8+
data class CardanoNftSong(
99
@Contextual
1010
val id: UUID,
1111
val fingerprint: String,

newm-server/src/main/kotlin/io/newm/server/features/cardano/parser/NFTSongParser.kt renamed to newm-server/src/main/kotlin/io/newm/server/features/cardano/parser/CardanoNftSongParser.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import io.ktor.utils.io.core.toByteArray
55
import io.newm.chain.grpc.LedgerAssetMetadataItem
66
import io.newm.chain.grpc.NativeAsset
77
import io.newm.chain.util.hexStringToAssetName
8-
import io.newm.server.features.cardano.model.NFTSong
8+
import io.newm.server.features.cardano.model.CardanoNftSong
99
import io.newm.server.features.nftcdn.repo.NftCdnRepository
1010
import io.newm.shared.koin.inject
1111
import io.newm.shared.ktx.toDurationOrNull
@@ -22,7 +22,7 @@ fun List<LedgerAssetMetadataItem>.toNFTSongs(
2222
asset: NativeAsset,
2323
isStreamToken: Boolean,
2424
isNftCdnEnabled: Boolean
25-
): List<NFTSong> {
25+
): List<CardanoNftSong> {
2626
val assetName = asset.name.hexStringToAssetName()
2727
logger.debug { "Parsing PolicyID: ${asset.policy}, assetName: $assetName" }
2828

@@ -100,7 +100,7 @@ fun List<LedgerAssetMetadataItem>.toNFTSongs(
100100
}
101101
null
102102
} else {
103-
NFTSong(
103+
CardanoNftSong(
104104
id = UUID.nameUUIDFromBytes(file.src.toByteArray()),
105105
fingerprint = fingerprint,
106106
policyId = asset.policy,

newm-server/src/main/kotlin/io/newm/server/features/cardano/repo/CardanoRepository.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import io.newm.chain.grpc.VerifySignDataResponse
1616
import io.newm.server.features.cardano.model.EncryptionRequest
1717
import io.newm.server.features.cardano.model.GetWalletSongsResponse
1818
import io.newm.server.features.cardano.model.Key
19-
import io.newm.server.features.cardano.model.NFTSong
19+
import io.newm.server.features.cardano.model.CardanoNftSong
2020
import io.newm.server.features.song.model.SongFilters
2121
import io.newm.server.typealiases.UserId
2222
import kotlinx.coroutines.flow.Flow
@@ -97,11 +97,11 @@ interface CardanoRepository {
9797
limit: Int
9898
): GetWalletSongsResponse
9999

100-
suspend fun getWalletNFTSongs(
100+
suspend fun getWalletNftSongs(
101101
userId: UserId,
102102
includeLegacy: Boolean,
103103
useDripDropz: Boolean
104-
): List<NFTSong>
104+
): List<CardanoNftSong>
105105

106106
suspend fun getWalletImages(userId: UserId): List<String>
107107

newm-server/src/main/kotlin/io/newm/server/features/cardano/repo/CardanoRepositoryImpl.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import io.newm.server.features.cardano.database.ScriptAddressWhitelistEntity
5757
import io.newm.server.features.cardano.model.EncryptionRequest
5858
import io.newm.server.features.cardano.model.GetWalletSongsResponse
5959
import io.newm.server.features.cardano.model.Key
60-
import io.newm.server.features.cardano.model.NFTSong
60+
import io.newm.server.features.cardano.model.CardanoNftSong
6161
import io.newm.server.features.cardano.model.WalletSong
6262
import io.newm.server.features.cardano.parser.toNFTSongs
6363
import io.newm.server.features.cardano.parser.toResourceUrl
@@ -576,13 +576,13 @@ internal class CardanoRepositoryImpl(
576576
return null
577577
}
578578

579-
override suspend fun getWalletNFTSongs(
579+
override suspend fun getWalletNftSongs(
580580
userId: UserId,
581581
includeLegacy: Boolean,
582582
useDripDropz: Boolean
583-
): List<NFTSong> {
583+
): List<CardanoNftSong> {
584584
val assets = if (useDripDropz) getDripDropzAssets(userId) else getWalletAssets(userId)
585-
val nftSongs = mutableListOf<NFTSong>()
585+
val nftSongs = mutableListOf<CardanoNftSong>()
586586
val streamTokenPolicyIds = configRepository.getStrings(CONFIG_KEY_MINT_ALL_POLICY_IDS)
587587
val isNftCdnEnabled = configRepository.getBoolean(CONFIG_KEY_NFTCDN_ENABLED)
588588
for (asset in assets) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.newm.server.features.ethereum
2+
3+
import io.newm.server.features.ethereum.repo.EthereumRepository
4+
import io.newm.server.features.ethereum.repo.EthereumRepositoryImpl
5+
import org.koin.dsl.module
6+
7+
val ethereumKoinModule =
8+
module {
9+
single<EthereumRepository> { EthereumRepositoryImpl(get(), get()) }
10+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.newm.server.features.ethereum
2+
3+
import io.ktor.server.auth.authenticate
4+
import io.ktor.server.response.respond
5+
import io.ktor.server.routing.Routing
6+
import io.newm.server.auth.jwt.AUTH_JWT
7+
import io.newm.server.features.ethereum.repo.EthereumRepository
8+
import io.newm.server.ktx.requiredQueryParam
9+
import io.newm.shared.koin.inject
10+
import io.newm.shared.ktx.get
11+
12+
fun Routing.createEthereumRoutes() {
13+
val repository: EthereumRepository by inject()
14+
15+
authenticate(AUTH_JWT) {
16+
get("/v1/ethereum/nft/songs") {
17+
respond(repository.getNftSongs(request.requiredQueryParam("ownerAddress")))
18+
}
19+
}
20+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package io.newm.server.features.ethereum.model
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class EthereumNft(
8+
@SerialName("contract")
9+
val contract: Contract,
10+
@SerialName("tokenId")
11+
val tokenId: String,
12+
@SerialName("tokenType")
13+
val tokenType: String,
14+
@SerialName("name")
15+
val name: String?,
16+
@SerialName("image")
17+
val image: Media?,
18+
@SerialName("animation")
19+
val animation: Media?,
20+
@SerialName("raw")
21+
val raw: Raw?,
22+
@SerialName("balance")
23+
val balance: Long
24+
) {
25+
@Serializable
26+
data class Contract(
27+
@SerialName("address")
28+
val address: String,
29+
@SerialName("name")
30+
val name: String?
31+
)
32+
33+
@Serializable
34+
data class Media(
35+
@SerialName("contentType")
36+
val contentType: String?,
37+
@SerialName("cachedUrl")
38+
val cachedUrl: String?,
39+
@SerialName("originalUrl")
40+
val originalUrl: String?
41+
)
42+
43+
@Serializable
44+
data class Raw(
45+
@SerialName("metadata")
46+
val metadata: Metadata?
47+
)
48+
49+
@Serializable
50+
data class Metadata(
51+
@SerialName("name")
52+
val name: String?,
53+
@SerialName("image")
54+
val image: String?,
55+
@SerialName("animation_url")
56+
val animationUrl: String?,
57+
@SerialName("attributes")
58+
val attributes: List<Attribute>?
59+
)
60+
61+
@Serializable
62+
data class Attribute(
63+
@SerialName("trait_type")
64+
val traitType: String,
65+
@SerialName("value")
66+
val value: String
67+
)
68+
}

0 commit comments

Comments
 (0)