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