diff --git a/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskClient.kt b/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskClient.kt index 2ca14f3..b6696d7 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskClient.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskClient.kt @@ -3,8 +3,8 @@ package com.faraphel.tasks_valider.connectivity.task import okhttp3.HttpUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.logging.HttpLoggingInterceptor /** @@ -19,19 +19,21 @@ class TaskClient( private val baseCookies: List = listOf() ) { private val baseUrl = "http://$address:$port" - private val client = OkHttpClient().newBuilder().cookieJar( - // TODO(Faraphel): should be moved into another object - object : okhttp3.CookieJar { - private val cookies = baseCookies.toMutableList() ///< list of cookies + private val client = OkHttpClient().newBuilder() + .cookieJar( + // TODO(Faraphel): should be moved into another object + object : okhttp3.CookieJar { + private val cookies = baseCookies.toMutableList() ///< list of cookies - override fun loadForRequest(url: HttpUrl): List { - return this.cookies + override fun loadForRequest(url: HttpUrl): List { + return this.cookies + } + override fun saveFromResponse(url: HttpUrl, cookies: List) { + this.cookies.addAll(cookies) + } } - override fun saveFromResponse(url: HttpUrl, cookies: List) { - this.cookies.addAll(cookies) - } - } - ).build() + ) + .build() // TODO(Faraphel): automatically convert content to the correct type ? @@ -83,7 +85,7 @@ class TaskClient( this.client.newCall( this.baseRequestBuilder(endpoint) .patch(content.toRequestBody(type.toMediaType())) - .build() + .build() ).execute() /** @@ -96,6 +98,6 @@ class TaskClient( this.client.newCall( this.baseRequestBuilder(endpoint) .delete(content.toRequestBody(type.toMediaType())) - .build() + .build() ).execute() } \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ClassApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ClassApi.kt index bbfe608..386b757 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ClassApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ClassApi.kt @@ -4,6 +4,11 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.ClassEntity import com.faraphel.tasks_valider.database.entities.SessionEntity +import com.google.gson.reflect.TypeToken class ClassApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/PersonApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/PersonApi.kt index eb8a8b8..a7c9410 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/PersonApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/PersonApi.kt @@ -4,6 +4,11 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.PersonEntity import com.faraphel.tasks_valider.database.entities.SessionEntity +import com.google.gson.reflect.TypeToken class PersonApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationClassPersonApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationClassPersonApi.kt index e2395e9..308e7e5 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationClassPersonApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationClassPersonApi.kt @@ -4,7 +4,12 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.RelationClassPersonEntity import com.faraphel.tasks_valider.database.entities.SessionEntity +import com.google.gson.reflect.TypeToken class RelationClassPersonApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationPersonSessionSubjectApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationPersonSessionSubjectApi.kt index 5b2983b..d5bcb99 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationPersonSessionSubjectApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/RelationPersonSessionSubjectApi.kt @@ -4,7 +4,12 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.RelationPersonSessionSubjectEntity import com.faraphel.tasks_valider.database.entities.SessionEntity +import com.google.gson.reflect.TypeToken class RelationPersonSessionSubjectApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SessionApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SessionApi.kt index cfad134..eafbc25 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SessionApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SessionApi.kt @@ -3,6 +3,11 @@ package com.faraphel.tasks_valider.database.api.entities import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.SessionEntity +import com.google.gson.reflect.TypeToken class SessionApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SubjectApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SubjectApi.kt index 383e3ed..fbbed53 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SubjectApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/SubjectApi.kt @@ -4,7 +4,12 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.SessionEntity import com.faraphel.tasks_valider.database.entities.SubjectEntity +import com.google.gson.reflect.TypeToken class SubjectApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/TaskApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/TaskApi.kt index f56a317..6f5351e 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/TaskApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/TaskApi.kt @@ -4,7 +4,12 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.SessionEntity import com.faraphel.tasks_valider.database.entities.TaskEntity +import com.google.gson.reflect.TypeToken class TaskApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ValidationApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ValidationApi.kt index 4326afc..46132b6 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ValidationApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/ValidationApi.kt @@ -4,7 +4,12 @@ import com.faraphel.tasks_valider.database.api.entities.base.BaseTaskApi import com.faraphel.tasks_valider.database.dao.base.BaseTaskDao import com.faraphel.tasks_valider.database.entities.SessionEntity import com.faraphel.tasks_valider.database.entities.ValidationEntity +import com.google.gson.reflect.TypeToken class ValidationApi(dao: BaseTaskDao, session: SessionEntity) : - BaseTaskApi(dao, session) + BaseTaskApi( + dao, + object: TypeToken() {}, + session + ) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseJsonApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseJsonApi.kt index 70bfa15..71441f7 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseJsonApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseJsonApi.kt @@ -1,5 +1,6 @@ package com.faraphel.tasks_valider.database.api.entities.base +import android.util.Log import com.faraphel.tasks_valider.database.dao.base.BaseCronDao import com.faraphel.tasks_valider.database.entities.base.BaseEntity import com.google.gson.Gson @@ -11,13 +12,14 @@ import fi.iki.elonen.NanoHTTPD * This is preconfigured to handle JSON data. * @param Entity the entity type to handle */ -abstract class BaseJsonApi(private val dao: BaseCronDao) : BaseApi { +abstract class BaseJsonApi( + private val dao: BaseCronDao, + private val entityTypeToken: TypeToken, +) : BaseApi { companion object { private val parser = Gson() ///< The JSON parser } - private val entityTypeToken: TypeToken = object: TypeToken() {} ///< the type of the managed entity - // Requests override fun head(httpSession: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { @@ -43,10 +45,16 @@ abstract class BaseJsonApi(private val dao: BaseCronDao( - httpSession.inputStream.bufferedReader().readText(), + data, this.entityTypeToken.type ) + + Log.i("post data", "data parsed : $obj") + val id = this.dao.insert(obj) return NanoHTTPD.newFixedLengthResponse( diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseTaskApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseTaskApi.kt index 5e29abb..b22ca9f 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseTaskApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/entities/base/BaseTaskApi.kt @@ -14,14 +14,16 @@ import fi.iki.elonen.NanoHTTPD */ abstract class BaseTaskApi( private val dao: BaseTaskDao, + private val entityTypeToken: TypeToken, private val session: SessionEntity, -) : BaseJsonApi(dao) { +) : BaseJsonApi( + dao, + entityTypeToken, +) { companion object { private val parser = Gson() ///< The JSON parser } - private val entityTypeToken: TypeToken = object: TypeToken() {} ///< the type of the managed entity - // Requests override fun head(httpSession: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/client.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/client.kt index 5c0e98f..b89ae26 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/client.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/client.kt @@ -1,6 +1,8 @@ package com.faraphel.tasks_valider.ui.screen.communication.internet import android.app.Activity +import android.os.Build +import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.Column import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button @@ -19,12 +21,14 @@ import com.faraphel.tasks_valider.ui.screen.communication.RANGE_SERVER_PORT import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen +@RequiresApi(Build.VERSION_CODES.O) @Composable fun CommunicationInternetClientScreen(activity: Activity) { val client = remember { mutableStateOf(null) } - if (client.value == null) CommunicationInternetClientContent(client) - else TaskSessionScreen(activity, client.value!!) + // TODO(Faraphel): fix and get a user + // if (client.value == null) CommunicationInternetClientContent(client) + // else TaskSessionScreen(activity, client.value!!, user) } diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/server.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/server.kt index fdf598e..626fae9 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/server.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/internet/server.kt @@ -28,6 +28,7 @@ import com.faraphel.tasks_valider.ui.screen.authentification.AuthentificationSer import com.faraphel.tasks_valider.ui.screen.communication.DEFAULT_SERVER_PORT import com.faraphel.tasks_valider.ui.screen.communication.RANGE_SERVER_PORT import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen +import kotlinx.coroutines.flow.MutableStateFlow import java.time.Instant @@ -42,26 +43,32 @@ fun CommunicationInternetServerScreen( ) { val controller = rememberNavController() + val adminPersonEntityRaw = remember { mutableStateOf(null) } val adminPersonEntity = remember { mutableStateOf(null) } val client = remember { mutableStateOf(null) } NavHost(navController = controller, startDestination = "authentication") { composable("authentication") { // if the admin person is not created, prompt the user for the admin information - if (adminPersonEntity.value == null) AuthentificationServerScreen(adminPersonEntity) + if (adminPersonEntityRaw.value == null) AuthentificationServerScreen(adminPersonEntityRaw) else controller.navigate("configuration") } composable("configuration") { if (client.value == null) CommunicationInternetServerContent( database, - adminPersonEntity.value!!, - client + adminPersonEntityRaw, + adminPersonEntity, + client, ) else controller.navigate("session") } composable("session") { - TaskSessionScreen(activity, client.value!!) + TaskSessionScreen( + activity, + client.value!!, + adminPersonEntity.value!! + ) } } } @@ -71,7 +78,8 @@ fun CommunicationInternetServerScreen( @Composable fun CommunicationInternetServerContent( database: TaskDatabase, - adminPersonEntity: PersonEntity, + adminPersonEntityRaw: MutableState, + adminPersonEntity: MutableState, client: MutableState ) { val classes = remember { mutableStateOf?>(null) } @@ -129,16 +137,17 @@ fun CommunicationInternetServerContent( Button(onClick = { Thread { // a thread is used for networking - // Insert the admin in the database - database.personDao().insert(adminPersonEntity) + // Insert the admin in the database and get its id + val (adminPersonEntityId) = database.personDao().insert(adminPersonEntityRaw.value!!) + adminPersonEntity.value = database.personDao().getById(adminPersonEntityId)!! // Create a new session // TODO(Faraphel): name val (sessionId) = database.sessionDao().insert( SessionEntity( - name="NOM", - start=Instant.now(), - classId=selectedClass.value!!.id, + name="NOM", + start=Instant.now(), + classId=selectedClass.value!!.id, ) ) val session = database.sessionDao().getById(sessionId)!! @@ -157,7 +166,7 @@ fun CommunicationInternetServerContent( serverPort.intValue, database, session, - adminPersonEntity, + adminPersonEntity.value!!, ) server.start() diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/wifiP2p/server/screen.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/wifiP2p/server/screen.kt index 1415230..11fb145 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/wifiP2p/server/screen.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/communication/wifiP2p/server/screen.kt @@ -30,10 +30,11 @@ import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen fun CommunicationWifiP2pServerScreen(activity: Activity, bwfManager: BwfManager) { val client = remember { mutableStateOf(null) } + // TODO(Faraphel): fix and get a user // if the server is not created, prompt the user for the server configuration - if (client.value == null) CommunicationWifiP2pServerContent(activity, bwfManager, client) + // if (client.value == null) CommunicationWifiP2pServerContent(activity, bwfManager, client) // else, go to the base tasks screen - else TaskSessionScreen(activity, client.value!!) + // else TaskSessionScreen(activity, client.value!!) } diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/session.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/session.kt index 2d1335a..d9dea02 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/session.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/session.kt @@ -1,7 +1,9 @@ package com.faraphel.tasks_valider.ui.screen.task import android.app.Activity +import android.os.Build import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.Column import androidx.compose.material3.Button import androidx.compose.material3.Text @@ -20,8 +22,13 @@ import com.google.gson.reflect.TypeToken * @param activity the android activity * @param client an HTTP client that can communicate with the server */ +@RequiresApi(Build.VERSION_CODES.O) @Composable -fun TaskSessionScreen(activity: Activity, client: TaskClient) { +fun TaskSessionScreen( + activity: Activity, + client: TaskClient, + user: PersonEntity, +) { val students = remember { mutableStateOf?>(null) } val selectedStudent = remember { mutableStateOf(null) } @@ -30,7 +37,12 @@ fun TaskSessionScreen(activity: Activity, client: TaskClient) { return Thread { refreshStudents(activity, client, students) }.start() if (selectedStudent.value != null) - return TaskStudentScreen(activity, client, selectedStudent.value!!) + return TaskStudentScreen( + activity, + client, + user, + selectedStudent.value!! + ) Column { // if the groups have already been defined, display them @@ -44,7 +56,11 @@ fun TaskSessionScreen(activity: Activity, client: TaskClient) { // TODO(Faraphel): template this function ? -fun refreshStudents(activity: Activity, client: TaskClient, students: MutableState?>) { +fun refreshStudents( + activity: Activity, + client: TaskClient, + students: MutableState?> +) { // TODO(Faraphel): global variable ? val jsonParser = Gson() diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/student.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/student.kt index 20acbb8..e5c0005 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/student.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/screen/task/student.kt @@ -1,49 +1,103 @@ package com.faraphel.tasks_valider.ui.screen.task import android.app.Activity +import android.os.Build +import android.util.Log import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import com.faraphel.tasks_valider.connectivity.task.TaskClient +import com.faraphel.tasks_valider.connectivity.task.session.TaskPermission import com.faraphel.tasks_valider.database.entities.* import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import java.time.Instant /** * This screen represent a student * @param student the student object */ +@RequiresApi(Build.VERSION_CODES.O) @Composable -fun TaskStudentScreen(activity: Activity, client: TaskClient, student: PersonEntity) { +fun TaskStudentScreen( + activity: Activity, + client: TaskClient, + user: PersonEntity, + student: PersonEntity, +) { val tasks = remember { mutableStateOf?>(null) } + val validations = remember { mutableStateOf?>(null) } - if (tasks.value == null) - Thread { refreshTasks(activity, client, student, tasks) }.start() + if (tasks.value == null || validations.value == null) + Thread { + refreshTasksValidations( + activity, + client, + student, + tasks, + validations + ) + }.start() Column { Text(text = student.fullName()) - tasks.value?.forEach { task -> - Button(onClick = {}) { - Column { - Text(task.title) - task.description?.let { description -> Text(description) } + // if both the list of tasks and validations are loaded + if (!(tasks.value == null || validations.value == null)) { + tasks.value?.forEach { task -> + // get the validation + val validation = validations.value!!.firstOrNull { validation -> validation.taskId == task.id } + + Button(onClick = {}) { + Row { + Column { + // task title + Text(task.title) + // task description + task.description?.let { description -> Text(description) } + // if the task have been validated, show the date + if (validation != null) Text(validation.date.toString()) + } + // the validation state + Checkbox( + checked = validation != null, + enabled = user.role.permissions.contains(TaskPermission.WRITE), + onCheckedChange = { state -> + Thread { + updateValidation( + client, + state, + validation ?: ValidationEntity( + Instant.now(), + user.id, + student.id, + task.id, + ) + ) + }.start() + } + ) + } } } } } } -fun refreshTasks( +fun refreshTasksValidations( activity: Activity, client: TaskClient, student: PersonEntity, - tasks: MutableState?> + tasks: MutableState?>, + validations: MutableState?>, ) { val jsonParser = Gson() @@ -86,4 +140,45 @@ fun refreshTasks( }.sortedBy { task -> task.order } + + // try to obtain the list of validations + val responseValidations = client.get("entities/" + ValidationEntity.TABLE_NAME) + + // in case of error, notify it + if (!responseValidations.isSuccessful) + return activity.runOnUiThread { Toast.makeText(activity, responseTasks.message, Toast.LENGTH_LONG).show() } + + // parse the list of validations + val allValidations = jsonParser.fromJson>( + responseValidations.body.string(), + object : TypeToken>(){}.type + ) + + // filter only the interesting validations + validations.value = allValidations.filter { validation -> + validation.studentId == student.id && + validation.taskId in allTasks.map { task -> task.id } + } } + + +fun updateValidation(client: TaskClient, checked: Boolean, validation: ValidationEntity) { + val jsonParser = Gson() + + if (checked) { + // if the validation is not set, create it + client.post( + "entities/" + ValidationEntity.TABLE_NAME, + jsonParser.toJson(validation), + "application/json" + ) + } + else { + // if the validation is set, delete it + client.delete( + "entities/" + ValidationEntity.TABLE_NAME, + jsonParser.toJson(validation), + "application/json" + ) + } +} \ No newline at end of file