Browse Source

Init : data center v3

liweihao 6 năm trước cách đây
commit
545dafd7d2
38 tập tin đã thay đổi với 1141 bổ sung0 xóa
  1. 53 0
      .gitignore
  2. 49 0
      build.gradle
  3. 21 0
      proguard-rules.pro
  4. 26 0
      src/androidTest/java/com/example/kdan_data_center/ExampleInstrumentedTest.java
  5. 2 0
      src/main/AndroidManifest.xml
  6. 22 0
      src/main/java/com/example/kdan_data_center/KdanCloud.kt
  7. 34 0
      src/main/java/com/example/kdan_data_center/datacenter/DataCenter.kt
  8. 168 0
      src/main/java/com/example/kdan_data_center/datacenter/file/FileService.kt
  9. 21 0
      src/main/java/com/example/kdan_data_center/datacenter/file/body/SyncBody.kt
  10. 12 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/CleanDeleteFileData.kt
  11. 9 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/DataSourceUrlData.kt
  12. 9 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/DownloadUrlData.kt
  13. 30 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/FileCredentialData.kt
  14. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/FilePreviewTokenData.kt
  15. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/file/data/SyncData.kt
  16. 151 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/FolderService.kt
  17. 13 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/CreateFolderByNameBody.kt
  18. 12 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/CreateFolderByPathBody.kt
  19. 9 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/SelectFolderBody.kt
  20. 10 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/SelectFolderWithParent.kt
  21. 20 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/SyncBody.kt
  22. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/body/UpdateFolderBody.kt
  23. 29 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/data/CreateFolderData.kt
  24. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/data/DeleteFolderData.kt
  25. 31 0
      src/main/java/com/example/kdan_data_center/datacenter/folder/data/UpdateFolderData.kt
  26. 69 0
      src/main/java/com/example/kdan_data_center/datacenter/share/ShareLinkService.kt
  27. 21 0
      src/main/java/com/example/kdan_data_center/datacenter/share/body/CreateShareLinkBody.kt
  28. 8 0
      src/main/java/com/example/kdan_data_center/datacenter/share/body/DeleteShareLinkBody.kt
  29. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/share/data/CreateShareLinkData.kt
  30. 12 0
      src/main/java/com/example/kdan_data_center/datacenter/share/data/DeleteShareLinkData.kt
  31. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/share/data/DownloadLinkData.kt
  32. 14 0
      src/main/java/com/example/kdan_data_center/datacenter/share/data/UpdateShareLinkData.kt
  33. 48 0
      src/main/java/com/example/kdan_data_center/datacenter/user/UserService.kt
  34. 9 0
      src/main/java/com/example/kdan_data_center/datacenter/user/data/SearchUserData.kt
  35. 30 0
      src/main/java/com/example/kdan_data_center/datacenter/user/data/UserCredentialData.kt
  36. 95 0
      src/main/java/com/example/kdan_data_center/datacenter/user/data/UserInfoData.kt
  37. 3 0
      src/main/res/values/strings.xml
  38. 17 0
      src/test/java/com/example/kdan_data_center/ExampleUnitTest.java

+ 53 - 0
.gitignore

@@ -0,0 +1,53 @@
+# Built application files
+*.apk
+*.ap_
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# Intellij
+*.iml
+.idea/
+
+# Keystore files
+*.jks
+
+# Windows thumbnail db
+Thumbs.db
+
+# OSX files
+.DS_Store
+
+# Eclipse project files
+.classpath
+.project
+
+keystore.properties
+*.keystore

+ 49 - 0
build.gradle

@@ -0,0 +1,49 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+    compileSdkVersion 28
+
+
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 28
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+    //retrofit 2
+    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
+    implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0"
+    api 'com.squareup.retrofit2:retrofit:2.4.0'
+
+    api 'io.reactivex.rxjava2:rxandroid:2.1.0'
+    api 'io.reactivex.rxjava2:rxjava:2.2.1'
+
+    api 'com.squareup.okhttp3:okhttp:3.11.0'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
+repositories {
+    mavenCentral()
+}

