Skip to content

Commit

Permalink
Fix #8 - Fix Marvel Api Authorization
Browse files Browse the repository at this point in the history
  • Loading branch information
fanky10 committed Apr 9, 2018
1 parent f3e3847 commit 0547cea
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 38 deletions.
2 changes: 2 additions & 0 deletions data/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ dependencies {
// Retrofit & OkHttp
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.puzzlebench.cmk.domain.service.CharacterServices
import io.reactivex.Observable


class CharacterServicesImpl(private val api: MarvelResquestGenerator = MarvelResquestGenerator(), private val mapper: CharacterMapperService = CharacterMapperService()) : CharacterServices {
class CharacterServicesImpl(private val api: MarvelRequestGenerator = MarvelRequestGenerator(), private val mapper: CharacterMapperService = CharacterMapperService()) : CharacterServices {
override fun getCharacters(): Observable<List<Character>> {
return Observable.create { subscriber ->
val callResponse = api.createService(MarvelApi::class.java).getCharacter()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.puzzlebench.cmk.data.service

import com.puzzlebench.cmk.data.BuildConfig
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.security.NoSuchAlgorithmException


class MarvelRequestGenerator {
private val QUERY_PARAMETER_KEY_HASH = "hash"
private val QUERY_PARAMETER_KEY_API_KEY = "apikey"
private val QUERY_PARAMETER_KEY_TS = "ts"
private val builder = Retrofit.Builder()
.baseUrl(BuildConfig.MARVEL_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())

private fun getHttpClient() : OkHttpClient {
// TODO: add proper environment configuration
return OkHttpClient.Builder()
.addInterceptor { chain ->
val defaultRequest = chain.request()
val timestamp = System.currentTimeMillis().toString()
val defaultHttpUrl = defaultRequest.url()
val httpUrl = defaultHttpUrl.newBuilder()
.addQueryParameter(QUERY_PARAMETER_KEY_API_KEY, BuildConfig.PUBLIC_API_KEY_VALUE)
.addQueryParameter(
QUERY_PARAMETER_KEY_HASH,
md5(timestamp + BuildConfig.PRIVATE_API_KEY_VALUE + BuildConfig.PUBLIC_API_KEY_VALUE)
)
.addQueryParameter(QUERY_PARAMETER_KEY_TS, timestamp)
.build()

val requestBuilder = defaultRequest.newBuilder().url(httpUrl)
chain.proceed(requestBuilder.build())
}
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build()
}

fun <S> createService(serviceClass: Class<S>): S {
val retrofit = builder.client(getHttpClient()).build()
return retrofit.create(serviceClass)
}

fun md5(s: String): String {
val MD5 = "MD5"
try {
// Create MD5 Hash
val digest = java.security.MessageDigest
.getInstance(MD5)
digest.update(s.toByteArray())
val messageDigest = digest.digest()

// Create Hex String
val hexString = StringBuilder()
for (aMessageDigest in messageDigest) {
var h = Integer.toHexString(0xFF and aMessageDigest.toInt())
while (h.length < 2)
h = "0$h"
hexString.append(h)
}
return hexString.toString()

} catch (e: NoSuchAlgorithmException) {
e.printStackTrace()
}

return ""
}
}

This file was deleted.

0 comments on commit 0547cea

Please sign in to comment.