Проект для изучения Go
Задача:
В альтернативной реальности человечество решило создать и запустить глобальную систему по поиску "вторых половинок". Такая система призвана уменьшить количество одиноких людей в мире и способствовать созданию крепких семей.
Предлагается выступить в роли инженера, которому заказали создание прототипа подобной системы. Прототип должен как можно быстрее выдавать правильные ответы на запросы сторонних сервисов, которые делают что-то с ответами (например, отображают пользователям в красивых интерфейсах). По сути, он должен служить для внешних гипотетических сервисов функциональным API.
API - это схемы http-запросов, которые должен обслуживать разработанный участником сервер. URL-ы строятся в соответствии с парадигмой REST. В угловых скобках указаны части URL, которые могут и будут меняться от запроса к запросу.
Во всех ответах от сервера учитываются заголовки Content-Type, Content-Length, Connection.
1. Получение списка пользователей: /accounts/filter/
Данный метод API планируется использовать для поиска пользователей по заранее известным или желаемым полям. К примеру, кому-то захотелось посмотреть всех людей определённого возраста и пола, кто живёт в определённом городе.
В теле ответа ожидается структура {"accounts": [ ... ]}
с пользователями, данные которых соответствуют указанным в GET-параметрах ограничениям. Для каждой подошедшей записи аккаунта не нужно передавать все известные о ней данные, а только поля id, email и те, что были использованы в запросе.
Пользователи в результате должны быть отсортированы по убыванию значений в поле id. Количество выбираемых записей ограничено обязательным GET-параметром limit.
Остальные GET-параметры формируются как <поле>_<предикат>
. У разных полей могут использоваться только определённые фильтрующие предикаты, которые перечислены в таблице ниже. В данном запросе действие нескольких параметров складывается, то есть сначала фильтрация по одному, затем фильтрация результата по второму и т. д.
# | Название поля | Возможные предикаты с расшифровкой |
---|---|---|
1 | sex | eq - соответствие конкретному полу - "m" или "f"; |
2 | domain - выбрать всех, чьи email-ы имеют указанный домен;lt - выбрать всех, чьи email-ы лексикографически раньше;gt - то же, но лексикографически позже; | |
3 | status | eq - соответствие конкретному статусу;neq - выбрать всех, чей статус не равен указанному; |
4 | fname | eq - соответствие конкретному имени;any - соответствие любому имени из перечисленных через запятую;null - выбрать всех, у кого указано имя (если 0) или не указано (если 1); |
5 | sname | eq - соответствие конкретной фамилии;starts - выбрать всех, чьи фамилии начинаются с переданного префикса;null - выбрать всех, у кого указана фамилия (если 0) или не указана (если 1); |
6 | phone | code - выбрать всех, у кого в телефоне конкретный код (три цифры в скобках);null - аналогично остальным полям; |
7 | country | eq - всех, кто живёт в конкретной стране;null - аналогично; |
8 | city | eq - всех, кто живёт в конкретном городе;any - в любом из перечисленных через запятую городов;null - аналогично; |
9 | birth | lt - выбрать всех, кто родился до указанной даты;gt - после указанной даты;year - кто родился в указанном году; |
10 | interests | contains - выбрать всех, у кого есть все перечисленные интересы;any - выбрать всех, у кого есть любой из перечисленных интересов; |
11 | likes | contains - выбрать всех, кто лайкал всех перечисленных пользователей(в значении - перечисленные через запятые id); |
12 | premium | now - все у кого есть премиум на текущую дату;null - аналогично остальным; |
Пример запроса и корректного ответа на него:
GET: /accounts/filter/?status_neq=всё+сложно&birth_lt=643972596&country_eq=Индляндия&limit=5&query_id=110
{
"accounts": [
{
"email": "monnorakodehrenod@list.ru",
"country": "Индляндия",
"id": 99270,
"status": "заняты",
"birth": 581863572
},{
"email": "erwirarhadmemeddifde@yahoo.com",
"country": "Индляндия",
"id": 98881,
"status": "свободны",
"birth": 640015608
},{
"email": "rupewseor@rambler.ru",
"country": "Индляндия",
"id": 98828,
"status": "заняты",
"birth": 604256977
},{
"email": "fiotnefaersohhev@inbox.ru",
"country": "Индляндия",
"id": 98804,
"status": "свободны",
"birth": 596799123
},{
"email": "geslasereshedot@yahoo.com",
"country": "Индляндия",
"id": 98718,
"status": "свободны",
"birth": 640919302
}
]
}
В случае неизвестного поля или неразрешённого предиката, в ответе ожидается код 400 с пустым телом. Во всех остальных случаях ожидается ответ 200, даже если ни одного пользователя не нашлось.