+ 21 - 0
proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
src/androidTest/java/com/example/kdan_data_center/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.example.kdan_data_center;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("com.example.kdan_data_center.test", appContext.getPackageName());
+    }
+}

+ 2 - 0
src/main/AndroidManifest.xml

@@ -0,0 +1,2 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.kdan_data_center" />

+ 22 - 0
src/main/java/com/example/kdan_data_center/KdanCloud.kt

@@ -0,0 +1,22 @@
+package com.example.kdan_data_center
+
+import com.example.kdan_data_center.datacenter.DataCenter
+import okhttp3.OkHttpClient
+import retrofit2.Retrofit
+import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
+import retrofit2.converter.gson.GsonConverterFactory
+
+class KdanCloud {
+    val dataCenter = DataCenter(this)
+
+    fun getRetrofit(baseUrl: String): Retrofit =
+            Retrofit.Builder()
+                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+                    .addConverterFactory(GsonConverterFactory.create())
+                    .client(provideOkHttpClient())
+                    .baseUrl(baseUrl)
+                    .build()
+
+    private fun provideOkHttpClient(): OkHttpClient =
+            OkHttpClient.Builder().build()
+}

+ 34 - 0
src/main/java/com/example/kdan_data_center/datacenter/DataCenter.kt

@@ -0,0 +1,34 @@
+package com.example.kdan_data_center.datacenter
+
+import com.example.kdan_data_center.BuildConfig
+import com.example.kdan_data_center.KdanCloud
+import com.example.kdan_data_center.datacenter.file.FileService
+import com.example.kdan_data_center.datacenter.folder.FolderService
+import com.example.kdan_data_center.datacenter.share.ShareLinkService
+import com.example.kdan_data_center.datacenter.user.UserService
+
+class DataCenter(private val kdanCloud: KdanCloud) {
+    companion object {
+        const val DEBUG_HOST = "https://preparing.kdanmobile.com:3020/"
+        const val RELEASE_HOST = "https://data-center-rails.kdanmobile.com/"
+    }
+
+    private val host = if (BuildConfig.DEBUG) DEBUG_HOST else RELEASE_HOST
+
+    val userService: UserService = buildUserService()
+    val fileService: FileService = buildFileService()
+    val folderService: FolderService = buildFolderService()
+    val shareLinkService: ShareLinkService = buildShareLinkService()
+
+    private fun buildUserService(): UserService =
+            kdanCloud.getRetrofit(host + UserService.BASE_URL).create(UserService::class.java)
+
+    private fun buildFileService(): FileService =
+            kdanCloud.getRetrofit(host + FileService.BASE_URL).create(FileService::class.java)
+
+    private fun buildFolderService(): FolderService =
+            kdanCloud.getRetrofit(host + FolderService.BASE_URL).create(FolderService::class.java)
+
+    private fun buildShareLinkService(): ShareLinkService =
+            kdanCloud.getRetrofit(host + ShareLinkService.BASE_URL).create(ShareLinkService::class.java)
+}

+ 168 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/FileService.kt

