Http Server / Client communication #7

Merged
faraphel merged 24 commits from test-http into main 2024-05-17 17:22:56 +02:00
43 changed files with 323 additions and 443 deletions
Showing only changes of commit a3dc69b23b - Show all commits

View file

@ -4,45 +4,37 @@ import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.faraphel.tasks_valider.database.converters.InstantConverter
import com.faraphel.tasks_valider.database.dao.GroupDao
import com.faraphel.tasks_valider.database.dao.GroupStudentDao
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.entities._old.GroupEntity
import com.faraphel.tasks_valider.database.entities._old.GroupStudentEntity
import com.faraphel.tasks_valider.database.entities._old.StudentEntity
import com.faraphel.tasks_valider.database.entities._old.TaskEntity
import com.faraphel.tasks_valider.database.entities._old.TaskGroupEntity
import com.faraphel.tasks_valider.database.entities._old.TeacherEntity
import com.faraphel.tasks_valider.database.dao.*
import com.faraphel.tasks_valider.database.entities.*
/**
* The database for the tasks application.
* The database for the tasks' application.
* Contains the entities and the relations between them.
*/
@Database(
entities = [
GroupEntity::class,
StudentEntity::class,
TeacherEntity::class,
ClassEntity::class,
PersonEntity::class,
SessionEntity::class,
SubjectEntity::class,
TaskEntity::class,
ValidationEntity::class,
GroupStudentEntity::class,
TaskGroupEntity::class,
RelationClassPersonEntity::class,
],
version = 1
)
@TypeConverters(
InstantConverter::class
)
abstract class TaskDatabase : RoomDatabase() {
abstract fun groupDao(): GroupDao
abstract fun studentDao(): StudentDao
abstract fun teacherDao(): TeacherDao
abstract class TaskDatabase: RoomDatabase() {
abstract fun classDao(): ClassDao
abstract fun personDao(): PersonDao
abstract fun sessionDao(): SessionDao
abstract fun subjectDao(): SubjectDao
abstract fun taskDao(): TaskDao
abstract fun validationDao(): ValidationDao
abstract fun groupStudentDao(): GroupStudentDao
abstract fun taskGroupDao(): TaskGroupDao
abstract fun relationClassPersonDao(): RelationClassPersonDao
}

View file

@ -5,17 +5,19 @@ import com.faraphel.tasks_valider.connectivity.task.session.TaskSession
import com.faraphel.tasks_valider.database.TaskDatabase
import com.faraphel.tasks_valider.database.api.entities.*
import com.faraphel.tasks_valider.database.api.entities.base.BaseApi
import com.faraphel.tasks_valider.database.entities.*
import fi.iki.elonen.NanoHTTPD
class TaskDatabaseApi(private val database: TaskDatabase) {
private val api: Map<String, BaseApi> = mapOf(
"group" to GroupApi(this.database.groupDao()),
"student" to StudentApi(this.database.studentDao()),
"teacher" to TeacherApi(this.database.teacherDao()),
"task" to TaskApi(this.database.taskDao()),
ClassEntity.TABLE_NAME to ClassApi(this.database.classDao()),
PersonEntity.TABLE_NAME to PersonApi(this.database.personDao()),
SessionEntity.TABLE_NAME to SessionApi(this.database.sessionDao()),
SubjectEntity.TABLE_NAME to SubjectApi(this.database.subjectDao()),
TaskEntity.TABLE_NAME to TaskApi(this.database.taskDao()),
ValidationEntity.TABLE_NAME to ValidationApi(this.database.validationDao()),
"group_student" to GroupStudentApi(this.database.groupStudentDao()),
"task_group" to TaskGroupApi(this.database.taskGroupDao()),
RelationClassPersonEntity.TABLE_NAME to RelationClassPersonApi(this.database.relationClassPersonDao()),
)
/**

View file

@ -2,6 +2,6 @@ package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.GroupEntity
import com.faraphel.tasks_valider.database.entities.ClassEntity
class GroupApi(dao: BaseDao<GroupEntity>) : BaseJsonApi<GroupEntity>(dao)
class ClassApi(dao: BaseDao<ClassEntity>) : BaseJsonApi<ClassEntity>(dao)

View file

@ -1,7 +0,0 @@
package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.GroupStudentEntity
class GroupStudentApi(dao: BaseDao<GroupStudentEntity>) : BaseJsonApi<GroupStudentEntity>(dao)

View file

@ -2,6 +2,6 @@ package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.TeacherEntity
import com.faraphel.tasks_valider.database.entities.PersonEntity
class TeacherApi(dao: BaseDao<TeacherEntity>) : BaseJsonApi<TeacherEntity>(dao)
class PersonApi(dao: BaseDao<PersonEntity>) : BaseJsonApi<PersonEntity>(dao)

View file

@ -0,0 +1,7 @@
package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities.RelationClassPersonEntity
class RelationClassPersonApi(dao: BaseDao<RelationClassPersonEntity>) : BaseJsonApi<RelationClassPersonEntity>(dao)

View file

@ -2,6 +2,6 @@ package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.StudentEntity
import com.faraphel.tasks_valider.database.entities.SessionEntity
class StudentApi(dao: BaseDao<StudentEntity>) : BaseJsonApi<StudentEntity>(dao)
class SessionApi(dao: BaseDao<SessionEntity>) : BaseJsonApi<SessionEntity>(dao)

View file

@ -2,6 +2,6 @@ package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.TaskGroupEntity
import com.faraphel.tasks_valider.database.entities.SubjectEntity
class TaskGroupApi(dao: BaseDao<TaskGroupEntity>) : BaseJsonApi<TaskGroupEntity>(dao)
class SubjectApi(dao: BaseDao<SubjectEntity>) : BaseJsonApi<SubjectEntity>(dao)

View file

@ -2,6 +2,6 @@ package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities._old.TaskEntity
import com.faraphel.tasks_valider.database.entities.TaskEntity
class TaskApi(dao: BaseDao<TaskEntity>) : BaseJsonApi<TaskEntity>(dao)
class TaskApi(dao: BaseDao<TaskEntity>) : BaseJsonApi<TaskEntity>(dao)

View file

@ -0,0 +1,7 @@
package com.faraphel.tasks_valider.database.api.entities
import com.faraphel.tasks_valider.database.api.entities.base.BaseJsonApi
import com.faraphel.tasks_valider.database.dao.base.BaseDao
import com.faraphel.tasks_valider.database.entities.ValidationEntity
class ValidationApi(dao: BaseDao<ValidationEntity>) : BaseJsonApi<ValidationEntity>(dao)

View file

@ -0,0 +1,40 @@
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.ClassEntity
import com.faraphel.tasks_valider.database.entities.PersonEntity
import com.faraphel.tasks_valider.database.entities.RelationClassPersonEntity
import com.faraphel.tasks_valider.database.entities.SessionEntity
@Dao
interface ClassDao : BaseDao<ClassEntity> {
@Query("SELECT * FROM ${ClassEntity.TABLE_NAME}")
override fun getAll(): List<ClassEntity>
/**
* Get the object from its identifier
*/
@Query("SELECT * FROM ${ClassEntity.TABLE_NAME} WHERE id = :id")
fun getById(id: Long): ClassEntity
/**
* Get all the sessions this class attended
* @param id the id of the class
*/
@Query("SELECT * FROM ${SessionEntity.TABLE_NAME} WHERE class_id = :id")
fun getSessions(id: Long): List<SessionEntity>
/**
* Get all the students in a class
* @param id the id of the class
*/
@Query(
"SELECT * FROM ${PersonEntity.TABLE_NAME} " +
"JOIN ${RelationClassPersonEntity.TABLE_NAME} " +
"ON ${PersonEntity.TABLE_NAME}.id = ${RelationClassPersonEntity.TABLE_NAME}.student_id " +
"WHERE ${RelationClassPersonEntity.TABLE_NAME}.class_id = :id"
)
fun getStudents(id: Long): List<PersonEntity>
}

View file

@ -1,28 +0,0 @@
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._old.GroupEntity
@Dao
interface GroupDao : BaseDao<GroupEntity> {
@Query("SELECT * FROM `groups`")
override fun getAll(): List<GroupEntity>
@Query("SELECT * FROM `groups` WHERE id = :id")
fun getById(id: Long): GroupEntity
/**
Allow to get all groups with a specific student
*/
@Query(
"SELECT * FROM `groups` " +
"JOIN `group_student` ON `groups`.id = `group_student`.student_id " +
"WHERE `group_student`.student_id = :studentId"
)
@RewriteQueriesToDropUnusedColumns
fun filterByStudentId(studentId: Long): List<GroupEntity>
}

View file

@ -1,16 +0,0 @@
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._old.GroupStudentEntity
@Dao
interface GroupStudentDao : BaseDao<GroupStudentEntity> {
@Query("SELECT * FROM `group_student`")
override fun getAll(): List<GroupStudentEntity>
@Query("SELECT * FROM `group_student` WHERE group_id = :groupId AND student_id = :studentId")
fun getById(groupId: Long, studentId: Long): GroupStudentEntity
}

View file

@ -0,0 +1,44 @@
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.*
@Dao
interface PersonDao : BaseDao<PersonEntity> {
@Query("SELECT * FROM ${PersonEntity.TABLE_NAME}")
override fun getAll(): List<PersonEntity>
/**
* Get the object from its identifier
*/
@Query("SELECT * FROM ${PersonEntity.TABLE_NAME} WHERE id = :id")
fun getById(id: Long): PersonEntity
/**
* Allow to get all the classes the person is attending as a student
*/
@Query(
"SELECT * FROM ${ClassEntity.TABLE_NAME} " +
"JOIN ${RelationClassPersonEntity.TABLE_NAME} " +
"ON ${ClassEntity.TABLE_NAME}.id = ${RelationClassPersonEntity.TABLE_NAME}.student_id " +
"WHERE ${RelationClassPersonEntity.TABLE_NAME}.student_id = :id"
)
fun getClasses(id: Long): List<ClassEntity>
/**
* Get all the tasks this user approved as a teacher
* @param id the id of the person
*/
@Query("SELECT * FROM ${ValidationEntity.TABLE_NAME} WHERE teacher_id = :id")
fun getTasksApproved(id: Long): List<ValidationEntity>
/**
* Get all the tasks this user validated as a student
* @param id the id of the person
*/
@Query("SELECT * FROM ${ValidationEntity.TABLE_NAME} WHERE student_id = :id")
fun getTasksValidated(id: Long): List<ValidationEntity>
}

View file

@ -0,0 +1,23 @@
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.RelationClassPersonEntity
@Dao
interface RelationClassPersonDao : BaseDao<RelationClassPersonEntity> {
@Query("SELECT * FROM ${RelationClassPersonEntity.TABLE_NAME}")
override fun getAll(): List<RelationClassPersonEntity>
/**
* Get the object from its identifiers
*/
@Query(
"SELECT * FROM ${RelationClassPersonEntity.TABLE_NAME} " +
"WHERE " +
"class_id = :classId AND " +
"student_id = :studentId"
)
fun getById(classId: Long, studentId: Long): RelationClassPersonEntity
}

View file

@ -0,0 +1,18 @@
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.SessionEntity
@Dao
interface SessionDao : BaseDao<SessionEntity> {
@Query("SELECT * FROM ${SessionEntity.TABLE_NAME}")
override fun getAll(): List<SessionEntity>
/**
* Get the object from its identifier
*/
@Query("SELECT * FROM ${SessionEntity.TABLE_NAME} WHERE id = :id")
fun getById(id: Long): SessionEntity
}

View file

@ -1,29 +0,0 @@
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._old.StudentEntity
@Dao
interface StudentDao : BaseDao<StudentEntity> {
@Query("SELECT * FROM `students`")
override fun getAll(): List<StudentEntity>
@Query("SELECT * FROM `students` WHERE id = :id")
fun getById(id: Long): StudentEntity
/**
Allow to get all the students in a group
*/
@Query(
"SELECT * FROM `students` " +
"JOIN `group_student` ON `students`.id = `group_student`.student_id " +
"WHERE `group_student`.group_id = :groupId"
)
@RewriteQueriesToDropUnusedColumns
fun filterByGroupId(groupId: Long): List<StudentEntity>
}

View file

@ -0,0 +1,27 @@
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.SessionEntity
import com.faraphel.tasks_valider.database.entities.SubjectEntity
import com.faraphel.tasks_valider.database.entities.TaskEntity
@Dao
interface SubjectDao : BaseDao<SubjectEntity> {
@Query("SELECT * FROM ${SubjectEntity.TABLE_NAME}")
override fun getAll(): List<SubjectEntity>
/**
* Get the object from its identifier
*/
@Query("SELECT * FROM ${SubjectEntity.TABLE_NAME} WHERE id = :id")
fun getById(id: Long): SubjectEntity
/**
* Get all the tasks available in a subject
* @param id the id of the subject
*/
@Query("SELECT * FROM ${TaskEntity.TABLE_NAME} WHERE subject_id = :id")
fun getSessions(id: Long): List<SessionEntity>
}

View file

@ -2,27 +2,25 @@ 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._old.TaskEntity
import com.faraphel.tasks_valider.database.entities.TaskEntity
import com.faraphel.tasks_valider.database.entities.ValidationEntity
@Dao
interface TaskDao : BaseDao<TaskEntity> {
@Query("SELECT * FROM `tasks`")
@Query("SELECT * FROM ${TaskEntity.TABLE_NAME}")
override fun getAll(): List<TaskEntity>
@Query("SELECT * FROM `tasks` WHERE id = :id")
/**
* Get the object from its identifier
*/
@Query("SELECT * FROM ${TaskEntity.TABLE_NAME} WHERE id = :id")
fun getById(id: Long): TaskEntity
/**
Get all the tasks for a specific group
* Get all the validations have been approved for this tasks
* @param id the id of the task
*/
@Query(
"SELECT * FROM `tasks` " +
"JOIN `task_group` ON `tasks`.id = `task_group`.task_id " +
"WHERE `task_group`.group_id = :groupId"
)
@RewriteQueriesToDropUnusedColumns
fun filterByGroupId(groupId: Long): List<TaskEntity>
@Query("SELECT * FROM ${ValidationEntity.TABLE_NAME} WHERE task_id = :id")
fun getTasksValidated(id: Long): List<ValidationEntity>
}

View file

@ -1,16 +0,0 @@
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._old.TaskGroupEntity
@Dao
interface TaskGroupDao : BaseDao<TaskGroupEntity> {
@Query("SELECT * FROM `task_group`")
override fun getAll(): List<TaskGroupEntity>
@Query("SELECT * FROM `task_group` WHERE task_id = :taskId AND group_id = :groupId")
fun getById(taskId: Long, groupId: Long): TaskGroupEntity
}

View file

@ -1,16 +0,0 @@
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._old.TeacherEntity
@Dao
interface TeacherDao : BaseDao<TeacherEntity> {
@Query("SELECT * FROM `teachers`")
override fun getAll(): List<TeacherEntity>
@Query("SELECT * FROM `teachers` WHERE id = :id")
fun getById(id: Long): TeacherEntity
}

View file

@ -0,0 +1,24 @@
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.ValidationEntity
@Dao
interface ValidationDao : BaseDao<ValidationEntity> {
@Query("SELECT * FROM ${ValidationEntity.TABLE_NAME}")
override fun getAll(): List<ValidationEntity>
/**
* Get the object from its identifiers
*/
@Query(
"SELECT * FROM ${ValidationEntity.TABLE_NAME} " +
"WHERE " +
"teacher_id = :teacherId and " +
"student_id = :studentId and " +
"task_id = :taskId"
)
fun getById(teacherId: Long, studentId: Long, taskId: Long): ValidationEntity
}

View file

@ -5,8 +5,13 @@ import androidx.room.Entity
import androidx.room.PrimaryKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
@Entity(tableName = "classes")
@Entity(tableName = ClassEntity.TABLE_NAME)
data class ClassEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("name") val name: String,
) : BaseEntity()
) : BaseEntity() {
companion object {
const val TABLE_NAME = "classes"
}
}

