From b97fb71f8f907e367d7d8e9dc1b401737f4fb618 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Wed, 8 May 2024 21:32:10 +0200 Subject: [PATCH] [WIP] simplified and fixed the Api system in the database --- .idea/deploymentTargetDropDown.xml | 12 +++++ .idea/misc.xml | 3 +- .../connectivity/task/TaskServer.kt | 27 ++++++----- .../tasks_valider/database/TaskDatabase.kt | 24 +++++++++- .../tasks_valider/database/api/GroupApi.kt | 7 +-- .../database/api/GroupStudentApi.kt | 7 +-- .../tasks_valider/database/api/StudentApi.kt | 7 +-- .../tasks_valider/database/api/TaskApi.kt | 7 +-- .../database/api/TaskGroupApi.kt | 7 +-- .../tasks_valider/database/api/TeacherApi.kt | 7 +-- .../database/api/base/BaseApi.kt | 9 ++-- .../database/api/base/BaseJsonApi.kt | 45 ++++++++----------- 12 files changed, 87 insertions(+), 75 deletions(-) diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index ad3ac93..45cc42a 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -4,6 +4,18 @@ + + + + + + + + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index cf5d4ff..daa0c6c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,9 +1,10 @@ + - + diff --git a/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskServer.kt b/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskServer.kt index 391e8e0..0337103 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskServer.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/connectivity/task/TaskServer.kt @@ -1,6 +1,7 @@ package com.faraphel.tasks_valider.connectivity.task import com.faraphel.tasks_valider.database.TaskDatabase +import com.faraphel.tasks_valider.database.api.base.BaseApi import com.google.gson.Gson import fi.iki.elonen.NanoHTTPD @@ -21,28 +22,30 @@ class TaskServer( val uri: String = session.uri // remove the first slash - val daoName: String = uri.substring(1) - // get the matching DAO in the database - - TODO("Faraphel: get the correct DAO from the database") - TODO("Faraphel: pass more direct arguments to the API handler ?") + val entityName: String = uri.substring(1) + // get the matching entity API in the database + val entityApi = database.getApiFromName(entityName) + ?: return newFixedLengthResponse( + Response.Status.NOT_FOUND, + "text/plain", + "Invalid entity name" + ) // handle the request - when (method) { + return when (method) { // check if the data is in the database - Method.HEAD -> { TODO() } + Method.HEAD -> entityApi.head(session) // get the data from the dao - Method.GET -> { TODO() } + Method.GET -> entityApi.get(session) // insert the data into the database - Method.POST -> { TODO() } + Method.POST -> entityApi.post(session) // other methods are not allowed - else -> { - return newFixedLengthResponse( + else -> + newFixedLengthResponse( Response.Status.METHOD_NOT_ALLOWED, "text/plain", "Method not allowed" ) - } // TODO(Faraphel): implement a permission system } } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/TaskDatabase.kt b/app/src/main/java/com/faraphel/tasks_valider/database/TaskDatabase.kt index 2fa80a1..9b84639 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/TaskDatabase.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/TaskDatabase.kt @@ -3,6 +3,8 @@ package com.faraphel.tasks_valider.database import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters +import com.faraphel.tasks_valider.database.api.* +import com.faraphel.tasks_valider.database.api.base.BaseApi import com.faraphel.tasks_valider.database.converters.InstantConverter import com.faraphel.tasks_valider.database.dao.GroupDao import com.faraphel.tasks_valider.database.dao.GroupStudentDao @@ -39,12 +41,32 @@ import com.faraphel.tasks_valider.database.entities.TeacherEntity ) abstract class TaskDatabase : RoomDatabase() { // entities + abstract fun groupDao(): GroupDao abstract fun studentDao(): StudentDao abstract fun teacherDao(): TeacherDao abstract fun taskDao(): TaskDao - // relations abstract fun groupStudentDao(): GroupStudentDao abstract fun taskGroupDao(): TaskGroupDao + + // api + + private val api: Map = mapOf( + "group" to GroupApi(this.groupDao()), + "student" to StudentApi(this.studentDao()), + "teacher" to TeacherApi(this.teacherDao()), + "task" to TaskApi(this.taskDao()), + + "group_student" to GroupStudentApi(this.groupStudentDao()), + "task_group" to TaskGroupApi(this.taskGroupDao()), + ) + + /** + * get the api for an entity from its name. + * @param name the name of the entity + */ + fun getApiFromName(name: String): BaseApi? { + return this.api[name] + } } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt index 06f3668..dfc2acd 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.GroupDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.GroupEntity -class GroupApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): GroupDao = database.groupDao() -} +class GroupApi(dao: BaseDao) : BaseJsonApi(dao) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt index d5760ad..7fdfddd 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.GroupStudentDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.GroupStudentEntity -class GroupStudentApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): GroupStudentDao = database.groupStudentDao() -} +class GroupStudentApi(dao: BaseDao) : BaseJsonApi(dao) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt index 2e11f54..8f1f67b 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.StudentDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.StudentEntity -class StudentApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): StudentDao = database.studentDao() -} +class StudentApi(dao: BaseDao) : BaseJsonApi(dao) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt index 402d2de..1385d1e 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.TaskDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.TaskEntity -class TaskApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): TaskDao = database.taskDao() -} +class TaskApi(dao: BaseDao) : BaseJsonApi(dao) \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt index f48f7d6..eeb52f3 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.TaskGroupDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.TaskGroupEntity -class TaskGroupApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): TaskGroupDao = database.taskGroupDao() -} +class TaskGroupApi(dao: BaseDao) : BaseJsonApi(dao) \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt index 7a7169a..37cf1c9 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt @@ -1,10 +1,7 @@ package com.faraphel.tasks_valider.database.api -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.api.base.BaseJsonApi -import com.faraphel.tasks_valider.database.dao.TeacherDao +import com.faraphel.tasks_valider.database.dao.base.BaseDao import com.faraphel.tasks_valider.database.entities.TeacherEntity -class TeacherApi : BaseJsonApi() { - override fun getDao(database: TaskDatabase): TeacherDao = database.teacherDao() -} +class TeacherApi(dao: BaseDao) : BaseJsonApi(dao) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt index e05e324..7f338b3 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt @@ -1,6 +1,5 @@ package com.faraphel.tasks_valider.database.api.base -import com.faraphel.tasks_valider.database.TaskDatabase import fi.iki.elonen.NanoHTTPD /** @@ -11,23 +10,23 @@ interface BaseApi { * Handle the HEAD request * This is used to check if a data exists in the database */ - fun head(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response + fun head(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response /** * Handle the GET request * This is used to get data from the database */ - fun get(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response + fun get(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response /** * Handle the POST request * This is used to insert data into the database */ - fun post(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response + fun post(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response /** * Handle the PUT request * This is used to delete data from the database */ - fun delete(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response + fun delete(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response } \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt index aea579f..f947220 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt @@ -1,8 +1,6 @@ package com.faraphel.tasks_valider.database.api.base -import com.faraphel.tasks_valider.database.TaskDatabase import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.GroupEntity import com.faraphel.tasks_valider.database.entities.base.BaseEntity import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -13,32 +11,21 @@ import fi.iki.elonen.NanoHTTPD * This is preconfigured to handle JSON data. * @param Entity the entity type to handle */ -abstract class BaseJsonApi : BaseApi { +abstract class BaseJsonApi(private val dao: BaseDao) : BaseApi { companion object { private val parser = Gson() ///< The JSON parser } - /** - * Get the DAO for the entity - * @param database the database to get the DAO from - * @return the DAO for the entity - */ - abstract fun getDao(database: TaskDatabase): BaseDao - - /** - * Get the type token for the entity - * @return the type token for the entity - */ - private fun getEntityTypeToken(): TypeToken = object: TypeToken() {} + private val entityTypeToken: TypeToken = object: TypeToken() {} ///< the type of the managed entity // Requests - override fun head(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + override fun head(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { val obj = parser.fromJson( session.inputStream.bufferedReader().readText(), - getEntityTypeToken().type + this.entityTypeToken.type ) - val exists = this.getDao(database).exists(obj) + val exists = this.dao.exists(obj) return NanoHTTPD.newFixedLengthResponse( if (exists) NanoHTTPD.Response.Status.OK else NanoHTTPD.Response.Status.NOT_FOUND, @@ -47,17 +34,20 @@ abstract class BaseJsonApi : BaseApi { ) } - override fun get(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + override fun get(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { return NanoHTTPD.newFixedLengthResponse( NanoHTTPD.Response.Status.OK, "application/json", - parser.toJson(database.groupDao().getAll()) + parser.toJson(this.dao.getAll()) ) } - override fun post(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { - val obj = parser.fromJson(session.inputStream.bufferedReader().readText(), GroupEntity::class.java) - val id = database.groupDao().insert(obj) + override fun post(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + val obj = parser.fromJson( + session.inputStream.bufferedReader().readText(), + this.entityTypeToken.type + ) + val id = this.dao.insert(obj) return NanoHTTPD.newFixedLengthResponse( NanoHTTPD.Response.Status.CREATED, @@ -66,9 +56,12 @@ abstract class BaseJsonApi : BaseApi { ) } - override fun delete(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { - val obj = parser.fromJson(session.inputStream.bufferedReader().readText(), GroupEntity::class.java) - val count = database.groupDao().delete(obj) + override fun delete(session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + val obj = parser.fromJson( + session.inputStream.bufferedReader().readText(), + this.entityTypeToken.type + ) + val count = this.dao.delete(obj) return NanoHTTPD.newFixedLengthResponse( if (count > 0) NanoHTTPD.Response.Status.OK else NanoHTTPD.Response.Status.NOT_FOUND,