From aebe6ca7fc2194acd9074b13f9dc8616f8ae6a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=A9o=20Calvo?= Date: Tue, 2 Jun 2026 10:13:15 -0300 Subject: [PATCH] fix: using get user from loyalty --- controllers/commands.go | 3 -- repositories/loyalty.go | 28 ++++++++++++ repositories/presenca.go | 34 +++----------- repositories/retro.go | 57 ----------------------- services/perfil.go | 43 ++---------------- services/points.go | 98 +++++++++++++++++----------------------- 6 files changed, 81 insertions(+), 182 deletions(-) delete mode 100644 repositories/retro.go diff --git a/controllers/commands.go b/controllers/commands.go index 7a3d514..259be95 100644 --- a/controllers/commands.go +++ b/controllers/commands.go @@ -69,9 +69,6 @@ func (c *CommandsController) GetCommand(message twitch.PrivateMessage) (string, case "cubos": return c.perfilService.GetUserCubes(message.User) - case "retro": - return c.perfilService.GetUserRetro(message.User) - case "presente": return c.pointsService.MgmtPresenca(message.User) diff --git a/repositories/loyalty.go b/repositories/loyalty.go index e5dfd59..0eedc41 100644 --- a/repositories/loyalty.go +++ b/repositories/loyalty.go @@ -276,6 +276,34 @@ func (r *LoyaltyRepository) GetCustomerLastTransactionDateByCategory(customerID } +func (r *LoyaltyRepository) GetCustomerLastTransactionDateByCodProduct(customerID string, codProduct string) (*time.Time, error) { + + /// last_transaction_product/:customerID/:codProduct + url := fmt.Sprintf("%s/last_transaction_product/%s/%s", r.URI, customerID, codProduct) + + resp, err := r.HttpClient.Get(url) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("erro na requisição. statuscode: %d", resp.StatusCode) + } + + bodyReader, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var payload PayloadLastDate + if err := json.Unmarshal(bodyReader, &payload); err != nil { + return nil, err + } + + return payload.LastTransactionDate, nil +} + func NewLoyaltyRepository(settings *config.Config) *LoyaltyRepository { return &LoyaltyRepository{ URI: settings.LoyaltyServiceURI, diff --git a/repositories/presenca.go b/repositories/presenca.go index 63be9b7..5c2d8a3 100644 --- a/repositories/presenca.go +++ b/repositories/presenca.go @@ -13,13 +13,6 @@ type PresentUser struct { CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"` } -func NewPresentUser(twitchUser *TwitchUser) *PresentUser { - return &PresentUser{ - UUID: uuid.New().String(), - UserID: twitchUser.UUID, - } -} - type StreakPresentUser struct { UUID string `json:"uuid" gorm:"primaryKey"` UserID string `json:"user_id"` @@ -28,10 +21,10 @@ type StreakPresentUser struct { UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime:true"` } -func NewStreakPresentUser(twitchUser *TwitchUser) *StreakPresentUser { +func NewStreakPresentUser(twitch_id string) *StreakPresentUser { return &StreakPresentUser{ UUID: uuid.New().String(), - UserID: twitchUser.UUID, + UserID: twitch_id, Qtd: 1, } } @@ -46,23 +39,8 @@ func NewPresencaRepository(db *gorm.DB) *PresencaRepository { } } -func (r *PresencaRepository) CreatePresenca(twitchUser *TwitchUser) (*PresentUser, error) { - present := NewPresentUser(twitchUser) - return present, r.db.Create(&present).Error -} - -func (r *PresencaRepository) DeletePresenca(present *PresentUser) error { - return r.db.Delete(&present).Error -} - -func (r *PresencaRepository) LoadLastPresent(twitchUser *TwitchUser) (*PresentUser, error) { - present := &PresentUser{} - res := r.db.Where("user_id = ?", twitchUser.UUID).Order("created_at DESC").First(&present) - return present, res.Error -} - -func (r *PresencaRepository) CreateStreak(twitchUser *TwitchUser) error { - streak := NewStreakPresentUser(twitchUser) +func (r *PresencaRepository) CreateStreak(twitch_id string) error { + streak := NewStreakPresentUser(twitch_id) return r.db.Create(&streak).Error } @@ -70,8 +48,8 @@ func (r *PresencaRepository) UpdateStreak(streak *StreakPresentUser) error { return r.db.Save(&streak).Error } -func (r *PresencaRepository) LoadLastUpdatedStreak(twitchUser *TwitchUser) (*StreakPresentUser, error) { +func (r *PresencaRepository) LoadLastUpdatedStreak(twitch_id string) (*StreakPresentUser, error) { streak := &StreakPresentUser{} - res := r.db.Where("user_id = ?", twitchUser.UUID).Order("updated_at DESC").First(&streak) + res := r.db.Where("user_id = ?", twitch_id).Order("updated_at DESC").First(&streak) return streak, res.Error } diff --git a/repositories/retro.go b/repositories/retro.go deleted file mode 100644 index 8043b7a..0000000 --- a/repositories/retro.go +++ /dev/null @@ -1,57 +0,0 @@ -package repositories - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "log" - "net/http" - "teomebot/config" -) - -type RetroRepository struct { - URI string - HttpClient *http.Client -} - -type retroResponse struct { - Report string `json:"report"` -} - -func (r *RetroRepository) GetUserRetro(uuid, nick string) (*string, error) { - - url := fmt.Sprintf("%s/retro?id=%s&name=%s?source=twitch", r.URI, uuid, nick) - - resp, err := http.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - if resp.StatusCode == http.StatusNotFound { - return nil, errors.New("user not found") - } else if resp.StatusCode != http.StatusOK { - log.Println(string(bodyBytes)) - return nil, errors.New("erro desconhecido") - } - - payload := &retroResponse{} - if err := json.Unmarshal(bodyBytes, &payload); err != nil { - return nil, err - } - - return &payload.Report, nil -} - -func NewRetroRepository(settings *config.Config) *RetroRepository { - return &RetroRepository{ - URI: settings.RetroServiceURI, - HttpClient: &http.Client{}, - } -} diff --git a/services/perfil.go b/services/perfil.go index afb8d1a..35338d6 100644 --- a/services/perfil.go +++ b/services/perfil.go @@ -17,12 +17,11 @@ import ( type PerfilService struct { loyaltyRepository *repositories.LoyaltyRepository userRepository *repositories.UserRepository - retroRepository *repositories.RetroRepository palantirRepository *repositories.PalantirRepository } func (s *PerfilService) CreateNewUser(twitchUser twitch.User) (string, error) { - _, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) + _, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { if err == gorm.ErrRecordNotFound { @@ -70,15 +69,7 @@ func (s *PerfilService) CreateNewUser(twitchUser twitch.User) (string, error) { func (s *PerfilService) GetUserCubes(twitchUser twitch.User) (string, error) { - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) - if err != nil { - if err == gorm.ErrRecordNotFound { - msg := fmt.Sprintf("%s usuário não encontrado. Dê !join", twitchUser.DisplayName) - return msg, err - } - } - - customer, err := s.loyaltyRepository.GetCustomer(user.UUID) + customer, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { log.Println(err) msg := fmt.Sprintf("%s não foi possível recuperar seus cubos", twitchUser.DisplayName) @@ -97,31 +88,9 @@ func (s *PerfilService) GetUserCubes(twitchUser twitch.User) (string, error) { } -func (s *PerfilService) GetUserRetro(twitchUser twitch.User) (string, error) { - - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) - if err != nil { - if err == gorm.ErrRecordNotFound { - msg := fmt.Sprintf("%s usuário não encontrado. Dê !join", twitchUser.DisplayName) - return msg, err - } - msg := fmt.Sprintf("%s não foi possível obter sua retro", twitchUser.DisplayName) - return msg, err - } - - retro, err := s.retroRepository.GetUserRetro(user.UUID, user.TwitchNick) - if retro == nil { - msg := fmt.Sprintf("%s não foi possível obter sua retro", twitchUser.DisplayName) - return msg, err - } - - return *retro, err - -} - func (s *PerfilService) GetFielScore(twitchUser twitch.User) (string, error) { - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) + user, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { if err == gorm.ErrRecordNotFound { msg := fmt.Sprintf("%s usuário não encontrado. Dê !join", twitchUser.DisplayName) @@ -184,7 +153,7 @@ func (s *PerfilService) GetFielScore(twitchUser twitch.User) (string, error) { msg += msgPontos - customer, err := s.loyaltyRepository.GetCustomer(user.UUID) + customer, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { log.Println(err) } @@ -201,7 +170,7 @@ func (s *PerfilService) GetFielScore(twitchUser twitch.User) (string, error) { func (s *PerfilService) CheckFielToday(twitchUser twitch.User) (bool, error) { - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) + user, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { if err == gorm.ErrRecordNotFound { return false, err @@ -227,14 +196,12 @@ func (s *PerfilService) CheckFielToday(twitchUser twitch.User) (bool, error) { func NewPerfilService(settings *config.Config, db *gorm.DB) *PerfilService { loyaltyRepository := repositories.NewLoyaltyRepository(settings) - retroRepository := repositories.NewRetroRepository(settings) palantirRepository := repositories.NewPalantirRepository(settings, &http.Client{}) userRepository := repositories.NewUserRepository(db) return &PerfilService{ loyaltyRepository: loyaltyRepository, userRepository: userRepository, - retroRepository: retroRepository, palantirRepository: palantirRepository, } diff --git a/services/points.go b/services/points.go index 0f0b779..8a0ba08 100644 --- a/services/points.go +++ b/services/points.go @@ -4,7 +4,6 @@ import ( "fmt" "log" "teomebot/config" - "teomebot/errors" "teomebot/models" "teomebot/repositories" "time" @@ -37,7 +36,7 @@ func NewPointsService(settings *config.Config, db *gorm.DB) *PointsService { func (s *PointsService) AddMsgCubes(twitchUser twitch.User) { - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) + customer, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { if err != gorm.ErrRecordNotFound { log.Println(err) @@ -48,73 +47,37 @@ func (s *PointsService) AddMsgCubes(twitchUser twitch.User) { product := models.NewChatMessage() products := []models.ProductPoints{product} - if err := s.loyaltyRepository.AddPoints(user.UUID, products); err != nil { + if err := s.loyaltyRepository.AddPoints(customer.UUID, products); err != nil { log.Println(err) return } - customer, err := s.loyaltyRepository.GetCustomerByTwitch(user.TwitchId) - if err != nil { - log.Println(err) - return - } - - if customer.DescCustomerName != user.TwitchNick { - customer.DescCustomerName = user.TwitchNick + if customer.DescCustomerName != twitchUser.DisplayName { + customer.DescCustomerName = twitchUser.DisplayName if err := s.loyaltyRepository.UpdateCustomer(*customer); err != nil { - log.Println(err, " - ", customer.UUID, " - ", user.TwitchNick) + log.Println(err, " - ", customer.UUID, " - ", twitchUser.DisplayName) } } } -func (s *PointsService) addPresencaCubes(user *repositories.TwitchUser) error { - - present, err := s.presentRepository.LoadLastPresent(user) - if err != nil && err != gorm.ErrRecordNotFound { - log.Println(err) - return err - } - - if present.CreatedAt.Format("2006-01-02") == time.Now().Format("2006-01-02") { - return errors.ErrPresencaAssinadaAnterior - } - - newPresent, err := s.presentRepository.CreatePresenca(user) - if err != nil { - log.Println(err) - return err - } +func (s *PointsService) addPresencaCubes(customer *repositories.Customer) error { products := []models.ProductPoints{models.NewPresent()} - if err := s.loyaltyRepository.AddPoints(user.UUID, products); err != nil { - s.presentRepository.DeletePresenca(newPresent) + if err := s.loyaltyRepository.AddPoints(customer.UUID, products); err != nil { log.Println(err) return err } - customer, err := s.loyaltyRepository.GetCustomerByTwitch(user.TwitchId) - if err != nil { - log.Println(err) - return nil - } - - if customer.DescCustomerName != user.TwitchNick { - customer.DescCustomerName = user.TwitchNick - if err := s.loyaltyRepository.UpdateCustomer(*customer); err != nil { - log.Println(err) - } - } - return nil } -func (s *PointsService) addStreakCubes(user *repositories.TwitchUser) { +func (s *PointsService) addStreakCubes(twitchID string) { - streak, err := s.presentRepository.LoadLastUpdatedStreak(user) + streak, err := s.presentRepository.LoadLastUpdatedStreak(twitchID) if err != nil { if err == gorm.ErrRecordNotFound { - if err := s.presentRepository.CreateStreak(user); err != nil { + if err := s.presentRepository.CreateStreak(twitchID); err != nil { log.Println(err) return } @@ -137,7 +100,7 @@ func (s *PointsService) addStreakCubes(user *repositories.TwitchUser) { for i := 0; i < int(streak.Qtd/5); i++ { products = append(products, models.NewStreakPresent()) } - if err := s.loyaltyRepository.AddPoints(user.UUID, products); err != nil { + if err := s.loyaltyRepository.AddPoints(twitchID, products); err != nil { log.Println(err) return } @@ -145,16 +108,34 @@ func (s *PointsService) addStreakCubes(user *repositories.TwitchUser) { return } - if err := s.presentRepository.CreateStreak(user); err != nil { + if err := s.presentRepository.CreateStreak(twitchID); err != nil { log.Println(err) return } } +func (s *PointsService) CheckPresentToday(id string) (bool, error) { + + lastDate, err := s.loyaltyRepository.GetCustomerLastTransactionDateByCodProduct(id, "11") + if err != nil { + return false, err + } + + if lastDate == nil { + return false, nil + } + + today := time.Now().Truncate(24 * time.Hour) + lastTransactionDate := lastDate.Truncate(24 * time.Hour) + + return today.Equal(lastTransactionDate), nil + +} + func (s *PointsService) MgmtPresenca(twitchUser twitch.User) (string, error) { - user, err := s.userRepository.GetUserByField("twitch_id", twitchUser.ID) + customer, err := s.loyaltyRepository.GetCustomerByTwitch(twitchUser.ID) if err != nil { log.Println(err) if err == gorm.ErrRecordNotFound { @@ -165,18 +146,23 @@ func (s *PointsService) MgmtPresenca(twitchUser twitch.User) (string, error) { return msg, err } - if err := s.addPresencaCubes(user); err != nil { + check, err := s.CheckPresentToday(customer.UUID) + if err != nil { + log.Println(err) + return "", err + } - if err == errors.ErrPresencaAssinadaAnterior { - msg := fmt.Sprintf("%s você já assinou presença hoje!", twitchUser.DisplayName) - return msg, nil - } + if check { + msg := fmt.Sprintf("%s você já assinou presença hoje!", twitchUser.DisplayName) + return msg, nil + } + if err := s.addPresencaCubes(customer); err != nil { msg := fmt.Sprintf("%s não foi possível assinar sua presença", twitchUser.DisplayName) return msg, err } - s.addStreakCubes(user) + s.addStreakCubes(*customer.IdTwitch) msg := fmt.Sprintf("%s presença assinada com sucesso!", twitchUser.DisplayName) return msg, nil