From 8c11e18e0d3c2008c271042e65b6a08a3c53a6ee Mon Sep 17 00:00:00 2001 From: Faraphel Date: Wed, 8 May 2024 00:10:04 +0200 Subject: [PATCH] [WIP] implemented API class to connect the database and the HTTP server --- .idea/deploymentTargetDropDown.xml | 12 --- .../connectivity/task/TaskServer.kt | 32 +++----- .../tasks_valider/database/TaskDatabase.kt | 41 +++------- .../tasks_valider/database/api/GroupApi.kt | 10 +++ .../database/api/GroupStudentApi.kt | 10 +++ .../tasks_valider/database/api/StudentApi.kt | 10 +++ .../tasks_valider/database/api/TaskApi.kt | 10 +++ .../database/api/TaskGroupApi.kt | 10 +++ .../tasks_valider/database/api/TeacherApi.kt | 10 +++ .../database/api/base/BaseApi.kt | 33 ++++++++ .../database/api/base/BaseJsonApi.kt | 79 +++++++++++++++++++ .../tasks_valider/database/dao/GroupDao.kt | 11 ++- .../database/dao/GroupStudentDao.kt | 11 +-- .../tasks_valider/database/dao/StudentDao.kt | 13 ++- .../tasks_valider/database/dao/TaskDao.kt | 11 ++- .../database/dao/TaskGroupDao.kt | 8 +- .../tasks_valider/database/dao/TeacherDao.kt | 10 +-- .../database/dao/base/BaseDao.kt | 30 ++++++- .../entities/{Group.kt => GroupEntity.kt} | 5 +- ...{GroupStudent.kt => GroupStudentEntity.kt} | 11 ++- .../entities/{Person.kt => PersonEntity.kt} | 5 +- .../entities/{Student.kt => StudentEntity.kt} | 4 +- .../entities/{Task.kt => TaskEntity.kt} | 5 +- .../{TaskGroup.kt => TaskGroupEntity.kt} | 12 +-- .../entities/{Teacher.kt => TeacherEntity.kt} | 4 +- .../database/entities/base/BaseEntity.kt | 3 + .../tasks_valider/ui/widgets/task/Group.kt | 4 +- .../tasks_valider/ui/widgets/task/Task.kt | 4 +- .../ui/widgets/task/TaskGroup.kt | 4 +- 29 files changed, 280 insertions(+), 132 deletions(-) create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{Group.kt => GroupEntity.kt} (73%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{GroupStudent.kt => GroupStudentEntity.kt} (76%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{Person.kt => PersonEntity.kt} (75%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{Student.kt => StudentEntity.kt} (85%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{Task.kt => TaskEntity.kt} (76%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{TaskGroup.kt => TaskGroupEntity.kt} (81%) rename app/src/main/java/com/faraphel/tasks_valider/database/entities/{Teacher.kt => TeacherEntity.kt} (85%) create mode 100644 app/src/main/java/com/faraphel/tasks_valider/database/entities/base/BaseEntity.kt diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index f67f999..ad3ac93 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -4,18 +4,6 @@ - - - - - - - - - - - - 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 211ba61..391e8e0 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,8 +1,6 @@ package com.faraphel.tasks_valider.connectivity.task -import android.util.Log import com.faraphel.tasks_valider.database.TaskDatabase -import com.faraphel.tasks_valider.database.entities.Task import com.google.gson.Gson import fi.iki.elonen.NanoHTTPD @@ -24,31 +22,19 @@ class TaskServer( // 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 ?") // handle the request when (method) { - // get the data from the database - Method.GET -> { - return newFixedLengthResponse( - Response.Status.OK, - "application/json", - jsonParser.toJson( database.taskDao().getAll() ) - ) - } + // check if the data is in the database + Method.HEAD -> { TODO() } + // get the data from the dao + Method.GET -> { TODO() } // insert the data into the database - Method.POST -> { - val task = jsonParser.fromJson( - session.inputStream.bufferedReader(), - Task::class.java - ) - database.taskDao().insert(task) - - return newFixedLengthResponse( - Response.Status.CREATED, - "application/json", - jsonParser.toJson(task) - ) - } + Method.POST -> { TODO() } // other methods are not allowed else -> { return newFixedLengthResponse( 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 718b6d1..2fa80a1 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 @@ -10,13 +10,12 @@ import com.faraphel.tasks_valider.database.dao.StudentDao import com.faraphel.tasks_valider.database.dao.TaskDao import com.faraphel.tasks_valider.database.dao.TaskGroupDao import com.faraphel.tasks_valider.database.dao.TeacherDao -import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.GroupStudent -import com.faraphel.tasks_valider.database.entities.Student -import com.faraphel.tasks_valider.database.entities.Task -import com.faraphel.tasks_valider.database.entities.TaskGroup -import com.faraphel.tasks_valider.database.entities.Teacher +import com.faraphel.tasks_valider.database.entities.GroupEntity +import com.faraphel.tasks_valider.database.entities.GroupStudentEntity +import com.faraphel.tasks_valider.database.entities.StudentEntity +import com.faraphel.tasks_valider.database.entities.TaskEntity +import com.faraphel.tasks_valider.database.entities.TaskGroupEntity +import com.faraphel.tasks_valider.database.entities.TeacherEntity /** @@ -25,13 +24,13 @@ import com.faraphel.tasks_valider.database.entities.Teacher */ @Database( entities = [ - Group::class, - Student::class, - Teacher::class, - Task::class, + GroupEntity::class, + StudentEntity::class, + TeacherEntity::class, + TaskEntity::class, - GroupStudent::class, - TaskGroup::class, + GroupStudentEntity::class, + TaskGroupEntity::class, ], version = 1 ) @@ -48,20 +47,4 @@ abstract class TaskDatabase : RoomDatabase() { // relations abstract fun groupStudentDao(): GroupStudentDao abstract fun taskGroupDao(): TaskGroupDao - - /** - * Get the DAO from the name of the dao. - */ - @Suppress("UNCHECKED_CAST") - fun daoFromName(name: String): BaseDao? { - return when (name) { - "group" -> groupDao() - "student" -> studentDao() - "teacher" -> teacherDao() - "task" -> taskDao() - "group_student" -> groupStudentDao() - "task_group" -> taskGroupDao() - else -> null - } as BaseDao? - } } 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 new file mode 100644 index 0000000..06f3668 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupApi.kt @@ -0,0 +1,10 @@ +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.entities.GroupEntity + +class GroupApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): GroupDao = database.groupDao() +} 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 new file mode 100644 index 0000000..d5760ad --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/GroupStudentApi.kt @@ -0,0 +1,10 @@ +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.entities.GroupStudentEntity + +class GroupStudentApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): GroupStudentDao = database.groupStudentDao() +} 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 new file mode 100644 index 0000000..2e11f54 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/StudentApi.kt @@ -0,0 +1,10 @@ +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.entities.StudentEntity + +class StudentApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): StudentDao = database.studentDao() +} 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 new file mode 100644 index 0000000..402d2de --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskApi.kt @@ -0,0 +1,10 @@ +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.entities.TaskEntity + +class TaskApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): TaskDao = database.taskDao() +} 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 new file mode 100644 index 0000000..f48f7d6 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TaskGroupApi.kt @@ -0,0 +1,10 @@ +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.entities.TaskGroupEntity + +class TaskGroupApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): TaskGroupDao = database.taskGroupDao() +} 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 new file mode 100644 index 0000000..7a7169a --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/TeacherApi.kt @@ -0,0 +1,10 @@ +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.entities.TeacherEntity + +class TeacherApi : BaseJsonApi() { + override fun getDao(database: TaskDatabase): TeacherDao = database.teacherDao() +} 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 new file mode 100644 index 0000000..e05e324 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseApi.kt @@ -0,0 +1,33 @@ +package com.faraphel.tasks_valider.database.api.base + +import com.faraphel.tasks_valider.database.TaskDatabase +import fi.iki.elonen.NanoHTTPD + +/** + * A base for the API to handle the database operations with an HTTP server. + */ +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 + + /** + * Handle the GET request + * This is used to get data from the database + */ + fun get(database: TaskDatabase, 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 + + /** + * Handle the PUT request + * This is used to delete data from the database + */ + fun delete(database: TaskDatabase, 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 new file mode 100644 index 0000000..aea579f --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/api/base/BaseJsonApi.kt @@ -0,0 +1,79 @@ +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 +import fi.iki.elonen.NanoHTTPD + +/** + * A base for the API to handle the database operations. + * This is preconfigured to handle JSON data. + * @param Entity the entity type to handle + */ +abstract class BaseJsonApi : 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() {} + + // Requests + + override fun head(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + val obj = parser.fromJson( + session.inputStream.bufferedReader().readText(), + getEntityTypeToken().type + ) + val exists = this.getDao(database).exists(obj) + + return NanoHTTPD.newFixedLengthResponse( + if (exists) NanoHTTPD.Response.Status.OK else NanoHTTPD.Response.Status.NOT_FOUND, + "text/plain", + if (exists) "Exists" else "Not found" + ) + } + + override fun get(database: TaskDatabase, session: NanoHTTPD.IHTTPSession): NanoHTTPD.Response { + return NanoHTTPD.newFixedLengthResponse( + NanoHTTPD.Response.Status.OK, + "application/json", + parser.toJson(database.groupDao().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) + + return NanoHTTPD.newFixedLengthResponse( + NanoHTTPD.Response.Status.CREATED, + "text/plain", + id.toString() + ) + } + + 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) + + return NanoHTTPD.newFixedLengthResponse( + if (count > 0) NanoHTTPD.Response.Status.OK else NanoHTTPD.Response.Status.NOT_FOUND, + "text/plain", + count.toString() + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupDao.kt index 33511fd..e53764c 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupDao.kt @@ -4,17 +4,16 @@ import androidx.room.Dao import androidx.room.Query import androidx.room.RewriteQueriesToDropUnusedColumns import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.Student +import com.faraphel.tasks_valider.database.entities.GroupEntity @Dao -interface GroupDao : BaseDao { +interface GroupDao : BaseDao { @Query("SELECT * FROM `groups`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `groups` WHERE id = :id") - fun getById(id: Long): Group + fun getById(id: Long): GroupEntity /** Allow to get all groups with a specific student @@ -25,5 +24,5 @@ interface GroupDao : BaseDao { "WHERE `group_student`.student_id = :studentId" ) @RewriteQueriesToDropUnusedColumns - fun filterByStudentId(studentId: Long): List + fun filterByStudentId(studentId: Long): List } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupStudentDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupStudentDao.kt index 2bd355e..6f86ea6 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupStudentDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/GroupStudentDao.kt @@ -2,18 +2,15 @@ package com.faraphel.tasks_valider.database.dao import androidx.room.Dao import androidx.room.Query -import androidx.room.RewriteQueriesToDropUnusedColumns import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.GroupStudent -import com.faraphel.tasks_valider.database.entities.Student +import com.faraphel.tasks_valider.database.entities.GroupStudentEntity @Dao -interface GroupStudentDao : BaseDao { +interface GroupStudentDao : BaseDao { @Query("SELECT * FROM `group_student`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `group_student` WHERE group_id = :groupId AND student_id = :studentId") - fun getById(groupId: Long, studentId: Long): GroupStudent + fun getById(groupId: Long, studentId: Long): GroupStudentEntity } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/StudentDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/StudentDao.kt index e4b8dfb..d1451eb 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/StudentDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/StudentDao.kt @@ -1,22 +1,19 @@ package com.faraphel.tasks_valider.database.dao -import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Query import androidx.room.RewriteQueriesToDropUnusedColumns import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.Person -import com.faraphel.tasks_valider.database.entities.Student +import com.faraphel.tasks_valider.database.entities.StudentEntity @Dao -interface StudentDao : BaseDao { +interface StudentDao : BaseDao { @Query("SELECT * FROM `students`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `students` WHERE id = :id") - fun getById(id: Long): Student + fun getById(id: Long): StudentEntity /** @@ -28,5 +25,5 @@ interface StudentDao : BaseDao { "WHERE `group_student`.group_id = :groupId" ) @RewriteQueriesToDropUnusedColumns - fun filterByGroupId(groupId: Long): List + fun filterByGroupId(groupId: Long): List } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskDao.kt index 1e2cb8c..33df321 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskDao.kt @@ -4,17 +4,16 @@ import androidx.room.Dao import androidx.room.Query import androidx.room.RewriteQueriesToDropUnusedColumns import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.Task +import com.faraphel.tasks_valider.database.entities.TaskEntity @Dao -interface TaskDao : BaseDao { +interface TaskDao : BaseDao { @Query("SELECT * FROM `tasks`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `tasks` WHERE id = :id") - fun getById(id: Long): Task + fun getById(id: Long): TaskEntity /** Get all the tasks for a specific group @@ -25,5 +24,5 @@ interface TaskDao : BaseDao { "WHERE `task_group`.group_id = :groupId" ) @RewriteQueriesToDropUnusedColumns - fun filterByGroupId(groupId: Long): List + fun filterByGroupId(groupId: Long): List } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskGroupDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskGroupDao.kt index 0caa673..8b2bea6 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskGroupDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TaskGroupDao.kt @@ -3,14 +3,14 @@ package com.faraphel.tasks_valider.database.dao import androidx.room.Dao import androidx.room.Query import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.TaskGroup +import com.faraphel.tasks_valider.database.entities.TaskGroupEntity @Dao -interface TaskGroupDao : BaseDao { +interface TaskGroupDao : BaseDao { @Query("SELECT * FROM `task_group`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `task_group` WHERE task_id = :taskId AND group_id = :groupId") - fun getById(taskId: Long, groupId: Long): TaskGroup + fun getById(taskId: Long, groupId: Long): TaskGroupEntity } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TeacherDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TeacherDao.kt index f489725..3acba4d 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/TeacherDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/TeacherDao.kt @@ -3,16 +3,14 @@ package com.faraphel.tasks_valider.database.dao import androidx.room.Dao import androidx.room.Query import com.faraphel.tasks_valider.database.dao.base.BaseDao -import com.faraphel.tasks_valider.database.entities.Person -import com.faraphel.tasks_valider.database.entities.Student -import com.faraphel.tasks_valider.database.entities.Teacher +import com.faraphel.tasks_valider.database.entities.TeacherEntity @Dao -interface TeacherDao : BaseDao { +interface TeacherDao : BaseDao { @Query("SELECT * FROM `teachers`") - override fun getAll(): List + override fun getAll(): List @Query("SELECT * FROM `teachers` WHERE id = :id") - fun getById(id: Long): Teacher + fun getById(id: Long): TeacherEntity } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/dao/base/BaseDao.kt b/app/src/main/java/com/faraphel/tasks_valider/database/dao/base/BaseDao.kt index c9c4fe2..b06e62f 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/dao/base/BaseDao.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/dao/base/BaseDao.kt @@ -2,18 +2,40 @@ package com.faraphel.tasks_valider.database.dao.base import androidx.room.Delete import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Update +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +/** + * A base DAO to handle the database operations. + * @param Entity the entity to handle + */ interface BaseDao { - @Insert + /** + * Check if the entities exists in the database. + */ + fun exists(vararg entities: Entity): Boolean { + return this.getAll().containsAll(entities.toList()) + } + + /** + * Insert the entities into the database. + */ + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg entities: Entity): List - @Update - fun update(vararg entities: Entity): Int - + /** + * Delete the entities from the database. + */ @Delete fun delete(vararg entities: Entity): Int + /** + * Get all the entities from the database. + * TODO(Faraphel): support filters ? + */ fun getAll(): List } diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Group.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupEntity.kt similarity index 73% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/Group.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupEntity.kt index d0f3a09..d042662 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Group.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupEntity.kt @@ -3,10 +3,11 @@ package com.faraphel.tasks_valider.database.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import com.faraphel.tasks_valider.database.entities.base.BaseEntity @Entity(tableName = "groups") -data class Group ( +data class GroupEntity ( @ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0, @ColumnInfo("name") val name: String? = null, -) +) : BaseEntity() diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudent.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudentEntity.kt similarity index 76% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudent.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudentEntity.kt index 2e830e3..ba003c8 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudent.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/GroupStudentEntity.kt @@ -3,8 +3,7 @@ package com.faraphel.tasks_valider.database.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey -import com.faraphel.tasks_valider.database.entities.Group -import com.faraphel.tasks_valider.database.entities.Student +import com.faraphel.tasks_valider.database.entities.base.BaseEntity @Entity( tableName = "group_student", @@ -14,20 +13,20 @@ import com.faraphel.tasks_valider.database.entities.Student ], foreignKeys = [ ForeignKey( - entity = Group::class, + entity = GroupEntity::class, parentColumns = ["id"], childColumns = ["group_id"], onDelete = ForeignKey.CASCADE ), ForeignKey( - entity = Student::class, + entity = StudentEntity::class, parentColumns = ["id"], childColumns = ["student_id"], onDelete = ForeignKey.CASCADE ) ] ) -data class GroupStudent( +data class GroupStudentEntity( @ColumnInfo("group_id", index = true) val groupId: Long, @ColumnInfo("student_id", index = true) val studentId: Long, -) +) : BaseEntity() diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Person.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/PersonEntity.kt similarity index 75% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/Person.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/PersonEntity.kt index 347b05d..469c9d2 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Person.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/PersonEntity.kt @@ -1,13 +1,14 @@ package com.faraphel.tasks_valider.database.entities import java.util.Locale +import com.faraphel.tasks_valider.database.entities.base.BaseEntity -open class Person ( +open class PersonEntity ( open val id: Long = 0, open val firstName: String, open val lastName: String, -) { +) : BaseEntity() { /** Get the full name of the person */ diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Student.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/StudentEntity.kt similarity index 85% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/Student.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/StudentEntity.kt index 4cff4c6..fdfd648 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Student.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/StudentEntity.kt @@ -5,8 +5,8 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "students") -class Student( +class StudentEntity( @ColumnInfo("id") @PrimaryKey(autoGenerate = true) override val id: Long = 0, @ColumnInfo("first_name") override val firstName: String, @ColumnInfo("last_name") override val lastName: String -) : Person(id, firstName, lastName) +) : PersonEntity(id, firstName, lastName) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Task.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskEntity.kt similarity index 76% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/Task.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskEntity.kt index 15e1361..7d04402 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Task.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskEntity.kt @@ -3,10 +3,11 @@ package com.faraphel.tasks_valider.database.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import com.faraphel.tasks_valider.database.entities.base.BaseEntity @Entity(tableName = "tasks") -data class Task ( +data class TaskEntity ( @ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0, @ColumnInfo("title") val title: String, @ColumnInfo("description") val description: String, -) +) : BaseEntity() diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroup.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroupEntity.kt similarity index 81% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroup.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroupEntity.kt index 07e9c57..006a6a0 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroup.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TaskGroupEntity.kt @@ -3,6 +3,7 @@ package com.faraphel.tasks_valider.database.entities import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.ForeignKey +import com.faraphel.tasks_valider.database.entities.base.BaseEntity import java.time.Instant @@ -14,29 +15,30 @@ import java.time.Instant ], foreignKeys = [ ForeignKey( - entity = Group::class, + entity = GroupEntity::class, parentColumns = ["id"], childColumns = ["group_id"], onDelete = ForeignKey.CASCADE ), ForeignKey( - entity = Task::class, + entity = TaskEntity::class, parentColumns = ["id"], childColumns = ["task_id"], onDelete = ForeignKey.CASCADE ), ForeignKey( - entity = Teacher::class, + entity = TeacherEntity::class, parentColumns = ["id"], childColumns = ["approval_teacher_id"], onDelete = ForeignKey.CASCADE ), ] ) -data class TaskGroup ( +data class TaskGroupEntity ( @ColumnInfo("task_id") val taskId: Long, @ColumnInfo("group_id") val groupId: Long, @ColumnInfo("approval_status") var approvalStatus: Boolean = false, @ColumnInfo("approval_teacher_id") val approvalTeacherId: Long? = null, @ColumnInfo("approval_time") val approvalTime: Instant? = null -) +) : BaseEntity() + diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Teacher.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TeacherEntity.kt similarity index 85% rename from app/src/main/java/com/faraphel/tasks_valider/database/entities/Teacher.kt rename to app/src/main/java/com/faraphel/tasks_valider/database/entities/TeacherEntity.kt index b499973..c244edc 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/database/entities/Teacher.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/TeacherEntity.kt @@ -5,8 +5,8 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(tableName = "teachers") -class Teacher( +class TeacherEntity( @ColumnInfo("id") @PrimaryKey(autoGenerate = true) override val id: Long = 0, @ColumnInfo("first_name") override val firstName: String, @ColumnInfo("last_name") override val lastName: String -) : Person(id, firstName, lastName) +) : PersonEntity(id, firstName, lastName) diff --git a/app/src/main/java/com/faraphel/tasks_valider/database/entities/base/BaseEntity.kt b/app/src/main/java/com/faraphel/tasks_valider/database/entities/base/BaseEntity.kt new file mode 100644 index 0000000..44654b2 --- /dev/null +++ b/app/src/main/java/com/faraphel/tasks_valider/database/entities/base/BaseEntity.kt @@ -0,0 +1,3 @@ +package com.faraphel.tasks_valider.database.entities.base + +open class BaseEntity diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Group.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Group.kt index 95520a7..fb35f98 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Group.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Group.kt @@ -3,10 +3,10 @@ package com.faraphel.tasks_valider.ui.widgets.task import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import com.faraphel.tasks_valider.database.entities.Group +import com.faraphel.tasks_valider.database.entities.GroupEntity @Composable -fun WidgetGroup(group: Group) { +fun WidgetGroup(group: GroupEntity) { // TODO Column { Text(text = group.name!!) diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Task.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Task.kt index fc604fb..6ed1293 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Task.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/Task.kt @@ -3,10 +3,10 @@ package com.faraphel.tasks_valider.ui.widgets.task import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import com.faraphel.tasks_valider.database.entities.Task +import com.faraphel.tasks_valider.database.entities.TaskEntity @Composable -fun WidgetTask(task: Task) { +fun WidgetTask(task: TaskEntity) { // task information Column { Text(text = task.title) diff --git a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/TaskGroup.kt b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/TaskGroup.kt index 75e0353..d14bb27 100644 --- a/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/TaskGroup.kt +++ b/app/src/main/java/com/faraphel/tasks_valider/ui/widgets/task/TaskGroup.kt @@ -12,11 +12,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.faraphel.tasks_valider.database.TaskDatabase -import com.faraphel.tasks_valider.database.entities.TaskGroup +import com.faraphel.tasks_valider.database.entities.TaskGroupEntity @Composable -fun WidgetTaskStudent(database: TaskDatabase, taskStudent: TaskGroup) { +fun WidgetTaskStudent(database: TaskDatabase, taskStudent: TaskGroupEntity) { val teacherDao = database.teacherDao() Column {