View file

@ -6,10 +6,14 @@ import androidx.room.PrimaryKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
import java.util.*
@Entity(tableName = "students")
data class StudentEntity (
@Entity(tableName = PersonEntity.TABLE_NAME)
data class PersonEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("first_name") val firstName: String,
@ColumnInfo("last_name") val lastName: String,
@ColumnInfo("card_id") val cardId: UUID,
) : BaseEntity()
) : BaseEntity() {
companion object {
const val TABLE_NAME = "persons"
}
}

View file

@ -1,4 +1,4 @@
package com.faraphel.tasks_valider.database.entities._old
package com.faraphel.tasks_valider.database.entities
import androidx.room.ColumnInfo
import androidx.room.Entity
@ -6,27 +6,31 @@ import androidx.room.ForeignKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
@Entity(
tableName = "group_student",
tableName = RelationClassPersonEntity.TABLE_NAME,
primaryKeys = [
"group_id",
"student_id"
"student_id",
"class_id",
],
foreignKeys = [
ForeignKey(
entity = GroupEntity::class,
parentColumns = ["id"],
childColumns = ["group_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = StudentEntity::class,
entity = PersonEntity::class,
parentColumns = ["id"],
childColumns = ["student_id"],
onDelete = ForeignKey.CASCADE
)
),
ForeignKey(
entity = ClassEntity::class,
parentColumns = ["id"],
childColumns = ["class_id"],
onDelete = ForeignKey.CASCADE
),
]
)
data class GroupStudentEntity(
@ColumnInfo("group_id", index = true) val groupId: Long,
data class RelationClassPersonEntity (
@ColumnInfo("student_id", index = true) val studentId: Long,
) : BaseEntity()
@ColumnInfo("class_id", index = true) val classId: Long,
) : BaseEntity() {
companion object {
const val TABLE_NAME = "relation_class_person"
}
}

