Files
srab/исх/властелины/уроки/уроки.tri
2025-11-26 21:32:41 +03:00

393 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
модуль уроки
импорт "стд::вывод"
импорт "исх/строка"
импорт "исх/спринтф"
импорт "исх/массивы"
импорт "исх/сеть/хттп"
импорт "исх/форматы/джесон"
импорт "исх/сеть/хттп/маршрутизатор"
импорт "исх/картотека"
импорт "исх/картотека/репозитории"
импорт "исх/бюрократия"
фн добавить урок*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
пусть оплошность := ""
пусть картотека = картотека.зайти()
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если пользователь = пусто {
вернуть хттп.ответ_401()
}
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если учитель = пусто & ~админ {
вернуть хттп.ответ_403()
}
если длина(параметры) < 1 {
вернуть хттп.ответ_400()
}
пусть ид класса = параметры[0]
пусть клass := джесон.ДжесонМногоЗначений{}
если админ {
клass := картотека.запросить безопасно(`
SELECT id FROM classes WHERE id = ?
`, оплошность, ид класса)
} иначе {
клass := картотека.запросить безопасно(`
SELECT id FROM classes WHERE id = ? AND creator_teacher_id = ?
`, оплошность, ид класса, учитель^.идентификатор)
}
если оплошность # "" {
вернуть хттп.ответ_500()
}
если длина(клass.значения) = 0 {
вернуть хттп.ответ_403()
}
пусть данные = джесон.парсить(обращение.туловище, оплошность)
если оплошность # "" {
вернуть хттп.ответ_400()
}
пусть дата := данные.получить("дата").строка()
пусть название := данные.получить("название").строка()
пусть домашка := данные.получить("домашнее задание").строка()
пусть строка даты := ""
если дата # пусто {
строка даты := дата^
} иначе {
пусть дата урока поле := данные.получить("дата урока").строка()
если дата урока поле # пусто {
строка даты := дата урока поле^
}
}
пусть строка названия := ""
если название # пусто {
строка названия := название^
} иначе {
пусть тема := данные.получить("тема").строка()
если тема # пусто {
строка названия := тема^
}
}
если строка даты = "" | строка названия = "" {
вернуть хттп.ответ_400()
}
пусть текст домашки := ""
если домашка # пусто {
текст домашки := домашка^
} иначе {
пусть поле домашка = данные.получить("домашка").строка()
если поле домашка # пусто {
текст домашки := поле домашка^
}
}
пусть ответ = картотека.запросить безопасно(`
INSERT INTO lessons (class_id, date, title, homework)
VALUES (?, ?, ?, ?)
RETURNING id, class_id, date, title, homework
`, оплошность, ид класса, строка даты, строка названия, текст домашки)
если оплошность # "" {
вернуть хттп.ответ_422()
}
если длина(ответ.значения) = 0 {
вернуть хттп.ответ_500()
}
пусть созданный = ответ.значения[0](:джесон.ДжесонОбъект)
пусть идентификатор урока = созданный.получить("id").число()^.значение
пусть идентификатор класса = созданный.получить("class_id").число()^.значение
пусть дата урока = созданный.получить("date").строка()^
пусть название урока = созданный.получить("title").строка()^
пусть поле домашки = созданный.получить("homework").строка()
пусть значение домашки := ""
если поле домашки # пусто {
значение домашки := поле домашки^
}
пусть туловище = джесон.сериализовать(джесон.ДжесонОбъект{
значения: джесон.ДжесонКлючЗначения[
джесон.ДжесонКлючЗначение{ключ: "идентификатор", значение: джесон.ДжесонЧисло{значение: идентификатор урока}},
джесон.ДжесонКлючЗначение{ключ: "идентификатор класса", значение: джесон.ДжесонЧисло{значение: идентификатор класса}},
джесон.ДжесонКлючЗначение{ключ: "дата", значение: джесон.ДжесонСтрока{значение: дата урока}},
джесон.ДжесонКлючЗначение{ключ: "название", значение: джесон.ДжесонСтрока{значение: название урока}},
джесон.ДжесонКлючЗначение{ключ: "домашнее задание", значение: джесон.ДжесонСтрока{значение: значение домашки}}
]
})
вернуть хттп.создать ответ(
хттп.ответ_201(),
хттп.ХттпОтвет{туловище: туловище}
)
}
фн список уроков*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
пусть оплошность := ""
пусть картотека = картотека.зайти()
если длина(параметры) < 1 {
вернуть хттп.ответ_400()
}
пусть ид класса = параметры[0]
пусть фильтр дата := ""
пусть есть фильтр := ложь
если длина(параметры) > 1 {
фильтр дата := параметры[1]
есть фильтр := истина
}
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если пользователь = пусто {
вернуть хттп.ответ_401()
}
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
пусть ученик = репозитории.пользователь ученик(пользователь^.идентификатор, оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
пусть данные класса = картотека.запросить безопасно(`
SELECT id, creator_teacher_id FROM classes WHERE id = ?
`, оплошность, ид класса)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если длина(данные класса.значения) = 0 {
вернуть хттп.ответ_404()
}
пусть объект класса = данные класса.значения[0](:джесон.ДжесонОбъект)
пусть поле создателя = объект класса.получить("creator_teacher_id").число()
пусть идентификатор создателя: Цел64 := -1
пусть есть создатель := ложь
если поле создателя # пусто {
идентификатор создателя := поле создателя^.значение
есть создатель := истина
}
пусть учитель имеет доступ := ложь
если админ {
учитель имеет доступ := истина
}
если учитель # пусто {
если есть создатель {
если учитель^.идентификатор = идентификатор создателя {
учитель имеет доступ := истина
}
}
}
если ~ учитель имеет доступ {
если ученик = пусто {
вернуть хттп.ответ_403()
}
пусть проверка ученика = картотека.запросить безопасно(`
SELECT id FROM class_students WHERE class_id = ? AND student_id = ?
`, оплошность, ид класса, ученик^.идентификатор)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если длина(проверка ученика.значения) = 0 {
вернуть хттп.ответ_403()
}
}
пусть уроки ответ: джесон.ДжесонМногоЗначений := джесон.ДжесонМногоЗначений{}
если есть фильтр {
уроки ответ := картотека.запросить безопасно(`
SELECT id, class_id, date, title, homework
FROM lessons
WHERE class_id = ? AND date = ?
ORDER BY date, id
`, оплошность, ид класса, фильтр дата)
} иначе {
уроки ответ := картотека.запросить безопасно(`
SELECT id, class_id, date, title, homework
FROM lessons
WHERE class_id = ?
ORDER BY date, id
`, оплошность, ид класса)
}
если оплошность # "" {
вернуть хттп.ответ_500()
}
пусть джесон уроки = джесон.ДжесонМногоЗначений{}
цикл [номер]запись среди уроки ответ.значения {
пусть объект = запись(:джесон.ДжесонОбъект)
пусть идентификатор = объект.получить("id").число()^.значение
пусть ид класса урока = объект.получить("class_id").число()^.значение
пусть дата урока = объект.получить("date").строка()^
пусть название урока = объект.получить("title").строка()^
пусть поле домашки = объект.получить("homework").строка()
пусть значение домашки := ""
если поле домашки # пусто {
значение домашки := поле домашки^
}
пусть урок = джесон.ДжесонОбъект{}
урок.вставить("идентификатор", джесон.ДжесонЧисло{значение: идентификатор})
урок.вставить("идентификатор класса", джесон.ДжесонЧисло{значение: ид класса урока})
урок.вставить("дата", джесон.ДжесонСтрока{значение: дата урока})
урок.вставить("название", джесон.ДжесонСтрока{значение: название урока})
урок.вставить("домашнее задание", джесон.ДжесонСтрока{значение: значение домашки})
джесон уроки.значения.добавить(урок)
}
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
значения: джесон.ДжесонКлючЗначения[
джесон.ДжесонКлючЗначение{
ключ: "уроки",
значение: джесон уроки
}
]
})
вернуть хттп.ХттпОтвет{туловище: тело}
}
фн удалить урок*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
пусть оплошность := ""
пусть картотека = картотека.зайти()
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если пользователь = пусто {
вернуть хттп.ответ_401()
}
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если учитель = пусто & ~админ {
вернуть хттп.ответ_403()
}
если длина(параметры) < 2 {
вернуть хттп.ответ_400()
}
пусть ид класса = параметры[0]
пусть ид урока = параметры[1]
пусть клass := джесон.ДжесонМногоЗначений{}
если админ {
клass := картотека.запросить безопасно(`
SELECT id FROM classes WHERE id = ?
`, оплошность, ид класса)
} иначе {
клass := картотека.запросить безопасно(`
SELECT id FROM classes WHERE id = ? AND creator_teacher_id = ?
`, оплошность, ид класса, учитель^.идентификатор)
}
если оплошность # "" {
вернуть хттп.ответ_500()
}
если длина(клass.значения) = 0 {
вернуть хттп.ответ_403()
}
пусть ответ = картотека.запросить безопасно(`
DELETE FROM lessons WHERE id = ? AND class_id = ?
RETURNING id
`, оплошность, ид урока, ид класса)
если оплошность # "" {
вернуть хттп.ответ_500()
}
если длина(ответ.значения) = 0 {
вернуть хттп.ответ_404()
}
вернуть хттп.ответ_204()
}
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
маршрутизатор.добавить маршрут("/api/classes/$/lessons", массивы.Строки["POST"], добавить урок)
маршрутизатор.добавить маршрут("/api/classes/$/lessons", массивы.Строки["GET"], список уроков)
маршрутизатор.добавить маршрут("/api/classes/$/lessons/$", массивы.Строки["GET"], список уроков)
маршрутизатор.добавить маршрут("/api/classes/$/lessons/date/$", массивы.Строки["GET"], список уроков)
маршрутизатор.добавить маршрут("/api/classes/$/lessons/$", массивы.Строки["DELETE"], удалить урок)
вернуть маршрутизатор
}