Регистрация и тесты эндпоинтов

This commit is contained in:
2025-03-23 06:11:13 +04:00
parent 844c89a365
commit a95494d3be
16 changed files with 822 additions and 176 deletions

View File

@@ -1,10 +1,12 @@
use crate::schema::LessonType::Break;
use crate::schema::{Day, Lesson, LessonSubGroup, LessonTime, LessonType, ScheduleEntity};
use crate::LessonParseResult::{Lessons, Street};
use calamine::{open_workbook_from_rs, Reader, Xls};
use crate::schema::LessonType::Break;
use crate::schema::{
Day, Lesson, LessonSubGroup, LessonTime, LessonType, ParseResult, ScheduleEntry,
};
use calamine::{Reader, Xls, open_workbook_from_rs};
use chrono::{Duration, NaiveDateTime};
use fuzzy_matcher::skim::SkimMatcherV2;
use fuzzy_matcher::FuzzyMatcher;
use fuzzy_matcher::skim::SkimMatcherV2;
use regex::Regex;
use std::collections::HashMap;
use std::io::Cursor;
@@ -471,9 +473,9 @@ fn parse_name_and_subgroups(name: &String) -> (String, Vec<LessonSubGroup>) {
}
fn convert_groups_to_teachers(
groups: &HashMap<String, ScheduleEntity>,
) -> HashMap<String, ScheduleEntity> {
let mut teachers: HashMap<String, ScheduleEntity> = HashMap::new();
groups: &HashMap<String, ScheduleEntry>,
) -> HashMap<String, ScheduleEntry> {
let mut teachers: HashMap<String, ScheduleEntry> = HashMap::new();
let empty_days: Vec<Day> = groups
.values()
@@ -510,7 +512,7 @@ fn convert_groups_to_teachers(
if !teachers.contains_key(&subgroup.teacher) {
teachers.insert(
subgroup.teacher.clone(),
ScheduleEntity {
ScheduleEntry {
name: subgroup.teacher.clone(),
days: empty_days.to_vec(),
},
@@ -538,12 +540,7 @@ fn convert_groups_to_teachers(
teachers
}
pub fn parse_xls(
buffer: &Vec<u8>,
) -> (
HashMap<String, ScheduleEntity>,
HashMap<String, ScheduleEntity>,
) {
pub fn parse_xls(buffer: &Vec<u8>) -> ParseResult {
let cursor = Cursor::new(&buffer);
let mut workbook: Xls<_> = open_workbook_from_rs(cursor).expect("Can't open workbook");
@@ -556,13 +553,13 @@ pub fn parse_xls(
let (days_markup, groups_markup) = parse_skeleton(&worksheet);
let mut groups: HashMap<String, ScheduleEntity> = HashMap::new();
let mut groups: HashMap<String, ScheduleEntry> = HashMap::new();
let mut days_times: Vec<Vec<InternalTime>> = Vec::new();
let saturday_end_row = worksheet.end().unwrap().0;
for group_markup in groups_markup {
let mut group = ScheduleEntity {
let mut group = ScheduleEntry {
name: group_markup.name,
days: Vec::new(),
};
@@ -686,7 +683,10 @@ pub fn parse_xls(
groups.insert(group.name.clone(), group);
}
(convert_groups_to_teachers(&groups), groups)
ParseResult {
teachers: convert_groups_to_teachers(&groups),
groups,
}
}
#[cfg(test)]
@@ -698,7 +698,7 @@ mod tests {
let buffer: Vec<u8> = include_bytes!("../../../../schedule.xls").to_vec();
let result = parse_xls(&buffer);
assert_ne!(result.0.len(), 0);
assert_ne!(result.1.len(), 0);
assert_ne!(result.groups.len(), 0);
assert_ne!(result.teachers.len(), 0);
}
}

View File

@@ -24,84 +24,104 @@ pub enum LessonType {
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LessonSubGroup {
/**
* Номер подгруппы.
*/
pub number: u8,
/**
* Кабинет, если присутствует.
*/
pub cabinet: Option<String>,
/**
* Фио преподавателя.
*/
pub teacher: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Lesson {
/**
* Тип занятия
* Тип занятия.
*/
#[serde(rename = "type")]
pub lesson_type: LessonType,
/**
* Индексы пар, если присутствуют
* Индексы пар, если присутствуют.
*/
#[serde(rename = "defaultRange")]
pub default_range: Option<[u8; 2]>,
/**
* Название занятия
* Название занятия.
*/
pub name: Option<String>,
/**
* Начало и конец занятия
* Начало и конец занятия.
*/
pub time: LessonTime,
/**
* Подгруппы
* Подгруппы.
*/
#[serde(rename = "subGroups")]
pub subgroups: Option<Vec<LessonSubGroup>>,
/**
* Группа (только для расписания преподавателей)
* Группа, если это расписание для преподавателей.
*/
pub group: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Day {
/**
* День недели.
*/
pub name: String,
/**
* Адрес другого корпуса.
*/
pub street: Option<String>,
/**
* Дата.
*/
pub date: DateTime<Utc>,
/**
* Список пар в этот день.
*/
pub lessons: Vec<Lesson>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ScheduleEntity {
pub struct ScheduleEntry {
/**
* Название группы или ФИО преподавателя.
*/
pub name: String,
/**
* Список из шести дней.
*/
pub days: Vec<Day>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Schedule {
#[serde(rename = "updatedAt")]
pub updated_at: DateTime<Utc>,
pub struct ParseResult {
/**
* Список групп.
* Ключом является название группы.
*/
pub groups: HashMap<String, ScheduleEntry>,
pub groups: HashMap<String, ScheduleEntity>,
#[serde(rename = "updatedGroups")]
pub updated_groups: Vec<Vec<usize>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TeacherSchedule {
#[serde(rename = "updatedAt")]
pub updated_at: DateTime<Utc>,
pub teacher: ScheduleEntity,
pub updated: Vec<usize>,
/**
* Список преподавателей.
* Ключом является ФИО преподавателя.
*/
pub teachers: HashMap<String, ScheduleEntry>,
}