View file

@ -8,7 +8,7 @@ import com.faraphel.tasks_valider.database.entities.base.BaseEntity
import java.time.Instant
@Entity(
tableName = "sessions",
tableName = SessionEntity.TABLE_NAME,
foreignKeys = [
ForeignKey(
entity = ClassEntity::class,
@ -23,5 +23,9 @@ data class SessionEntity (
@ColumnInfo("name") val name: String? = null,
@ColumnInfo("start") val start: Instant,
@ColumnInfo("class_id") val classId: Long? = null,
) : BaseEntity()
@ColumnInfo("class_id", index = true) val classId: Long? = null,
) : BaseEntity() {
companion object {
const val TABLE_NAME = "sessions"
}
}

View file

@ -5,8 +5,12 @@ import androidx.room.Entity
import androidx.room.PrimaryKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
@Entity(tableName = "subjects")
@Entity(tableName = SubjectEntity.TABLE_NAME)
data class SubjectEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("name") val name: String,
) : BaseEntity()
) : BaseEntity() {
companion object {
const val TABLE_NAME = "subjects"
}
}

View file

@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
@Entity(
tableName = "tasks",
tableName = TaskEntity.TABLE_NAME,
foreignKeys = [
ForeignKey(
entity = SubjectEntity::class,
@ -22,5 +22,9 @@ data class TaskEntity (
@ColumnInfo("title") val title: String,
@ColumnInfo("description") val description: String? = null,
@ColumnInfo("subject_id") val subjectId: Long,
) : BaseEntity()
@ColumnInfo("subject_id", index = true) val subjectId: Long,
) : BaseEntity() {
companion object {
const val TABLE_NAME = "tasks"
}
}

View file

@ -1,15 +0,0 @@
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
// TODO(Faraphel): is this class really required ?
@Entity(tableName = "teachers")
data class TeacherEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("first_name") val firstName: String,
@ColumnInfo("last_name") val lastName: String,
) : BaseEntity()

View file

@ -7,37 +7,42 @@ import com.faraphel.tasks_valider.database.entities.base.BaseEntity
import java.time.Instant
@Entity(
tableName = "validations",
tableName = ValidationEntity.TABLE_NAME,
primaryKeys = [
"teacher_id",
"task_id",
"student_id",
"task_id",
],
foreignKeys = [
ForeignKey(
entity = TeacherEntity::class,
entity = PersonEntity::class,
parentColumns = ["id"],
childColumns = ["teacher_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = PersonEntity::class,
parentColumns = ["id"],
childColumns = ["student_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = TaskEntity::class,
parentColumns = ["id"],
childColumns = ["task_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = StudentEntity::class,
parentColumns = ["id"],
childColumns = ["student_id"],
onDelete = ForeignKey.CASCADE
),
]
)
data class ValidationEntity (
@ColumnInfo("date") val date: Instant,
@ColumnInfo("teacher_id") val teacherId: Long,
@ColumnInfo("task_id") val taskId: Long,
@ColumnInfo("student_id") val studentId: Long,
) : BaseEntity()
@ColumnInfo("teacher_id", index = true) val teacherId: Long,
@ColumnInfo("student_id", index = true) val studentId: Long,
@ColumnInfo("task_id", index = true) val taskId: Long,
) : BaseEntity() {
companion object {
const val TABLE_NAME = "validations"
}
}

View file

@ -1,14 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
// TODO(Faraphel): should be renamed to TeamEntity
@Entity(tableName = "groups")
data class GroupEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("name") val name: String? = null,
) : BaseEntity()

View file

@ -1,19 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
import java.util.Locale
import com.faraphel.tasks_valider.database.entities.base.BaseEntity
open class PersonEntity (
open val id: Long = 0,
open val firstName: String,
open val lastName: String,
) : BaseEntity() {
/**
Get the full name of the person
*/
val fullName: String
get() {
return "${firstName.capitalize(Locale.ROOT)} ${lastName.uppercase()}"
}
}

View file

@ -1,12 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "students")
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
) : PersonEntity(id, firstName, lastName)

