Browse Source

[검색][New] 필터 세부 속성 병합

hyodong.min 6 years ago
parent
commit
685b40b247

+ 4 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/FilterDetailRequestBean.java

@@ -21,17 +21,17 @@ public class FilterDetailRequestBean extends JsonBeanBase {
   /*
   {
 "fltrType":02 지역 03 핫플레잇
-,"key":상세키
+,"key":상세키 -> fltrNo
 }
    */
   @SerializedName("fltrType")
   private String filterType;
 
   @SerializedName("key")
-  private String filterKey;
+  private String fltrNo;
 
-  public FilterDetailRequestBean(String filterType, String filterKey) {
+  public FilterDetailRequestBean(String filterType, String fltrNo) {
     this.filterType = filterType;
-    this.filterKey = filterKey;
+    this.fltrNo = fltrNo;
   }
 }

+ 13 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/SearchFilterBean.java

@@ -5,6 +5,8 @@ package kr.co.zumo.app.lifeplus.bean.api;
 
 import com.google.gson.annotations.SerializedName;
 
+import java.util.List;
+
 import kr.co.zumo.app.lifeplus.bean.JsonBeanBase;
 
 /**
@@ -53,6 +55,9 @@ public class SearchFilterBean extends JsonBeanBase {
   @SerializedName("doubSlctYn")
   private String multiSelection;
 
+  // 세부 속성을 로딩 후 설정해준다. 세부 속성은 tag 형식
+  private List<TagBean> tagBeans;
+
   public String getFilterNo() {
     return filterNo;
   }
@@ -92,4 +97,12 @@ public class SearchFilterBean extends JsonBeanBase {
   public void setMultiSelection(String multiSelection) {
     this.multiSelection = multiSelection;
   }
+
+  public List<TagBean> getTagBeans() {
+    return tagBeans;
+  }
+
+  public void setTagBeans(List<TagBean> tagBeans) {
+    this.tagBeans = tagBeans;
+  }
 }

+ 40 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/SearchFilterDetailResultBean.java

@@ -14,4 +14,44 @@ package kr.co.zumo.app.lifeplus.bean.api;
  * @since 2019. 1. 11.
  */
 public class SearchFilterDetailResultBean extends LifeplusAPIResultListBean<TagBean> {
+
+  /**
+   * 속성 -> api 로드 완료 후 mapping 해준다.
+   */
+  private SearchFilterBean searchFilterBean;
+  private String filterNo;
+  private String filterName;
+  private String filterType;
+
+  public String getFilterNo() {
+    return filterNo;
+  }
+
+  public void setFilterNo(String filterNo) {
+    this.filterNo = filterNo;
+  }
+
+  public String getFilterName() {
+    return filterName;
+  }
+
+  public void setFilterName(String filterName) {
+    this.filterName = filterName;
+  }
+
+  public String getFilterType() {
+    return filterType;
+  }
+
+  public void setFilterType(String filterType) {
+    this.filterType = filterType;
+  }
+
+  public SearchFilterBean getSearchFilterBean() {
+    return searchFilterBean;
+  }
+
+  public void setSearchFilterBean(SearchFilterBean searchFilterBean) {
+    this.searchFilterBean = searchFilterBean;
+  }
 }

+ 54 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/model/module/APISearchFilterModule.java

@@ -3,10 +3,20 @@
  */
 package kr.co.zumo.app.lifeplus.model.module;
 
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.Observable;
 import io.reactivex.Single;
+import kr.co.zumo.app.lifeplus.bean.api.FilterDetailRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
+import kr.co.zumo.app.lifeplus.bean.api.SearchFilterBean;
+import kr.co.zumo.app.lifeplus.bean.api.SearchFilterDetailResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.SearchFilterResultBean;
 import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIRepository;
+import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIService;
 
 /**
  * APISearchFilterModule
@@ -22,7 +32,49 @@ public class APISearchFilterModule extends LifeplusAPIModule<RequestBean, Search
 
   @Override
   protected Single<SearchFilterResultBean> getAPI(RequestBean requestBean) {
-    return new LifeplusAPIRepository().getFilter(requestBean);
-  }
+    return new LifeplusAPIRepository().getFilter(requestBean)
+      // 속성이 02, 03 인 것 세부 설정 로드 후 combine
+      .flatMap(searchFilterResultBean -> {
+        List<SearchFilterBean> list = searchFilterResultBean.getData();
+        if (null != list && list.size() > 0) {
+          List<Observable<SearchFilterDetailResultBean>> detailList = new ArrayList<>();
+          for (SearchFilterBean filterBean : list) {
+            String type = filterBean.getFilterType();
+            // 지역/핫플레이스 는 세부 필터까지 로드 해서 반환
+            if (type.equals(SearchFilterBean.FILTER_TYPE_AREA)
+              || SearchFilterBean.FILTER_TYPE_HOT_PLACE.equals(type)) {
+              detailList.add(new LifeplusAPIService().getFilterDetail(new FilterDetailRequestBean(type, filterBean.getFilterNo()))
+                .map(searchFilterDetailResultBean -> {
+                  // 결과를 구분하기 위한 속성 맵핑
+                  searchFilterDetailResultBean.setSearchFilterBean(filterBean);
+                  searchFilterDetailResultBean.setFilterName(filterBean.getFilterName());
+                  searchFilterDetailResultBean.setFilterType(filterBean.getFilterType());
+                  searchFilterDetailResultBean.setFilterNo(filterBean.getFilterNo());
+                  return searchFilterDetailResultBean;
+                }).toObservable());
+            }
+          }
 
+          if (detailList.size() > 0) {
+            // 각 속성들을 모두 병합하여 리턴
+            return Single.fromObservable(Observable.combineLatest(detailList, objects -> {
+              Log.w("APP# APISearchFilterModule | apply", "|" + " objects.length = " + objects.length);
+              for (Object object : objects) {
+                if (object instanceof SearchFilterDetailResultBean) {
+                  SearchFilterDetailResultBean resultBean = (SearchFilterDetailResultBean) object;
+                  SearchFilterBean filterBean = resultBean.getSearchFilterBean();
+                  if (null != resultBean.getData() && resultBean.getData().size() > 0) {
+                    filterBean.setTagBeans(resultBean.getData());
+                    Log.w("APP# APISearchFilterModule | apply", "|" + resultBean.toJson());
+                  }
+                }
+              }
+              return searchFilterResultBean;
+            }));
+          }
+        }
+
+        return Single.fromCallable(() -> searchFilterResultBean);
+      });
+  }
 }

+ 1 - 1
app/src/test/java/kr/co/zumo/app/lifeplus/activity/ScreenStarterTest.java

@@ -46,7 +46,7 @@ public class ScreenStarterTest {
   public void setup() {
     lifeplusPreferences = mock(LifeplusPreferences.class);
 
-    SuperModel.getInstance().init(lifeplusPreferences, 100, 100);
+    SuperModel.getInstance().init(lifeplusPreferences);
 
     activity = mock(FragmentActivity.class);
     starter = spy(new ScreenStarter(activity));

+ 1 - 1
app/src/test/java/kr/co/zumo/app/lifeplus/model/SuperModelTest.java

@@ -15,7 +15,7 @@ public class SuperModelTest {
     baseSharedPreferences = mock(BaseSharedPreferences.class);
     lifeplusPreferences = new LifeplusPreferences(baseSharedPreferences);
 
-    SuperModel.getInstance().init(lifeplusPreferences, 100, 100);
+    SuperModel.getInstance().init(lifeplusPreferences);
   }
 
   @Test

+ 61 - 0
app/src/test/java/kr/co/zumo/app/lifeplus/model/module/APISearchFilterModuleTest.java

@@ -0,0 +1,61 @@
+package kr.co.zumo.app.lifeplus.model.module;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import kr.co.zumo.app.lifeplus.config.NetworkConfigSetup;
+import kr.co.zumo.app.lifeplus.model.LifeplusPreferences;
+import kr.co.zumo.app.lifeplus.model.SuperModel;
+
+import static org.powermock.api.mockito.PowerMockito.mock;
+
+/**
+ * APISearchFilterModuleTest
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-01-19]   [최초 작성]
+ * @since 2019-01-19
+ */
+
+@RunWith(RobolectricTestRunner.class)
+public class APISearchFilterModuleTest {
+
+  LifeplusPreferences lifeplusPreferences;
+
+  @Before
+  public void setup() {
+    lifeplusPreferences = mock(LifeplusPreferences.class);
+
+    SuperModel.getInstance().init(lifeplusPreferences);
+    SuperModel.getInstance().setUserId("__test__");
+    SuperModel.getInstance().setToken("");
+    SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_LOGIN);
+
+    NetworkConfigSetup.setConfig();
+  }
+  @Test
+  public void getAPI() {
+//    new APISearchFilterModule().call(new RequestBean(), new APIModuleSimpleListener<SearchFilterResultBean>() {
+//      @Override
+//      public void onApiSuccess(SearchFilterResultBean resultBean) {
+//        System.out.print(resultBean.toJson() + "\n");
+//      }
+//
+//      @Override
+//      public void onApiError(String errorMessage, APIError error) {
+//        System.out.print(errorMessage + "\n");
+//      }
+//    });
+//
+//    try {
+//      Thread.sleep(2000);
+//    } catch (InterruptedException e) {
+//      e.printStackTrace();
+//    }
+  }
+}

+ 1 - 1
app/src/test/java/kr/co/zumo/app/lifeplus/model/module/LoginModuleParserTest.java

@@ -30,7 +30,7 @@ public class LoginModuleParserTest {
   public void setup() {
     lifeplusPreferences = mock(LifeplusPreferences.class);
 
-    SuperModel.getInstance().init(lifeplusPreferences, 100, 100);
+    SuperModel.getInstance().init(lifeplusPreferences);
     SuperModel.getInstance().setUserId("__test__");
     SuperModel.getInstance().setToken("");
     SuperModel.getInstance().deleteMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);

+ 1 - 1
app/src/test/java/kr/co/zumo/app/lifeplus/view/custom/auth/MobileAuthPresenterTest.java

@@ -47,7 +47,7 @@ public class MobileAuthPresenterTest {
     lifeplusPreferences = mock(LifeplusPreferences.class);
     when(lifeplusPreferences.getDeviceUuid()).thenReturn("device_id");
 
-    SuperModel.getInstance().init(lifeplusPreferences, 100, 100);
+    SuperModel.getInstance().init(lifeplusPreferences);
 
     view = mock(IMobileAuthContract.View.class);
     listener = mock(IMobileAuthContract.Listener.class);