@@ -0,0 +1,168 @@
+package com.example.kdan_data_center.datacenter.file
+
+import com.example.kdan_data_center.datacenter.file.body.SyncBody
+import com.example.kdan_data_center.datacenter.file.data.*
+import io.reactivex.Observable
+import retrofit2.http.*
+
+interface FileService {
+    companion object {
+        const val BASE_URL = "api/v3/file_objects/"
+    }
+
+    @POST("upload_mission")
+    fun uploadFile(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String
+    )
+
+    @GET("list")
+    fun getFileInfo(
+            @Header("Authorization") accessToken: String,
+            @Query("object_type") objectType: String?,
+            @Query("object_state") objectState: String?,
+            @Query("object_id_list[]") objectIdList: Array<Int>?,
+            @Query("category") category: String?,
+            @Query("app_series") appSeries: String?
+    )
+
+    @GET(".")
+    fun getFileInfo(
+            @Header("Authorization") accessToken: String,
+            @Query("object_type") objectType: String?,
+            @Query("object_id") objectId: Int
+    )
+
+    @PUT(".")
+    @FormUrlEncoded
+    fun updateFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_id") objectId: Int,
+            @Field("project_name") projectName: String?,
+            @Field("parent_id") parentId: Int?
+    )
+
+    @HTTP(method = "DELETE", path = ".", hasBody = true)
+    fun deleteFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_id") objectId: Int,
+            @Field("object_type") objectType: String?
+    )
+
+    @HTTP(method = "DELETE", path = ".", hasBody = true)
+    fun deleteFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_id_list") objectIdList: Array<Int>,
+            @Field("object_type") objectType: String?
+    )
+
+    @HTTP(method = "DELETE", path = "hard_destroy", hasBody = true)
+    fun hardDeleteFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id") objectId: Int
+    )
+
+    @HTTP(method = "DELETE", path = "hard_destroy", hasBody = true)
+    fun hardDeleteFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id_list") objectIdList: Array<Int>
+    )
+
+    @HTTP(method = "DELETE", path = "clean", hasBody = true)
+    fun cleanDeleteFile(
+            @Header("Authorization") accessToken: String
+    ): Observable<CleanDeleteFileData>
+
+    @PUT("restore")
+    @FormUrlEncoded
+    fun restoreFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id") objectId: Int
+    )
+
+    @PUT("restore")
+    @FormUrlEncoded
+    fun restoreFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id_list") objectIdList: Array<Int>
+    )
+
+    @POST("copy")
+    @FormUrlEncoded
+    fun copyFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id") objectId: Int,
+            @Field("parent_id") parentId: Int
+    )
+
+    @POST("copy")
+    @FormUrlEncoded
+    fun copyFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id_list") objectIdList: Array<Int>,
+            @Field("parent_id") parentId: Int
+    )
+
+    @PUT("move")
+    @FormUrlEncoded
+    fun moveFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id") objectId: Int,
+            @Field("parent_id") parentId: Int
+    )
+
+    @PUT("move")
+    @FormUrlEncoded
+    fun moveFile(
+            @Header("Authorization") accessToken: String,
+            @Field("object_type") objectType: String?,
+            @Field("object_id_list") objectIdList: Array<Int>,
+            @Field("parent_id") parentId: Int
+    )
+
+    @GET("download_url")
+    fun getDownloadUrl(
+            @Header("Authorization") accessToken: String,
+            @Query("object_id") objectId: Int,
+            @Query("object_type") objectType: String?
+    ): Observable<DownloadUrlData>
+
+    @GET("data_source_url")
+    fun getDataSourceUrl(
+            @Header("Authorization") accessToken: String,
+            @Query("object_id") objectId: Int
+    ): Observable<DataSourceUrlData>
+
+    @GET("file_credential")
+    fun getFileCredential(
+            @Header("Authorization") accessToken: String,
+            @Query("object_id") objectId: Int,
+            @Query("object_type") objectType: String?
+    ): Observable<FileCredentialData>
+
+    @GET("preview_token")
+    fun getFilePreviewToken(
+            @Header("Authorization") accessToken: String,
+            @Query("object_id") objectId: Int,
+            @Query("object_type") objectType: String?
+    ): Observable<FilePreviewTokenData>
+
+    @GET("preview_info")
+    fun getFilePreviewInfo(
+            @Query("token") previewToken: String
+    )
+
+    @PUT("sync_architecture")
+    fun sync(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body syncBody: SyncBody
+    ): Observable<SyncData>
+}

+ 21 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/body/SyncBody.kt

@@ -0,0 +1,21 @@
+package com.example.kdan_data_center.datacenter.file.body
+
+import com.google.gson.annotations.SerializedName
+
+
+data class SyncBody(
+        @SerializedName("last_sync_time") val lastSyncTime: String,
+        @SerializedName("architecture_infos") val architectureInfos: List<ArchitectureInfo>
+) {
+
+    data class ArchitectureInfo(
+            @SerializedName("project_id") val projectId: String,
+            @SerializedName("bucket_name") val bucketName: String,
+            @SerializedName("updated_at") val updatedAt: String
+    ){
+        @SerializedName("prev_parent_id") val prevParentId: Int? = null
+        @SerializedName("cur_parent_id") val curParentId: Int? = null
+        @SerializedName("prev_name") val prevName: String? = null
+        @SerializedName("cur_name") val curName: String? = null
+    }
+}