View file

@ -1,13 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
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 TaskEntity (
@ColumnInfo("id") @PrimaryKey(autoGenerate = true) val id: Long = 0,
@ColumnInfo("title") val title: String,
@ColumnInfo("description") val description: String,
) : BaseEntity()

View file

@ -1,44 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
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
@Entity(
tableName = "task_group",
primaryKeys = [
"task_id",
"group_id"
],
foreignKeys = [
ForeignKey(
entity = GroupEntity::class,
parentColumns = ["id"],
childColumns = ["group_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = TaskEntity::class,
parentColumns = ["id"],
childColumns = ["task_id"],
onDelete = ForeignKey.CASCADE
),
ForeignKey(
entity = TeacherEntity::class,
parentColumns = ["id"],
childColumns = ["approval_teacher_id"],
onDelete = ForeignKey.CASCADE
),
]
)
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()

View file

@ -1,12 +0,0 @@
package com.faraphel.tasks_valider.database.entities._old
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "teachers")
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
) : PersonEntity(id, firstName, lastName)

View file

@ -16,7 +16,7 @@ import com.faraphel.tasks_valider.connectivity.task.TaskClient
import com.faraphel.tasks_valider.ui.screen.communication.DEFAULT_SERVER_ADDRESS
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.TaskGroupScreen
import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen
@Composable
@ -24,7 +24,7 @@ fun CommunicationInternetClientScreen(activity: Activity) {
val client = remember { mutableStateOf<TaskClient?>(null) }
if (client.value == null) CommunicationInternetClientContent(client)
else TaskGroupScreen(activity, client.value!!)
else TaskSessionScreen(activity, client.value!!)
}

