Implemented more robust auth interceptor

This commit is contained in:
Gilbert Kimutai 2019-02-14 05:43:16 +03:00
parent 23e422bdf8
commit 866d25fc4b
23 changed files with 245 additions and 369 deletions

View File

@ -1,24 +1,17 @@
package me.gilo.wc.ui package me.gilo.wc.ui
import android.os.Bundle import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import me.gilo.wc.R
import kotlinx.android.synthetic.main.activity_shop.* import kotlinx.android.synthetic.main.activity_shop.*
import kotlinx.android.synthetic.main.content_menu.*
import kotlinx.android.synthetic.main.content_shop.* import kotlinx.android.synthetic.main.content_shop.*
import me.gilo.wc.adapter.MenuAdapter import me.gilo.wc.R
import me.gilo.wc.adapter.ProductAdapter import me.gilo.wc.adapter.ProductAdapter
import me.gilo.woodroid.Woocommerce import me.gilo.woodroid.Woocommerce
import me.gilo.woodroid.models.Product import me.gilo.woodroid.models.Product
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
import java.util.ArrayList import java.util.*
class ShopActivity : BaseActivity() { class ShopActivity : BaseActivity() {
@ -54,8 +47,8 @@ class ShopActivity : BaseActivity() {
.setConsumerSecret("cs_062e8e3a7ae0ce08fdebc0c39f8f834d5e87598e") .setConsumerSecret("cs_062e8e3a7ae0ce08fdebc0c39f8f834d5e87598e")
.build() .build()
woocommerce.products.enqueue(object : Callback<ArrayList<Product>> { woocommerce.products.enqueue(object : Callback<List<Product>> {
override fun onResponse(call: Call<ArrayList<Product>>, response: Response<ArrayList<Product>>) { override fun onResponse(call: Call<List<Product>>, response: Response<List<Product>>) {
val productsResponse = response.body() val productsResponse = response.body()
for (product in productsResponse!!) { for (product in productsResponse!!) {
products.add(product) products.add(product)
@ -64,7 +57,7 @@ class ShopActivity : BaseActivity() {
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
override fun onFailure(call: Call<ArrayList<Product>>, t: Throwable) { override fun onFailure(call: Call<List<Product>>, t: Throwable) {
} }
}) })

View File

@ -1,11 +1,11 @@
package me.gilo.woodroid; package me.gilo.woodroid;
import me.gilo.woodroid.dto.CouponData;
import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.repo.ProductRepository; import me.gilo.woodroid.repo.ProductRepository;
import me.gilo.woodroid.services.CouponData;
import retrofit2.Call; import retrofit2.Call;
import java.util.ArrayList; import java.util.List;
public class Woocommerce { public class Woocommerce {
@ -68,7 +68,7 @@ public class Woocommerce {
} }
public Call<ArrayList<Product>> getProducts() { public Call<List<Product>> getProducts() {
return productRepository.products(); return productRepository.products();
} }

View File

@ -1,37 +1,8 @@
package me.gilo.woodroid.data; package me.gilo.woodroid.data;
import android.util.Base64;
import me.gilo.woodroid.data.api.API;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.apache.http.NameValuePair; import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RestAdapter { public class RestAdapter {
@ -51,252 +22,7 @@ public class RestAdapter {
this.consumerSecret = consumerSecret; this.consumerSecret = consumerSecret;
} }
public API createAPI(final String endpoint) {
return createAPI(endpoint, null);
}
public API createAPI(final String endpoint, Map<String, String> query) {
if (query != null) {
setParams(endpoint, query);
}else{
setParams(endpoint);
}
// Define the interceptor, add authentication headers
Interceptor interceptor = chain -> {
HttpUrl.Builder builder = chain.request().url().newBuilder();
for (NameValuePair entry : params) {
builder.addQueryParameter(entry.getName(), entry.getValue());
}
Request newRequest = chain.request()
.newBuilder()
.url(builder.build())
.header("Accept", "application/json")
.build();
return chain.proceed(newRequest);
};
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addInterceptor(loggingInterceptor)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
return retrofit.create(API.class);
}
public API createAPI(Class<API> service, final String endpoint, Map<String, String> query) {
if (query != null) {
setParams(endpoint, query);
}else{
setParams(endpoint);
}
// Define the interceptor, add authentication headers
Interceptor interceptor = chain -> {
HttpUrl.Builder builder = chain.request().url().newBuilder();
for (NameValuePair entry : params) {
builder.addQueryParameter(entry.getName(), entry.getValue());
}
Request newRequest = chain.request()
.newBuilder()
.url(builder.build())
.header("Accept", "application/json")
.build();
return chain.proceed(newRequest);
};
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addInterceptor(loggingInterceptor)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
return retrofit.create(API.class);
}
public Interceptor getInterceptor(final String endpoint, Map<String, String> query) {
if (query != null) {
setParams(endpoint, query);
}else{
setParams(endpoint);
}
// Define the interceptor, add authentication headers
Interceptor interceptor = chain -> {
chain.request().method();
HttpUrl.Builder builder = chain.request().url().newBuilder();
for (NameValuePair entry : params) {
builder.addQueryParameter(entry.getName(), entry.getValue());
}
Request newRequest = chain.request()
.newBuilder()
.url(builder.build())
.header("Accept", "application/json")
.build();
return chain.proceed(newRequest);
};
return interceptor;
}
public ArrayList<NameValuePair> setParams(String endpoint) {
final String uri = baseUrl + endpoint;
URI uri1 = URI.create(baseUrl + endpoint);
String urlString = "";
try {
URL url = uri1.toURL();
urlString = url.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
}
oauth_nonce = getOauth_nonce();
oauth_timestamp = getOauth_timestamp();
params = new ArrayList<>();
params.add(new BasicNameValuePair("oauth_consumer_key", consumerKey));
params.add(new BasicNameValuePair("oauth_nonce", oauth_nonce));
params.add(new BasicNameValuePair("oauth_timestamp", oauth_timestamp));
params.add(new BasicNameValuePair("oauth_signature_method", oauth_signature_method));
Collections.sort(params, new SortParams());
String encodedParams = URLEncodedUtils.format(params, "utf-8");
String string_to_sign = "";
try {
string_to_sign = (new StringBuilder("GET&")).append(URLEncoder.encode(uri, "utf-8")).append("&").append(URLEncoder.encode(encodedParams, "utf-8")).toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
Mac mac = Mac.getInstance("HMAC-SHA1");
String secret = consumerSecret + "&";
mac.init(new SecretKeySpec(secret.getBytes("utf-8"), "HMAC-SHA1"));
String signature = Base64.encodeToString(mac.doFinal(string_to_sign.getBytes("utf-8")), 0).trim();
params.add(new BasicNameValuePair("oauth_signature", signature));
} catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return params;
}
public ArrayList<NameValuePair> setParams(String endpoint, Map<String, String> query) {
final String uri = baseUrl + endpoint;
URI uri1 = URI.create(baseUrl + endpoint);
String urlString = "";
try {
URL url = uri1.toURL();
urlString = url.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
}
oauth_nonce = getOauth_nonce();
oauth_timestamp = getOauth_timestamp();
params = new ArrayList<>();
Iterator it = query.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
params.add(new BasicNameValuePair((String) pair.getKey(), (String) pair.getValue()));
it.remove();
}
params.add(new BasicNameValuePair("oauth_consumer_key", consumerKey));
params.add(new BasicNameValuePair("oauth_nonce", oauth_nonce));
params.add(new BasicNameValuePair("oauth_timestamp", oauth_timestamp));
params.add(new BasicNameValuePair("oauth_signature_method", oauth_signature_method));
Collections.sort(params, new SortParams());
String encodedParams = URLEncodedUtils.format(params, "utf-8");
String string_to_sign = "";
try {
string_to_sign = (new StringBuilder("GET&")).append(URLEncoder.encode(uri, "utf-8")).append("&").append(URLEncoder.encode(encodedParams, "utf-8")).toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
Mac mac = Mac.getInstance("HMAC-SHA1");
String secret = consumerSecret;
//if (API.WP_API_VERSION.equals("3")) {
secret = consumerSecret + "&";
//}
mac.init(new SecretKeySpec(secret.getBytes("utf-8"), "HMAC-SHA1"));
String signature = Base64.encodeToString(mac.doFinal(string_to_sign.getBytes("utf-8")), 0).trim();
params.add(new BasicNameValuePair("oauth_signature", signature));
} catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return params;
}
public static String getOauth_nonce() {
return (new StringBuilder(String.valueOf(Math.random() * 100000000D))).toString();
}
public static String getOauth_timestamp() {
long stamp = (long) (System.currentTimeMillis() / 1000D);
return (new StringBuilder(String.valueOf(stamp))).toString();
}
static class SortParams implements Comparator<NameValuePair> {
@Override
public int compare(NameValuePair nameValuePair1, NameValuePair nameValuePair2) {
return nameValuePair1.getName().compareTo(nameValuePair2.getName());
}
}
} }

View File

@ -1,14 +1,12 @@
package me.gilo.woodroid.data.api; package me.gilo.woodroid.data.api;
import me.gilo.woodroid.data.callbacks.*; import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.data.callbacks.Data;
import me.gilo.woodroid.models.*;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.http.*; import retrofit2.http.*;
import rx.Observable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
public interface ProductAPI { public interface ProductAPI {
@ -27,9 +25,33 @@ public interface ProductAPI {
Call<ArrayList<Product>> search(@Query("search") String search); Call<ArrayList<Product>> search(@Query("search") String search);
@GET("products") @GET("products")
Call<ArrayList<Product>> filter(@QueryMap Map<String, String> filter); Call<List<Product>> filter(@QueryMap Map<String, String> filter);
@GET("products/count") @GET("products/count")
Call<ArrayList<Product>> getProductsCount(); Call<List<Product>> getProductsCount();
@Headers("Content-Type: application/json")
@POST("products")
Call<Product> create(@Body Product body);
@GET("products/{id}")
Call<Product> view(@Path("id") int id);
@GET("products")
Call<List<Product>> list();
@Headers("Content-Type: application/json")
@PUT("products/{id}")
Call<Product> update(@Path("id") int id, @Body Product body);
@DELETE("products/{id}")
Call<Product> delete(@Path("id") int id);
@DELETE("products/{id}")
Call<Product> delete(@Path("id") int id, @Query("force") boolean force);
@POST("products/batch")
Call<String> batch(@Body Product body);
} }

View File

@ -0,0 +1,13 @@
package me.gilo.woodroid.data.auth;
import org.apache.http.NameValuePair;
import java.util.Comparator;
public class AlphabeticSorter implements Comparator<NameValuePair> {
@Override
public int compare(NameValuePair nameValuePair1, NameValuePair nameValuePair2) {
return nameValuePair1.getName().compareTo(nameValuePair2.getName());
}
}

View File

@ -0,0 +1,118 @@
package me.gilo.woodroid.data.auth;
import android.util.Base64;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
public class AuthIntercepter implements Interceptor {
static String oauth_nonce = "";
static String oauth_timestamp = "";
static String oauth_signature_method = "HMAC-SHA1";
private String oauth_signature = "";
private String consumerKey;
private String consumerSecret;
public AuthIntercepter(String consumerKey, String consumerSecret) {
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
}
@Override
public Response intercept(Chain chain) throws IOException {
ArrayList<NameValuePair> params = getOauthParams(chain);
HttpUrl.Builder builder = chain.request().url().newBuilder();
for (NameValuePair entry : params) {
builder.addQueryParameter(entry.getName(), entry.getValue());
}
Request newRequest = chain.request()
.newBuilder()
.url(builder.build())
.header("Accept", "application/json")
.build();
return chain.proceed(newRequest);
}
public ArrayList<NameValuePair> getOauthParams(Chain chain) {
ArrayList<NameValuePair> params = new ArrayList<>();
oauth_nonce = getOauth_nonce();
oauth_timestamp = getOauth_timestamp();
params.add(new BasicNameValuePair("oauth_consumer_key", consumerKey));
params.add(new BasicNameValuePair("oauth_nonce", oauth_nonce));
params.add(new BasicNameValuePair("oauth_timestamp", oauth_timestamp));
params.add(new BasicNameValuePair("oauth_signature_method", oauth_signature_method));
Collections.sort(params, new AlphabeticSorter());
String encodedParams = URLEncodedUtils.format(params, "utf-8");
oauth_signature = getOauth_signature(chain.request().method(), chain.request().url().toString(), consumerSecret, encodedParams );
params.add(new BasicNameValuePair("oauth_signature", oauth_signature));
return params;
}
public String getOauth_nonce() {
return (new StringBuilder(String.valueOf(Math.random() * 100000000D))).toString();
}
public String getStringToSign(String method, String url, String parameters) {
String string_to_sign = "";
try {
string_to_sign = (new StringBuilder(method + "&"))
.append(URLEncoder.encode(url, "utf-8")).append("&")
.append(URLEncoder.encode(parameters, "utf-8"))
.toString();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return string_to_sign;
}
public String getOauth_signature(String method, String url, String consumerSecret, String parameters) {
String signature = "";
String string_to_sign = getStringToSign(method, url, parameters);
try {
Mac mac = Mac.getInstance(oauth_signature_method);
String secret = consumerSecret + "&";
mac.init(new SecretKeySpec(secret.getBytes("utf-8"), oauth_signature_method));
signature = Base64.encodeToString(mac.doFinal(string_to_sign.getBytes("utf-8")), 0).trim();
} catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return signature;
}
public String getOauth_timestamp() {
long stamp = (long) (System.currentTimeMillis() / 1000D);
return (new StringBuilder(String.valueOf(stamp))).toString();
}
}

View File

@ -8,9 +8,6 @@ import me.gilo.woodroid.models.Category;
import java.util.ArrayList; import java.util.ArrayList;
/**
* Created by Aron on 12/8/2015.
*/
public class CategoriesCallback { public class CategoriesCallback {
@SerializedName("product_categories") @SerializedName("product_categories")
ArrayList<Category> categories; ArrayList<Category> categories;

View File

@ -11,7 +11,7 @@ public class CouponRepository extends WooRepository{
private final CouponAPI apiService; private final CouponAPI apiService;
public CouponRepository(String baseUrl, String consumerKey, String consumerSecret) { public CouponRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("coupon", baseUrl, consumerKey, consumerSecret); super( baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(CouponAPI.class); apiService = retrofit.create(CouponAPI.class);
} }

View File

@ -1,9 +1,7 @@
package me.gilo.woodroid.repo; package me.gilo.woodroid.repo;
import me.gilo.woodroid.data.api.CustomerAPI; import me.gilo.woodroid.data.api.CustomerAPI;
import me.gilo.woodroid.data.api.OrderAPI;
import me.gilo.woodroid.models.Customer; import me.gilo.woodroid.models.Customer;
import me.gilo.woodroid.models.Order;
import retrofit2.Call; import retrofit2.Call;
import java.util.List; import java.util.List;
@ -13,7 +11,7 @@ public class CustomerRepository extends WooRepository{
private final CustomerAPI apiService; private final CustomerAPI apiService;
public CustomerRepository(String baseUrl, String consumerKey, String consumerSecret) { public CustomerRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("customers", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(CustomerAPI.class); apiService = retrofit.create(CustomerAPI.class);
} }

View File

@ -17,7 +17,7 @@ public class OrderRepository extends WooRepository {
RefundRepository refundRepository; RefundRepository refundRepository;
public OrderRepository(String baseUrl, String consumerKey, String consumerSecret) { public OrderRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("orders", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(OrderAPI.class); apiService = retrofit.create(OrderAPI.class);
orderNoteRepository = new OrderNoteRepository(baseUrl, consumerKey, consumerSecret); orderNoteRepository = new OrderNoteRepository(baseUrl, consumerKey, consumerSecret);

View File

@ -1,53 +1,49 @@
package me.gilo.woodroid.repo; package me.gilo.woodroid.repo;
import me.gilo.woodroid.data.api.API;
import me.gilo.woodroid.data.api.ProductAPI; import me.gilo.woodroid.data.api.ProductAPI;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
public class ProductRepository extends WooRepository { public class ProductRepository extends WooRepository {
private final ProductAPI apiService; private final ProductAPI apiService;
public ProductRepository(String baseUrl, String consumerKey, String consumerSecret) { public ProductRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductAPI.class); apiService = retrofit.create(ProductAPI.class);
} }
//TODO public Call<Product> create(Product product) {
public void create(Product product) { return apiService.create(product);
} }
//TODO
public void update() {
public Call<Product> product(int id) {
return apiService.view(id);
} }
//TODO public Call<List<Product>> products() {
public void delete() { return apiService.list();
} }
public Call<ArrayList<Product>> products() { public Call<Product> update(int id, Product product) {
API apiService = restAdapter.createAPI("products"); return apiService.update(id, product);
return apiService.getProducts();
} }
public Call<ArrayList<Product>> products(HashMap<String, String> filters) { public Call<Product> delete(int id) {
API apiService = restAdapter.createAPI("products", filters); return apiService.delete(id);
}
public Call<Product> delete(int id, boolean force) {
return apiService.delete(id, force);
}
public Call<List<Product>> products(HashMap<String, String> filters) {
return apiService.filter(filters); return apiService.filter(filters);
} }
} }

View File

@ -1,38 +1,24 @@
package me.gilo.woodroid.repo; package me.gilo.woodroid.repo;
import me.gilo.woodroid.data.RestAdapter; import me.gilo.woodroid.data.auth.AuthIntercepter;
import me.gilo.woodroid.data.api.CouponAPI;
import me.gilo.woodroid.models.Coupon;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor; import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Retrofit; import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class WooRepository { public class WooRepository {
private String baseUrl; //TODO Apply DI or single instance on this
private String consumerKey;
private String consumerSecret;
public RestAdapter restAdapter;
public Retrofit retrofit; public Retrofit retrofit;
public WooRepository(String method, String baseUrl, String consumerKey, String consumerSecret) { public WooRepository(String baseUrl, String consumerKey, String consumerSecret) {
this.baseUrl = baseUrl;
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
restAdapter = new RestAdapter(baseUrl, consumerKey, consumerSecret);
OkHttpClient client = new OkHttpClient.Builder() OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(restAdapter.getInterceptor(method, null)) .addInterceptor(new AuthIntercepter(consumerKey, consumerSecret))
.addInterceptor(loggingInterceptor) .addInterceptor(loggingInterceptor)
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS)

View File

@ -13,7 +13,7 @@ public class OrderNoteRepository extends WooRepository {
private final OrderNoteAPI apiService; private final OrderNoteAPI apiService;
public OrderNoteRepository(String baseUrl, String consumerKey, String consumerSecret) { public OrderNoteRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("orders", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(OrderNoteAPI.class); apiService = retrofit.create(OrderNoteAPI.class);
} }

View File

@ -13,7 +13,7 @@ public class RefundRepository extends WooRepository {
private final RefundAPI apiService; private final RefundAPI apiService;
public RefundRepository(String baseUrl, String consumerKey, String consumerSecret) { public RefundRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("orders", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(RefundAPI.class); apiService = retrofit.create(RefundAPI.class);
} }

View File

@ -1,9 +1,7 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductAttributeAPI; import me.gilo.woodroid.data.api.ProductAttributeAPI;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.models.Attribute; import me.gilo.woodroid.models.Attribute;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -14,7 +12,7 @@ public class AttributeRepository extends WooRepository {
private final ProductAttributeAPI apiService; private final ProductAttributeAPI apiService;
public AttributeRepository(String baseUrl, String consumerKey, String consumerSecret) { public AttributeRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products/attributes", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductAttributeAPI.class); apiService = retrofit.create(ProductAttributeAPI.class);
} }

View File

@ -1,10 +1,8 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductAttributeTermAPI; import me.gilo.woodroid.data.api.ProductAttributeTermAPI;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.models.Attribute; import me.gilo.woodroid.models.Attribute;
import me.gilo.woodroid.models.AttributeTerm; import me.gilo.woodroid.models.AttributeTerm;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -17,7 +15,7 @@ public class AttributeTermRepository extends WooRepository {
Attribute attribute; Attribute attribute;
public AttributeTermRepository(String baseUrl, String consumerKey, String consumerSecret, Attribute attribute) { public AttributeTermRepository(String baseUrl, String consumerKey, String consumerSecret, Attribute attribute) {
super("products/categories", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductAttributeTermAPI.class); apiService = retrofit.create(ProductAttributeTermAPI.class);
this.attribute = attribute; this.attribute = attribute;

View File

@ -1,9 +1,7 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.CustomerAPI;
import me.gilo.woodroid.data.api.ProductCategoryAPI; import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.models.Category; import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.models.Customer;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -14,7 +12,7 @@ public class CategoryRepository extends WooRepository {
private final ProductCategoryAPI apiService; private final ProductCategoryAPI apiService;
public CategoryRepository(String baseUrl, String consumerKey, String consumerSecret) { public CategoryRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products/categories", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductCategoryAPI.class); apiService = retrofit.create(ProductCategoryAPI.class);
} }

View File

@ -1,8 +1,6 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.data.api.ProductReviewAPI; import me.gilo.woodroid.data.api.ProductReviewAPI;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.models.ProductReview; import me.gilo.woodroid.models.ProductReview;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -14,7 +12,7 @@ public class ReviewRepository extends WooRepository {
private final ProductReviewAPI apiService; private final ProductReviewAPI apiService;
public ReviewRepository(String baseUrl, String consumerKey, String consumerSecret) { public ReviewRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products/reviews", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductReviewAPI.class); apiService = retrofit.create(ProductReviewAPI.class);
} }

View File

@ -1,8 +1,6 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.data.api.ShippingClassAPI; import me.gilo.woodroid.data.api.ShippingClassAPI;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.models.ShippingClass; import me.gilo.woodroid.models.ShippingClass;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -14,7 +12,7 @@ public class ShippingClassRepository extends WooRepository {
private final ShippingClassAPI apiService; private final ShippingClassAPI apiService;
public ShippingClassRepository(String baseUrl, String consumerKey, String consumerSecret) { public ShippingClassRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products/categories", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ShippingClassAPI.class); apiService = retrofit.create(ShippingClassAPI.class);
} }

View File

@ -1,8 +1,6 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.data.api.ProductTagAPI; import me.gilo.woodroid.data.api.ProductTagAPI;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.models.Tag; import me.gilo.woodroid.models.Tag;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
import retrofit2.Call; import retrofit2.Call;
@ -14,7 +12,7 @@ public class TagRepository extends WooRepository {
private final ProductTagAPI apiService; private final ProductTagAPI apiService;
public TagRepository(String baseUrl, String consumerKey, String consumerSecret) { public TagRepository(String baseUrl, String consumerKey, String consumerSecret) {
super("products/categories", baseUrl, consumerKey, consumerSecret); super( baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductTagAPI.class); apiService = retrofit.create(ProductTagAPI.class);
} }

View File

@ -1,8 +1,6 @@
package me.gilo.woodroid.repo.product; package me.gilo.woodroid.repo.product;
import me.gilo.woodroid.data.api.ProductCategoryAPI;
import me.gilo.woodroid.data.api.ProductVariationAPI; import me.gilo.woodroid.data.api.ProductVariationAPI;
import me.gilo.woodroid.models.Category;
import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.models.Variation; import me.gilo.woodroid.models.Variation;
import me.gilo.woodroid.repo.WooRepository; import me.gilo.woodroid.repo.WooRepository;
@ -16,7 +14,7 @@ public class VariationRepository extends WooRepository {
Product product; Product product;
public VariationRepository(String baseUrl, String consumerKey, String consumerSecret, Product product) { public VariationRepository(String baseUrl, String consumerKey, String consumerSecret, Product product) {
super("products/categories", baseUrl, consumerKey, consumerSecret); super(baseUrl, consumerKey, consumerSecret);
apiService = retrofit.create(ProductVariationAPI.class); apiService = retrofit.create(ProductVariationAPI.class);
this.product = product; this.product = product;

View File

@ -1,6 +1,5 @@
package me.gilo.woodroid.dto; package me.gilo.woodroid.services;
import me.gilo.woodroid.data.RestAdapter;
import me.gilo.woodroid.models.Coupon; import me.gilo.woodroid.models.Coupon;
import me.gilo.woodroid.repo.CouponRepository; import me.gilo.woodroid.repo.CouponRepository;
import retrofit2.Call; import retrofit2.Call;

View File

@ -0,0 +1,42 @@
package me.gilo.woodroid.services;
import me.gilo.woodroid.models.Product;
import me.gilo.woodroid.repo.ProductRepository;
import retrofit2.Call;
import java.util.List;
public class ProductService {
final ProductRepository productRepository;
public ProductService(String baseUrl, String consumerKey, String consumerSecret) {
productRepository = new ProductRepository(baseUrl, consumerKey, consumerSecret);
}
public Call<Product> create(Product product) {
return productRepository.create(product);
}
public Call<Product> product(int id) {
return productRepository.product(id);
}
public Call<List<Product>> products() {
return productRepository.products();
}
public Call<Product> update(int id, Product product) {
return productRepository.update(id, product);
}
public Call<Product> delete(int id) {
return productRepository.delete(id);
}
public Call<Product> delete(int id, boolean force) {
return productRepository.delete(id, force);
}
}