스팀 앱 개발기 #62 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 수정steemCreated with Sketch.

시작하며...

bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스를 #60에서 구현했었습니다. 그런데요... PostItemDTO 객체를 PostItem 객체로 변환하는 코드를 아직 안 만들었습니다. 이번 포스트에서는 이를 수행하는 toPostItem() 메소드를 구현하구요. 그 과정에서 부수적으로 필요한 메소드들을 다른 데이터 클래스들에도 추가로 만들었습니다.


작업 내용

  • ActiveVoteDTO 클래스 - isUpvote() 메소드 추가
  • JSONMetadataDTO 클래스 - getThumbnailURL() 메소드 추가
  • PostItemDTO 클래스 - toPostItem() 메소드 추가

ActiveVoteDTO 클래스 - isUpvote() 메소드 추가

isUpvote() 메소드는 보팅이 업보팅인지 판별하기 위해 만들었습니다. bridge.get_ranked_posts API가 업보팅/다운보팅 개수를 그냥 주지는 않구요. 응답 데이터의 active_votes 배열을 통해 이들을 계산해야 합니다. 이 때 업보팅인지 구별이 필요하구요. 여기서 isUpvote() 메소드를 활용합니다.

data class ActiveVoteDTO(
    val voter: String?,
    val rshares: String?
) {

    fun isUpvote(): Boolean {
        return rshares?.toLongOrNull()?.let {
            when {
                (null == it) -> false
                (it >= 0) -> true
                else -> false
            }
        } ?: false
    }

}

JSONMetadataDTO 클래스 - getThumbnailURL() 메소드 추가

포스트의 썸네일 URL 역시 이 API가 그냥 주지 않아요. 이것은 응답 자료에서 json_metadata의 image 배열의 최초 문자열로 알 수 있습니다. 이 값을 getThumbnailURL() 메소드로 읽을 수 있게끔 하였습니다.

data class JSONMetadataDTO(
    val links: List<String>?,
    val image: List<String>?,
    val users: List<String>?,
    val tags: List<String>?,
    val app: String?,
    val format: String?
) {

    fun getThumbnailURL(): String {
        return when {
            (image?.size == 0) -> ""
            else -> image?.get(0) ?: ""
        }
    }

}

PostItemDTO 클래스 - toPostItem() 메소드 추가

PostItemDTO 객체를 PostItem 객체로 변환하는 과정에서 위에 설명드린 메소드들을 활용하였습니다. 데이터 모듈의 데이터 타입을 도메인 모듈의 데이터 타입으로 변환하기가 생각보다 쉽지 않음을 이번에도 경험하네요. 코드는 아래와 같습니다.

fun toPostItem(): PostItem {
    val thumbnailURL = json_metadata?.getThumbnailURL() ?: ""
    val voteCount = active_votes?.size ?: 0
    val upvotes = active_votes?.filter { activeVote -> activeVote.isUpvote() }
    val upvoteCount = upvotes?.size ?: 0
    val downvoteCount = voteCount - upvoteCount

    return PostItem(
        title ?: "",
        thumbnailURL,
        body ?: "",
        category ?: "",
        Converter.toLocalTimeFromUTCTime(created ?: ""),
        payout ?: 0f,
        upvoteCount,
        downvoteCount,
        author ?: "",
        author_reputation?.toInt() ?: 0
    )
}

Git Commit


마치며...

이번 태그 화면 개발에서는 API 관련 클래스 작성도 길어지네요. 에너지가 많이 부족한 것인지... 조금씩이라도 멈추지 않고 계속 진행하고자 합니다. 하다 보면 빨라지는 날이 오지 않을까 합니다.

다음 포스트에서는 bridge.get_ranked_posts API 연동 코드를 만들어 보려 합니다.


지난 스팀 앱 개발기

Sort:  
 3 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.09
TRX 0.29
JST 0.036
BTC 104760.65
ETH 3577.17
USDT 1.00
SBD 0.56