+ 12 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/CleanDeleteFileData.kt

@@ -0,0 +1,12 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class CleanDeleteFileData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    class Data
+}

+ 9 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/DataSourceUrlData.kt

@@ -0,0 +1,9 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DataSourceUrlData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: String
+)

+ 9 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/DownloadUrlData.kt

@@ -0,0 +1,9 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DownloadUrlData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: String
+)

+ 30 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/FileCredentialData.kt

@@ -0,0 +1,30 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class FileCredentialData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("credentials") val credentials: Credentials,
+            @SerializedName("federated_user") val federatedUser: FederatedUser,
+            @SerializedName("packed_policy_size") val packedPolicySize: Int
+    ) {
+
+        data class Credentials(
+                @SerializedName("access_key_id") val accessKeyId: String,
+                @SerializedName("secret_access_key") val secretAccessKey: String,
+                @SerializedName("session_token") val sessionToken: String,
+                @SerializedName("expiration") val expiration: String
+        )
+
+
+        data class FederatedUser(
+                @SerializedName("federated_user_id") val federatedUserId: String,
+                @SerializedName("arn") val arn: String
+        )
+    }
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/FilePreviewTokenData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class FilePreviewTokenData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("token") val token: String
+    )
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/file/data/SyncData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.file.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class SyncData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("need_sync") val needSync: Boolean
+    )
+}

+ 151 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/FolderService.kt

@@ -0,0 +1,151 @@
+package com.example.kdan_data_center.datacenter.folder
+
+import com.example.kdan_data_center.datacenter.folder.body.*
+import com.example.kdan_data_center.datacenter.folder.data.CreateFolderData
+import com.example.kdan_data_center.datacenter.folder.data.DeleteFolderData
+import com.example.kdan_data_center.datacenter.folder.data.UpdateFolderData
+import io.reactivex.Observable
+import retrofit2.http.*
+
+interface FolderService {
+    companion object {
+        const val BASE_URL = "api/v3/folders/"
+    }
+
+    @POST(".")
+    fun createFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body createFolderByNameBody: CreateFolderByNameBody
+    ): Observable<CreateFolderData>
+
+    @POST("recursive_create")
+    fun createFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body createFolderByPathBody: CreateFolderByPathBody
+    ): Observable<CreateFolderData>
+
+    @GET(".")
+    fun getFolderInfo(
+            @Header("Authorization") accessToken: String,
+            @Query("folder_id") folderId: Int?,
+            @Query("depth") depth: Int?,
+            @Query("category") category: String?,
+            @Query("app_series") appSeries: String?
+    )
+
+    @PUT(".")
+    fun updateFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body updateFolderBody: UpdateFolderBody
+    ): Observable<UpdateFolderData>
+
+    @DELETE(".")
+    fun deleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body selectFolderBody: SelectFolderBody
+    )
+
+    @DELETE(".")
+    fun deleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id") folderId: Int
+    )
+
+    @DELETE(".")
+    fun deleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id_list") folderIdList: List<Int>
+    )
+
+    @DELETE("hard_destroy")
+    fun hardDeleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body selectFolderBody: SelectFolderBody
+    ): Observable<DeleteFolderData>
+
+    @DELETE("hard_destroy")
+    fun hardDeleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id") folderId: Int
+    ): Observable<DeleteFolderData>
+
+    @DELETE("hard_destroy")
+    fun hardDeleteFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id_list") folderIdList: List<Int>
+    ): Observable<DeleteFolderData>
+
+    @PUT("restore")
+    fun restoreFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body selectFolderBody: SelectFolderBody
+    )
+
+    @PUT("restore")
+    fun restoreFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id") folderId: Int
+    )
+
+    @PUT("restore")
+    fun restoreFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("folder_id_list") folderIdList: List<Int>
+    )
+
+    @POST("copy")
+    fun copyFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body selectFolderWithParent: SelectFolderWithParent
+    )
+
+    @POST("copy")
+    fun copyFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("parent_id") parentId: Int?,
+            @Field("folder_id") folderId: Int
+    )
+
+    @POST("copy")
+    fun copyFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("parent_id") parentId: Int?,
+            @Field("folder_id_list") folderIdList: List<Int>
+    )
+
+    @PUT("move")
+    fun moveFolder(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body selectFolderWithParent: SelectFolderWithParent
+    )
+
+    @PUT("move")
+    fun moveFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("parent_id") parentId: Int?,
+            @Field("folder_id") folderId: Int
+    )
+
+    @PUT("move")
+    fun moveFolder(
+            @Header("Authorization") accessToken: String,
+            @Field("parent_id") parentId: Int?,
+            @Field("folder_id_list") folderIdList: List<Int>
+    )
+
+    @PUT("sync_architecture")
+    fun sync(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body syncBody: SyncBody
+    )
+
+}

+ 13 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/CreateFolderByNameBody.kt

@@ -0,0 +1,13 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+
+data class CreateFolderByNameBody(
+        val folder_name: String
+) {
+    val parent_id: Int? = null
+    val other_infos: OtherInfos? = null
+
+    data class OtherInfos(
+            val color: String
+    )
+}

+ 12 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/CreateFolderByPathBody.kt

@@ -0,0 +1,12 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+
+data class CreateFolderByPathBody(
+        val full_path: String
+) {
+    val other_infos: OtherInfos? = null
+
+    data class OtherInfos(
+            val color: String
+    )
+}

+ 9 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/SelectFolderBody.kt

@@ -0,0 +1,9 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+import com.google.gson.annotations.SerializedName
+
+
+data class SelectFolderBody(
+        @SerializedName("folder_id") val folderId: Int?,
+        @SerializedName("folder_id_list") val folderIdList: List<Int>?
+)

+ 10 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/SelectFolderWithParent.kt

@@ -0,0 +1,10 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+import com.google.gson.annotations.SerializedName
+
+
+data class SelectFolderWithParent(
+        @SerializedName("folder_id") val folderId: Int?,
+        @SerializedName("folder_id_list") val folderIdList: List<Int>?,
+        @SerializedName("parent_id") val parentId: Int?
+)

+ 20 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/SyncBody.kt

@@ -0,0 +1,20 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+
+data class SyncBody(
+        val last_sync_time: String,
+        val architecture_infos: List<ArchitectureInfo>
+) {
+
+    data class ArchitectureInfo(
+            val updated_at: String,
+            val depth: Int
+    ){
+        val folder_id: Int? = null
+        val prev_parent_id: Int? = null
+        val prev_name:String? = null
+        val cur_parent_id: Int? = null
+        val cur_name: String? = null
+        val cur_path: String? = null
+    }
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/body/UpdateFolderBody.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.folder.body
+
+
+data class UpdateFolderBody(
+        val folder_id: Int
+) {
+    val parent_id: Int? = null
+    val folder_name: String? = null
+    val other_infos: OtherInfos? = null
+
+    data class OtherInfos(
+            val color: String
+    )
+}

+ 29 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/data/CreateFolderData.kt

@@ -0,0 +1,29 @@
+package com.example.kdan_data_center.datacenter.folder.data
+
+
+data class CreateFolderData(
+        val message: String,
+        val data: Data
+) {
+
+    data class Data(
+            val id: Int,
+            val folder_name: String,
+            val user_id: Int,
+            val is_deleted: Boolean,
+            val user_updated_at: String,
+            val created_at: String,
+            val updated_at: String,
+            val full_path: String,
+            val active_status: String,
+            val other_infos: OtherInfos,
+            val folder_type: String,
+            val parent_id: Int,
+            val size: Int
+    ) {
+
+        data class OtherInfos(
+                val color: String
+        )
+    }
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/data/DeleteFolderData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.folder.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DeleteFolderData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("folder_id") val folderId: List<Int>
+    )
+}

