Skip to content

Conversation

srg-bnd
Copy link
Collaborator

@srg-bnd srg-bnd commented Jun 24, 2025

No description provided.

srg-bnd and others added 24 commits June 15, 2025 04:03
* feat(gopher): user registration

* feat(gopher): user authentication

* fix(infra): correct configuration of the DB environment

* docs: added a description for the README
* feat(gophermart): add balance API

* feat(gophermart): add withdraw API

* feat(gophermart): add withdrawals API
@srg-bnd
Copy link
Collaborator Author

srg-bnd commented Jun 24, 2025

Как сделали 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

@srg-bnd srg-bnd changed the title gofermart feat: gofermart & accrual API Jun 24, 2025
AccrualAddress string `env:"ACCRUAL_SYSTEM_ADDRESS" envDefault:"http://localhost:8081"`
}

func ParseFlags() Config {

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]

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 {

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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а тут уже r.Context()

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()

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()

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) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут можно сделать декомпозицию на доменную логику и клиента. Клиент умеет ходить в апи, знает куда и возвращает готовый ответ или ошибки определенного типа. А здесь уже вызывается клиент, обрабатываются ошибки от клиента и ответ.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants