diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/AssistantIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v1/AssistantV1Tests.kt similarity index 63% rename from library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/AssistantIT.kt rename to library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v1/AssistantV1Tests.kt index 33213bac06..842995adde 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/AssistantIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v1/AssistantV1Tests.kt @@ -2,11 +2,11 @@ * Nextcloud Android Library * * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Tobias Kaminsky + * SPDX-FileCopyrightText: 2024 Alper Ozturk * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.assistant +package com.owncloud.android.lib.resources.assistant.v1 import com.owncloud.android.AbstractIT import com.owncloud.android.lib.resources.status.NextcloudVersion @@ -15,7 +15,7 @@ import junit.framework.TestCase.assertTrue import org.junit.Before import org.junit.Test -class AssistantIT : AbstractIT() { +class AssistantV1Tests : AbstractIT() { @Before fun before() { testOnlyOnServer(NextcloudVersion.nextcloud_28) @@ -23,7 +23,7 @@ class AssistantIT : AbstractIT() { @Test fun testGetTaskTypes() { - val result = GetTaskTypesRemoteOperation().execute(nextcloudClient) + val result = GetTaskTypesRemoteOperationV1().execute(nextcloudClient) assertTrue(result.isSuccess) val taskTypes = result.resultData.types @@ -32,16 +32,16 @@ class AssistantIT : AbstractIT() { @Test fun testGetTaskList() { - var result = GetTaskListRemoteOperation("assistant").execute(nextcloudClient) + var result = GetTaskListRemoteOperationV1("assistant").execute(nextcloudClient) assertTrue(result.isSuccess) assertTrue(result.resultData.tasks.isEmpty()) // create one task val input = "Give me some random output for test purpose" val type = "OCP\\TextProcessing\\FreePromptTaskType" - assertTrue(CreateTaskRemoteOperation(input, type).execute(nextcloudClient).isSuccess) + assertTrue(CreateTaskRemoteOperationV1(input, type).execute(nextcloudClient).isSuccess) - result = GetTaskListRemoteOperation("assistant").execute(nextcloudClient) + result = GetTaskListRemoteOperationV1("assistant").execute(nextcloudClient) assertTrue(result.isSuccess) val taskList = result.resultData.tasks @@ -53,18 +53,18 @@ class AssistantIT : AbstractIT() { // create one task val input = "Give me some random output for test purpose" val type = "OCP\\TextProcessing\\FreePromptTaskType" - assertTrue(CreateTaskRemoteOperation(input, type).execute(nextcloudClient).isSuccess) + assertTrue(CreateTaskRemoteOperationV1(input, type).execute(nextcloudClient).isSuccess) - var result = GetTaskListRemoteOperation("assistant").execute(nextcloudClient) + var result = GetTaskListRemoteOperationV1("assistant").execute(nextcloudClient) assertTrue(result.isSuccess) val tasks = result.resultData.tasks val countBefore = tasks.size // delete - assertTrue(DeleteTaskRemoteOperation(tasks.first().id).execute(nextcloudClient).isSuccess) + assertTrue(DeleteTaskRemoteOperationV1(tasks.first().id).execute(nextcloudClient).isSuccess) - result = GetTaskListRemoteOperation("assistant").execute(nextcloudClient) + result = GetTaskListRemoteOperationV1("assistant").execute(nextcloudClient) assertTrue(result.isSuccess) assertEquals(countBefore - 1, result.resultData.tasks.size) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v2/AssistantV2Tests.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v2/AssistantV2Tests.kt new file mode 100644 index 0000000000..c15c378661 --- /dev/null +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/assistant/v2/AssistantV2Tests.kt @@ -0,0 +1,100 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2 + +import com.owncloud.android.AbstractIT +import com.owncloud.android.lib.resources.assistant.v2.model.TaskInputShape +import com.owncloud.android.lib.resources.assistant.v2.model.TaskOutputShape +import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypeData +import com.owncloud.android.lib.resources.status.NextcloudVersion +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertTrue +import org.junit.Before +import org.junit.Test + +class AssistantV2Tests : AbstractIT() { + @Before + fun before() { + testOnlyOnServer(NextcloudVersion.nextcloud_30) + } + + private fun getTaskType(): TaskTypeData { + return TaskTypeData( + "core:text2text", + "Free text to text prompt", + "Runs an arbitrary prompt through a language model that returns a reply", + listOf( + TaskInputShape( + "Prompt", + "Describe a task that you want the assistant to do or ask a question", + "Text" + ) + ), + listOf( + TaskOutputShape( + "Generated reply", + "The generated text from the assistant", + "Text" + ) + ) + ) + } + + private fun getSelectedTaskType(): String = "core:text2text" + + @Test + fun testGetTaskTypes() { + val result = GetTaskTypesRemoteOperationV2().execute(nextcloudClient) + assertTrue(result.isSuccess) + } + + @Test + fun testGetTaskList() { + val taskType = getTaskType() + val selectedTaskType = getSelectedTaskType() + + var result = GetTaskListRemoteOperationV2(selectedTaskType).execute(nextcloudClient) + assertTrue(result.isSuccess) + assertTrue(result.resultData.tasks.isEmpty()) + + // create one task + val input = "Give me some random output for test purpose" + assertTrue(CreateTaskRemoteOperationV2(input, taskType).execute(nextcloudClient).isSuccess) + + result = GetTaskListRemoteOperationV2(selectedTaskType).execute(nextcloudClient) + assertTrue(result.isSuccess) + + val taskList = result.resultData.tasks + assertTrue(taskList.isNotEmpty()) + } + + @Test + fun testDeleteTask() { + // create one task + val input = "Give me some random output for test purpose" + val taskType = getTaskType() + val selectedTaskType = getSelectedTaskType() + + assertTrue(CreateTaskRemoteOperationV2(input, taskType).execute(nextcloudClient).isSuccess) + + var result = GetTaskListRemoteOperationV2(selectedTaskType).execute(nextcloudClient) + assertTrue(result.isSuccess) + + val tasks = result.resultData.tasks + val countBefore = tasks.size + + // delete + assertTrue(DeleteTaskRemoteOperationV2(tasks.first().id).execute(nextcloudClient).isSuccess) + + result = GetTaskListRemoteOperationV2(selectedTaskType).execute(nextcloudClient) + assertTrue(result.isSuccess) + + assertEquals(countBefore - 1, result.resultData.tasks.size) + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskList.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskList.kt deleted file mode 100644 index aeefd07d43..0000000000 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskList.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Nextcloud Android Library - * - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-License-Identifier: MIT - */ - -package com.owncloud.android.lib.resources.assistant.model - -data class TaskList( - var tasks: List -) - -data class Task( - val id: Long, - val type: String?, - val status: Long?, - val userId: String?, - val appId: String?, - val input: String?, - val output: String?, - val identifier: String?, - val completionExpectedAt: String? = null -) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskTypes.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskTypes.kt deleted file mode 100644 index 5a4174b9fc..0000000000 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/model/TaskTypes.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Nextcloud Android Library - * - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-License-Identifier: MIT - */ - -package com.owncloud.android.lib.resources.assistant.model - -data class TaskTypes( - var types: List -) - -data class TaskType( - val id: String?, - val name: String?, - val description: String? -) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/CreateTaskRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/CreateTaskRemoteOperationV1.kt similarity index 91% rename from library/src/main/java/com/owncloud/android/lib/resources/assistant/CreateTaskRemoteOperation.kt rename to library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/CreateTaskRemoteOperationV1.kt index e82193aa57..cc4487c327 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/CreateTaskRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/CreateTaskRemoteOperationV1.kt @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.assistant +package com.owncloud.android.lib.resources.assistant.v1 import com.nextcloud.common.NextcloudClient import com.nextcloud.operations.PostMethod @@ -16,7 +16,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.toRequestBody import org.apache.commons.httpclient.HttpStatus -class CreateTaskRemoteOperation(private val input: String, private val type: String) : +class CreateTaskRemoteOperationV1(private val input: String, private val type: String) : RemoteOperation() { override fun run(client: NextcloudClient): RemoteOperationResult { val requestBody = diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/DeleteTaskRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt similarity index 91% rename from library/src/main/java/com/owncloud/android/lib/resources/assistant/DeleteTaskRemoteOperation.kt rename to library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt index cdadde92f0..2f5ad083a0 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/DeleteTaskRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.assistant +package com.owncloud.android.lib.resources.assistant.v1 import com.nextcloud.common.NextcloudClient import com.nextcloud.operations.DeleteMethod @@ -17,7 +17,7 @@ import com.owncloud.android.lib.resources.users.DeletePrivateKeyRemoteOperation import java.io.IOException import java.net.HttpURLConnection -class DeleteTaskRemoteOperation(private val appId: Long) : RemoteOperation() { +class DeleteTaskRemoteOperationV1(private val appId: Long) : RemoteOperation() { override fun run(client: NextcloudClient): RemoteOperationResult { var postMethod: DeleteMethod? = null var result: RemoteOperationResult diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskListRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskListRemoteOperationV1.kt similarity index 86% rename from library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskListRemoteOperation.kt rename to library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskListRemoteOperationV1.kt index 9f7501fbbc..384c95e9ba 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskListRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskListRemoteOperationV1.kt @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.assistant +package com.owncloud.android.lib.resources.assistant.v1 import com.google.gson.reflect.TypeToken import com.nextcloud.common.NextcloudClient @@ -15,10 +15,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.ocs.ServerResponse import com.owncloud.android.lib.resources.OCSRemoteOperation -import com.owncloud.android.lib.resources.assistant.model.TaskList +import com.owncloud.android.lib.resources.assistant.v1.model.TaskList import org.apache.commons.httpclient.HttpStatus -class GetTaskListRemoteOperation(private val appId: String) : OCSRemoteOperation() { +class GetTaskListRemoteOperationV1(private val appId: String) : OCSRemoteOperation() { @Suppress("TooGenericExceptionCaught") override fun run(client: NextcloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -52,7 +52,7 @@ class GetTaskListRemoteOperation(private val appId: String) : OCSRemoteOperation } companion object { - private val TAG = GetTaskTypesRemoteOperation::class.java.simpleName + private val TAG = GetTaskListRemoteOperationV1::class.java.simpleName private const val DIRECT_ENDPOINT = "/ocs/v2.php/textprocessing/tasks/app/" } } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskTypesRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskTypesRemoteOperationV1.kt similarity index 87% rename from library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskTypesRemoteOperation.kt rename to library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskTypesRemoteOperationV1.kt index aad05a3bc3..7047022e22 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/GetTaskTypesRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/GetTaskTypesRemoteOperationV1.kt @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.assistant +package com.owncloud.android.lib.resources.assistant.v1 import com.google.gson.reflect.TypeToken import com.nextcloud.common.NextcloudClient @@ -15,10 +15,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.ocs.ServerResponse import com.owncloud.android.lib.resources.OCSRemoteOperation -import com.owncloud.android.lib.resources.assistant.model.TaskTypes +import com.owncloud.android.lib.resources.assistant.v1.model.TaskTypes import org.apache.commons.httpclient.HttpStatus -class GetTaskTypesRemoteOperation : OCSRemoteOperation() { +class GetTaskTypesRemoteOperationV1 : OCSRemoteOperation() { @Suppress("TooGenericExceptionCaught") override fun run(client: NextcloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -52,7 +52,7 @@ class GetTaskTypesRemoteOperation : OCSRemoteOperation() { } companion object { - private val TAG = GetTaskTypesRemoteOperation::class.java.simpleName + private val TAG = GetTaskTypesRemoteOperationV1::class.java.simpleName private const val DIRECT_ENDPOINT = "/ocs/v2.php/textprocessing/tasktypes" } } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskList.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskList.kt new file mode 100644 index 0000000000..4a4ee48a5e --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskList.kt @@ -0,0 +1,53 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v1.model + +data class TaskList( + var tasks: List +) + +data class Task( + val id: Long, + val type: String?, + val status: Long?, + val userId: String?, + val appId: String?, + val input: String?, + val output: String?, + val identifier: String?, + val completionExpectedAt: String? = null +) + +fun TaskList.toV2(): com.owncloud.android.lib.resources.assistant.v2.model.TaskList { + return com.owncloud.android.lib.resources.assistant.v2.model.TaskList( + tasks = + tasks.map { task -> + com.owncloud.android.lib.resources.assistant.v2.model.Task( + id = task.id, + type = task.type, + status = task.status?.toString(), + userId = task.userId, + appId = task.appId, + input = + task.input?.let { + com.owncloud.android.lib.resources.assistant.v2.model.TaskInput(input = it) + }, + output = + task.output?.let { + com.owncloud.android.lib.resources.assistant.v2.model.TaskOutput(output = it) + }, + completionExpectedAt = task.completionExpectedAt?.toIntOrNull(), + progress = null, + lastUpdated = null, + scheduledAt = null, + endedAt = null + ) + } + ) +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskTypes.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskTypes.kt new file mode 100644 index 0000000000..0f65ca7c17 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/model/TaskTypes.kt @@ -0,0 +1,33 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v1.model + +import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypeData + +data class TaskTypes( + var types: List +) + +data class TaskType( + val id: String?, + val name: String?, + val description: String? +) + +fun TaskTypes.toV2(): List { + return types.map { taskType -> + TaskTypeData( + id = taskType.id, + name = taskType.name, + description = taskType.description, + inputShape = null, + outputShape = null + ) + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/CreateTaskRemoteOperationV2.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/CreateTaskRemoteOperationV2.kt new file mode 100644 index 0000000000..49670f4a15 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/CreateTaskRemoteOperationV2.kt @@ -0,0 +1,51 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2 + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.PostMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypeData +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.toRequestBody +import org.apache.commons.httpclient.HttpStatus + +class CreateTaskRemoteOperationV2(private val input: String, private val taskType: TaskTypeData) : + RemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + val inputField = hashMapOf("input" to input) + + val requestBody = + hashMapOf( + "input" to inputField, + "type" to taskType.id, + "appId" to "assistant", + "customId" to "" + ) + + val json = gson.toJson(requestBody) + + val request = json.toRequestBody("application/json".toMediaTypeOrNull()) + + val postMethod = PostMethod(client.baseUri.toString() + TAG_URL, true, request) + + val status = postMethod.execute(client) + + return if (status == HttpStatus.SC_OK) { + RemoteOperationResult(true, postMethod) + } else { + RemoteOperationResult(false, postMethod) + } + } + + companion object { + const val TAG_URL = "/ocs/v2.php/taskprocessing/schedule" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/DeleteTaskRemoteOperationV2.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/DeleteTaskRemoteOperationV2.kt new file mode 100644 index 0000000000..302f9349af --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/DeleteTaskRemoteOperationV2.kt @@ -0,0 +1,45 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2 + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import java.io.IOException +import java.net.HttpURLConnection + +class DeleteTaskRemoteOperationV2(private val appId: Long) : RemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + var postMethod: DeleteMethod? = null + var result: RemoteOperationResult + try { + postMethod = + DeleteMethod( + client.baseUri.toString() + DIRECT_ENDPOINT + appId, + true + ) + val status = client.execute(postMethod) + result = RemoteOperationResult(status == HttpURLConnection.HTTP_OK, postMethod) + } catch (e: IOException) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Deletion of task failed: " + result.logMessage, result.exception) + } finally { + postMethod?.releaseConnection() + } + + return result + } + + companion object { + private val TAG = DeleteTaskRemoteOperationV2::class.java.simpleName + private const val DIRECT_ENDPOINT = "/ocs/v2.php/taskprocessing/task/" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskListRemoteOperationV2.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskListRemoteOperationV2.kt new file mode 100644 index 0000000000..19dc6c83c9 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskListRemoteOperationV2.kt @@ -0,0 +1,58 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2 + +import com.google.gson.reflect.TypeToken +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.ocs.ServerResponse +import com.owncloud.android.lib.resources.OCSRemoteOperation +import com.owncloud.android.lib.resources.assistant.v2.model.TaskList +import org.apache.commons.httpclient.HttpStatus + +class GetTaskListRemoteOperationV2(private val taskType: String) : OCSRemoteOperation() { + @Suppress("TooGenericExceptionCaught") + override fun run(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult + var getMethod: GetMethod? = null + try { + getMethod = + GetMethod(client.baseUri.toString() + DIRECT_ENDPOINT + taskType + "&format=json", true) + val status = client.execute(getMethod) + if (status == HttpStatus.SC_OK) { + val taskTypes: TaskList? = + getServerResponse( + getMethod, + object : TypeToken>() {} + )?.ocs?.data + result = RemoteOperationResult(true, getMethod) + result.setResultData(taskTypes) + } else { + result = RemoteOperationResult(false, getMethod) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e( + TAG, + "Get task list for user " + " failed: " + result.logMessage, + result.exception + ) + } finally { + getMethod?.releaseConnection() + } + return result + } + + companion object { + private val TAG = GetTaskTypesRemoteOperationV2::class.java.simpleName + private const val DIRECT_ENDPOINT = "/ocs/v2.php/taskprocessing/tasks?taskType=" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskTypesRemoteOperationV2.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskTypesRemoteOperationV2.kt new file mode 100644 index 0000000000..b2f3822d0b --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/GetTaskTypesRemoteOperationV2.kt @@ -0,0 +1,77 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2 + +import com.google.gson.reflect.TypeToken +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.ocs.ServerResponse +import com.owncloud.android.lib.resources.OCSRemoteOperation +import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypeData +import com.owncloud.android.lib.resources.assistant.v2.model.TaskTypes +import org.apache.commons.httpclient.HttpStatus + +class GetTaskTypesRemoteOperationV2 : OCSRemoteOperation>() { + private val supportedTaskType = "Text" + + @Suppress("TooGenericExceptionCaught") + override fun run(client: NextcloudClient): RemoteOperationResult> { + var result: RemoteOperationResult> + var getMethod: GetMethod? = null + + try { + getMethod = + GetMethod(client.baseUri.toString() + DIRECT_ENDPOINT + JSON_FORMAT, true) + val status = client.execute(getMethod) + if (status == HttpStatus.SC_OK) { + val response = + getServerResponse( + getMethod, + object : TypeToken>() {} + )?.ocs?.data?.types + + val taskTypeList = + response?.map { (key, value) -> + value.copy(id = value.id ?: key) + } + + val supportedTaskTypeList = + taskTypeList?.filter { taskType -> + taskType.inputShape?.any { inputShape -> + inputShape.type == supportedTaskType + } == true && taskType.outputShape?.any { outputShape -> + outputShape.type == supportedTaskType + } == true + } + + result = RemoteOperationResult(true, getMethod) + result.setResultData(supportedTaskTypeList) + } else { + result = RemoteOperationResult(false, getMethod) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e( + TAG, + "Get task types for user " + " failed: " + result.logMessage, + result.exception + ) + } finally { + getMethod?.releaseConnection() + } + return result + } + + companion object { + private val TAG = GetTaskTypesRemoteOperationV2::class.java.simpleName + private const val DIRECT_ENDPOINT = "/ocs/v2.php/taskprocessing/tasktypes" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskList.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskList.kt new file mode 100644 index 0000000000..a33dae69c1 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskList.kt @@ -0,0 +1,36 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2.model + +data class TaskList( + var tasks: List +) + +data class Task( + val id: Long, + val type: String?, + val status: String?, + val userId: String?, + val appId: String?, + val input: TaskInput?, + val output: TaskOutput?, + val completionExpectedAt: Int? = null, + var progress: Int? = null, + val lastUpdated: Int? = null, + val scheduledAt: Int? = null, + val endedAt: Int? = null +) + +data class TaskInput( + var input: String? = null +) + +data class TaskOutput( + var output: String? = null +) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskTypes.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskTypes.kt new file mode 100644 index 0000000000..616c6e9199 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v2/model/TaskTypes.kt @@ -0,0 +1,31 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.assistant.v2.model + +data class TaskTypes(val types: Map) + +data class TaskTypeData( + val id: String?, + val name: String?, + val description: String?, + val inputShape: List?, + val outputShape: List? +) + +data class TaskInputShape( + val name: String?, + val description: String?, + val type: String? +) + +data class TaskOutputShape( + val name: String?, + val description: String?, + val type: String? +)