+ 31 - 0
src/main/java/com/example/kdan_data_center/datacenter/folder/data/UpdateFolderData.kt

@@ -0,0 +1,31 @@
+package com.example.kdan_data_center.datacenter.folder.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class UpdateFolderData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("user_id") val userId: Int,
+            @SerializedName("folder_name") val folderName: String,
+            @SerializedName("id") val id: Int,
+            @SerializedName("is_deleted") val isDeleted: Boolean,
+            @SerializedName("user_updated_at") val userUpdatedAt: String,
+            @SerializedName("created_at") val createdAt: String,
+            @SerializedName("updated_at") val updatedAt: String,
+            @SerializedName("full_path") val fullPath: String,
+            @SerializedName("active_status") val activeStatus: String,
+            @SerializedName("other_infos") val otherInfos: OtherInfos,
+            @SerializedName("folder_type") val folderType: String,
+            @SerializedName("parent_id") val parentId: Int,
+            @SerializedName("size") val size: Int
+    ) {
+
+        data class OtherInfos(
+                @SerializedName("color") val color: String
+        )
+    }
+}

+ 69 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/ShareLinkService.kt

@@ -0,0 +1,69 @@
+package com.example.kdan_data_center.datacenter.share
+
+import com.example.kdan_data_center.datacenter.share.body.CreateShareLinkBody
+import com.example.kdan_data_center.datacenter.share.body.DeleteShareLinkBody
+import com.example.kdan_data_center.datacenter.share.data.CreateShareLinkData
+import com.example.kdan_data_center.datacenter.share.data.DeleteShareLinkData
+import com.example.kdan_data_center.datacenter.share.data.DownloadLinkData
+import com.example.kdan_data_center.datacenter.share.data.UpdateShareLinkData
+import io.reactivex.Observable
+import retrofit2.http.*
+
+interface ShareLinkService {
+    companion object {
+        const val BASE_URL = "api/v3/share_links/"
+    }
+
+    @GET("list")
+    fun getShareLinkList(
+            @Header("Authorization") accessToken: String,
+            @Query("page") page: Int?
+    )
+
+    @GET(".")
+    fun getShareLinkInfo(
+            @Header("Authorization") accessToken: String,
+            @Query("url_token") urlToken: String
+    )
+
+    @POST(".")
+    fun createShareLink(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body createShareLinkBody: CreateShareLinkBody
+    ): Observable<CreateShareLinkData>
+
+    @PUT(".")
+    @FormUrlEncoded
+    fun updateShareLink(
+            @Header("Authorization") accessToken: String,
+            @Field("url_token") urlToken: String,
+            @Field("status") status: String
+    ): Observable<UpdateShareLinkData>
+
+    @HTTP(method = "DELETE", path = ".", hasBody = true)
+    fun deleteShareLink(
+            @Header("Authorization") accessToken: String,
+            @Header("Content-Type") contentType: String,
+            @Body deleteShareLinkBody: DeleteShareLinkBody
+    ): Observable<DeleteShareLinkData>
+
+    @HTTP(method = "DELETE", path = ".", hasBody = true)
+    @FormUrlEncoded
+    fun deleteShareLink(
+            @Header("Authorization") accessToken: String,
+            @Field("url_token") urlToken: String
+    ): Observable<DeleteShareLinkData>
+
+    @POST("download_folder")
+    @FormUrlEncoded
+    fun getDownloadLink(
+            @Header("Authorization") accessToken: String,
+            @Field("url_token") urlToken: String
+    ): Observable<DownloadLinkData>
+
+    @GET("folder_token")
+    fun getFolderToken(
+            @Query("url_token") urlToken: String
+    )
+}

+ 21 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/body/CreateShareLinkBody.kt

