# Заметки по ревью кода Острякова В. *(тестовое задание в контент WB)* Ревьюер: [Гульков И.С.](https://t.me/isgulkov) Версия репы: [`d575b38a5852034104de0cfe3cf036ea9bdd9ca9`](https://github.com/Lnx117/L3WB/tree/d575b38a5852034104de0cfe3cf036ea9bdd9ca9) Допы: - [x] 1\. Асинхронное обновление данных - [x] 2\. Распараллеливание процесса - [ ] 3\. Docker - [ ] 4\. «Для самых смелых» - [x] 5\. Swagger, тесты, логи ## Несоответствия требованиям 1. Данные обновляются не раз в минуту, а раз в "минуту + время самого обновления" ## Замечания *Эти пункты в той или иной мере повлияли на оценку* ### API самого сервиса 1. Сервис вообще не отвечает на запросы, пока не завершится загрузка данных из внешнего API, при том что длительность этой операции велика (практически не ограничена), а успех — не гарантирован. Можно было бы сразу запустить HTTP-сервер, а в фоне уже че-то там обновлять: если это не первый запуск, то данные в базе уже есть, пусть и необновленные; мы их могли бы начать отдавать сразу же, как к ней подключились! ### Поддерживаемость и кодстайл 1. [Передаем вейт-группу в другую функцию](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/service/geocodingService.go#L75), просто чтобы вызвать там внутри `wg.Done()`. Ну, можно же вот так делать: ```go go func() { syncCitiesOpenweathermapData.GetCityOpenweathermapData(v) wg.Done() }() ``` *Когда синхронизационный примитив можно не выпускать за пределы одной функции, следует так и поступать* ### Обработка ошибок 1. [Логируем ошибку и идем дальше](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/repository/postgresQueries.go#L96), вставлять в БД заведомо невалидные данные; [вот то же самое](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/repository/postgresQueries.go#L129): залогировали ошибку и пошли ковырять заведомо невалидный `rows`... 2. [Неоправданный фатал еррор](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/repository/postgresQueries.go#L35) (крэш сервера) из-за всего лишь невалидного состояния данных в БД 3. Очень многие функции, где ошибки возможны и вероятны (особенно связанные с походом во внешнее API), не возвращают их, что позволило бы, например, сделать ретрай, зато сразу, на месте, логируют ### Работа с БД - Подставлять параметры в запрос текстом — недопустимо, т.к. приводит к SQL-инъекциям (в твоем коде одна такая даже есть). Для подстановки данных в запрос следует использовать `$`-параметры ### Работа с внешним API - [Вот здесь](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/service/geocodingService.go#L75) мы условно одновременно отправляем N запросов, где N — количество городов. С 20 городами именно этот сервис такое позволяет, а если их в БД будет 1000? *(тогда тебя забанят по API-ключу, я проверял уже)* ## Придирки по-мелочи *Эти пункты __не__ повлияли на оценку* ### Поддерживаемость и кодстайл - [Локальная переменная называется с большой буквы](https://github.com/Lnx117/L3WB/blob/d575b38a5852034104de0cfe3cf036ea9bdd9ca9/pkg/repository/postgresQueries.go#L60) ### Работа с БД - Держать имена таблиц в константах и потом их подставлять под `%s` — это какая-то дичь...