View file

@ -21,7 +21,7 @@ import com.faraphel.tasks_valider.connectivity.task.TaskServer
import com.faraphel.tasks_valider.database.TaskDatabase
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.TaskGroupScreen
import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen
@Composable
@ -31,7 +31,7 @@ fun CommunicationInternetServerScreen(activity: Activity) {
// if the server is not created, prompt the user for the server configuration
if (client.value == null) CommunicationInternetServerContent(activity, client)
// else, go to the base tasks screen
else TaskGroupScreen(activity, client.value!!)
else TaskSessionScreen(activity, client.value!!)
}

View file

@ -22,7 +22,7 @@ import com.faraphel.tasks_valider.connectivity.task.TaskServer
import com.faraphel.tasks_valider.database.TaskDatabase
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.TaskGroupScreen
import com.faraphel.tasks_valider.ui.screen.task.TaskSessionScreen
@Composable
@ -32,7 +32,7 @@ fun CommunicationWifiP2pServerScreen(activity: Activity, bwfManager: BwfManager)
// if the server is not created, prompt the user for the server configuration
if (client.value == null) CommunicationWifiP2pServerContent(activity, bwfManager, client)
// else, go to the base tasks screen
else TaskGroupScreen(activity, client.value!!)
else TaskSessionScreen(activity, client.value!!)
}

