package payout import ( "errors" "net/http" "regexp" "go.uber.org/fx" "payouts/internal/config" "payouts/internal/service/cache" "payouts/internal/service/database" "payouts/internal/service/database/orm" "payouts/internal/service/yookassa" ) const ( BaseRoute = "/payment" CreateRoute = "/create" CallbackRoute = "/callback" BanksRoute = "/sbp/banks" ) var authHeaderRe = regexp.MustCompile(`^Bearer\s+(.*)$`) type payoutHandler struct { dbService database.Service cacheService cache.Service yooKassa yookassa.Service } // Params represents the module input params type Params struct { fx.In AppConfig *config.App DbService database.Service YooKassa yookassa.Service CacheService cache.Service } func NewPayoutHandler(p Params) (Handler, error) { return &payoutHandler{ dbService: p.DbService, cacheService: p.CacheService, yooKassa: p.YooKassa, }, nil } func (p *payoutHandler) getSession(r *http.Request) (*orm.User, error) { authHeaderValue := r.Header.Get("Authorization") if len(authHeaderValue) == 0 { return nil, errors.New("no valid auth header") } matches := authHeaderRe.FindStringSubmatch(authHeaderValue) if matches == nil { return nil, errors.New("no valid auth header") } sessionId := matches[1] userSession, err := p.cacheService.GetSession(sessionId) if err != nil { return nil, errors.New("session not found") } return &userSession, nil } // GetSbpBanks implements [Handler]. func (p *payoutHandler) GetSbpBanks(w http.ResponseWriter, r *http.Request) { panic("unimplemented") } // PaymentCreate implements [Handler]. func (p *payoutHandler) PayoutCreate(w http.ResponseWriter, r *http.Request) { errResponse := func(message string, err error, status int) { http.Error(w, errors.Join(errors.New(message), err).Error(), status) } _, err := p.getSession(r) if err != nil { errResponse("unautiorized", err, http.StatusUnauthorized) } panic("unimplemented") } // PaymentCallback implements [Handler]. func (p *payoutHandler) PayoutCallback(http.ResponseWriter, *http.Request) { }