init here
This commit is contained in:
18
исх/властелины/главный/главный.tri
Normal file
18
исх/властелины/главный/главный.tri
Normal file
@@ -0,0 +1,18 @@
|
||||
модуль главный
|
||||
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
|
||||
фн главный*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
вернуть хттп.ХттпОтвет{
|
||||
туловище: "Привет, мир!",
|
||||
}
|
||||
}
|
||||
|
||||
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
|
||||
маршрутизатор.добавить маршрут("/api/", массивы.Строки["GET"], главный)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
|
||||
373
исх/властелины/классы/классы.tri
Normal file
373
исх/властелины/классы/классы.tri
Normal file
@@ -0,0 +1,373 @@
|
||||
модуль классы
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/спринтф"
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/форматы/джесон"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
импорт "исх/картотека"
|
||||
импорт "исх/картотека/репозитории"
|
||||
импорт "исх/бюрократия"
|
||||
|
||||
фн список классов*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если учитель = пусто & ~админ {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
пусть фильтр по учителю := -1
|
||||
|
||||
пусть параметр учитель = обращение.запрос-в-пути.найти("учитель")
|
||||
|
||||
если параметр учитель # пусто {
|
||||
пусть номер байта := 0
|
||||
строка.извлечь цел(параметр учитель^.значение, номер байта, фильтр по учителю)
|
||||
} иначе если ~админ {
|
||||
фильтр по учителю := учитель^.идентификатор
|
||||
}
|
||||
|
||||
если фильтр по учителю = -1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть классы := картотека.запросить безопасно(`
|
||||
SELECT id, number, letter, creator_teacher_id
|
||||
FROM classes
|
||||
WHERE creator_teacher_id = ?
|
||||
`, оплошность, фильтр по учителю)
|
||||
|
||||
пусть джесон ответ = джесон.ДжесонМногоЗначений{}
|
||||
|
||||
цикл [номер телефона мамы]клass среди классы.значения {
|
||||
пусть объект = клass(:джесон.ДжесонОбъект)
|
||||
|
||||
пусть идентификатор = объект.получить("id").число()^.значение
|
||||
пусть номер = объект.получить("number").число()^.значение
|
||||
пусть буква = объект.получить("letter").строка()^
|
||||
пусть создатель = объект.получить("creator_teacher_id").число()^.значение
|
||||
|
||||
пусть джесон клass = джесон.ДжесонОбъект{}
|
||||
джесон клass.вставить("идентификатор", джесон.ДжесонЧисло{ значение: идентификатор })
|
||||
джесон клass.вставить("номер", джесон.ДжесонЧисло{ значение: номер })
|
||||
джесон клass.вставить("буква", джесон.ДжесонСтрока{ значение: буква })
|
||||
джесон клass.вставить("создатель", джесон.ДжесонЧисло{ значение: создатель })
|
||||
|
||||
джесон ответ.значения.добавить(джесон клass)
|
||||
}
|
||||
|
||||
пусть туловище = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{
|
||||
ключ: "классы",
|
||||
значение: джесон ответ
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.ХттпОтвет{
|
||||
туловище: туловище
|
||||
}
|
||||
}
|
||||
|
||||
фн создать клass*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
|
||||
пусть данные = джесон.парсить(обращение.туловище, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть номер := данные.получить("номер").число()
|
||||
пусть буква := данные.получить("буква").строка()
|
||||
|
||||
если номер = пусто | буква = пусто {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
|
||||
пусть ответ = картотека.запросить безопасно(`
|
||||
INSERT INTO classes (number, letter, creator_teacher_id)
|
||||
VALUES (?, ?, ?)
|
||||
RETURNING id, number, letter, creator_teacher_id
|
||||
`, оплошность, номер^.значение, буква^, учитель^.идентификатор)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_422()
|
||||
}
|
||||
|
||||
если длина(ответ.значения) = 0 {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть созданный = ответ.значения[0](:джесон.ДжесонОбъект)
|
||||
пусть идентификатор = созданный.получить("id").число()^.значение
|
||||
пусть создан номер = созданный.получить("number").число()^.значение
|
||||
пусть создан буква = созданный.получить("letter").строка()^
|
||||
пусть создан создатель = созданный.получить("creator_teacher_id").число()^.значение
|
||||
|
||||
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{ключ: "идентификатор", значение: джесон.ДжесонЧисло{значение: идентификатор}},
|
||||
джесон.ДжесонКлючЗначение{ключ: "номер", значение: джесон.ДжесонЧисло{значение: создан номер}},
|
||||
джесон.ДжесонКлючЗначение{ключ: "буква", значение: джесон.ДжесонСтрока{значение: создан буква}},
|
||||
джесон.ДжесонКлючЗначение{ключ: "создатель", значение: джесон.ДжесонЧисло{значение: создан создатель}}
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.создать ответ(
|
||||
хттп.ответ_201(),
|
||||
хттп.ХттпОтвет{туловище: тело}
|
||||
)
|
||||
}
|
||||
|
||||
фн удалить клass*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто & ~админ {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
если длина(параметры) < 1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть ид класса = параметры[0]
|
||||
|
||||
пусть ответ := джесон.ДжесонМногоЗначений{}
|
||||
|
||||
если админ {
|
||||
ответ := картотека.запросить безопасно(`
|
||||
DELETE FROM classes WHERE id = ?
|
||||
RETURNING id
|
||||
`, оплошность, ид класса)
|
||||
} иначе {
|
||||
ответ := картотека.запросить безопасно(`
|
||||
DELETE FROM classes WHERE id = ? AND creator_teacher_id = ?
|
||||
RETURNING id
|
||||
`, оплошность, ид класса, учитель^.идентификатор)
|
||||
}
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ответ.значения) = 0 {
|
||||
вывод.ф("Класс с id = $стр не найден или не принадлежит учителю", ид класса)
|
||||
вернуть хттп.ответ_404()
|
||||
}
|
||||
|
||||
вернуть хттп.ответ_204()
|
||||
}
|
||||
|
||||
фн добавить ученика в клass*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_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()
|
||||
}
|
||||
|
||||
пусть ученик = картотека.запросить безопасно(`
|
||||
SELECT id FROM students WHERE id = ?
|
||||
`, оплошность, ид ученика)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ученик.значения) = 0 {
|
||||
вернуть хттп.ответ_404()
|
||||
}
|
||||
|
||||
пусть ответ = картотека.запросить безопасно(`
|
||||
INSERT INTO class_students (class_id, student_id)
|
||||
VALUES (?, ?)
|
||||
RETURNING id
|
||||
`, оплошность, ид класса, ид ученика)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_422()
|
||||
}
|
||||
|
||||
вернуть хттп.ответ_201()
|
||||
}
|
||||
|
||||
фн удалить ученика из класса*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_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 class_students
|
||||
WHERE class_id = ? AND student_id = ?
|
||||
RETURNING id
|
||||
`, оплошность, ид класса, ид ученика)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ответ.значения) = 0 {
|
||||
вернуть хттп.ответ_404()
|
||||
}
|
||||
|
||||
вернуть хттп.ответ_204()
|
||||
}
|
||||
|
||||
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
|
||||
маршрутизатор.добавить маршрут("/api/classes", массивы.Строки["GET"], список классов)
|
||||
маршрутизатор.добавить маршрут("/api/classes", массивы.Строки["POST"], создать клass)
|
||||
маршрутизатор.добавить маршрут("/api/classes/$", массивы.Строки["DELETE"], удалить клass)
|
||||
маршрутизатор.добавить маршрут("/api/classes/$/students/$", массивы.Строки["POST"], добавить ученика в клass)
|
||||
маршрутизатор.добавить маршрут("/api/classes/$/students/$", массивы.Строки["DELETE"], удалить ученика из класса)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
84
исх/властелины/пользователи/пользователи.tri
Normal file
84
исх/властелины/пользователи/пользователи.tri
Normal file
@@ -0,0 +1,84 @@
|
||||
модуль пользователи
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/спринтф"
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/форматы/джесон"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
импорт "исх/картотека"
|
||||
импорт "исх/картотека/репозитории"
|
||||
импорт "исх/бюрократия"
|
||||
|
||||
фн войти*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть картотека = картотека.зайти()
|
||||
пусть оплошность := ""
|
||||
пусть данные = джесон.парсить(обращение.туловище, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть имя пользователя := данные.получить("имя пользователя").строка()
|
||||
пусть пароль := данные.получить("пароль").строка()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать пользователя(имя пользователя^, пароль^, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вывод.ф("$стр\n", оплошность)
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
вернуть хттп.ХттпОтвет{
|
||||
туловище: "Рады видеть вас снова :3"
|
||||
}
|
||||
}
|
||||
|
||||
фн сменить пароль*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть данные = джесон.парсить(обращение.туловище, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть новый пароль := данные.получить("новый пароль").строка()
|
||||
|
||||
если новый пароль = пусто | новый пароль^ = "" {
|
||||
вернуть хттп.ответ_422()
|
||||
}
|
||||
|
||||
картотека.запросить безопасно(`
|
||||
UPDATE users SET password = ? WHERE id = ?
|
||||
`, оплошность, новый пароль^, пользователь^.идентификатор
|
||||
)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
вернуть хттп.ответ_204()
|
||||
}
|
||||
|
||||
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
|
||||
маршрутизатор.добавить маршрут("/api/users/login", массивы.Строки["POST"], войти)
|
||||
маршрутизатор.добавить маршрут("/api/users/password", массивы.Строки["PUT"], сменить пароль)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
381
исх/властелины/пользователи/ученики/ученики.tri
Normal file
381
исх/властелины/пользователи/ученики/ученики.tri
Normal file
@@ -0,0 +1,381 @@
|
||||
модуль ученики
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/спринтф"
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/форматы/джесон"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
импорт "исх/картотека"
|
||||
импорт "исх/картотека/репозитории"
|
||||
импорт "исх/бюрократия"
|
||||
|
||||
фн создать*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
пусть данные = джесон.парсить(обращение.туловище, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть имя := данные.получить("имя").строка()
|
||||
пусть фамилия := данные.получить("фамилия").строка()
|
||||
пусть отчество := данные.получить("отчество").строка()
|
||||
пусть пароль := данные.получить("пароль").строка()
|
||||
пусть повтор пароля := данные.получить("повтор пароля").строка()
|
||||
|
||||
пусть снилс := данные.получить("снилс").строка()
|
||||
пусть паспорт := данные.получить("паспорт").строка()
|
||||
|
||||
если имя = пусто | фамилия = пусто | отчество = пусто | пароль = пусто | повтор пароля = пусто | снилс = пусто | паспорт = пусто {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
если имя^ = "" | фамилия^ = "" | отчество^ = "" | пароль^ = "" | повтор пароля^ = "" | снилс^ = "" | паспорт^ = "" {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
если пароль^ # повтор пароля^ {
|
||||
вернуть хттп.создать ответ(
|
||||
хттп.ответ_400(),
|
||||
хттп.ХттпОтвет{ туловище: "Пароли не совпадают." }
|
||||
)
|
||||
}
|
||||
|
||||
пусть имя пользователя = спринтф.ф("$стр.$стр", имя^, фамилия^)
|
||||
|
||||
пусть ответ = картотека.запросить безопасно(`
|
||||
INSERT INTO users (first_name, last_name, middle_name, username, password)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
RETURNING id
|
||||
`, оплошность, имя^, фамилия^, отчество^, имя пользователя, пароль^)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ответ.значения) = 0 {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть айди пользователя = ответ.значения[0](:джесон.ДжесонОбъект).получить("id").число()
|
||||
|
||||
если айди пользователя = пусто {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть ученик = картотека.запросить безопасно(`
|
||||
INSERT INTO students (user_id, mentor_id, snils, passport)
|
||||
VALUES (?, ?, ?, ?)
|
||||
RETURNING id
|
||||
`, оплошность,
|
||||
айди пользователя^.значение,
|
||||
учитель^.идентификатор,
|
||||
снилс^,
|
||||
паспорт^
|
||||
)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ученик.значения) = 0 {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть созданный = ученик.значения[0](:джесон.ДжесонОбъект)
|
||||
пусть идентификатор ученика = созданный.получить("id").число()
|
||||
|
||||
если идентификатор ученика = пусто {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{ ключ: "идентификатор", значение: джесон.ДжесонЧисло{ значение: идентификатор ученика^.значение } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя", значение: джесон.ДжесонСтрока{ значение: имя^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "фамилия", значение: джесон.ДжесонСтрока{ значение: фамилия^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "отчество", значение: джесон.ДжесонСтрока{ значение: отчество^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "снилс", значение: джесон.ДжесонСтрока{ значение: снилс^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "паспорт", значение: джесон.ДжесонСтрока{ значение: паспорт^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "учитель", значение: джесон.ДжесонЧисло{ значение: учитель^.идентификатор } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя пользователя", значение: джесон.ДжесонСтрока{ значение: имя пользователя } }
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.создать ответ(
|
||||
хттп.ответ_201(),
|
||||
хттп.ХттпОтвет{ туловище: тело }
|
||||
)
|
||||
}
|
||||
|
||||
фн список учеников*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто & ~админ {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
пусть фильтр по учителю := -1
|
||||
пусть параметр учитель = обращение.запрос-в-пути.найти("учитель")
|
||||
|
||||
если параметр учитель # пусто {
|
||||
пусть номер байта := 0
|
||||
строка.извлечь цел(параметр учитель^.значение, номер байта, фильтр по учителю)
|
||||
} иначе если ~админ {
|
||||
фильтр по учителю := учитель^.идентификатор
|
||||
}
|
||||
|
||||
если фильтр по учителю = -1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть найдено = картотека.запросить безопасно(`
|
||||
SELECT s.id, s.snils, s.passport, s.mentor_id, u.first_name, u.last_name, u.middle_name, u.username
|
||||
FROM students s
|
||||
JOIN users u ON u.id = s.user_id
|
||||
WHERE s.mentor_id = ?
|
||||
ORDER BY s.id
|
||||
`, оплошность, фильтр по учителю)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть джесон ученики = джесон.ДжесонМногоЗначений{}
|
||||
|
||||
цикл запись среди найдено.значения {
|
||||
пусть объект = запись(:джесон.ДжесонОбъект)
|
||||
|
||||
пусть идентификатор = объект.получить("id").число()
|
||||
пусть имя = объект.получить("first_name").строка()
|
||||
пусть фамилия = объект.получить("last_name").строка()
|
||||
пусть отчество = объект.получить("middle_name").строка()
|
||||
пусть снилс = объект.получить("snils").строка()
|
||||
пусть паспорт = объект.получить("passport").строка()
|
||||
пусть наставник = объект.получить("mentor_id").число()
|
||||
пусть имя пользователя = объект.получить("username").строка()
|
||||
|
||||
пусть студент = джесон.ДжесонОбъект{}
|
||||
студент.вставить("идентификатор", джесон.ДжесонЧисло{ значение: идентификатор^.значение })
|
||||
студент.вставить("имя", джесон.ДжесонСтрока{ значение: имя^ })
|
||||
студент.вставить("фамилия", джесон.ДжесонСтрока{ значение: фамилия^ })
|
||||
студент.вставить("отчество", джесон.ДжесонСтрока{ значение: отчество^ })
|
||||
студент.вставить("снилс", джесон.ДжесонСтрока{ значение: снилс^ })
|
||||
студент.вставить("паспорт", джесон.ДжесонСтрока{ значение: паспорт^ })
|
||||
студент.вставить("наставник", джесон.ДжесонЧисло{ значение: наставник^.значение })
|
||||
студент.вставить("имя пользователя", джесон.ДжесонСтрока{ значение: имя пользователя^ })
|
||||
|
||||
джесон ученики.значения.добавить(студент)
|
||||
}
|
||||
|
||||
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{
|
||||
ключ: "ученики",
|
||||
значение: джесон ученики
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.ХттпОтвет{ туловище: тело }
|
||||
}
|
||||
|
||||
фн получить*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто & ~админ {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
если длина(параметры) < 1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть ид ученика = параметры[0]
|
||||
|
||||
пусть ученик := джесон.ДжесонМногоЗначений{}
|
||||
|
||||
если админ {
|
||||
ученик := картотека.запросить безопасно(`
|
||||
SELECT s.id, s.snils, s.passport, s.mentor_id, u.first_name, u.last_name, u.middle_name, u.username
|
||||
FROM students s
|
||||
JOIN users u ON u.id = s.user_id
|
||||
WHERE s.id = ?
|
||||
`, оплошность, ид ученика)
|
||||
} иначе {
|
||||
ученик := картотека.запросить безопасно(`
|
||||
SELECT s.id, s.snils, s.passport, s.mentor_id, u.first_name, u.last_name, u.middle_name, u.username
|
||||
FROM students s
|
||||
JOIN users u ON u.id = s.user_id
|
||||
WHERE s.id = ? AND s.mentor_id = ?
|
||||
`, оплошность, ид ученика, учитель^.идентификатор)
|
||||
}
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(ученик.значения) = 0 {
|
||||
вернуть хттп.ответ_404()
|
||||
}
|
||||
|
||||
пусть объект = ученик.значения[0](:джесон.ДжесонОбъект)
|
||||
|
||||
пусть идентификатор = объект.получить("id").число()
|
||||
пусть имя = объект.получить("first_name").строка()
|
||||
пусть фамилия = объект.получить("last_name").строка()
|
||||
пусть отчество = объект.получить("middle_name").строка()
|
||||
пусть снилс = объект.получить("snils").строка()
|
||||
пусть паспорт = объект.получить("passport").строка()
|
||||
пусть наставник = объект.получить("mentor_id").число()
|
||||
пусть имя пользователя = объект.получить("username").строка()
|
||||
|
||||
если идентификатор = пусто | имя = пусто | фамилия = пусто | отчество = пусто | снилс = пусто | паспорт = пусто | наставник = пусто | имя пользователя = пусто {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{ ключ: "идентификатор", значение: джесон.ДжесонЧисло{ значение: идентификатор^.значение } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя", значение: джесон.ДжесонСтрока{ значение: имя^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "фамилия", значение: джесон.ДжесонСтрока{ значение: фамилия^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "отчество", значение: джесон.ДжесонСтрока{ значение: отчество^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "снилс", значение: джесон.ДжесонСтрока{ значение: снилс^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "паспорт", значение: джесон.ДжесонСтрока{ значение: паспорт^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "наставник", значение: джесон.ДжесонЧисло{ значение: наставник^.значение } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя пользователя", значение: джесон.ДжесонСтрока{ значение: имя пользователя^ } }
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.ХттпОтвет{ туловище: тело }
|
||||
}
|
||||
|
||||
фн удалить*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть учитель = репозитории.пользователь учитель(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если учитель = пусто {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
если длина(параметры) < 1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть ид ученика = параметры[0]
|
||||
|
||||
пусть удален = картотека.запросить безопасно(`
|
||||
DELETE FROM students WHERE id = ? AND mentor_id = ?
|
||||
RETURNING id, user_id
|
||||
`, оплошность, ид ученика, учитель^.идентификатор)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(удален.значения) = 0 {
|
||||
вернуть хттп.ответ_404()
|
||||
}
|
||||
|
||||
пусть объект = удален.значения[0](:джесон.ДжесонОбъект)
|
||||
пусть айди пользователя = объект.получить("user_id").число()
|
||||
|
||||
если айди пользователя = пусто {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
картотека.запросить безопасно(`
|
||||
DELETE FROM users WHERE id = ?
|
||||
`, оплошность, айди пользователя^.значение)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
вернуть хттп.ответ_204()
|
||||
}
|
||||
|
||||
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
|
||||
маршрутизатор.добавить маршрут("/api/students", массивы.Строки["POST"], создать)
|
||||
маршрутизатор.добавить маршрут("/api/students", массивы.Строки["GET"], список учеников)
|
||||
маршрутизатор.добавить маршрут("/api/students/$", массивы.Строки["GET"], получить)
|
||||
маршрутизатор.добавить маршрут("/api/students/$", массивы.Строки["DELETE"], удалить)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
215
исх/властелины/пользователи/учителя/учителя.tri
Normal file
215
исх/властелины/пользователи/учителя/учителя.tri
Normal file
@@ -0,0 +1,215 @@
|
||||
модуль учителя
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/спринтф"
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/форматы/джесон"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
импорт "исх/картотека"
|
||||
импорт "исх/картотека/репозитории"
|
||||
импорт "исх/бюрократия"
|
||||
|
||||
фн создать*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть картотека = картотека.зайти()
|
||||
пусть оплошность := ""
|
||||
пусть данные = джесон.парсить(обращение.туловище, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть имя := данные.получить("имя").строка()
|
||||
пусть фамилия := данные.получить("фамилия").строка()
|
||||
пусть отчество := данные.получить("отчество").строка()
|
||||
пусть образование := данные.получить("образование").строка()
|
||||
пусть пароль := данные.получить("пароль").строка()
|
||||
пусть повтор пароля := данные.получить("повтор пароля").строка()
|
||||
пусть аватар = данные.получить("аватар").строка()
|
||||
пусть аватар урл := ""
|
||||
|
||||
если имя = пусто | фамилия = пусто | отчество = пусто | образование = пусто | пароль = пусто | повтор пароля = пусто {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
если имя^ = "" | фамилия^ = "" | отчество^ = "" | образование^ = "" | пароль^ = "" | повтор пароля^ = "" {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
если пароль^ # повтор пароля^ {
|
||||
вернуть хттп.создать ответ(
|
||||
хттп.ответ_400(),
|
||||
хттп.ХттпОтвет{
|
||||
туловище: "Пароли не совпадают.",
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
пусть имя пользователя = спринтф.ф("$стр.$стр", имя^, фамилия^)
|
||||
|
||||
пусть ответ = картотека.запросить безопасно(`
|
||||
INSERT INTO users (first_name, last_name, middle_name, username, password)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
RETURNING id
|
||||
`, оплошность, имя^, фамилия^, отчество^, имя пользователя, пароль^)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть айди пользователя = ответ.значения[0](:джесон.ДжесонОбъект).получить("id").число()
|
||||
|
||||
если айди пользователя = пусто {
|
||||
авария("неверный ответ от базы данных")
|
||||
}
|
||||
|
||||
если аватар # пусто & аватар^ # "" {
|
||||
пусть урл = хттп.парсить урл(аватар^, оплошность)
|
||||
|
||||
если оплошность = "" {
|
||||
пусть ответ = хттп.послать на три буквы(урл.хост, урл.порт, урл.путь)
|
||||
пусть размер контента := 0
|
||||
|
||||
цикл [номер]заглавие среди ответ.заглавия {
|
||||
если заглавие.имя = "Content-Length" {
|
||||
пусть № байта := 0
|
||||
строка.извлечь цел(заглавие.значение, № байта, размер контента)
|
||||
прервать
|
||||
}
|
||||
}
|
||||
|
||||
если размер контента > 0 & размер контента < 1000000 {
|
||||
аватар урл := аватар^
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
пусть учитель = картотека.запросить безопасно(`
|
||||
INSERT INTO teachers (user_id, education, avatar_url)
|
||||
VALUES (?, ?, ?)
|
||||
RETURNING id
|
||||
`, оплошность, айди пользователя^.значение, образование^, аватар урл)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если длина(учитель.значения) = 0 {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть созданный учитель = учитель.значения[0](:джесон.ДжесонОбъект)
|
||||
пусть идентификатор учителя = созданный учитель.получить("id").число()
|
||||
|
||||
если идентификатор учителя = пусто {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть тело = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{ ключ: "идентификатор", значение: джесон.ДжесонЧисло{ значение: идентификатор учителя^.значение } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "образование", значение: джесон.ДжесонСтрока{ значение: образование^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя", значение: джесон.ДжесонСтрока{ значение: имя^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "фамилия", значение: джесон.ДжесонСтрока{ значение: фамилия^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "отчество", значение: джесон.ДжесонСтрока{ значение: отчество^ } },
|
||||
джесон.ДжесонКлючЗначение{ ключ: "имя пользователя", значение: джесон.ДжесонСтрока{ значение: имя пользователя } }
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.создать ответ(
|
||||
хттп.ответ_201(),
|
||||
хттп.ХттпОтвет{ туловище: тело }
|
||||
)
|
||||
}
|
||||
|
||||
фн список*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если пользователь = пусто {
|
||||
вернуть хттп.ответ_401()
|
||||
}
|
||||
|
||||
пусть админ = репозитории.пользователь админ(пользователь^.идентификатор, оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
если ~админ {
|
||||
вернуть хттп.ответ_403()
|
||||
}
|
||||
|
||||
пусть размер страницы := 20
|
||||
пусть номер страницы := 1
|
||||
|
||||
пусть параметр страница = обращение.запрос-в-пути.найти("страница")
|
||||
если параметр страница # пусто {
|
||||
пусть номер байта := 0
|
||||
строка.извлечь цел(параметр страница^.значение, номер байта, номер страницы)
|
||||
}
|
||||
|
||||
если номер страницы < 1 {
|
||||
вернуть хттп.ответ_400()
|
||||
}
|
||||
|
||||
пусть смещение := (номер страницы - 1) * размер страницы
|
||||
|
||||
пусть учителя = картотека.запросить безопасно(`
|
||||
SELECT t.id, t.user_id, t.education, t.avatar_url,
|
||||
u.first_name, u.last_name, u.middle_name, u.username
|
||||
FROM teachers t
|
||||
JOIN users u ON u.id = t.user_id
|
||||
ORDER BY t.id
|
||||
LIMIT ? OFFSET ?
|
||||
`, оплошность, размер страницы, смещение)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_500()
|
||||
}
|
||||
|
||||
пусть джесон учителя = джесон.ДжесонМногоЗначений{}
|
||||
|
||||
цикл [номер]запись среди учителя.значения {
|
||||
пусть объект = запись(:джесон.ДжесонОбъект)
|
||||
|
||||
пусть идентификатор = объект.получить("id").число()
|
||||
пусть образование = объект.получить("education").строка()
|
||||
пусть имя = объект.получить("first_name").строка()
|
||||
пусть фамилия = объект.получить("last_name").строка()
|
||||
пусть отчество = объект.получить("middle_name").строка()
|
||||
пусть имя пользователя = объект.получить("username").строка()
|
||||
|
||||
пусть учитель = джесон.ДжесонОбъект{}
|
||||
если идентификатор # пусто { учитель.вставить("идентификатор", джесон.ДжесонЧисло{ значение: идентификатор^.значение }) }
|
||||
если образование # пусто { учитель.вставить("образование", джесон.ДжесонСтрока{ значение: образование^ }) }
|
||||
если имя # пусто { учитель.вставить("имя", джесон.ДжесонСтрока{ значение: имя^ }) }
|
||||
если фамилия # пусто { учитель.вставить("фамилия", джесон.ДжесонСтрока{ значение: фамилия^ }) }
|
||||
если отчество # пусто { учитель.вставить("отчество", джесон.ДжесонСтрока{ значение: отчество^ }) }
|
||||
если имя пользователя # пусто { учитель.вставить("имя пользователя", джесон.ДжесонСтрока{ значение: имя пользователя^ }) }
|
||||
|
||||
джесон учителя.значения.добавить(учитель)
|
||||
}
|
||||
|
||||
пусть туловище = джесон.сериализовать(джесон.ДжесонОбъект{
|
||||
значения: джесон.ДжесонКлючЗначения[
|
||||
джесон.ДжесонКлючЗначение{ ключ: "учителя", значение: джесон учителя }
|
||||
]
|
||||
})
|
||||
|
||||
вернуть хттп.ХттпОтвет{ туловище: туловище }
|
||||
}
|
||||
|
||||
фн добавить маршруты*(маршрутизатор: маршрутизатор.Маршрутизатор): маршрутизатор.Маршрутизатор {
|
||||
маршрутизатор.добавить маршрут("/api/users", массивы.Строки["POST"], создать)
|
||||
маршрутизатор.добавить маршрут("/api/teachers", массивы.Строки["GET"], список)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
392
исх/властелины/уроки/уроки.tri
Normal file
392
исх/властелины/уроки/уроки.tri
Normal file
@@ -0,0 +1,392 @@
|
||||
модуль уроки
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/спринтф"
|
||||
импорт "исх/массивы"
|
||||
импорт "исх/сеть/хттп"
|
||||
импорт "исх/форматы/джесон"
|
||||
импорт "исх/сеть/хттп/маршрутизатор"
|
||||
импорт "исх/картотека"
|
||||
импорт "исх/картотека/репозитории"
|
||||
импорт "исх/бюрократия"
|
||||
|
||||
фн добавить урок*(путь: Строка, параметры: массивы.Строки, обращение: маршрутизатор.Обращение): хттп.ХттпОтвет {
|
||||
пусть оплошность := ""
|
||||
пусть картотека = картотека.зайти()
|
||||
|
||||
пусть пользователь = репозитории.авторизовать по паспорту(бюрократия.получить данные паспорта(обращение), оплошность)
|
||||
|
||||
если оплошность # "" {
|
||||
вернуть хттп.ответ_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"], удалить урок)
|
||||
|
||||
вернуть маршрутизатор
|
||||
}
|
||||
Reference in New Issue
Block a user