{"id":21519382,"url":"https://github.com/alexwayfer/payapp_job_test","last_synced_at":"2025-03-17T16:49:50.258Z","repository":{"id":55758750,"uuid":"319722642","full_name":"AlexWayfer/payapp_job_test","owner":"AlexWayfer","description":"Тестовое задание для вакансии Ruby Developer в PayApp","archived":false,"fork":false,"pushed_at":"2020-12-12T13:41:48.000Z","size":12,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-31T04:34:09.687Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/AlexWayfer.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}},"created_at":"2020-12-08T18:13:54.000Z","updated_at":"2020-12-08T18:14:30.000Z","dependencies_parsed_at":"2022-08-15T06:50:18.474Z","dependency_job_id":null,"html_url":"https://github.com/AlexWayfer/payapp_job_test","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/AlexWayfer%2Fpayapp_job_test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexWayfer%2Fpayapp_job_test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexWayfer%2Fpayapp_job_test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexWayfer%2Fpayapp_job_test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlexWayfer","download_url":"https://codeload.github.com/AlexWayfer/payapp_job_test/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244074436,"owners_count":20393965,"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-24T00:57:37.301Z","updated_at":"2025-03-17T16:49:50.237Z","avatar_url":"https://github.com/AlexWayfer.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Тестовое задание для вакансии Ruby Developer в PayApp\n\n## Постановка\n\nДва микросервиса.\n\nПервый решает квадратное уравнение `aX^2 + bX + c = 0`.\n\n`POST /api/equation` принимает JSON объект `{ a: , b: , c: }` и возвращает `id`\nсозданного уравнения\n\n`PATCH /api/equation/:id/solve` решает уравнение, записывает в базу корни,\nпроверяет их вторым сервисом и возвращает клиенту. Если проверка не прошла,\nтранзакция откатывается. Предусмотреть корректную обработку ошибок второго\nсервиса.\n\nВторой проверяет, что оба корня положительны.\n\n`POST /api/check` принимает JSON объект `{ x1: , x2: }` и возвращает объект\n`{ valid: true|false }`.\n\nВ метод добавить генерацию ошибки случайным образом (чтобы часть запросов не\nпроходила).\n\nБонус: использовать `dry-validation` для проверки входных параметров.\n\n## Решение\n\nПервый сервис в `solver/`, второй — в `checker/`.\n\nРешил впервые попробовать [`grape`](https://github.com/ruby-grape/grape).\nНе понравилось: неясная привязка `params` к методам, дублирование в `params` и `route_param`.\nПонравилось: `values` и `except_values`, но можно было обойтись меньшими хелперами.\n\nДобавил валидацию `a ≠ 0` (условие решений квадратных уравнений).\nНе уверен, когда лучше валидировать: при создании уравнения или при попытке его решить.\nПошёл по более простому и оптимальному пути (первому).\n\nНекоторые инструменты (`toys`) и решения (мемоизация в `config`)\nперенёс из экосистемы [Flame](https://github.com/AlexWayfer/flame).\n\nНепонятно, что возвращать от `/solve` в случае какой-либо ошибки. Оставил на откуп `grape`.\n\nТак как это уравнение в вакууме, непонятно, лучше проверять количество корней до отправки запроса\nвторому сервису или перенести полностью логику туда.\nВ итоге перенёс, ведь цель задания не (оптимальное) решение уравнения, а взаимодействие сервисов.\n\nТакже хотелось бы кэшировать решение в базе до отправки на проверку и переиспользовать его\nпри повторах после недоступности сервиса проверки, но не стал этого делать по тем же причинам.\n\nНе понятно, в какой \"метод\" добавить \"генерацию ошибки случайным образом\".\nДобавил в `POST /api/check` у второго сервиса (избегая тестов).\nНо из-за наличия кэширования в первом сервисе (про которое не указано ни нужно ли оно,\nни не нужно ли), добиться этого ручным тестированием может быть сложно.\n\nНе использовал `dry-validation` потому, что решил попробовать `grape`, который, как оказалось,\nиспользует `dry`, но не `-validation`. Не нашёл смысла и места использовать `dry-validation`,\nно могу прикрутить в дополнительное место или к другому абстрактному коню в вакууме.\n\nВо время решения узнал, что мемоизация с `module_function` не работает,\nв отличие от `class \u003c\u003c self`.\n\nВообще, я имел дело с откатом транзакций\n[[1]](https://github.com/AlexWayfer/formalism-sequel_transactions),\nс обработкой ошибок от сторонних сервисов\n[[1]](https://github.com/dustinlakin/twitch-rb/pull/34)\n[[2]](https://github.com/EnotPoloskun/twitch-chat/pull/6),\nтак что не очень понимаю, в чём именно ожидали протестировать меня как кандидата.\n\nЯ бы больше понял тестовое с RabbitMQ, Kafka, чем-нибудь подобным, с чем не имел дела,\nно что может быть важным в микро-сервисной архитектуре.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexwayfer%2Fpayapp_job_test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexwayfer%2Fpayapp_job_test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexwayfer%2Fpayapp_job_test/lists"}