From 35f6dc6ca0f3633a70cd49b7f25451f2241fd846 Mon Sep 17 00:00:00 2001 From: alxeg Date: Sat, 14 Mar 2026 17:52:10 +0300 Subject: [PATCH] Add payout req parsing --- internal/api/payout/payout_handler.go | 23 +++++++++++++++++-- internal/models/payout.go | 17 +++++++++----- internal/service/yookassa/module.go | 2 +- internal/service/yookassa/yookassa_service.go | 4 +++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/internal/api/payout/payout_handler.go b/internal/api/payout/payout_handler.go index bd16dcc..c60e1fb 100644 --- a/internal/api/payout/payout_handler.go +++ b/internal/api/payout/payout_handler.go @@ -12,6 +12,7 @@ import ( "go.uber.org/fx" "payouts/internal/config" + "payouts/internal/models" "payouts/internal/service/cache" "payouts/internal/service/database" "payouts/internal/service/database/orm" @@ -106,12 +107,30 @@ func (p *payoutHandler) PayoutCreate(w http.ResponseWriter, r *http.Request) { http.Error(w, errors.Join(errors.New(message), err).Error(), status) } - _, err := p.getSession(r) + userSession, err := p.getSession(r) if err != nil { errResponse("unauthorized", err, http.StatusUnauthorized) + return } - panic("unimplemented") + payoutReq := models.PayoutReq{ + PayoutType: models.TypeSBP, + } + decoder := json.NewDecoder(r.Body) + err = decoder.Decode(&payoutReq) + if err != nil { + slog.Error("Failed to decode request body", slog.String("error", err.Error())) + errResponse("failed to decode request body", err, http.StatusBadRequest) + return + } + + slog.Debug(fmt.Sprintf("Received create payload request: %v from user %v", payoutReq, userSession)) + err = p.yooKassa.CreatePayout(payoutReq, userSession) + if err != nil { + slog.Error("Failed to create payout request", slog.String("error", err.Error())) + errResponse("failed to create payout request", err, http.StatusBadRequest) + return + } } // PaymentCallback implements [Handler]. diff --git a/internal/models/payout.go b/internal/models/payout.go index 9d04567..ee99c50 100644 --- a/internal/models/payout.go +++ b/internal/models/payout.go @@ -8,15 +8,15 @@ import ( type PayoutType int64 const ( - SBP PayoutType = iota - YooMoney + TypeSBP PayoutType = iota + TypeYooMoney ) func (r PayoutType) String() string { switch r { - case SBP: + case TypeSBP: return "spb" - case YooMoney: + case TypeYooMoney: return "yoo_money" } return "unknown" @@ -30,9 +30,9 @@ func (r *PayoutType) UnmarshalText(text []byte) (err error) { s := strings.ToLower(string(text)) switch s { case "spb": - *r = SBP + *r = TypeSBP case "yoo_money": - *r = YooMoney + *r = TypeYooMoney default: err = fmt.Errorf("invalid payment type: %s", s) } @@ -44,3 +44,8 @@ type PayoutReq struct { AccountNumber string `json:"account_number"` Amount float32 `json:"amount"` } + +type PayoutResp struct { + Success bool `json:"success"` + Reason string `json:"reason,omitempty"` +} diff --git a/internal/service/yookassa/module.go b/internal/service/yookassa/module.go index 639959b..2e98261 100644 --- a/internal/service/yookassa/module.go +++ b/internal/service/yookassa/module.go @@ -27,7 +27,7 @@ func WithContext(ctx context.Context) Optional { } type Service interface { - CreatePayout(models.PayoutReq, *orm.User, ...Optional) + CreatePayout(models.PayoutReq, *orm.User, ...Optional) error GetConfig() yookassaConf.YooKassa } diff --git a/internal/service/yookassa/yookassa_service.go b/internal/service/yookassa/yookassa_service.go index abff78f..5c7ac06 100644 --- a/internal/service/yookassa/yookassa_service.go +++ b/internal/service/yookassa/yookassa_service.go @@ -60,10 +60,12 @@ func (y *yookassaService) OAuth2(ctx context.Context, operationName gen.Operatio } // CreatePayout implements [Service]. -func (y *yookassaService) CreatePayout(req models.PayoutReq, userSession *orm.User, opts ...Optional) { +func (y *yookassaService) CreatePayout(req models.PayoutReq, userSession *orm.User, opts ...Optional) error { params := y.getParams(opts...) y.payClient.PayoutsPost(params.ctx, &gen.PayoutRequest{}, gen.PayoutsPostParams{}) + + return nil } // GetConfig implements [Service].