@@ -0,0 +1,21 @@
+package com.example.kdan_data_center.datacenter.share.body
+
+import com.google.gson.annotations.SerializedName
+
+
+data class CreateShareLinkBody(
+        @SerializedName("object_id") val objectId: Int
+
+) {
+    @SerializedName("object_type")
+    var objectType: String? = null
+    @SerializedName("verify_type")
+    var verifyType: String? = null
+    @SerializedName("verify_info")
+    var verifyInfo: VerifyInfo? = null
+
+    data class VerifyInfo(
+            @SerializedName("password") val password: Int?,
+            @SerializedName("expires_at") val expiresAt: String?
+    )
+}

+ 8 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/body/DeleteShareLinkBody.kt

@@ -0,0 +1,8 @@
+package com.example.kdan_data_center.datacenter.share.body
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DeleteShareLinkBody(
+        @SerializedName("url_token") val urlToken: String
+)

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/data/CreateShareLinkData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.share.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class CreateShareLinkData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("url_token") val urlToken: String
+    )
+}

+ 12 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/data/DeleteShareLinkData.kt

@@ -0,0 +1,12 @@
+package com.example.kdan_data_center.datacenter.share.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DeleteShareLinkData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    class Data
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/data/DownloadLinkData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.share.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class DownloadLinkData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("receiver") val receiver: String
+    )
+}

+ 14 - 0
src/main/java/com/example/kdan_data_center/datacenter/share/data/UpdateShareLinkData.kt

@@ -0,0 +1,14 @@
+package com.example.kdan_data_center.datacenter.share.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class UpdateShareLinkData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("status") val status: String
+    )
+}

+ 48 - 0
src/main/java/com/example/kdan_data_center/datacenter/user/UserService.kt

@@ -0,0 +1,48 @@
+package com.example.kdan_data_center.datacenter.user
+
+import com.example.kdan_data_center.datacenter.user.data.SearchUserData
+import com.example.kdan_data_center.datacenter.user.data.UserCredentialData
+import com.example.kdan_data_center.datacenter.user.data.UserInfoData
+import io.reactivex.Observable
+import retrofit2.http.GET
+import retrofit2.http.Header
+import retrofit2.http.Query
+
+interface UserService {
+    companion object {
+        const val BASE_URL = "api/v3/users/"
+    }
+
+    @GET(".")
+    fun getUserInfo(
+            @Header("Authorization") accessToken: String
+    ): Observable<UserInfoData>
+
+    @GET("search")
+    fun searchUser(
+            @Header("Authorization") accessToken: String,
+            @Query("search_string") searchText: String
+    ): Observable<SearchUserData>
+
+    @GET("credential")
+    fun getUserCredential(
+            @Header("Authorization") accessToken: String
+    ): Observable<UserCredentialData>
+
+    @GET("team_list")
+    fun getUserTeamList(
+            @Header("Authorization") accessToken: String
+    )
+
+    @GET("share_folders")
+    fun getUserShareFolders(
+            @Header("Authorization") accessToken: String
+    )
+
+    @GET("recent_logs")
+    fun getUserRecentLogs(
+            @Header("Authorization") accessToken: String
+    )
+
+
+}

+ 9 - 0
src/main/java/com/example/kdan_data_center/datacenter/user/data/SearchUserData.kt

@@ -0,0 +1,9 @@
+package com.example.kdan_data_center.datacenter.user.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class SearchUserData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: List<String>
+)

+ 30 - 0
src/main/java/com/example/kdan_data_center/datacenter/user/data/UserCredentialData.kt

@@ -0,0 +1,30 @@
+package com.example.kdan_data_center.datacenter.user.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class UserCredentialData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("credentials") val credentials: Credentials,
+            @SerializedName("federated_user") val federatedUser: FederatedUser,
+            @SerializedName("packed_policy_size") val packedPolicySize: Int
+    ) {
+
+        data class Credentials(
+                @SerializedName("access_key_id") val accessKeyId: String,
+                @SerializedName("secret_access_key") val secretAccessKey: String,
+                @SerializedName("session_token") val sessionToken: String,
+                @SerializedName("expiration") val expiration: String
+        )
+
+
+        data class FederatedUser(
+                @SerializedName("federated_user_id") val federatedUserId: String,
+                @SerializedName("arn") val arn: String
+        )
+    }
+}

