added absence endpoints

This commit is contained in:
vextrixes committed 2026-10-31 02:29:22 +01:00
1 parent 6236099ae1
commit 1d1b7a30f3
6 files changed
+183 -47

No files matched your search

-43
View File
@@ -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<AbsenceDay>,
pub absences_per_subject: Option<Vec<SubjectAbsence>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct AbsenceDay {
pub date: chrono::DateTime<FixedOffset>,
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<Vec<AbsenceDay>>,
pub absences_per_subject: Option<Vec<SubjectAbsence>>,
}
+132
View File
@@ -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<AbsenceDay>,
pub absences_per_subject: Option<Vec<SubjectAbsence>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct AbsenceDay {
pub date: chrono::DateTime<FixedOffset>,
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<Vec<AbsenceDay>>,
pub absences_per_subject: Option<Vec<SubjectAbsence>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct StudentTimetableAbsenceResponse {
pub student: Option<StudentInfo>,
pub days: Vec<AbsenceDayResponse>,
pub absent_type_options: Vec<AbsenceTypeOption>,
}
#[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<AbsenceKind>,
}
#[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<String>,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct AbsenceDayResponse {
pub date: DateTime<FixedOffset>,
pub absences: Vec<Absence>,
}
#[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<i64>,
pub absent_kind_id: Option<String>,
pub notice: Option<String>,
pub student_id: Option<String>,
pub subject: Option<AbsenceSubject>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ExcuseAbsenceResponse {
pub absences: Vec<AbsenceRecord>,
pub hours: Vec<Hour>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct AbsenceRecord {
pub minutes: i64,
pub absent_type: AbsentType,
pub hour_id: Option<String>,
pub date: DateTime<FixedOffset>,
pub start: i64,
pub duration: i64,
pub absent_kind_id: Option<String>,
pub notice: Option<String>,
pub student_id: Option<String>,
pub apology_id: Option<String>,
}
+36
View File
@@ -0,0 +1,36 @@
use std::marker::PhantomData;
use crate::{
ContentType, Endpoint, ExcuseAbsenceResponse, StudentAbsenceOverviewResponse,
StudentTimetableAbsenceResponse,
};
pub const CAN_STUDENT_EXCUSE_ABSENCE_ENDPOINT: Endpoint<bool, ()> = Endpoint::Get {
url: "/api/3/absence/canexcuse/{studentId}",
auth: true,
_types: PhantomData,
};
pub const GET_STUDENT_ABSENCE_ENDPOINT: Endpoint<StudentAbsenceOverviewResponse, ()> =
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<ExcuseAbsenceResponse, ()> = Endpoint::Put {
//TODO unknown behaviour (and request type) // probably bsenceRecord or AbsenceRecordWithSubject
url: "/api/3/absence",
auth: true,
content_type: ContentType::Json,
_types: PhantomData,
};
+5
View File
@@ -0,0 +1,5 @@
mod absence;
mod endpoints;
pub use absence::*;
pub use endpoints::*;
+6
View File
@@ -12,6 +12,12 @@ pub enum Endpoint<Response, Request> {
content_type: ContentType,
_types: PhantomData<fn() -> (Response, Request)>,
},
Put {
url: &'static str,
auth: bool,
content_type: ContentType,
_types: PhantomData<fn() -> (Response, Request)>,
},
}
pub enum ContentType {
+4 -4
View File
@@ -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