Skip to content

Commit ed691f7

Browse files
use jsonapi-converter properly
Signed-off-by: Arnav Gupta <[email protected]>
1 parent 40ca6ea commit ed691f7

File tree

18 files changed

+297
-67
lines changed

18 files changed

+297
-67
lines changed

.idea/modules.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.

onlineandroidapi/build.gradle

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
apply plugin: 'com.android.library'
2+
apply plugin: 'kotlin-android'
3+
4+
android {
5+
compileSdkVersion 28
6+
7+
8+
9+
defaultConfig {
10+
minSdkVersion 21
11+
targetSdkVersion 28
12+
versionCode 1
13+
versionName "1.0"
14+
15+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
16+
17+
}
18+
19+
buildTypes {
20+
release {
21+
minifyEnabled false
22+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23+
}
24+
}
25+
26+
}
27+
28+
dependencies {
29+
implementation fileTree(dir: 'libs', include: ['*.jar'])
30+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
31+
32+
// 3rd party libs
33+
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
34+
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
35+
implementation 'com.github.jasminb:jsonapi-converter:0.9'
36+
37+
testImplementation 'junit:junit:4.12'
38+
androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
39+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'
40+
}

onlineandroidapi/proguard-rules.pro

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.codingblocks.onlineandroidapi;
2+
3+
import android.content.Context;
4+
5+
import androidx.test.InstrumentationRegistry;
6+
import androidx.test.runner.AndroidJUnit4;
7+
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
11+
import static org.junit.Assert.*;
12+
13+
/**
14+
* Instrumented test, which will execute on an Android device.
15+
*
16+
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
17+
*/
18+
@RunWith(AndroidJUnit4.class)
19+
public class ExampleInstrumentedTest {
20+
@Test
21+
public void useAppContext() {
22+
// Context of the app under test.
23+
Context appContext = InstrumentationRegistry.getTargetContext();
24+
25+
assertEquals("com.codingblocks.onlineandroidapi.test", appContext.getPackageName());
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="com.codingblocks.onlineandroidapi" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.codingblocks.onlineandroidapi
2+
3+
4+
import com.codingblocks.onlineandroidapi.api.AuthApi
5+
import com.codingblocks.onlineandroidapi.api.OnlineApi
6+
import com.codingblocks.onlineandroidapi.api.QbountyApi
7+
import com.codingblocks.onlineandroidapi.models.qbounty.Claim
8+
import com.codingblocks.onlineandroidapi.models.qbounty.Task
9+
import com.codingblocks.onlineandroidapi.models.qbounty.User
10+
import com.github.jasminb.jsonapi.ResourceConverter
11+
import com.github.jasminb.jsonapi.retrofit.JSONAPIConverterFactory
12+
import retrofit2.Retrofit
13+
import retrofit2.converter.gson.GsonConverterFactory
14+
15+
16+
object Client {
17+
18+
val retrofitAuth = Retrofit.Builder()
19+
.baseUrl("https://account.codingblocks.com/apiAuth/users/")
20+
.addConverterFactory(GsonConverterFactory.create())
21+
.build()
22+
23+
val apiAuth = retrofitAuth.create(AuthApi::class.java)
24+
25+
val retrofit = Retrofit.Builder()
26+
.baseUrl("https://api-online.cb.lk/api/v2/")
27+
.addConverterFactory(GsonConverterFactory.create())
28+
.build()
29+
30+
val api = retrofit.create(OnlineApi::class.java)
31+
32+
val qbountyApi = Retrofit.Builder()
33+
.baseUrl("https://cb-qbounty.herokuapp.com/api/")
34+
.addConverterFactory(JSONAPIConverterFactory(ResourceConverter(
35+
User::class.java,
36+
Task::class.java,
37+
Claim::class.java
38+
)))
39+
.build()
40+
.create(QbountyApi::class.java)
41+
42+
43+
}

onlineapi/src/main/java/com/codingblocks/onlineapi/api/AuthApi.kt renamed to onlineandroidapi/src/main/java/com/codingblocks/onlineandroidapi/api/AuthApi.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package com.codingblocks.onlineapi.api
1+
package com.codingblocks.onlineandroidapi.api
22

3-
import com.codingblocks.onlineapi.models.User
3+
import com.codingblocks.onlineandroidapi.models.User
44
import retrofit2.Call
55
import retrofit2.http.GET
66
import retrofit2.http.Header
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codingblocks.onlineandroidapi.api
2+
3+
import com.codingblocks.onlineandroidapi.models.CourseModel
4+
import retrofit2.Call
5+
import retrofit2.http.GET
6+
import retrofit2.http.Query
7+
8+
interface OnlineApi {
9+
10+
@GET("courses")
11+
fun getRecommendedCourses(
12+
@Query("exclude") query: String = "ratings",
13+
@Query("filter[recommended]") recommended: String = "true",
14+
@Query("filter[unlisted]") unlisted: String = "false",
15+
@Query("include") include: String = "instructors,runs",
16+
@Query("sort") sort: String = "difficulty"): Call<CourseModel>
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.codingblocks.onlineandroidapi.api
2+
3+
import com.codingblocks.onlineandroidapi.models.qbounty.Claim
4+
import com.codingblocks.onlineandroidapi.models.qbounty.Task
5+
import com.codingblocks.onlineandroidapi.models.qbounty.User
6+
import retrofit2.Call
7+
import retrofit2.http.GET
8+
9+
interface QbountyApi {
10+
@get:GET("tasks")
11+
val tasks: Call<ArrayList<Task>>
12+
13+
@get:GET("claims?include=claimant")
14+
val claims: Call<ArrayList<Claim>>
15+
16+
@get:GET("users")
17+
val users: Call<ArrayList<User>>
18+
}

onlineapi/src/main/java/com/codingblocks/onlineapi/models/Courses.kt renamed to onlineandroidapi/src/main/java/com/codingblocks/onlineandroidapi/models/Courses.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.codingblocks.onlineapi.models
1+
package com.codingblocks.onlineandroidapi.models
22

33
import com.google.gson.annotations.SerializedName
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.codingblocks.onlineandroidapi.models.qbounty
2+
3+
import com.github.jasminb.jsonapi.annotations.Id
4+
import com.github.jasminb.jsonapi.annotations.Relationship
5+
import com.github.jasminb.jsonapi.annotations.Type
6+
7+
open class BaseModel {
8+
@Id
9+
val id: String = ""
10+
}
11+
// Use @JsonProperty when working with non camelcase fields
12+
13+
@Type("users")
14+
class User: BaseModel() {
15+
@JvmField val username: String? = null
16+
}
17+
18+
@Type("claims")
19+
open class Claim: BaseModel() {
20+
@JvmField val description: String? = null
21+
@JvmField val link: String? = null
22+
@Relationship("claimant", resolve = true)
23+
@JvmField val claimant: User? = null
24+
}
25+
26+
@Type("tasks")
27+
open class Task: BaseModel() {
28+
@JvmField val title: String? = null
29+
@JvmField val description: String? = null
30+
@JvmField val instances: Int? = null
31+
@Relationship("owner")
32+
@JvmField val owner: User? = null
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<resources>
2+
<string name="app_name">OnlineAndroidAPI</string>
3+
</resources>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.codingblocks.onlineandroidapi;
2+
3+
import com.codingblocks.onlineandroidapi.api.QbountyApi;
4+
import com.codingblocks.onlineandroidapi.models.qbounty.Claim;
5+
import com.codingblocks.onlineandroidapi.models.qbounty.Task;
6+
import com.codingblocks.onlineandroidapi.models.qbounty.User;
7+
import com.fasterxml.jackson.core.JsonFactory;
8+
import com.fasterxml.jackson.databind.DeserializationFeature;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import com.github.jasminb.jsonapi.RelationshipResolver;
11+
import com.github.jasminb.jsonapi.ResourceConverter;
12+
import com.github.jasminb.jsonapi.retrofit.JSONAPIConverterFactory;
13+
14+
import org.junit.Before;
15+
import org.junit.BeforeClass;
16+
import org.junit.Rule;
17+
import org.junit.Test;
18+
19+
import java.io.IOException;
20+
import java.util.ArrayList;
21+
import java.util.Arrays;
22+
23+
import okhttp3.OkHttpClient;
24+
import okhttp3.Request;
25+
import okhttp3.ResponseBody;
26+
import retrofit2.Call;
27+
import retrofit2.Retrofit;
28+
import retrofit2.http.GET;
29+
30+
import static org.junit.Assert.assertEquals;
31+
32+
public class QbountyTest {
33+
34+
public ObjectMapper om;
35+
public QbountyApi api;
36+
public ResourceConverter rc;
37+
38+
39+
@Before
40+
public void setUp () {
41+
om = new ObjectMapper();
42+
rc = new ResourceConverter(om,
43+
Claim.class, Task.class, User.class);
44+
45+
rc.setGlobalResolver(new RelationshipResolver() {
46+
@Override
47+
public byte[] resolve(String relationshipURL) {
48+
OkHttpClient client = new OkHttpClient();
49+
String[] parts = relationshipURL.split(":[0-9]{4}");
50+
String actualUrl = parts[0] + parts[1];
51+
try {
52+
okhttp3.Call c = client.newCall(new Request.Builder().url(actualUrl).build());
53+
ResponseBody b = c.execute().body();
54+
return b.bytes();
55+
} catch (IOException e) {
56+
e.printStackTrace();
57+
return new byte[0];
58+
}
59+
}
60+
});
61+
62+
api = new Retrofit.Builder()
63+
.baseUrl("https://cb-qbounty.herokuapp.com/api/")
64+
.addConverterFactory(new JSONAPIConverterFactory(rc))
65+
.build()
66+
.create(QbountyApi.class);
67+
}
68+
69+
70+
@Test
71+
public void testApi() throws IOException {
72+
73+
ArrayList<Claim> claims = api.getClaims().execute().body();
74+
int l = claims.size();
75+
assertEquals(2, l);
76+
77+
}
78+
@Test
79+
public void testTasks() throws IOException {
80+
81+
82+
ArrayList<Task> tasks = api.getTasks().execute().body();
83+
int l = tasks.size();
84+
assertEquals(3, l);
85+
86+
}
87+
}

onlineapi/build.gradle

-15
This file was deleted.

onlineapi/src/main/java/com/codingblocks/onlineapi/Client.kt

-26
This file was deleted.

onlineapi/src/main/java/com/codingblocks/onlineapi/api/OnlineApi.kt

-21
This file was deleted.

settings.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
include ':app', ':onlineapi'
1+
include ':app', ':onlineandroidapi'

0 commit comments

Comments
 (0)