8000 GitHub - YuriyLeontev/ConGo: A pet project for honing skills and learning Go by building something fun and useful
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

YuriyLeontev/ConGo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ConGo

Проект для изучения Go

Highload Cup 2018 (Task)

Задача:

В альтернативной реальности человечество решило создать и запустить глобальную систему по поиску "вторых половинок". Такая система призвана уменьшить количество одиноких людей в мире и способствовать созданию крепких семей.

Предлагается выступить в роли инженера, которому заказали создание прототипа подобной системы. Прототип должен как можно быстрее выдавать правильные ответы на запросы сторонних сервисов, которые делают что-то с ответами (например, отображают пользователям в красивых интерфейсах). По сути, он должен служить для внешних гипотетических сервисов функциональным API.

Описание необходимого API

API - это схемы http-запросов, которые должен обслуживать разработанный участником сервер. URL-ы строятся в соответствии с парадигмой REST. В угловых скобках указаны части URL, которые могут и будут меняться от запроса к запросу.

Во всех ответах от сервера учитываются заголовки Content-Type, Content-Length, Connection.

Запросы выборки данных (GET):

1. Получение списка пользователей: /accounts/filter/

Данный метод API планируется использовать для поиска пользователей по заранее известным или желаемым полям. К примеру, кому-то захотелось посмотреть всех людей определённого возраста и пола, кто живёт в определённом городе.

В теле ответа ожидается структура {"accounts": [ ... ]} с пользователями, данные которых соответствуют указанным в GET-параметрах ограничениям. Для каждой подошедшей записи аккаунта не нужно передавать все известные о ней данные, а только поля id, email и те, что были использованы в запросе.

Пользователи в результате должны быть отсортированы по убыванию значений в поле id. Количество выбираемых записей ограничено обязательным GET-параметром limit.

Остальные GET-параметры формируются как <поле>_<предикат>. У разных полей могут использоваться только определённые фильтрующие предикаты, которые перечислены в таблице ниже. В данном запросе действие нескольких параметров складывается, то есть сначала фильтрация по одному, затем фильтрация результата по второму и т. д.

#Название поляВозможные предикаты с расшифровкой
1sexeq - соответствие конкретному полу - "m" или "f";
2emaildomain - выбрать всех, чьи email-ы имеют указанный домен;
lt - выбрать всех, чьи email-ы лексикографически раньше;
gt - то же, но лексикографически позже;
3statuseq - соответствие конкретному статусу;
neq - выбрать всех, чей статус не равен указанному;
4fnameeq - соответствие конкретному имени;
any - соответствие любому имени из перечисленных через запятую;
null - выбрать всех, у кого указано имя (если 0) или не указано (если 1);
5snameeq - соответствие конкретной фамилии;
starts - выбрать всех, чьи фамилии начинаются с переданного префикса;
null - выбрать всех, у кого указана фамилия (если 0) или не указана (если 1);
6phonecode - выбрать всех, у кого в телефоне конкретный код (три цифры в скобках);
null - аналогично остальным полям;
7countryeq - всех, кто живёт в конкретной стране;
null - аналогично;
8cityeq - всех, кто живёт в конкретном городе;
any - в любом из перечисленных через запятую городов;
null - аналогично;
9birthlt - выбрать всех, кто родился до указанной даты;
gt - после указанной даты;
year - кто родился в указанном году;
10interestscontains - выбрать всех, у кого есть все перечисленные интересы;
any - выбрать всех, у кого есть любой из перечисленных интересов;
11likescontains - выбрать всех, кто лайкал всех перечисленных пользователей
 (в значении - перечисленные через запятые id);
12premiumnow - все у кого есть премиум на текущую дату;
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, даже если ни одного пользователя не нашлось.

About

A pet project for honing skills and learning Go by building something fun and useful

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0