393 lines
18 KiB
Plaintext
393 lines
18 KiB
Plaintext
модуль уроки
|
||
|
||
импорт "стд::вывод"
|
||
импорт "исх/строка"
|
||
импорт "исх/спринтф"
|
||
импорт "исх/массивы"
|
||
импорт "исх/сеть/хттп"
|
||
импорт "исх/форматы/джесон"
|
||
импорт "исх/сеть/хттп/маршрутизатор"
|
||
импорт "исх/картотека"
|
||
импорт "исх/картотека/репозитории"
|
||
импорт "исх/бюрократия"
|
||
|
||
фн добавить урок*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||
пусть оплошность := ""
|
||
пусть картотека = картотека.зайти()
|
||
|
||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||
|
||
если оплошность # "" {
|
||
вернуть хттп.ответ_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"], удалить урок)
|
||
|
||
вернуть маршрутизатор
|
||
}
|