View file

@ -1,28 +1,22 @@
package com.faraphel.tasks_valider.ui.screen.task
import android.app.Activity
import android.widget.Toast
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.database.entities._old.TaskGroupEntity
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
val jsonParser = Gson()
/**
* This screen let the user decide which student team he wants to interact with
* This screen represent a session
* @param activity the android activity
* @param client an HTTP client that can communicate with the server
*/
@Composable
fun TaskGroupScreen(activity: Activity, client: TaskClient) {
val groups = remember { mutableStateOf<List<TaskGroupEntity>?>(null) }
fun TaskSessionScreen(activity: Activity, client: TaskClient) {
Text("WIP : Session Screen")
/*
val students = remember { mutableStateOf<List<TaskGroupEntity>?>(null) }
// title
Text(text = "Task Group")
@ -37,9 +31,11 @@ fun TaskGroupScreen(activity: Activity, client: TaskClient) {
for (group in groups.value!!) {
Text(text = group.toString())
}
*/
}
/*
fun refreshGroups(activity: Activity, client: TaskClient, groups: MutableState<List<TaskGroupEntity>?>) {
// try to obtain the list of groups
val response = client.get("entities/group")
@ -55,4 +51,5 @@ fun refreshGroups(activity: Activity, client: TaskClient, groups: MutableState<L
response.body.toString(),
object : TypeToken<List<TaskGroupEntity>>(){}
)
}
}
*/

View file

@ -1,18 +0,0 @@
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._old.GroupEntity
@Composable
fun WidgetGroup(group: GroupEntity) {
// TODO
Column {
Text(text = group.name!!)
// group.tasks.forEach { task ->
// WidgetTask(task)
// }
}
}

View file

@ -1,15 +0,0 @@
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._old.TaskEntity
@Composable
fun WidgetTask(task: TaskEntity) {
// task information
Column {
Text(text = task.title)
Text(text = task.description)
}
}

View file

@ -1,55 +0,0 @@
package com.faraphel.tasks_valider.ui.widgets.task
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Checkbox
import androidx.compose.material3.Text
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._old.TaskGroupEntity
@Composable
fun WidgetTaskStudent(database: TaskDatabase, taskStudent: TaskGroupEntity) {
val teacherDao = database.teacherDao()
Column {
// row for this task
Row {
// task information
// TODO: WidgetTask(task = taskStudent.task)
// align the other columns to the right
Spacer(modifier = Modifier.weight(1f))
// task status
Checkbox(
checked = taskStudent.approvalStatus,
onCheckedChange = { status -> taskStudent.approvalStatus = status }
)
}
// if the task has been approved
if (taskStudent.approvalStatus) {
Row (
modifier = Modifier.fillMaxSize(),
horizontalArrangement = Arrangement.Center
) {
// teacher who approved the task
Text(text = teacherDao.getById(taskStudent.approvalTeacherId!!).fullName)
// align the other columns to the right
Spacer(modifier = Modifier.width(16.dp))
// date of approval
Text(text = taskStudent.approvalTime.toString())
}
}
}
}