Перейти к содержанию

Практикум на ЭВМ (2026)/Задание 0 (бонусное)

Материал из SecSem Wiki
Версия от 07:07, 26 сентября 2026; Dzeni (обсуждение | вклад) (Новая страница: «==Формулировка== Вам достался в наследство модуль от старой внутренней системы компании. В архиве есть файл legacy_db.py, где уже частично настроено подключение к базе данных и написано несколько базовых функций поиска. В базе данных модуля три таблицы, хран...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Формулировка

Вам достался в наследство модуль от старой внутренней системы компании. В архиве есть файл legacy_db.py, где уже частично настроено подключение к базе данных и написано несколько базовых функций поиска.

В базе данных модуля три таблицы, хранящие данные о пользователях приложения. Первая таблица "users" имееет следующие колонки:

  • id пользователя (число) - универсальное для каждого пользователя
  • login - имя пользователя (строка)
  • money_amount (число)
  • card_number - (строка) номер его кредитной карты
  • status - статус активен/неактивен (любой тип данных по выбору, главное, чтобы было два различимых значения).

Вторая таблица "passwords" хранит пароли пользователей, в ней две колонки: id пользователя и собственно пароль. Третья таблица "banks" хранит соответствие пользователей и их банков и имеет две колонки: id и название банка.

Веб-приложение по '/users' отдает страницу со списком активных пользователей. Реализована выборка пользователей по login и id. Параметр, по которому должен отбираться пользователь, передается в параметре query string. То есть:

  • по url "/by-login?login=username" выдается страница с данными пользователя с именем "username"
  • по url "/by-id?id=3" выдаются данные пользователя с id=3


Ваша задача — доработать этот модуль (нельзя удалять старый код, только добавлять свой).

Реализуйте следующие функции:

  • Универсальный живой поиск (/search)

Необходимо найти всех пользователей, у которых строка поиска частично совпадает (LIKE) с их login (параметр поиска передается через query-параметр q). Если параметр q пустой или отсутствует, приложение должно выводить топ-5 самых богатых пользователей по значению money_amount.

  • Аналитический срез (/analytics)

Запрос на /analytics выводит пользователей, чей баланс (money_amount) строго выше среднего баланса по всей базе данных. При этом список должен фильтроваться по статусу, который пользователь передает через query-параметр /analytics?target_status=active. Рядом с каждым пользователем в выдаче должн отображаться информация о его банке, полученная «на лету» с помощью JOIN с третьей таблицей.

  • Расширение функционала

Добавьте эндпоинт /transfer_status. Он должен принимать список ID через запятую (например, ids=1,3,4) и массово обновлять их status на противоположный одним SQL-запросом.

Файлы задания

Файл:Mini-app.zip


Критерии

Чтобы засчитать задание, вы должны прислать ссылку на код своего мини-приложения на почту: OkunevaA@seclab.cs.msu.ru. Если вы используете git, то первый коммит должен содержать файлы из архива, последующие - ваш добавленный код. Приложение должно запускаться и правильно отрабатывать. Автором присланного кода должны быть вы сами, запрещается присылать приложение, сделанное кем-то еще. В своем сообщении или теме письма не забудьте указать по какому поводу пишете (например "Задание по SQL по практикуму на ЭВМ" и ФИО).

Дедлайн и баллы

Те, кто пришлёт работающее и отвечающее критериям приложение до 12:30 26 сентября, получат за задание 120 баллов. (сверх тех 2000 баллов, которые будут даваться за основные задания). Приславшие между 12:30 26 сентября и 14:30 26 сентября получат за задание 80 баллов.

14:30 26 сентября- крайний срок приёма задания.

Приславшие засчитанное приложение первыми получат дополнительный бонус.