diff --git a/internal/api/http/handlers/donat/donat.go b/internal/api/http/handlers/donat/donat.go index f073fea..3b5bbbe 100644 --- a/internal/api/http/handlers/donat/donat.go +++ b/internal/api/http/handlers/donat/donat.go @@ -220,10 +220,8 @@ func GetOuterDonatePage(donatService model.DonatService) echo.HandlerFunc { ctx := context.Background() streamerLogin := request.Param("streamer-login") - accessToken := model.Token(request.Request().Header.Get("Authorization")) - outerPageResponse, err := donatService.GetOuterDonatPage( - ctx, streamerLogin, string(accessToken), + ctx, streamerLogin, ) if outerPageResponse.Login == "" { return echo.NewHTTPError(http.StatusNotFound, "Пользователь не найден!") diff --git a/internal/model/interfaces.go b/internal/model/interfaces.go index b9e7c8b..0c95831 100644 --- a/internal/model/interfaces.go +++ b/internal/model/interfaces.go @@ -81,7 +81,7 @@ type DonatService interface { MarkDonatView(ctx context.Context, orderID string) error GetInnerDonatPage(ctx context.Context, streamerID int, token string) (InnerDonatePageResponse, error) - GetOuterDonatPage(ctx context.Context, streamerLogin string, token string) (OuterDonatePageResponse, error) + GetOuterDonatPage(ctx context.Context, streamerLogin string) (OuterDonatePageResponse, error) UpdateDonatePage( ctx context.Context, streamerID int, @@ -252,6 +252,7 @@ type FileService interface { } type StreamerClient interface { - GetAvatarID(token string) (string, error) + GetAvatarIdByToken(token string) (string, error) + GetAvatarById(accountId string) (string, error) UpdateAvatarID(token string, avatarUUID string) error } diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index 24e91db..06268ed 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -143,6 +143,7 @@ SELECT dp.description, dp.text_after_donat, dp.streamer_login, + dp.profile_avatar, -- Поля для хед-изображения head_img.id AS head_img_id, diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index 6c062da..a10903b 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -9,6 +9,7 @@ import ( "log/slog" "mime/multipart" "net/http" + "strconv" ) type ServiceDonat struct { @@ -217,7 +218,7 @@ func (donatService *ServiceDonat) GetInnerDonatPage( } if donatePage.ProfileAvatar == true { - fileId, err := donatService.streamerClient.GetAvatarID(token) + fileId, err := donatService.streamerClient.GetAvatarIdByToken(token) if err != nil { slog.Error(err.Error()) } @@ -260,7 +261,6 @@ func (donatService *ServiceDonat) GetInnerDonatPage( func (donatService *ServiceDonat) GetOuterDonatPage( ctx context.Context, streamerLogin string, - token string, ) (model.OuterDonatePageResponse, error) { donatePage, err := donatService.donatRepo.GetDonatPageByLogin(ctx, streamerLogin) if err != nil { @@ -271,7 +271,17 @@ func (donatService *ServiceDonat) GetOuterDonatPage( avatarFileId := donatePage.AvatarFileId if donatePage.ProfileAvatar == true { - fileId, err := donatService.streamerClient.GetAvatarID(token) + donatModel, err := donatService.donatRepo.GetDonatPageByLogin(ctx, streamerLogin) + if err != nil { + slog.Error(err.Error()) + } + streamerID := donatModel.StreamerID + if streamerID == 0 { + slog.Error("Account by login not found") + } + + fileId, err := donatService.streamerClient.GetAvatarById(strconv.Itoa(streamerID)) + if err != nil { slog.Error(err.Error()) avatarFileId = donatePage.AvatarFileId diff --git a/pkg/api/streamer/streamer.go b/pkg/api/streamer/streamer.go index 38da2d2..f7f8d87 100644 --- a/pkg/api/streamer/streamer.go +++ b/pkg/api/streamer/streamer.go @@ -71,7 +71,7 @@ func (c *ClientStreamer) UpdateAvatarID(token string, avatarUUID string) error { return nil } -func (c *ClientStreamer) GetAvatarID(token string) (string, error) { +func (c *ClientStreamer) GetAvatarIdByToken(token string) (string, error) { const endpoint = "/info" var result model.StreamerInfo @@ -115,6 +115,49 @@ func (c *ClientStreamer) GetAvatarID(token string) (string, error) { return extractFileID(result.Avatar), nil } +func (c *ClientStreamer) GetAvatarById(accountId string) (string, error) { + var endpoint = "/info" + "/" + accountId + var result model.StreamerInfo + + req, err := http.NewRequest("GET", c.baseURL+endpoint, nil) + if err != nil { + slog.Error("create request failed", "error", err) + return "", fmt.Errorf("request creation error: %w", err) + } + + req.Header.Set("Accept", "application/json") + + resp, err := c.client.Do(req) + if err != nil { + slog.Error("request failed", "error", err) + return "", fmt.Errorf("HTTP request error: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + slog.Error("unexpected status code", + "status", resp.Status, + "response", string(body)) + return "", fmt.Errorf("HTTP %d: %s", resp.StatusCode, resp.Status) + } + + rawBody, err := io.ReadAll(resp.Body) + if err != nil { + slog.Error("read body failed", "error", err) + return "", fmt.Errorf("read body error: %w", err) + } + + if err := json.Unmarshal(rawBody, &result); err != nil { + slog.Error("JSON parse error", + "error", err, + "response", string(rawBody)) + return "", fmt.Errorf("JSON unmarshal error: %w", err) + } + + return extractFileID(result.Avatar), nil +} + // extractFileID извлекает последний сегмент URL (fileId) func extractFileID(avatarURL string) string { if avatarURL == "" {