diff --git a/src/absence.rs b/src/absence.rs deleted file mode 100644 index 389725e..0000000 --- a/src/absence.rs +++ /dev/null @@ -1,35 +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, -} diff --git a/src/absence/absence.rs b/src/absence/absence.rs new file mode 100644 index 0000000..5a8b2d4 --- /dev/null +++ b/src/absence/absence.rs @@ -0,0 +1,17 @@ +use crate::{AbsentType, StdTypeAbbrevNullable}; +use serde::{Deserialize, Serialize}; + +#[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, +} diff --git a/src/absence/absence_day.rs b/src/absence/absence_day.rs new file mode 100644 index 0000000..b89e2d5 --- /dev/null +++ b/src/absence/absence_day.rs @@ -0,0 +1,15 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceDay { + pub date: DateTime, + pub unsolved: u16, + pub ok: u16, + pub missed: u16, + pub late: u16, + pub soon: u16, + pub school: u16, + pub distance_teaching: u16, +} diff --git a/src/absence/absence_day_response.rs b/src/absence/absence_day_response.rs new file mode 100644 index 0000000..5072264 --- /dev/null +++ b/src/absence/absence_day_response.rs @@ -0,0 +1,10 @@ +use crate::Absence; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceDayResponse { + pub date: DateTime, + pub absences: Vec, +} diff --git a/src/absence/absence_overview_response.rs b/src/absence/absence_overview_response.rs new file mode 100644 index 0000000..56d5975 --- /dev/null +++ b/src/absence/absence_overview_response.rs @@ -0,0 +1,10 @@ +use crate::{AbsenceDay, SubjectAbsence}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AbsenceOverviewResponse { + pub percentage_threshold: f64, //TODO: cutom type (u8) + pub absences: Vec, + pub absences_per_subject: Option>, +} diff --git a/src/absence/absence_record.rs b/src/absence/absence_record.rs new file mode 100644 index 0000000..e1fdd82 --- /dev/null +++ b/src/absence/absence_record.rs @@ -0,0 +1,18 @@ +use crate::AbsentType; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[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/absence_type_option.rs b/src/absence/absence_type_option.rs new file mode 100644 index 0000000..9d4495e --- /dev/null +++ b/src/absence/absence_type_option.rs @@ -0,0 +1,13 @@ +use crate::{AbsentType, StdType}; +use serde::{Deserialize, Serialize}; + +#[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, +} diff --git a/src/absence/absent_type.rs b/src/absence/absent_type.rs new file mode 100644 index 0000000..3fe4bd1 --- /dev/null +++ b/src/absence/absent_type.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum AbsentType { + Absent, + AbsentLate, + AbsentMiss, + AbsentOk, + AbsentSchool, + AbsentSoon, + DistanceTeaching, + NoAbsent, +} diff --git a/src/absence/endpoints.rs b/src/absence/endpoints.rs new file mode 100644 index 0000000..e18c6ac --- /dev/null +++ b/src/absence/endpoints.rs @@ -0,0 +1,34 @@ +use crate::{ + AbsenceOverviewResponse, ContentType, Endpoint, ExcuseAbsenceResponse, + StudentTimetableAbsenceResponse, +}; +use std::marker::PhantomData; + +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 absenceRecord or AbsenceRecordWithSubject + url: "/api/3/absence", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; diff --git a/src/absence/excuse_absence_response.rs b/src/absence/excuse_absence_response.rs new file mode 100644 index 0000000..feccfa8 --- /dev/null +++ b/src/absence/excuse_absence_response.rs @@ -0,0 +1,9 @@ +use crate::{AbsenceRecord, Hour}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ExcuseAbsenceResponse { + pub absences: Vec, + pub hours: Vec, +} diff --git a/src/absence/mod.rs b/src/absence/mod.rs new file mode 100644 index 0000000..6be0793 --- /dev/null +++ b/src/absence/mod.rs @@ -0,0 +1,23 @@ +mod absence; +mod absence_day; +mod absence_day_response; +mod absence_overview_response; +mod absence_record; +mod absence_type_option; +mod absent_type; +mod endpoints; +mod excuse_absence_response; +mod student_timetable_absence_response; +mod subject_absence; + +pub use absence::*; +pub use absence_day::*; +pub use absence_day_response::*; +pub use absence_overview_response::*; +pub use absence_record::*; +pub use absence_type_option::*; +pub use absent_type::*; +pub use endpoints::*; +pub use excuse_absence_response::*; +pub use student_timetable_absence_response::*; +pub use subject_absence::*; diff --git a/src/absence/student_timetable_absence_response.rs b/src/absence/student_timetable_absence_response.rs new file mode 100644 index 0000000..d865f18 --- /dev/null +++ b/src/absence/student_timetable_absence_response.rs @@ -0,0 +1,10 @@ +use crate::{AbsenceDayResponse, AbsenceTypeOption, StdTypeNullable}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct StudentTimetableAbsenceResponse { + pub student: Option, + pub days: Vec, + pub absent_type_options: Vec, +} diff --git a/src/absence/subject_absence.rs b/src/absence/subject_absence.rs new file mode 100644 index 0000000..4f01c3d --- /dev/null +++ b/src/absence/subject_absence.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[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, +} diff --git a/src/auth/endpoints.rs b/src/auth/endpoints.rs new file mode 100644 index 0000000..3a0db5f --- /dev/null +++ b/src/auth/endpoints.rs @@ -0,0 +1,21 @@ +use crate::{ContentType, Endpoint, LoginSuccess, OpenIdDiscovery, auth::login::LoginRequest}; +use std::marker::PhantomData; + +pub const LOGIN_ENDPOINT: Endpoint = Endpoint::Post { + url: "/api/login", + auth: false, + content_type: ContentType::Urlencoded, + _types: PhantomData, +}; + +pub const OPEN_ID_DISCOVERY_ENDPOINT: Endpoint = Endpoint::Get { + url: "/.well-known/openid-configuration", + auth: false, + _types: PhantomData, +}; + +pub const LOGIN_TOKEN_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/logintoken", + auth: true, + _types: PhantomData, +}; diff --git a/src/auth/login.rs b/src/auth/login.rs index c7716c8..6da5c95 100644 --- a/src/auth/login.rs +++ b/src/auth/login.rs @@ -15,6 +15,15 @@ pub struct LoginSuccess { pub app_version: String, } +#[derive(Debug, Clone, Serialize, Deserialize)] // TODO: evaluate removing or changing debug here +#[serde(rename_all = "snake_case")] +pub struct LoginRequest { + pub client_id: String, + pub grant_type: String, + pub username: String, + pub password: String, +} + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum TokenType { diff --git a/src/auth/mod.rs b/src/auth/mod.rs index 6da0d2a..c897508 100644 --- a/src/auth/mod.rs +++ b/src/auth/mod.rs @@ -1,7 +1,9 @@ +mod endpoints; mod login; mod open_id_discovery; mod user_jwt_claim; -pub use login::{LoginSuccess, TokenType}; -pub use open_id_discovery::OpenIdDiscovery; -pub use user_jwt_claim::UserJwtClaim; +pub use endpoints::*; +pub use login::*; +pub use open_id_discovery::*; +pub use user_jwt_claim::*; diff --git a/src/endpoints.rs b/src/endpoints.rs new file mode 100644 index 0000000..7691458 --- /dev/null +++ b/src/endpoints.rs @@ -0,0 +1,27 @@ +use std::marker::PhantomData; + +pub enum Endpoint { + //TODO: better url handling. (defining api version/is base url used/query/url params) + Get { + url: &'static str, + auth: bool, + _types: PhantomData (Response, Request)>, + }, + Post { + url: &'static str, + auth: bool, + content_type: ContentType, + _types: PhantomData (Response, Request)>, + }, + Put { + url: &'static str, + auth: bool, + content_type: ContentType, + _types: PhantomData (Response, Request)>, + }, +} + +pub enum ContentType { + Urlencoded, + Json, +} diff --git a/src/error.rs b/src/error.rs deleted file mode 100644 index 8eb4723..0000000 --- a/src/error.rs +++ /dev/null @@ -1,24 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Error { - pub message: String, - pub model_state: ModelState, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ModelState { - #[serde(rename = "$type")] - pub type_name: String, - #[serde(rename = "from")] - pub from: StringArray, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct StringArray { - #[serde(rename = "$type")] - pub type_name: String, - #[serde(rename = "$values")] - pub values: Vec, -} diff --git a/src/events.rs b/src/events.rs deleted file mode 100644 index 9c35ef5..0000000 --- a/src/events.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::{Room, RoomSet, SchoolClass, SchoolClassSet, StdType, Student, Teacher, TeacherSet}; -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Events { - pub events: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Event { - pub id: String, - pub title: String, - pub description: String, - pub event_type: EventType, - pub times: Vec, - pub classes: Vec, - pub class_sets: Vec, - pub teachers: Vec, - pub teacher_sets: Vec, - pub rooms: Vec, - pub room_sets: Vec, - pub students: Vec, - pub note: Option, - pub date_changed: DateTime, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct EventTime { - pub whole_day: bool, - pub start_time: Option>, - pub end_time: Option>, -} - -pub type EventType = StdType; diff --git a/src/events/endpoints.rs b/src/events/endpoints.rs new file mode 100644 index 0000000..df6da5e --- /dev/null +++ b/src/events/endpoints.rs @@ -0,0 +1,14 @@ +use crate::{Endpoint, Events}; +use std::marker::PhantomData; + +pub const EVENTS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/events", + auth: true, + _types: PhantomData, +}; + +pub const MY_EVENTS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/events/my", + auth: true, + _types: PhantomData, +}; diff --git a/src/events/event.rs b/src/events/event.rs new file mode 100644 index 0000000..4eb3dfa --- /dev/null +++ b/src/events/event.rs @@ -0,0 +1,28 @@ +use crate::{EventTime, StdType}; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Event { + pub id: String, + pub title: String, + pub description: String, + pub event_type: StdType, + pub times: Vec, + pub classes: Vec, + pub class_sets: Vec, + pub teachers: Vec, + pub teacher_sets: Vec, + pub rooms: Vec, + pub room_sets: Vec, + pub students: Vec, + pub note: Option, + pub date_changed: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Events { + pub events: Vec, +} diff --git a/src/events/event_time.rs b/src/events/event_time.rs new file mode 100644 index 0000000..72f2b0b --- /dev/null +++ b/src/events/event_time.rs @@ -0,0 +1,10 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct EventTime { + pub whole_day: bool, + pub start_time: Option>, + pub end_time: Option>, +} diff --git a/src/events/mod.rs b/src/events/mod.rs new file mode 100644 index 0000000..1581bb1 --- /dev/null +++ b/src/events/mod.rs @@ -0,0 +1,7 @@ +mod endpoints; +mod event; +mod event_time; + +pub use endpoints::*; +pub use event::*; +pub use event_time::*; diff --git a/src/gdpr.rs b/src/gdpr.rs deleted file mode 100644 index 959f4ee..0000000 --- a/src/gdpr.rs +++ /dev/null @@ -1,72 +0,0 @@ -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -use crate::UserType; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct GdprCommissioners { - pub commissioners: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct GdprCommissioner { - pub id: String, - pub name: String, - pub mobile: String, - pub phone: String, - pub email: String, - pub web: Option, - pub data_box: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct GdprConsent { - pub id: i64, - pub person_type: UserType, - pub person_id: String, - pub created: DateTime, - pub validity: GdprValidity, - pub valid_from: DateTime, - pub state: GdprConsentState, - pub title: Option, - pub personal_data: Option, - pub usage_purpose: Option, - pub valid_to: Option>, - pub valid_years: Option, - pub rights: Option, - pub body: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum GdprValidity { - EndOfStudy, - EndOfStudyPlusYears, - ToAppeal, - Unknown, - Validity, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum GdprConsentState { - Agreed, - Cancelled, - Disagreed, - Expired, - NewConsent, - RevokeRequested, - Revoked, - Unknown, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct GdprConsentRights { - pub can_agree: bool, - pub can_disagree: bool, - pub can_revoke_request: bool, -} diff --git a/src/gdpr/endpoints.rs b/src/gdpr/endpoints.rs new file mode 100644 index 0000000..6d4bf56 --- /dev/null +++ b/src/gdpr/endpoints.rs @@ -0,0 +1,62 @@ +use crate::{ContentType, Endpoint, GdprCommissioners, GdprConsents}; +use std::marker::PhantomData; + +pub const SEND_GDPR_OBJECTION_ENDPOINT: Endpoint<(), String> = Endpoint::Post { + url: "/api/3/gdpr/commissioner/send-objection", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const GDPR_CONSENT_REVOKE_ENDPOINT: Endpoint<(), ()> = Endpoint::Put { + url: "/api/3/gdpr/consent/{id}/revoke-request", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const GDPR_CONSENT_AGREE_ENDPOINT: Endpoint<(), ()> = Endpoint::Put { + url: "/api/3/gdpr/consent/{id}/agree", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const GDPR_CONSENT_DISAGREE_ENDPOINT: Endpoint<(), ()> = Endpoint::Put { + url: "/api/3/gdpr/consent/{id}/disagree", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const GDPR_CONSENTS_COUNT_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/gdpr/consents/person/new", + auth: true, + _types: PhantomData, +}; + +pub const SEND_GDPR_REPORT_ENDPOINT: Endpoint<(), ()> = Endpoint::Post { + // unknown request type + url: "/api/3/gdpr/commissioner/send-report", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const GET_GDPR_COMMISSIONERS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/gdpr/commissioners", + auth: true, + _types: PhantomData, +}; + +pub const GET_GDPR_CHILD_CONSENTS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/gdpr/consents/person/child", + auth: true, + _types: PhantomData, +}; + +pub const GET_GDPR_CONSENTS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/gdpr/consents/person", + auth: true, + _types: PhantomData, +}; diff --git a/src/gdpr/gdpr_commissioner.rs b/src/gdpr/gdpr_commissioner.rs new file mode 100644 index 0000000..af45456 --- /dev/null +++ b/src/gdpr/gdpr_commissioner.rs @@ -0,0 +1,19 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct GdprCommissioner { + pub id: String, + pub name: String, + pub mobile: String, + pub phone: String, + pub email: String, + pub web: Option, + pub data_box: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct GdprCommissioners { + pub commissioners: Vec, +} diff --git a/src/gdpr/gdpr_consent.rs b/src/gdpr/gdpr_consent.rs new file mode 100644 index 0000000..b9c8b71 --- /dev/null +++ b/src/gdpr/gdpr_consent.rs @@ -0,0 +1,28 @@ +use crate::{GdprConsentRights, GdprConsentState, GdprValidity, UserType}; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct GdprConsent { + pub id: i64, + pub person_type: UserType, + pub person_id: String, + pub created: DateTime, + pub validity: GdprValidity, + pub valid_from: DateTime, + pub state: GdprConsentState, + pub title: Option, + pub personal_data: Option, + pub usage_purpose: Option, + pub valid_to: Option>, + pub valid_years: Option, + pub rights: Option, + pub body: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct GdprConsents { + pub person_consents: Vec, +} diff --git a/src/gdpr/gdpr_consent_rights.rs b/src/gdpr/gdpr_consent_rights.rs new file mode 100644 index 0000000..6a05b9b --- /dev/null +++ b/src/gdpr/gdpr_consent_rights.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct GdprConsentRights { + pub can_agree: bool, + pub can_disagree: bool, + pub can_revoke_request: bool, +} diff --git a/src/gdpr/gdpr_consent_state.rs b/src/gdpr/gdpr_consent_state.rs new file mode 100644 index 0000000..ecf60d1 --- /dev/null +++ b/src/gdpr/gdpr_consent_state.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum GdprConsentState { + Agreed, + Cancelled, + Disagreed, + Expired, + NewConsent, + RevokeRequested, + Revoked, + Unknown, +} diff --git a/src/gdpr/gdpr_validity.rs b/src/gdpr/gdpr_validity.rs new file mode 100644 index 0000000..4c69ab7 --- /dev/null +++ b/src/gdpr/gdpr_validity.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum GdprValidity { + EndOfStudy, + EndOfStudyPlusYears, + ToAppeal, + Unknown, + Validity, +} diff --git a/src/gdpr/mod.rs b/src/gdpr/mod.rs new file mode 100644 index 0000000..4495940 --- /dev/null +++ b/src/gdpr/mod.rs @@ -0,0 +1,13 @@ +mod endpoints; +mod gdpr_commissioner; +mod gdpr_consent; +mod gdpr_consent_rights; +mod gdpr_consent_state; +mod gdpr_validity; + +pub use endpoints::*; +pub use gdpr_commissioner::*; +pub use gdpr_consent::*; +pub use gdpr_consent_rights::*; +pub use gdpr_consent_state::*; +pub use gdpr_validity::*; diff --git a/src/homework/endpoints.rs b/src/homework/endpoints.rs new file mode 100644 index 0000000..b0a74f7 --- /dev/null +++ b/src/homework/endpoints.rs @@ -0,0 +1,23 @@ +use crate::{Endpoint, Homeworks}; +use std::marker::PhantomData; + +pub const HOMEWORKS_COUNT_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/homeworks/count-actual", + auth: true, + _types: PhantomData, +}; + +/// ID = homework ID (String) +/// finished = homework state (bool) +pub const HOMEWORK_DONE_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/homeworks/{id}/student-done/{finished}", + auth: true, + _types: PhantomData, +}; + +/// Query 'from' and 'to' (Datetime) +pub const HOMEWORKS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/homeworks", + auth: true, + _types: PhantomData, +}; diff --git a/src/homework.rs b/src/homework/homeworks.rs similarity index 69% rename from src/homework.rs rename to src/homework/homeworks.rs index 3fea919..f44e107 100644 --- a/src/homework.rs +++ b/src/homework/homeworks.rs @@ -1,17 +1,10 @@ +use crate::{AttachmentInfo, StdType}; use chrono::{DateTime, FixedOffset}; use serde::{Deserialize, Serialize}; -use crate::{AttachmentInfo, StdType}; - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] -pub struct HomeworkList { - pub homeworks: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct HomeworkListItem { +pub struct Homework { #[serde(rename = "ID")] pub id: String, pub date_start: DateTime, @@ -22,10 +15,16 @@ pub struct HomeworkListItem { pub closed: bool, pub electronic: bool, //check existance pub hour: i64, - pub class: StdType, //HomeworkSchoolClass - pub group: StdType, //HomeworkSchoolGroup - pub subject: StdType, //HomeworkSchoolSubject - pub teacher: StdType, //HomeworkTeacher + pub class: StdType, + pub group: StdType, + pub subject: StdType, + pub teacher: StdType, pub attachments: Vec, pub finished: bool, } + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Homeworks { + pub homeworks: Vec, +} diff --git a/src/homework/mod.rs b/src/homework/mod.rs new file mode 100644 index 0000000..a461b3c --- /dev/null +++ b/src/homework/mod.rs @@ -0,0 +1,5 @@ +mod endpoints; +mod homeworks; + +pub use endpoints::*; +pub use homeworks::*; diff --git a/src/lib.rs b/src/lib.rs index dbaec2d..6b2622f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,8 @@ mod absence; -mod api_info; -mod attachment; +mod others; //campaign mod auth; -mod campaign; -mod error; +mod endpoints; mod events; mod gdpr; //komens @@ -18,35 +16,23 @@ mod subjects; mod substitutions; mod teaching; mod timetable; -mod user; //TODOS +mod user; //webmodules //predictor -pub use absence::{AbsenceDay, StudentAbsenceOverviewResponse, SubjectAbsence}; -pub use api_info::ApiInfo; -pub use attachment::AttachmentInfo; +pub use absence::*; pub use auth::*; -pub use campaign::Campaign; -pub use error::{Error, ModelState, StringArray}; -pub use events::{Event, EventTime, EventType, Events}; -pub use gdpr::{ - GdprCommissioner, GdprCommissioners, GdprConsent, GdprConsentRights, GdprConsentState, - GdprValidity, -}; -pub use homework::{HomeworkList, HomeworkListItem}; -pub use marks::{Mark, MarkConfirmationStatus, Marks, SubjectMarks}; +pub use endpoints::*; +pub use events::*; +pub use gdpr::*; +pub use homework::*; +pub use marks::*; +pub use others::*; pub use payments::*; -pub use semester::{ - CertificateTerm, CertificateTerms, FinalMark, PedagogicalMeasure, PedagogicalMeasures, -}; -pub use stdtype::{ - Room, RoomSet, SchoolClass, SchoolClassSet, StdClassGroup, StdType, StdTypeNullable, Student, - Teacher, TeacherSet, TimetableStudent, -}; -pub use subjects::{Subject, Subjects}; -pub use substitutions::{ - ChangeDisplayType, ChangeLessonInfo, SubstitutionChange, SubstitutionChangeType, Substitutions, -}; -pub use teaching::{Lesson, Teaching, TeachingTheme}; +pub use semester::*; +pub use stdtype::*; +pub use subjects::*; +pub use substitutions::*; +pub use teaching::*; pub use timetable::*; pub use user::*; diff --git a/src/marks/endpoints.rs b/src/marks/endpoints.rs new file mode 100644 index 0000000..54dcf05 --- /dev/null +++ b/src/marks/endpoints.rs @@ -0,0 +1,21 @@ +use crate::{ContentType, Endpoint, Marks}; +use std::marker::PhantomData; + +pub const CONFIRM_MARKS_ENDPOINT: Endpoint<(), Vec> = Endpoint::Post { + url: "/api/3/marks/SetClassificationConfirmation", + auth: true, + content_type: ContentType::Json, + _types: PhantomData, +}; + +pub const COUNT_NEW_MARKS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/marks/count-new", + auth: true, + _types: PhantomData, +}; + +pub const MARKS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/marks", + auth: true, + _types: PhantomData, +}; diff --git a/src/marks.rs b/src/marks/mark.rs similarity index 54% rename from src/marks.rs rename to src/marks/mark.rs index 3c02a26..9eadcf8 100644 --- a/src/marks.rs +++ b/src/marks/mark.rs @@ -1,33 +1,13 @@ +use crate::MarkConfirmationStatus; use chrono::{DateTime, FixedOffset}; use serde::{Deserialize, Serialize}; -use crate::StdType; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Marks { - pub subjects: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct SubjectMarks { - pub marks: Vec, - pub points_only: bool, - pub mark_prediction_enabled: bool, - pub subject: StdType, - pub average_text: Option, - pub temporary_mark: Option, - pub subject_note: Option, - pub temporary_mark_note: Option, -} - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Mark { pub mark_date: DateTime, pub edit_date: DateTime, - pub is_invalid_date: Option, + pub is_invalid_date: bool, pub teacher_id: Option, pub subject_id: String, pub is_new: bool, @@ -49,12 +29,3 @@ pub struct Mark { pub confirmed_by: Option, pub verbal_evaluation: Option, } - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum MarkConfirmationStatus { - Confirmed, - DoesNotRequireConfirmation, - Unconfirmed, - UnconfirmedAfterChange, -} diff --git a/src/marks/mark_confirmation_status.rs b/src/marks/mark_confirmation_status.rs new file mode 100644 index 0000000..2a16167 --- /dev/null +++ b/src/marks/mark_confirmation_status.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum MarkConfirmationStatus { + Confirmed, + DoesNotRequireConfirmation, + Unconfirmed, + UnconfirmedAfterChange, +} diff --git a/src/marks/mod.rs b/src/marks/mod.rs new file mode 100644 index 0000000..aa07d14 --- /dev/null +++ b/src/marks/mod.rs @@ -0,0 +1,9 @@ +mod endpoints; +mod mark; +mod mark_confirmation_status; +mod subject_marks; + +pub use endpoints::*; +pub use mark::*; +pub use mark_confirmation_status::*; +pub use subject_marks::*; diff --git a/src/marks/subject_marks.rs b/src/marks/subject_marks.rs new file mode 100644 index 0000000..474d498 --- /dev/null +++ b/src/marks/subject_marks.rs @@ -0,0 +1,21 @@ +use crate::{Mark, StdType}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SubjectMarks { + pub marks: Vec, + pub points_only: bool, + pub mark_prediction_enabled: bool, + pub subject: StdType, + pub average_text: Option, + pub temporary_mark: Option, + pub subject_note: Option, + pub temporary_mark_note: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Marks { + pub subjects: Vec, +} diff --git a/src/api_info.rs b/src/others/api_info.rs similarity index 100% rename from src/api_info.rs rename to src/others/api_info.rs diff --git a/src/attachment.rs b/src/others/attachment.rs similarity index 100% rename from src/attachment.rs rename to src/others/attachment.rs diff --git a/src/campaign.rs b/src/others/campaign.rs similarity index 100% rename from src/campaign.rs rename to src/others/campaign.rs diff --git a/src/others/endpoints.rs b/src/others/endpoints.rs new file mode 100644 index 0000000..d3d361c --- /dev/null +++ b/src/others/endpoints.rs @@ -0,0 +1,14 @@ +use crate::{ApiInfo, Endpoint}; +use std::marker::PhantomData; + +pub const API_V3_INFO_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3", + auth: false, + _types: PhantomData, +}; + +pub const APIS_INFO_ENDPOINT: Endpoint, ()> = Endpoint::Get { + url: "/api", + auth: false, + _types: PhantomData, +}; diff --git a/src/others/mod.rs b/src/others/mod.rs new file mode 100644 index 0000000..b37524e --- /dev/null +++ b/src/others/mod.rs @@ -0,0 +1,9 @@ +mod api_info; +mod attachment; +mod campaign; +mod endpoints; + +pub use api_info::*; +pub use attachment::*; +pub use campaign::*; +pub use endpoints::*; diff --git a/src/payments.rs b/src/payments.rs deleted file mode 100644 index ac73533..0000000 --- a/src/payments.rs +++ /dev/null @@ -1,217 +0,0 @@ -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassfundSummary { - pub student_name_with_class: Option, - pub balance: f64, - pub spent: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundPaymentInfo { - instructions: Option, - bank_account: Option, - variable_symbol: Option, - specific_symbol: i64, - amount: f64, - message: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundRecord { - description: Option, - date: DateTime, - amount: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundSummary { - student_name_with_class: Option, - balance: f64, - spent: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherDocumentDetailStudent { - full_name_with_class: Option, - amount: f64, - status: Option, //Option, enum "Active" "Canceled" -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherDocumentDetail { - title: Option, - amount: f64, - date: DateTime, - student_count: i64, - students: Option>, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherDocumentsItem { - id: i64, - title: Option, - date: DateTime, - total_amount: f64, - amount_per_student: f64, - student_count: i64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherDocumentsMonthly { - date: DateTime, - monthly_balance: f64, - items: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherStudentsItem { - variable_symbol: i64, - name: Option, - registration_number: Option, - balance: f64, - status: String, //PaymentsTeacherStudentStatus, enum "Active" "Canceled -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherSummaryClass { - abbrev: Option, - class_id: Option, - balance: f64, - amount_to_pay: f64, - debtors: i64, - spent: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ClassFundTeacherSummary { - teacher_name: Option, - allowed_classes: Option>, -} - -//------------------------------------------------------------------------------------------------------------------------------------------------------------ - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPaymentDetail { - title: Option, - due_date: DateTime, - amount: f64, - original_amount: f64, - status: String, //r16 = "BeforeDueDate", "NotPaid", "Paid", "PartiallyPaid" - bank_account: Option, - variable_symbol: Option, - specific_symbol: Option, - message: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPayment { - payment_id: i64, - title: Option, - due_date: DateTime, - amount: f64, - status: String, //r16 = "BeforeDueDate", "NotPaid", "Paid", "PartiallyPaid" - original_amount: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPaymentsSummary { - pub balance: f64, - pub paid: f64, - pub amount_scheduled: f64, - pub student_name_with_class: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionDetailItem { - pub due_date: DateTime, - pub title: Option, - pub amount: f64, - pub advance_notice_date: DateTime, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionDetail { - pub id: i64, - pub title: Option, - pub payment_type_id: i64, - pub payment_type_name: Option, - pub amount: f64, - pub state: String, //r16 = "Paid", "PaidNotActive","unknown","Unpaid", "UnpaidNotActive" - pub due_date_max: DateTime, - pub bank_account: Option, - pub specific_symbol: Option, - pub items: Option>, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionDocumentLine { - pub date: DateTime, - pub title: Option, - pub amount: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionRegulationLine { - pub due_date: DateTime, - pub title: Option, - pub amount: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionStudentDetail { - pub id: i64, - pub last_name: Option, - pub first_name: Option, - pub full_name: Option, - pub title: Option, - pub balance: f64, - pub total_regulation_amount: f64, - pub status: String, //PaymentsTeacherStudentStatus, enum "Active" "Canceled" - pub document_lines: Option>, - pub regulation_lines: Option>, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescriptionStudent { - pub id: i64, - pub last_name: Option, - pub first_name: Option, - pub full_name: Option, - pub balance: f64, - pub status: String, //PaymentsTeacherStudentStatus, enum "Active" "Canceled" -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct RegularPrescription { - pub id: i64, - pub title: Option, - pub payment_type_id: i64, - pub payment_type_name: Option, - pub amount: f64, - pub state: String, //PaymentsTeacherStudentStatus, enum "Active" "Canceled" - pub due_date_max: Option>, - pub students_count: i64, -} diff --git a/src/payments/class_fund.rs b/src/payments/class_fund.rs new file mode 100644 index 0000000..9554cde --- /dev/null +++ b/src/payments/class_fund.rs @@ -0,0 +1,112 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +use crate::PaymentsTeacherStudentStatus; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassfundSummary { + pub student_name_with_class: Option, + pub balance: f64, + pub spent: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundPaymentInfo { + pub instructions: Option, + pub bank_account: Option, + pub variable_symbol: Option, + pub specific_symbol: i64, + pub amount: f64, + pub message: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundMonthly { + pub date: DateTime, + pub monthly_balance: f64, + pub items: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundRecord { + pub description: Option, + pub date: DateTime, + pub amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundSummary { + pub student_name_with_class: Option, + pub balance: f64, + pub spent: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherDocumentDetailStudent { + pub full_name_with_class: Option, + pub amount: f64, + pub status: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherDocumentDetail { + pub title: Option, + pub amount: f64, + pub date: DateTime, + pub student_count: i64, + pub students: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherDocumentsItem { + pub id: i64, + pub title: Option, + pub date: DateTime, + pub total_amount: f64, + pub amount_per_student: f64, + pub student_count: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherDocumentsMonthly { + pub date: DateTime, + pub monthly_balance: f64, + pub items: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherStudentsItem { + pub variable_symbol: i64, + pub name: Option, + pub registration_number: Option, + pub balance: f64, + pub status: PaymentsTeacherStudentStatus, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherSummaryClass { + pub abbrev: Option, + pub class_id: Option, + pub balance: f64, + pub amount_to_pay: f64, + pub debtors: i64, + pub spent: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ClassFundTeacherSummary { + pub teacher_name: Option, + pub allowed_classes: Option>, +} diff --git a/src/payments/common.rs b/src/payments/common.rs new file mode 100644 index 0000000..9e6c83c --- /dev/null +++ b/src/payments/common.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum PaymentsTeacherStudentStatus { + Active, + Canceled, +} diff --git a/src/payments/endpoints.rs b/src/payments/endpoints.rs new file mode 100644 index 0000000..84fe2cc --- /dev/null +++ b/src/payments/endpoints.rs @@ -0,0 +1,104 @@ +use crate::{ + ClassFundMonthly, ClassFundPaymentInfo, ClassFundSummary, ClassFundTeacherDocumentDetail, + ClassFundTeacherDocumentsMonthly, ClassFundTeacherStudentsItem, ClassFundTeacherSummary, + Endpoint, RegularPayment, RegularPaymentDetail, RegularPaymentsSummary, RegularPrescription, + RegularPrescriptionDetail, RegularPrescriptionStudent, RegularPrescriptionStudentDetail, +}; +use std::marker::PhantomData; + +pub const CLASS_FUND_PAYMENT_INFO_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/payments/classfund/paymentsinfo", + auth: true, + _types: PhantomData, +}; + +pub const REGULAR_PAYMENTS_INFO_ENDPOINT: Endpoint, ()> = Endpoint::Get { + url: "/api/3/payments/regularpayments", + auth: true, + _types: PhantomData, +}; + +pub const REGULAR_PAYMENTS_SUMMARY_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/payments/regularpayments/summary", + auth: true, + _types: PhantomData, +}; + +pub const CLASS_FUND_INFO_ENDPOINT: Endpoint, ()> = Endpoint::Get { + url: "/api/3/payments/classfund", + auth: true, + _types: PhantomData, +}; + +pub const CLASS_FUND_SUMMARY_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/payments/classfund/summary", + auth: true, + _types: PhantomData, +}; + +pub const REGULAR_PAYMENT_DETAIL_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/payments/regularpayments/detail/{paymentId}", + auth: true, + _types: PhantomData, +}; + +pub const CLASS_FUND_TEACHER_DOCUMENT_DETAIL_ENDPOINT: Endpoint< + ClassFundTeacherDocumentDetail, + (), +> = Endpoint::Get { + url: "/api/3/payments/classfund/teacher/document/detail/{documentId}", + auth: true, + _types: PhantomData, +}; + +pub const REGULAR_PRESCRIPTIONS_ENDPOINT: Endpoint, ()> = Endpoint::Get { + url: "/api/3/payments/regularpayments/teacher/prescriptions", + auth: true, + _types: PhantomData, +}; + +pub const CLASS_FUND_TEACHER_STUDENTS_ENDPOINT: Endpoint, ()> = + Endpoint::Get { + url: "/api/3/payments/classfund/teacher/students/{classId}", + auth: true, + _types: PhantomData, + }; + +pub const CLASS_FUND_TEACHER_DOCUMENTS_ENDPOINT: Endpoint< + Vec, + (), +> = Endpoint::Get { + url: "/api/3/payments/classfund/teacher/documents/{classId}", + auth: true, + _types: PhantomData, +}; + +pub const CLASS_FUND_TEACHER_SUMMARY_ENDPOINT: Endpoint = + Endpoint::Get { + url: "/api/3/payments/classfund/teacher/summary", + auth: true, + _types: PhantomData, + }; + +pub const REGULAR_PRESCRIPTION_DETAIL_ENDPOINT: Endpoint = + Endpoint::Get { + url: "/api/3/payments/regularpayments/teacher/prescriptions/{prescriptionId}", + auth: true, + _types: PhantomData, + }; + +pub const REGULAR_PRESCRIPTION_STUDENT_DETAIL_ENDPOINT: Endpoint< + RegularPrescriptionStudentDetail, + (), +> = Endpoint::Get { + url: "/api/3/payments/regularpayments/teacher/prescriptions/{prescriptionId}/students/{studentId}", + auth: true, + _types: PhantomData, +}; + +pub const REGULAR_PRESCRIPTION_STUDENTS_ENDPOINT: Endpoint, ()> = + Endpoint::Get { + url: "/api/3/payments/regularpayments/teacher/prescriptions/{prescriptionId}/students", + auth: true, + _types: PhantomData, + }; diff --git a/src/payments/mod.rs b/src/payments/mod.rs new file mode 100644 index 0000000..126d754 --- /dev/null +++ b/src/payments/mod.rs @@ -0,0 +1,9 @@ +mod class_fund; +mod common; +mod endpoints; +mod regular_payments; + +pub use class_fund::*; +pub use common::*; +pub use endpoints::*; +pub use regular_payments::*; diff --git a/src/payments/regular_payments.rs b/src/payments/regular_payments.rs new file mode 100644 index 0000000..0ccccfe --- /dev/null +++ b/src/payments/regular_payments.rs @@ -0,0 +1,137 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +use crate::PaymentsTeacherStudentStatus; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPaymentDetail { + pub title: Option, + pub due_date: DateTime, + pub amount: f64, + pub original_amount: f64, + pub status: RegularPaymentStatus, + pub bank_account: Option, + pub variable_symbol: Option, + pub specific_symbol: Option, + pub message: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPayment { + pub payment_id: i64, + pub title: Option, + pub due_date: DateTime, + pub amount: f64, + pub status: RegularPaymentStatus, + pub original_amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPaymentsSummary { + pub balance: f64, + pub paid: f64, + pub amount_scheduled: f64, + pub student_name_with_class: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionDetailItem { + pub due_date: DateTime, + pub title: Option, + pub amount: f64, + pub advance_notice_date: DateTime, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionDetail { + pub id: i64, + pub title: Option, + pub payment_type_id: i64, + pub payment_type_name: Option, + pub amount: f64, + pub state: RegularPrescriptionState, + pub due_date_max: DateTime, + pub bank_account: Option, + pub specific_symbol: Option, + pub items: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionDocumentLine { + pub date: DateTime, + pub title: Option, + pub amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionRegulationLine { + pub due_date: DateTime, + pub title: Option, + pub amount: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionStudentDetail { + pub id: i64, + pub last_name: Option, + pub first_name: Option, + pub full_name: Option, + pub title: Option, + pub balance: f64, + pub total_regulation_amount: f64, + pub status: PaymentsTeacherStudentStatus, + pub document_lines: Option>, + pub regulation_lines: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescriptionStudent { + pub id: i64, + pub last_name: Option, + pub first_name: Option, + pub full_name: Option, + pub balance: f64, + pub status: PaymentsTeacherStudentStatus, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct RegularPrescription { + pub id: i64, + pub title: Option, + pub payment_type_id: i64, + pub payment_type_name: Option, + pub amount: f64, + pub state: PaymentsTeacherStudentStatus, + pub due_date_max: Option>, + pub students_count: i64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum RegularPaymentStatus { + BeforeDueDate, + NotPaid, + Paid, + PartiallyPaid, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum RegularPrescriptionState { + Paid, + PaidNotActive, + #[serde(rename = "unknown")] + Unknown, + Unpaid, + UnpaidNotActive, +} diff --git a/src/semester.rs b/src/semester/certificate_term.rs similarity index 50% rename from src/semester.rs rename to src/semester/certificate_term.rs index cc7d2b0..fd97fd8 100644 --- a/src/semester.rs +++ b/src/semester/certificate_term.rs @@ -1,14 +1,7 @@ +use crate::{FinalMark, StdTypeNullable}; use chrono::{DateTime, FixedOffset}; use serde::{Deserialize, Serialize}; -use crate::StdTypeNullable; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct CertificateTerms { - pub certificate_terms: Vec, -} - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct CertificateTerm { @@ -31,29 +24,6 @@ pub struct CertificateTerm { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] -pub struct FinalMark { - pub mark_date: DateTime, - pub edit_date: DateTime, - pub mark_text: String, - pub subject_id: String, - pub id: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct PedagogicalMeasure { - pub pedagogical_measures: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct PedagogicalMeasures { - pub school_year: String, - pub semester: String, - pub type_label: String, - pub date: DateTime, - pub type_id: String, - pub text: String, - pub actual_grade: Option, - pub actual_grade_name: Option, +pub struct CertificateTerms { + pub certificate_terms: Vec, } diff --git a/src/semester/endpoints.rs b/src/semester/endpoints.rs new file mode 100644 index 0000000..2ba7988 --- /dev/null +++ b/src/semester/endpoints.rs @@ -0,0 +1,14 @@ +use crate::{CertificateTerms, Endpoint, PedagogicalMeasures}; +use std::marker::PhantomData; + +pub const GET_CERTIFICATE_TERMS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/marks/final", + auth: true, + _types: PhantomData, +}; + +pub const GET_PEDAGOGICAL_MEASURES_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/marks/measures", + auth: true, + _types: PhantomData, +}; diff --git a/src/semester/final_mark.rs b/src/semester/final_mark.rs new file mode 100644 index 0000000..8f9271b --- /dev/null +++ b/src/semester/final_mark.rs @@ -0,0 +1,12 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct FinalMark { + pub mark_date: DateTime, + pub edit_date: DateTime, + pub mark_text: String, + pub subject_id: String, + pub id: String, +} diff --git a/src/semester/mod.rs b/src/semester/mod.rs new file mode 100644 index 0000000..8ec482c --- /dev/null +++ b/src/semester/mod.rs @@ -0,0 +1,9 @@ +mod certificate_term; +mod endpoints; +mod final_mark; +mod pedagogical_measure; + +pub use certificate_term::*; +pub use endpoints::*; +pub use final_mark::*; +pub use pedagogical_measure::*; diff --git a/src/semester/pedagogical_measure.rs b/src/semester/pedagogical_measure.rs new file mode 100644 index 0000000..11983ab --- /dev/null +++ b/src/semester/pedagogical_measure.rs @@ -0,0 +1,21 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct PedagogicalMeasures { + pub pedagogical_measures: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct PedagogicalMeasure { + pub school_year: String, + pub semester: String, + pub type_label: String, + pub date: DateTime, + pub type_id: String, + pub text: String, + pub actual_grade: Option, + pub actual_grade_name: Option, +} diff --git a/src/stdtype.rs b/src/stdtype.rs index 3dd77f1..f633741 100644 --- a/src/stdtype.rs +++ b/src/stdtype.rs @@ -16,25 +16,9 @@ pub struct StdTypeNullable { pub name: Option, } -pub type SchoolClass = StdType; - -pub type StdClassGroup = StdType; - -pub type SchoolClassSet = StdType; - -pub type Teacher = StdType; - -pub type TeacherSet = StdType; - -pub type Room = StdType; - -pub type RoomSet = StdType; - -pub type Student = StdType; - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] -pub struct TimetableStudent { +pub struct StdTypeAbbrevNullable { pub id: String, pub abbrev: Option, pub name: String, diff --git a/src/subjects/endpoints.rs b/src/subjects/endpoints.rs new file mode 100644 index 0000000..c20f6e8 --- /dev/null +++ b/src/subjects/endpoints.rs @@ -0,0 +1,8 @@ +use crate::{Endpoint, Subjects}; +use std::marker::PhantomData; + +pub const SUBJECTS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/subjects", + auth: true, + _types: PhantomData, +}; diff --git a/src/subjects/mod.rs b/src/subjects/mod.rs new file mode 100644 index 0000000..f11d6df --- /dev/null +++ b/src/subjects/mod.rs @@ -0,0 +1,5 @@ +mod endpoints; +mod subject; + +pub use endpoints::*; +pub use subject::*; diff --git a/src/subjects.rs b/src/subjects/subject.rs similarity index 100% rename from src/subjects.rs rename to src/subjects/subject.rs index 8e80101..8830eeb 100644 --- a/src/subjects.rs +++ b/src/subjects/subject.rs @@ -1,11 +1,5 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Subjects { - pub subjects: Vec, -} - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Subject { @@ -21,3 +15,9 @@ pub struct Subject { pub teacher_home_phone: Option, pub teacher_mobile_phone: Option, } + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Subjects { + pub subjects: Vec, +} diff --git a/src/substitutions.rs b/src/substitutions.rs deleted file mode 100644 index 359f9d2..0000000 --- a/src/substitutions.rs +++ /dev/null @@ -1,55 +0,0 @@ -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -use crate::{AtomType, Subject}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Substitutions { - pub from: DateTime, - pub to: DateTime, - pub changes: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct SubstitutionChange { - pub change_subject: Option, - pub day: DateTime, - pub hours: String, - pub change_type: SubstitutionChangeType, - pub description: String, - pub time: String, - pub change_lesson_info: Option, - pub change_display_type: Option, - pub atom_type: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub enum SubstitutionChangeType { - Absence, - Added, - Canceled, - NoChange, - Removed, - RoomChanged, - Substitution, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub enum ChangeDisplayType { - OriginalTeacher, - SubstituteTeacher, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct ChangeLessonInfo { - class_abbrev: Option, - group_abbrev: Option, - is_class_group: Option, - subject_abbrev: Option, - room_abbrev: Option, -} diff --git a/src/substitutions/change_display_type.rs b/src/substitutions/change_display_type.rs new file mode 100644 index 0000000..3c30239 --- /dev/null +++ b/src/substitutions/change_display_type.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum ChangeDisplayType { + OriginalTeacher, + SubstituteTeacher, +} diff --git a/src/substitutions/change_lesson_info.rs b/src/substitutions/change_lesson_info.rs new file mode 100644 index 0000000..526a1a8 --- /dev/null +++ b/src/substitutions/change_lesson_info.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ChangeLessonInfo { + pub class_abbrev: Option, + pub group_abbrev: Option, + pub is_class_group: Option, + pub subject_abbrev: Option, + pub room_abbrev: Option, +} diff --git a/src/substitutions/day_cycle_info.rs b/src/substitutions/day_cycle_info.rs new file mode 100644 index 0000000..ba3dad1 --- /dev/null +++ b/src/substitutions/day_cycle_info.rs @@ -0,0 +1,17 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SubstitutionCycles { + pub cycles_info: Option>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct DayCycleInfo { + pub date: DateTime, + pub code: Option, + pub abbrev: Option, + pub name: Option, +} diff --git a/src/substitutions/endpoints.rs b/src/substitutions/endpoints.rs new file mode 100644 index 0000000..5dfb790 --- /dev/null +++ b/src/substitutions/endpoints.rs @@ -0,0 +1,14 @@ +use crate::{Endpoint, SubstitutionCycles, Substitutions}; +use std::marker::PhantomData; + +pub const SUBSTITUTIONS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/substitutions", + auth: true, + _types: PhantomData, +}; + +pub const SUBSTITUTION_CYCLES_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/substitutions/cycles", + auth: true, + _types: PhantomData, +}; diff --git a/src/substitutions/mod.rs b/src/substitutions/mod.rs new file mode 100644 index 0000000..c2fe22c --- /dev/null +++ b/src/substitutions/mod.rs @@ -0,0 +1,15 @@ +mod change_display_type; +mod change_lesson_info; +mod day_cycle_info; +mod endpoints; +mod substitution_change; +mod substitution_change_type; +mod substitutions; + +pub use change_display_type::*; +pub use change_lesson_info::*; +pub use day_cycle_info::*; +pub use endpoints::*; +pub use substitution_change::*; +pub use substitution_change_type::*; +pub use substitutions::*; diff --git a/src/substitutions/substitution_change.rs b/src/substitutions/substitution_change.rs new file mode 100644 index 0000000..9e674e3 --- /dev/null +++ b/src/substitutions/substitution_change.rs @@ -0,0 +1,17 @@ +use crate::{AtomType, ChangeDisplayType, ChangeLessonInfo, Subject, SubstitutionChangeType}; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SubstitutionChange { + pub change_subject: Option, + pub day: DateTime, + pub hours: String, + pub change_type: SubstitutionChangeType, + pub description: String, + pub time: String, + pub change_lesson_info: Option, + pub change_display_type: Option, + pub atom_type: Option, +} diff --git a/src/substitutions/substitution_change_type.rs b/src/substitutions/substitution_change_type.rs new file mode 100644 index 0000000..3d057a1 --- /dev/null +++ b/src/substitutions/substitution_change_type.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum SubstitutionChangeType { + Absence, + Added, + Canceled, + NoChange, + Removed, + RoomChanged, + Substitution, +} diff --git a/src/substitutions/substitutions.rs b/src/substitutions/substitutions.rs new file mode 100644 index 0000000..8f203f6 --- /dev/null +++ b/src/substitutions/substitutions.rs @@ -0,0 +1,11 @@ +use crate::SubstitutionChange; +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Substitutions { + pub from: DateTime, + pub to: DateTime, + pub changes: Vec, +} diff --git a/src/teaching.rs b/src/teaching.rs deleted file mode 100644 index e182842..0000000 --- a/src/teaching.rs +++ /dev/null @@ -1,39 +0,0 @@ -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -use crate::Subject; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Teaching { - pub subject: Subject, - pub themes: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct TeachingTheme { - pub date: DateTime, - pub theme: String, - pub note: String, - pub lesson_label: String, - pub hour_caption: Option, - pub start: Option, - pub duration: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Lesson { - pub subject_id: String, - pub subject_name: String, - pub subject_abbrev: String, - pub teacher_id: String, - pub teacher_name: String, - pub teacher_abbrev: String, - pub teacher_email: Option, - pub teacher_web: Option, - pub teacher_school_phone: Option, - pub teacher_home_phone: Option, - pub teacher_mobile_phone: Option, -} diff --git a/src/teaching/endpoints.rs b/src/teaching/endpoints.rs new file mode 100644 index 0000000..62adb5d --- /dev/null +++ b/src/teaching/endpoints.rs @@ -0,0 +1,9 @@ +use crate::{Endpoint, Teaching}; +use std::marker::PhantomData; + +/// Subject ID = String +pub const TEACHING_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/subjects/themes/{subjectId}", + auth: true, + _types: PhantomData, +}; diff --git a/src/teaching/mod.rs b/src/teaching/mod.rs new file mode 100644 index 0000000..f742f12 --- /dev/null +++ b/src/teaching/mod.rs @@ -0,0 +1,7 @@ +mod endpoints; +mod teaching; +mod teaching_theme; + +pub use endpoints::*; +pub use teaching::*; +pub use teaching_theme::*; diff --git a/src/teaching/teaching.rs b/src/teaching/teaching.rs new file mode 100644 index 0000000..99677d5 --- /dev/null +++ b/src/teaching/teaching.rs @@ -0,0 +1,9 @@ +use crate::{Subject, TeachingTheme}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Teaching { + pub subject: Subject, + pub themes: Vec, +} diff --git a/src/teaching/teaching_theme.rs b/src/teaching/teaching_theme.rs new file mode 100644 index 0000000..d75c39d --- /dev/null +++ b/src/teaching/teaching_theme.rs @@ -0,0 +1,14 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct TeachingTheme { + pub date: DateTime, + pub theme: String, + pub note: String, + pub lesson_label: String, + pub hour_caption: Option, + pub start: Option, + pub duration: Option, +} diff --git a/src/timetable.rs b/src/timetable.rs deleted file mode 100644 index 7216cda..0000000 --- a/src/timetable.rs +++ /dev/null @@ -1,157 +0,0 @@ -use chrono::{DateTime, FixedOffset}; -use serde::{Deserialize, Serialize}; - -use crate::{Room, StdType, Student, Teacher}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Timetable { - pub hours: Vec, - pub days: Vec, - pub classes: Vec, - pub groups: Vec, - pub subjects: Vec, - pub rooms: Vec, - pub teachers: Vec, - pub cycles: Vec, - pub students: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct TimetableChange { - pub day: DateTime, - pub hours: String, - pub changetype: Changetype, - pub description: String, - pub time: String, - pub change_subject: Option, - pub type_abbrev: Option, - pub type_name: Option, - pub atom_type: Option, - pub start: Option, - pub duration: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub enum Changetype { - Absence, - Added, - Canceled, - NoChange, - Removed, - RoomChanged, - Substitution, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub enum AtomType { - Hour, - Pause, - TimeBlock, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct PlannedClassification { - pub description: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct HomeworkInfo { - pub id: String, - pub text: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Group { - pub class_id: Option, - pub id: String, - pub abbre: Option, - pub name: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Day { - pub atoms: Vec, - pub day_of_week: i64, - pub date: DateTime, - pub day_description: String, - pub day_type: DateTime, - pub assistance_atoms: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Atom { - pub hour_id: i64, - pub group_ids: Vec, - pub subject_id: Option, - pub teacher_id: Option, - pub room_id: Option, - pub is_last_room_lesson: bool, - pub cycle_ids: Vec, - pub homeworks: Vec, - pub homework_ids: Vec, - pub change: Option, - pub theme: Option, - pub assistants: Vec, - pub notice: Option, - pub planned_clasification: Option, - pub week_theme: Option, - pub lesson_release: LessonRelease, - pub start: Option, - pub duration: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub enum LessonRelease { - NoChange, - Released, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Assistant { - pub id: String, - pub is_present: bool, - pub student_id: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct AssistanceAtom { - pub hour_id: i64, - pub start: i64, - pub duration: i64, - pub class_id: Option, - pub group_id: Option, - pub subject_id: Option, - pub teacher_id: Option, - pub room_id: Option, - pub student_id: Option, - pub change: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct PlannedClasification { - pub description: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct Hour { - pub id: i64, - pub caption: String, - pub begin_time: String, - pub end_time: String, - pub start: Option, - pub duration: Option, -} diff --git a/src/timetable/assistance_atom.rs b/src/timetable/assistance_atom.rs new file mode 100644 index 0000000..eb5cafc --- /dev/null +++ b/src/timetable/assistance_atom.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; + +use crate::TimetableChange; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct AssistanceAtom { + pub hour_id: i64, + pub start: i64, + pub duration: i64, + pub class_id: Option, + pub group_id: Option, + pub subject_id: Option, + pub teacher_id: Option, + pub room_id: Option, + pub student_id: Option, + pub change: Option, +} diff --git a/src/timetable/assistant.rs b/src/timetable/assistant.rs new file mode 100644 index 0000000..8744c1c --- /dev/null +++ b/src/timetable/assistant.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Assistant { + pub id: String, + pub is_present: bool, + pub student_id: String, +} diff --git a/src/timetable/atom.rs b/src/timetable/atom.rs new file mode 100644 index 0000000..65641c6 --- /dev/null +++ b/src/timetable/atom.rs @@ -0,0 +1,27 @@ +use serde::{Deserialize, Serialize}; + +use crate::{Assistant, HomeworkInfo, LessonRelease, PlannedClassification, TimetableChange}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Atom { + pub hour_id: i64, + pub group_ids: Vec, + pub subject_id: Option, + pub teacher_id: Option, + pub room_id: Option, + pub is_last_room_lesson: bool, + pub cycle_ids: Vec, + pub homeworks: Vec, + pub homework_ids: Vec, + pub change: Option, + pub theme: Option, + pub assistants: Vec, + pub notice: Option, + #[serde(rename = "PlannedClasification")] + pub planned_classification: Option, + pub week_theme: Option, + pub lesson_release: LessonRelease, + pub start: Option, + pub duration: Option, +} diff --git a/src/timetable/atom_type.rs b/src/timetable/atom_type.rs new file mode 100644 index 0000000..8e33411 --- /dev/null +++ b/src/timetable/atom_type.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum AtomType { + Hour, + Pause, + TimeBlock, +} diff --git a/src/timetable/change_type.rs b/src/timetable/change_type.rs new file mode 100644 index 0000000..826e16b --- /dev/null +++ b/src/timetable/change_type.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum Changetype { + Absence, + Added, + Canceled, + NoChange, + Removed, + RoomChanged, + Substitution, +} diff --git a/src/timetable/day.rs b/src/timetable/day.rs new file mode 100644 index 0000000..d860e02 --- /dev/null +++ b/src/timetable/day.rs @@ -0,0 +1,15 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +use crate::{AssistanceAtom, Atom}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Day { + pub atoms: Vec, + pub day_of_week: i64, + pub date: DateTime, + pub day_description: String, + pub day_type: DateTime, + pub assistance_atoms: Vec, +} diff --git a/src/timetable/endpoints.rs b/src/timetable/endpoints.rs new file mode 100644 index 0000000..698e612 --- /dev/null +++ b/src/timetable/endpoints.rs @@ -0,0 +1,26 @@ +use crate::{Endpoint, Timetable}; +use std::marker::PhantomData; + +pub const PERMAMENT_TIMETABLE_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/timetable/permanent", + auth: true, + _types: PhantomData, +}; + +pub const PERMAMENT_TIMETABLE_CLASS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/timetable/permanent/class/{classId}", + auth: true, + _types: PhantomData, +}; + +pub const WEEK_TIMETABLE_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/timetable/actual", + auth: true, + _types: PhantomData, +}; + +pub const WEEK_TIMETABLE_CLASS_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/timetable/actual/class/{classId}", + auth: true, + _types: PhantomData, +}; diff --git a/src/timetable/homework_info.rs b/src/timetable/homework_info.rs new file mode 100644 index 0000000..65455c6 --- /dev/null +++ b/src/timetable/homework_info.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HomeworkInfo { + pub id: String, + pub text: String, +} diff --git a/src/timetable/hour.rs b/src/timetable/hour.rs new file mode 100644 index 0000000..197992c --- /dev/null +++ b/src/timetable/hour.rs @@ -0,0 +1,12 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Hour { + pub id: i64, + pub caption: String, + pub begin_time: String, + pub end_time: String, + pub start: Option, + pub duration: Option, +} diff --git a/src/timetable/lesson_release.rs b/src/timetable/lesson_release.rs new file mode 100644 index 0000000..482611e --- /dev/null +++ b/src/timetable/lesson_release.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub enum LessonRelease { + NoChange, + Released, +} diff --git a/src/timetable/mod.rs b/src/timetable/mod.rs new file mode 100644 index 0000000..8fb5280 --- /dev/null +++ b/src/timetable/mod.rs @@ -0,0 +1,29 @@ +mod assistance_atom; +mod assistant; +mod atom; +mod atom_type; +mod change_type; +mod day; +mod endpoints; +mod homework_info; +mod hour; +mod lesson_release; +mod planned_classification; +mod timetable; +mod timetable_change; +mod timetable_group; + +pub use assistance_atom::*; +pub use assistant::*; +pub use atom::*; +pub use atom_type::*; +pub use change_type::*; +pub use day::*; +pub use endpoints::*; +pub use homework_info::*; +pub use hour::*; +pub use lesson_release::*; +pub use planned_classification::*; +pub use timetable::*; +pub use timetable_change::*; +pub use timetable_group::*; diff --git a/src/timetable/planned_classification.rs b/src/timetable/planned_classification.rs new file mode 100644 index 0000000..1977be5 --- /dev/null +++ b/src/timetable/planned_classification.rs @@ -0,0 +1,7 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct PlannedClassification { + pub description: Option, +} diff --git a/src/timetable/timetable.rs b/src/timetable/timetable.rs new file mode 100644 index 0000000..0b0c5b7 --- /dev/null +++ b/src/timetable/timetable.rs @@ -0,0 +1,16 @@ +use crate::{Day, Group, Hour, StdType}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Timetable { + pub hours: Vec, + pub days: Vec, + pub classes: Vec, + pub groups: Vec, + pub subjects: Vec, + pub rooms: Vec, + pub teachers: Vec, + pub cycles: Vec, + pub students: Vec, +} diff --git a/src/timetable/timetable_change.rs b/src/timetable/timetable_change.rs new file mode 100644 index 0000000..9c28896 --- /dev/null +++ b/src/timetable/timetable_change.rs @@ -0,0 +1,20 @@ +use chrono::{DateTime, FixedOffset}; +use serde::{Deserialize, Serialize}; + +use crate::{AtomType, Changetype, StdType}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct TimetableChange { + pub day: DateTime, + pub hours: String, + pub changetype: Changetype, + pub description: String, + pub time: String, + pub change_subject: Option, + pub type_abbrev: Option, + pub type_name: Option, + pub atom_type: Option, + pub start: Option, + pub duration: Option, +} diff --git a/src/timetable/timetable_group.rs b/src/timetable/timetable_group.rs new file mode 100644 index 0000000..4b56361 --- /dev/null +++ b/src/timetable/timetable_group.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Group { + pub class_id: Option, + pub id: String, + pub abbre: Option, + pub name: Option, +} diff --git a/src/user/endpoints.rs b/src/user/endpoints.rs new file mode 100644 index 0000000..a5fe383 --- /dev/null +++ b/src/user/endpoints.rs @@ -0,0 +1,14 @@ +use crate::{Endpoint, UserInfo}; +use std::marker::PhantomData; + +pub const USER_INFO_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/user", + auth: true, + _types: PhantomData, +}; + +pub const STUDENT_AT_SCHOOL_ENDPOINT: Endpoint = Endpoint::Get { + url: "/api/3/user/student-at-school", + auth: true, + _types: PhantomData, +}; diff --git a/src/user/mod.rs b/src/user/mod.rs index fd87e59..ae4154d 100644 --- a/src/user/mod.rs +++ b/src/user/mod.rs @@ -1,7 +1,9 @@ +mod endpoints; mod modules; mod setting_modules; mod user_info; +pub use endpoints::*; pub use modules::*; pub use setting_modules::*; pub use user_info::*; diff --git a/src/user/user_info.rs b/src/user/user_info.rs index f2ea5d8..f9985c3 100644 --- a/src/user/user_info.rs +++ b/src/user/user_info.rs @@ -1,15 +1,14 @@ +use crate::{Module, StdType, user::ModulesSetting}; use serde::{Deserialize, Serialize}; -use crate::{Module, SchoolClass, user::ModulesSetting}; - #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct UserInfo { #[serde(rename = "UserUID")] pub user_uid: String, pub campaign_category_code: String, - pub class: Option, - pub teacher_classes: Option>, + pub class: Option, + pub teacher_classes: Option>, pub full_name: Option, pub school_organization_name: Option, pub school_type: Option, @@ -35,7 +34,7 @@ pub enum UserType { #[serde(rename_all = "PascalCase")] pub struct UserInfoStudent { pub full_name: String, - pub class: SchoolClass, + pub class: StdType, pub school_type: SchoolType, pub study_year: Option, } diff --git a/tracker.md b/tracker.md index 1c2135a..1cd78bc 100644 --- a/tracker.md +++ b/tracker.md @@ -6,7 +6,7 @@ - [ ] class book - [x] events - [x] auth -- [ ] error +- [ ] errors - [x] gdpr - [x] homeworks - [ ] komens @@ -24,4 +24,105 @@ - [ ] OpenApi schema generation - [ ] documentation - [ ] tests -- [ ] constructors \ No newline at end of file +- [ ] constructors + +# Endpoints +- [ ] /api/3/komens/message/:messageId/mark-as-read +- [x] /api/3/marks +- [x] /api/3/homeworks/:id/student-done/:finished +- [ ] /api/3/marking/atoms/:atomId/headers +- [x] /api/3/payments/classfund/teacher/students/:classId +- [ ] /api/3/classbook/lessonTags +- [ ] /api/3/komens/messages/rating/:messageId +- [x] /api/3/absence/student +- [ ] /api/3/webmodule +- [x] /api/3/timetable/actual +- [x] /api/3/payments/classfund/teacher/document/detail/:documentId +- [x] /api/3 +- [ ] /api/3/komens/attachment/:id +- [x] /api/3/subjects/themes/:subjectId +- [x] /api/3/payments/classfund +- [x] /api/3/gdpr/consents/person/child +- [ ] /api/3/komens/concept/:conceptId +- [x] /api/3/marks/measures +- [ ] /api/3/unregister-user-notification +- [x] /api/3/gdpr/consent/:id/agree +- [x] /api/3/marks/count-new +- [ ] /api/3/komens/concept +- [x] /api/3/timetable/permanent +- [ ] /api/3/komens/messages/noticeboard +- [ ] /api/3/komens/messages/apology/:messageId +- [ ] /api/3/komens/messages/received/:messageId +- [x] /api/3/user +- [x] /api/3/payments/regularpayments/detail/:paymentId +- [x] /api/3/substitutions +- [ ] /api/3/marks/what-if +- [x] /api/3/gdpr/commissioner/send-objection +- [x] /api/3/gdpr/consents/person/new +- [ ] /api/3/lesson/:lessonId/absence +- [x] /api/3/payments/regularpayments/summary +- [ ] /api/3/emergency/startemergency +- [x] /api/3/timetable/permanent/class/:classId +- [x] /api/3/gdpr/commissioner/send-report +- [ ] /api/3/komens/message/:messageId/mark-as-unhidden +- [ ] /api/3/lesson/:lessonId/studentsTimetable +- [x] /api/3/marks/final +- [x] /api/3/timetable/student/:studentId +- [ ] /api/3/marking/atom/:atomId/headerOptions +- [x] /api/3/gdpr/consent/:id/disagree +- [ ] /api/3/komens/messages/sent +- [ ] /api/3/emergency/configuration +- [ ] /api/3/komens/message +- [ ] /api/3/komens/message/:messageId/mark-as-hidden +- [ ] /api/3/lesson/:lessonId/past +- [ ] /api/3/komens/attachment +- [ ] /api/3/komens/messages/received +- [ ] /api/3/login/:token +- [ ] /api/3/komens/concepts +- [ ] /api/3/komens/messages/received/unread +- [x] /api/3/payments/regularpayments/teacher/prescriptions/:prescriptionId +- [x] /api/3/timetable/actual/class/:classId +- [ ] /api/3/gdpr/consents/person +- [ ] /api/3/komens/messages/unread +- [x] /api/3/absence +- [ ] /api/3/komens/message/:messageId/mark-as-confirmed +- [ ] /api/3/komens/messages/apology +- [x] /api/3/events +- [ ] /api/3/komens/concepts/count +- [x] /api/3/payments/regularpayments/teacher/prescriptions/:prescriptionId/students +- [x] /api/3/payments/regularpayments +- [ ] /api/3/komens/messages/noticeboard/:messageId& +- [ ] /api/3/komens/message-types/reply/:messageId +- [x] /api/3/payments/regularpayments/teacher/prescriptions +- [x] /api/3/marks/SetClassificationConfirmation +- [x] /api/3/homeworks/count-actual +- [x] /api/3/gdpr/consent/:id/revoke-request +- [x] /api/3/payments/regularpayments/teacher/prescriptions/:prescriptionId/students/:studentId +- [ ] /api/3/marking/atoms +- [x] /api/3/absence/canexcuse/:studentId +- [ ] /api/3/komens/rating-templates +- [ ] /api/3/emergency/participantsselection +- [ ] /api/3/komens/messages/noticeboard/unread +- [ ] /api/3/komens/message-types +- [x] /api/3/events/my +- [x] /api/3/gdpr/commissioners +- [ ] /api/3/classbook/:recordId +- [ ] /api/3/marking/marks/:atomId +- [x] /api/3/substitutions/cycles +- [x] /api/3/logintoken +- [ ] /api/3/komens/message-types/edit/:messageId +- [x] /api/3/payments/classfund/teacher/documents/:classId +- [x] /api/3/payments/classfund/summary +- [ ] /api/3/register-notification +- [x] /api/3/payments/classfund/paymentsinfo +- [ ] /api/3/komens/messages/rating +- [ ] /api/3/komens/message/:messageId +- [x] /api/3/homeworks +- [x] /api/3/subjects +- [ ] /api/3/classbook +- [x] /api/3/user/student-at-school +- [x] /api/3/payments/classfund/teacher/summary +- [ ] /api/3/komens/messages/sent/:messageId +- [x] /api/login +- [x] /.well-known/openid-configuration +- [x] /api \ No newline at end of file