{"id":21542274,"url":"https://github.com/mxmzigzag/aviasales","last_synced_at":"2025-03-17T23:51:03.640Z","repository":{"id":152077034,"uuid":"424873913","full_name":"mxmzigzag/aviasales","owner":"mxmzigzag","description":null,"archived":false,"fork":false,"pushed_at":"2021-11-09T08:25:10.000Z","size":890,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-24T08:43:26.518Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mxmzigzag.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-05T08:17:16.000Z","updated_at":"2021-11-09T08:25:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"74a333cb-994e-4e9e-90bc-e737e9d75275","html_url":"https://github.com/mxmzigzag/aviasales","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxmzigzag%2Faviasales","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxmzigzag%2Faviasales/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxmzigzag%2Faviasales/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxmzigzag%2Faviasales/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mxmzigzag","download_url":"https://codeload.github.com/mxmzigzag/aviasales/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244130277,"owners_count":20402753,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-24T05:09:05.989Z","updated_at":"2025-03-17T23:51:03.634Z","avatar_url":"https://github.com/mxmzigzag.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Тестовое задание Aviasales ([frontend](https://aviasales.recruitee.com/o/frontend-developer-js-coffeescript-react%C2%A0redux--aviasalesru))\n\nОсновной frontend проект нашей команды — это страница выдачи билетов со множеством фильтров, настроек и, собственно, билетов.\nПроект написан на React, поэтому тестовое задание приближено к ежедневным задачам.\n\nПеред тобой упрощенный макет нашего проекта — список билетов, фильтры и сортировка. Также у нас есть небольшой сервер для тестового задания, который работает схоже с нашим основным backend движком и реализует технику long polling для передачи пачек билетов. Тебе необходимо реализовать клиент, который будет получать случайно сгенерированные билеты от сервера и отрисует интерфейс согласно макету в Figma. Достаточно будет отрендерить 5 первых билетов соотвествующих выбранным фильтрам и сортировки.\n\n## Условия\n\n- Используй React\n- Используй TS или JS\n- Работоспособность в актуальной версии Google Chrome\n- Остальное на твоё усмотрение\n\n## Документация по работе с сервером: [Здесь](https://github.com/KosyanMedia/test-tasks/blob/master/aviasales_frontend/server.md)\n\n## Макет (Figma)\nhttps://github.com/KosyanMedia/test-tasks/raw/f0f60244b045928746188a86ba4f76ddb5515111/aviasales_frontend/Aviasales%20Test%20Task.fig\n\nFigma \n\n![](search_preview.png?raw=true)\n\nУдачи! Если будут какие-то вопросы, пиши – добавим уточнения в репу.\n\nP.S.: Картинки авиакомпаний можешь брать с нашего CDN: `//pics.avs.io/99/36/{IATA_CODE_HERE}.png`\n\n\n# Server md\n\n# Описание взаимодействия с сервером\n\nСхема работы проста: сначала необходимо инициировать поиск на сервере и получить идентификатор поиска (`searchId`). Далее, с полученным `searchId`, ты делаешь запросы для получения неотсортированных списков билетов. Обрати внимание, что билеты прилетают пачками, которые необходимо агрегировать, фильтровать и сортировать согласно выбранным в интерфейсе параметрам. Для усложнения задачи, сервер может на один из запросов ответить ошибкой.\n\n## Получение `searchId`\n\nПросто отправь GET-запрос на `https://front-test.beta.aviasales.ru/search` и получи его.\n\nПример:\n\nRequest: `https://front-test.beta.aviasales.ru/search`\n\nResponse: `{\"searchId\":\"4niyd\"}`\n\n## Получение пачки билетов\n\nОтправляй GET-запросы на `https://front-test.beta.aviasales.ru/tickets` и передай searchId полученный из запроса выше GET-параметром.\n\nПример:\n\nRequest: `https://front-test.beta.aviasales.ru/tickets?searchId=4niyd`\n\nResponse: `{tickets: [], stop: false}`\n\n## Обработка завершения поиска\n\nПоиск считается завершенным, когда в очередном ответе от сервера придёт значение `{stop: true}`.\n\nПример:\n\nRequest: `https://front-test.beta.aviasales.ru/tickets?searchId=4niyd`\n\nResponse: `{tickets: [], stop: true}`\n\n## Структура билета\n\nВ списке `tickets` будут лежать билеты следующей структуры:\n\n```typescript\ninterface Ticket {\n  // Цена в рублях\n  price: number\n  // Код авиакомпании (iata)\n  carrier: string\n  // Массив перелётов.\n  // В тестовом задании это всегда поиск \"туда-обратно\" значит состоит из двух элементов\n  segments: [\n    {\n      // Код города (iata)\n      origin: string\n      // Код города (iata)\n      destination: string\n      // Дата и время вылета туда\n      date: string\n      // Массив кодов (iata) городов с пересадками\n      stops: string[]\n      // Общее время перелёта в минутах\n      duration: number\n    },\n    {\n      // Код города (iata)\n      origin: string\n      // Код города (iata)\n      destination: string\n      // Дата и время вылета обратно\n      date: string\n      // Массив кодов (iata) городов с пересадками\n      stops: string[]\n      // Общее время перелёта в минутах\n      duration: number\n    }\n  ]\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmxmzigzag%2Faviasales","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmxmzigzag%2Faviasales","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmxmzigzag%2Faviasales/lists"}