From 1d1b7a30f350106566b165d3bbd4da26ba1bb90c Mon Sep 17 00:00:00 2001 From: vextrixes <113197359+vextrixes@users.noreply.github.com> Date: Sat, 31 Oct 2026 02:29:22 +0100 Subject: [PATCH] added absence endpoints --- src/absence.rs | 43 ------------- src/absence/absence.rs | 132 +++++++++++++++++++++++++++++++++++++++ src/absence/endpoints.rs | 36 +++++++++++ src/absence/mod.rs | 5 ++ src/endpoints.rs | 6 ++ tracker.md | 8 +-- 6 files changed, 183 insertions(+), 47 deletions(-) delete mode 100644 src/absence.rs create mode 100644 src/absence/absence.rs create mode 100644 src/absence/endpoints.rs create mode 100644 src/absence/mod.rs diff --git a/src/absence.rs b/src/absence.rs deleted file mode 100644 index ebfe0d1..0000000 --- a/src/absence.rs +++ /dev/null @@ -1,43 +0,0 @@ -use chrono::FixedOffset; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct StudentAbsenceOverviewResponse { - pub percentage_threshold: f64, //TODO: cutom type (u8) - pub absences: Vec, - pub absences_per_subject: Option>, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct AbsenceDay { - pub date: chrono::DateTime, - pub unsolved: u16, - pub ok: u16, - pub missed: u16, - pub late: u16, - pub soon: u16, - pub school: u16, - pub distance_teaching: u16, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct SubjectAbsence { - pub subject_name: String, - pub lessons_count: u16, - pub base: u16, - pub late: u16, - pub soon: u16, - pub school: u16, - pub distance_teaching: u16, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct SubjectAbsenceOverviewResponse { - pub percentage_threshold: f64, - pub absences: Option>, - pub absences_per_subject: Option>, -} diff --git a/src/absence/absence.rs b/src/absence/absence.rs new file mode 100644 index 0000000..1cafb2e --- /dev/null +++ b/src/absence/absence.rs @@ -0,0 +1,132 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +use crate::{Hour, StdType, StdTypeNullable}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct StudentAbsenceOverviewResponse { + pub percentage_threshold: f64, //TODO: cutom type (u8) + pub absences: Vec, + pub absences_per_subject: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceDay { + pub date: chrono::DateTime, + pub unsolved: u16, + pub ok: u16, + pub missed: u16, + pub late: u16, + pub soon: u16, + pub school: u16, + pub distance_teaching: u16, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SubjectAbsence { + pub subject_name: String, + pub lessons_count: u16, + pub base: u16, + pub late: u16, + pub soon: u16, + pub school: u16, + pub distance_teaching: u16, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SubjectAbsenceOverviewResponse { + pub percentage_threshold: f64, + pub absences: Option>, + pub absences_per_subject: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct StudentTimetableAbsenceResponse { + pub student: Option, + pub days: Vec, + pub absent_type_options: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceTypeOption { + pub absent_type: AbsentType, + pub absent_kind_enabled: bool, + pub absent_kind_required: bool, + pub absent_note_enabled: bool, + pub next_absent_type: AbsentType, + pub absent_kinds: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum AbsentType { + Absent, + AbsentLate, + AbsentMiss, + AbsentOk, + AbsentSchool, + AbsentSoon, + DistanceTeaching, + NoAbsent, +} + +type StudentInfo = StdTypeNullable; +type AbsenceKind = StdType; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceSubject { + pub id: String, + pub abbrev: Option, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceDayResponse { + pub date: DateTime, + pub absences: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Absence { + pub minutes: i64, + pub absent_type: AbsentType, + pub hour_id: String, + pub start: i64, + pub duration: i64, + pub hour_index: Option, + pub absent_kind_id: Option, + pub notice: Option, + pub student_id: Option, + pub subject: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ExcuseAbsenceResponse { + pub absences: Vec, + pub hours: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceRecord { + pub minutes: i64, + pub absent_type: AbsentType, + pub hour_id: Option, + pub date: DateTime, + pub start: i64, + pub duration: i64, + pub absent_kind_id: Option, + pub notice: Option, + pub student_id: Option, + pub apology_id: Option, +} diff --git a/src/absence/endpoints.rs b/src/absence/endpoints.rs new file mode 100644 index 0000000..1b70b8a --- /dev/null +++ b/src/absence/endpoints.rs @@ -0,0 +1,36 @@ +use std::marker::PhantomData; + +use crate::{ + ContentType, Endpoint, ExcuseAbsenceResponse, StudentAbsenceOverviewResponse, + StudentTimetableAbsenceResponse, +}; + +pub const CAN_STUDENT_EXCUSE_ABSENCE_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/absence/canexcuse/{studentId}", + auth: true, + _types: PhantomData, +}; + +pub const GET_STUDENT_ABSENCE_ENDPOINT: Endpoint = + Endpoint::Get { + url: "/api/3/absence/student", + auth: true, + _types: PhantomData, + }; + +pub const GET_STUDENT_TIMETABLE_WITH_ABSENCES_ENDPOINT: Endpoint< + StudentTimetableAbsenceResponse, + (), +> = Endpoint::Get { + url: "/api/3/timetable/student/{studentId}", + auth: true, + _types: PhantomData, +}; + +pub const EXCUSE_KOMENS_ABSENCE_ENDPOINT: Endpoint = Endpoint::Put { + //TODO unknown behaviour (and request type) // probably bsenceRecord or AbsenceRecordWithSubject + url: "/api/3/absence", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; diff --git a/src/absence/mod.rs b/src/absence/mod.rs new file mode 100644 index 0000000..d7fb00d --- /dev/null +++ b/src/absence/mod.rs @@ -0,0 +1,5 @@ +mod absence; +mod endpoints; + +pub use absence::*; +pub use endpoints::*; diff --git a/src/endpoints.rs b/src/endpoints.rs index b26ae89..9c7a8a1 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -12,6 +12,12 @@ pub enum Endpoint { content_type: ContentType, _types: PhantomData (Response, Request)>, }, + Put { + url: &'static str, + auth: bool, + content_type: ContentType, + _types: PhantomData (Response, Request)>, + }, } pub enum ContentType { diff --git a/tracker.md b/tracker.md index 09b0cf3..88b56c5 100644 --- a/tracker.md +++ b/tracker.md @@ -34,7 +34,7 @@ - [x] /api/3/payments/classfund/teacher/students/:classId - [ ] /api/3/classbook/lessonTags - [ ] /api/3/komens/messages/rating/:messageId -- [ ] /api/3/absence/student +- [x] /api/3/absence/student - [ ] /api/3/webmodule - [ ] /api/3/timetable/actual - [x] /api/3/payments/classfund/teacher/document/detail/:documentId @@ -67,7 +67,7 @@ - [ ] /api/3/komens/message/:messageId/mark-as-unhidden - [ ] /api/3/lesson/:lessonId/studentsTimetable - [ ] /api/3/marks/final -- [ ] /api/3/timetable/student/:studentId +- [x] /api/3/timetable/student/:studentId - [ ] /api/3/marking/atom/:atomId/headerOptions - [ ] /api/3/gdpr/consent/:id/disagree - [ ] /api/3/komens/messages/sent @@ -84,7 +84,7 @@ - [ ] /api/3/timetable/actual/class/:classId - [ ] /api/3/gdpr/consents/person - [ ] /api/3/komens/messages/unread -- [ ] /api/3/absence +- [x] /api/3/absence - [ ] /api/3/komens/message/:messageId/mark-as-confirmed - [ ] /api/3/komens/messages/apology - [x] /api/3/events @@ -99,7 +99,7 @@ - [ ] /api/3/gdpr/consent/:id/revoke-request - [x] /api/3/payments/regularpayments/teacher/prescriptions/:prescriptionId/students/:studentId - [ ] /api/3/marking/atoms -- [ ] /api/3/absence/canexcuse/:studentId +- [x] /api/3/absence/canexcuse/:studentId - [ ] /api/3/komens/rating-templates - [ ] /api/3/emergency/participantsselection - [ ] /api/3/komens/messages/noticeboard/unread