+ 95 - 0
src/main/java/com/example/kdan_data_center/datacenter/user/data/UserInfoData.kt

@@ -0,0 +1,95 @@
+package com.example.kdan_data_center.datacenter.user.data
+
+import com.google.gson.annotations.SerializedName
+
+
+data class UserInfoData(
+        @SerializedName("message") val message: String,
+        @SerializedName("data") val data: Data
+) {
+
+    data class Data(
+            @SerializedName("uid") val uid: Int,
+            @SerializedName("account") val account: String,
+            @SerializedName("folder_name_hash") val folderNameHash: String,
+            @SerializedName("full_storage") val fullStorage: Long,
+            @SerializedName("used_storage") val usedStorage: Int,
+            @SerializedName("active") val active: Boolean,
+            @SerializedName("created_at") val createdAt: String,
+            @SerializedName("updated_at") val updatedAt: String,
+            @SerializedName("projects_count") val projectsCount: ProjectsCount,
+            @SerializedName("content_category_count") val contentCategoryCount: ContentCategoryCount,
+            @SerializedName("bucket_category_count") val bucketCategoryCount: BucketCategoryCount,
+            @SerializedName("storage_expired_at") val storageExpiredAt: String,
+            @SerializedName("email") val email: String,
+            @SerializedName("using_version") val usingVersion: Any,
+            @SerializedName("project_count") val projectCount: Int,
+            @SerializedName("source_location") val sourceLocation: SourceLocation
+    ) {
+
+        data class ContentCategoryCount(
+                @SerializedName("txt") val txt: Int,
+                @SerializedName("other") val other: Int,
+                @SerializedName("pdf") val pdf: Int,
+                @SerializedName("image") val image: Int,
+                @SerializedName("iwork") val iwork: Int,
+                @SerializedName("doc") val doc: Int,
+                @SerializedName("audio") val audio: Int,
+                @SerializedName("video") val video: Int
+        )
+
+
+        data class ProjectsCount(
+                @SerializedName("cloud-demo") val cloudDemo: Int
+        )
+
+
+        data class SourceLocation(
+                @SerializedName("data_source") val dataSource: DataSource
+        ) {
+
+            data class DataSource(
+                    @SerializedName("knote") val knote: Knote,
+                    @SerializedName("pdf_source") val pdfSource: PdfSource,
+                    @SerializedName("fax") val fax: Fax,
+                    @SerializedName("clipboard") val clipboard: Clipboard
+            ) {
+
+                data class PdfSource(
+                        @SerializedName("bucket") val bucket: String,
+                        @SerializedName("root_path") val rootPath: String
+                )
+
+
+                data class Clipboard(
+                        @SerializedName("bucket") val bucket: String,
+                        @SerializedName("root_path") val rootPath: String
+                )
+
+
+                data class Fax(
+                        @SerializedName("bucket") val bucket: String,
+                        @SerializedName("root_path") val rootPath: String
+                )
+
+
+                data class Knote(
+                        @SerializedName("bucket") val bucket: String,
+                        @SerializedName("root_path") val rootPath: String
+                )
+            }
+        }
+
+
+        data class BucketCategoryCount(
+                @SerializedName("cloud-demo,txt") val cloudDemoTxt: Int,
+                @SerializedName("cloud-demo,other") val cloudDemoOther: Int,
+                @SerializedName("cloud-demo,pdf") val cloudDemoPdf: Int,
+                @SerializedName("cloud-demo,image") val cloudDemoImage: Int,
+                @SerializedName("cloud-demo,iwork") val cloudDemoIwork: Int,
+                @SerializedName("cloud-demo,doc") val cloudDemoDoc: Int,
+                @SerializedName("cloud-demo,audio") val cloudDemoAudio: Int,
+                @SerializedName("cloud-demo,video") val cloudDemoVideo: Int
+        )
+    }
+}

+ 3 - 0
src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">kdan_data_center</string>
+</resources>

+ 17 - 0
src/test/java/com/example/kdan_data_center/ExampleUnitTest.java

@@ -0,0 +1,17 @@
+package com.example.kdan_data_center;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}