-
Notifications
You must be signed in to change notification settings - Fork 1
feat: gofermart & accrual API #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: review
Are you sure you want to change the base?
Conversation
(feature) accrual
* feat(gopher): user registration * feat(gopher): user authentication * fix(infra): correct configuration of the DB environment * docs: added a description for the README
Feature/gophermart orders
* feat(gophermart): add balance API * feat(gophermart): add withdraw API * feat(gophermart): add withdrawals API
Как сделали PR для проверки: # Develop branch
git checkout --orphan develop
git rm -rf .
git commit -a -m "Init" --allow-empty
git push -u origin develop
# Review branch
git checkout develop
git checkout -b review
git push --set-upstream origin review
# Merge main
git checkout develop
git merge main --allow-unrelated-histories
git push |
AccrualAddress string `env:"ACCRUAL_SYSTEM_ADDRESS" envDefault:"http://localhost:8081"` | ||
} | ||
|
||
func ParseFlags() Config { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почему ParseFlags, если это конструктор, а конструкторы принято именовать с New
) | ||
|
||
type OrdersHandler struct { | ||
Repo repositories.Repository[models.Order] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Существуют различные решения с DI на го, но все они не очень, например, https://github.com/google/wire
Но у них есть существенный недостаток - они не могут работать с идеоматическим подходом го в плане интерфейсов. Те если объявлять интерфейсы вместе использования, что предоставляет большую гибкость в коде, то подобные вещи не очень хорошо отрабатывают, например, wire не умеет.
Литература и ссылки
interface pollution https://100go.co/5-interface-pollution/ в целом вся книга довольно полезная
https://youtu.be/eYHCCht8eX4?feature=shared
https://www.ardanlabs.com/blog/2016/10/avoid-interface-pollution.html
https://www.ardanlabs.com/blog/2015/09/composition-with-go.html
return | ||
} | ||
|
||
if orderInstance, err := h.Repo.FindByFieldWithPreloads(context.Background(), "number", orderNumber, "Goods"); err != nil { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
почему contexst.Background() вместо r.Context()?
|
||
ctx := r.Context() | ||
|
||
existing, err := h.Repo.FindByField(ctx, "number", req.Order) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а тут уже r.Context()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
выглядит так, что все ниже это - доменная или бизнес логика, которую можно декомпозировать и вынести либо в доменный слой6 если интересен DDD либо в сервисный слой, если больше приверженец SOLID или CLEAN
for task := range p.tasks { | ||
logger.L().Debug("worker picked task", zap.Int("worker_id", id), zap.Uint("order_id", task.OrderID)) | ||
|
||
ctx := context.Background() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а предусмотрена ли возможность дождать окончания операции и после этого завершить процесс, если поступил сигнал на завершение?
|
||
ctx, cancel := context.WithTimeout(context.Background(), ShutdownTimeout) | ||
defer cancel() | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
с workerpool не понял, как отрабатывается этот сигнал
} | ||
} | ||
|
||
func (f *AccrualFetcher) fetchAccrualResponse(ctx context.Context, number string) (*accrualResponse, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут можно сделать декомпозицию на доменную логику и клиента. Клиент умеет ходить в апи, знает куда и возвращает готовый ответ или ошибки определенного типа. А здесь уже вызывается клиент, обрабатываются ошибки от клиента и ответ.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
таким образом можно будет завязаться на интерфейс клиента и покрыть бизнес логику тестами на моках, не дожидаясь, когда реальный аккруал заработает - это обсуждали на созвоне. Плюс дополнительная декомпозиция.
В микросервисах обычно подымают grpc и наружу отдают grpc клиентов, которые можно импортировать в проект.
No description provided.