Skip to content

Commit 05b86e4

Browse files
committed
refactor: add parseMenuPriceagent method
1 parent 15e6b3f commit 05b86e4

3 files changed

Lines changed: 36 additions & 74 deletions

File tree

internal/bot/bot.go

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,11 @@ func mainMenuHandler(b *gotgbot.Bot, ctx *ext.Context) error {
179179
func showPriceagentDetail(b *gotgbot.Bot, ctx *ext.Context) error {
180180
cb := ctx.Update.CallbackQuery
181181

182-
menu, parseErr := models.NewMenu(cb.Data)
182+
menu, priceagent, parseErr := parseMenuPriceagent(ctx)
183183
if parseErr != nil {
184184
return fmt.Errorf("showPriceagentDetail: failed to parse callback data: %w", parseErr)
185185
}
186186

187-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, menu.PriceAgentID)
188-
if dbErr != nil {
189-
return fmt.Errorf("showPriceagentDetail: failed to get priceagent from database: %w", dbErr)
190-
}
191-
192187
var backCallbackData string
193188
switch {
194189
case priceagent.Entity.Type == geizhals.Wishlist:
@@ -225,19 +220,19 @@ func showPriceagentDetail(b *gotgbot.Bot, ctx *ext.Context) error {
225220
case "00":
226221
_, err := cb.Message.EditText(b, editedText, &gotgbot.EditMessageTextOpts{ReplyMarkup: markup, ParseMode: "HTML"})
227222
if err != nil {
228-
return fmt.Errorf("showPriceagent: failed to edit message text: %w", err)
223+
return fmt.Errorf("showPriceagentDetail: failed to edit message text: %w", err)
229224
}
230225
case "01":
231226
bot.DeleteMessage(ctx.EffectiveChat.Id, cb.Message.MessageId)
232227

233228
_, err := b.SendMessage(ctx.EffectiveChat.Id, editedText, &gotgbot.SendMessageOpts{ReplyMarkup: markup, ParseMode: "HTML"})
234229
if err != nil {
235-
return fmt.Errorf("showPriceagent: failed to send new message: %w", err)
230+
return fmt.Errorf("showPriceagentDetail: failed to send new message: %w", err)
236231
}
237232
case "02":
238233
_, err := b.SendMessage(ctx.EffectiveChat.Id, editedText, &gotgbot.SendMessageOpts{ReplyMarkup: markup, ParseMode: "HTML"})
239234
if err != nil {
240-
return fmt.Errorf("showPriceagent: failed to send new message: %w", err)
235+
return fmt.Errorf("showPriceagentDetail: failed to send new message: %w", err)
241236
}
242237
}
243238
return nil
@@ -248,14 +243,9 @@ func showPriceagentDetail(b *gotgbot.Bot, ctx *ext.Context) error {
248243
func changePriceagentSettingsHandler(b *gotgbot.Bot, ctx *ext.Context) error {
249244
cb := ctx.Update.CallbackQuery
250245

251-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m04_00_")
246+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
252247
if parseErr != nil {
253-
return fmt.Errorf("changePriceagentSettingsHandler: failed to parse priceagentID from callback data: %w", parseErr)
254-
}
255-
256-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
257-
if dbErr != nil {
258-
return fmt.Errorf("setNotifPriceagentHandler: failed to get priceagent from database: %w", dbErr)
248+
return fmt.Errorf("changePriceagentSettingsHandler: failed to parse callback data: %w", parseErr)
259249
}
260250

261251
if _, err := cb.Answer(b, &gotgbot.AnswerCallbackQueryOpts{}); err != nil {
@@ -286,14 +276,9 @@ func changePriceagentSettingsHandler(b *gotgbot.Bot, ctx *ext.Context) error {
286276
func deletePriceagentConfirmationHandler(b *gotgbot.Bot, ctx *ext.Context) error {
287277
cb := ctx.Update.CallbackQuery
288278

289-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m04_98_")
279+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
290280
if parseErr != nil {
291-
return fmt.Errorf("deletePriceagentConfirmationHandler: failed to parse priceagentID from callback data: %w", parseErr)
292-
}
293-
294-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
295-
if dbErr != nil {
296-
return fmt.Errorf("deletePriceagentConfirmationHandler: failed to get priceagent from database: %w", dbErr)
281+
return fmt.Errorf("deletePriceagentConfirmationHandler: failed to parse callback data: %w", parseErr)
297282
}
298283

299284
if _, err := cb.Answer(b, &gotgbot.AnswerCallbackQueryOpts{}); err != nil {
@@ -326,15 +311,10 @@ func deletePriceagentHandler(b *gotgbot.Bot, ctx *ext.Context) error {
326311
}
327312

328313
// Get Priceagent from DB
329-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m04_99_")
314+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
330315
if parseErr != nil {
331-
return fmt.Errorf("deletePriceagentHandler: failed to parse priceagentID from callback data: %w", parseErr)
332-
}
333-
334-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
335-
if dbErr != nil {
336316
ctx.EffectiveMessage.Reply(b, "Der Preisagent existiert nicht mehr, vielleicht wurde er schon gelöscht?", &gotgbot.SendMessageOpts{})
337-
return fmt.Errorf("deletePriceagentHandler: failed to get priceagent from database: %w", dbErr)
317+
return fmt.Errorf("deletePriceagentHandler: failed to parse callback data: %w", parseErr)
338318
}
339319

340320
deleteErr := database.DeletePriceAgentForUser(priceagent)
@@ -347,7 +327,7 @@ func deletePriceagentHandler(b *gotgbot.Bot, ctx *ext.Context) error {
347327

348328
_, err := cb.Message.EditText(b, editText, &gotgbot.EditMessageTextOpts{ParseMode: "HTML", DisableWebPagePreview: true})
349329
if err != nil {
350-
return fmt.Errorf("deletePriceagent: failed to edit message text: %w", err)
330+
return fmt.Errorf("deletePriceagentHandler: failed to edit message text: %w", err)
351331
}
352332
return nil
353333
}
@@ -515,3 +495,17 @@ func Start(botConfig config.Config) {
515495

516496
updater.Idle()
517497
}
498+
499+
func parseMenuPriceagent(ctx *ext.Context) (models.Menu, models.PriceAgent, error) {
500+
menu, parseMenuErr := models.NewMenu(ctx.CallbackQuery.Data)
501+
if parseMenuErr != nil {
502+
return models.Menu{}, models.PriceAgent{}, fmt.Errorf("invalid callback data: %s", ctx.CallbackQuery.Data)
503+
}
504+
505+
priceAgent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, menu.PriceAgentID)
506+
if dbErr != nil {
507+
return models.Menu{}, models.PriceAgent{}, fmt.Errorf("invalid callback data: %s", ctx.CallbackQuery.Data)
508+
}
509+
510+
return *menu, priceAgent, nil
511+
}

internal/bot/pricehistory.go

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ package bot
22

33
import (
44
"GoGeizhalsBot/internal/bot/models"
5-
"GoGeizhalsBot/internal/database"
65
"GoGeizhalsBot/internal/geizhals"
76
"GoGeizhalsBot/internal/prometheus"
87
"bytes"
98
"fmt"
109
"io"
1110
"log"
1211
"math"
13-
"strings"
1412
"time"
1513

1614
"github.com/wcharczuk/go-chart/v2/drawing"
@@ -26,9 +24,9 @@ import (
2624
func showPriceHistoryHandler(b *gotgbot.Bot, ctx *ext.Context) error {
2725
cb := ctx.Update.CallbackQuery
2826

29-
priceagent, getPriceagentErr := getPriceagentFromContext(ctx)
30-
if getPriceagentErr != nil {
31-
return getPriceagentErr
27+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
28+
if parseErr != nil {
29+
return fmt.Errorf("showPriceHistoryHandler: failed to parse callback data: %w", parseErr)
3230
}
3331

3432
dateRangeKeyboard, since := generateDateRangeKeyboard(priceagent, "03")
@@ -63,17 +61,12 @@ func showPriceHistoryHandler(b *gotgbot.Bot, ctx *ext.Context) error {
6361
func updatePriceHistoryGraphHandler(b *gotgbot.Bot, ctx *ext.Context) error {
6462
cb := ctx.Update.CallbackQuery
6563

66-
priceagent, getPriceagentErr := getPriceagentFromContext(ctx)
67-
if getPriceagentErr != nil {
68-
return getPriceagentErr
69-
}
70-
71-
results := strings.Split(cb.Data, "_")
72-
if len(results) < 2 {
73-
return fmt.Errorf("updatePriceHistoryGraphHandler: invalid callback data: %s", cb.Data)
64+
menu, priceagent, parseErr := parseMenuPriceagent(ctx)
65+
if parseErr != nil {
66+
return fmt.Errorf("updatePriceHistoryGraphHandler: failed to parse callback data: %w", parseErr)
7467
}
75-
dateRange := results[1]
7668

69+
dateRange := menu.SubMenu
7770
dateRangeKeyboard, since := generateDateRangeKeyboard(priceagent, dateRange)
7871

7972
markup := gotgbot.InlineKeyboardMarkup{
@@ -130,21 +123,6 @@ func generateDateRangeKeyboard(priceagent models.PriceAgent, dateRange string) (
130123
return dateRangeKeyboard, since
131124
}
132125

133-
// getPriceagentFromContext returns the priceagent from the callbackQuery data.
134-
func getPriceagentFromContext(ctx *ext.Context) (models.PriceAgent, error) {
135-
cb := ctx.CallbackQuery
136-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m05_00_")
137-
if parseErr != nil {
138-
return models.PriceAgent{}, fmt.Errorf("showPriceagentDetail: failed to parse priceagentID from callback data: %w", parseErr)
139-
}
140-
141-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
142-
if dbErr != nil {
143-
return models.PriceAgent{}, fmt.Errorf("showPriceagentDetail: failed to get priceagent from database: %w", dbErr)
144-
}
145-
return priceagent, nil
146-
}
147-
148126
// renderChart renders a price history chart to the given writer.
149127
func renderChart(priceagent models.PriceAgent, history geizhals.PriceHistory, since time.Time, w io.Writer) {
150128
prometheus.GraphsRendered.Inc()

internal/bot/updatenotificationshandler.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,9 @@ import (
1717
func setNotificationBelowHandler(b *gotgbot.Bot, ctx *ext.Context) error {
1818
cb := ctx.Update.CallbackQuery
1919

20-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m04_02_")
20+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
2121
if parseErr != nil {
22-
return fmt.Errorf("setNotificationBelowHandler: failed to parse priceagentID from callback data: %w", parseErr)
23-
}
24-
25-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
26-
if dbErr != nil {
27-
return fmt.Errorf("setNotificationBelowHandler: failed to get priceagent from database: %w", dbErr)
22+
return fmt.Errorf("setNotificationBelowHandler: failed to parse callback data: %w", parseErr)
2823
}
2924

3025
userID := ctx.EffectiveUser.Id
@@ -48,14 +43,9 @@ func setNotificationBelowHandler(b *gotgbot.Bot, ctx *ext.Context) error {
4843
func setNotificationAlwaysHandler(b *gotgbot.Bot, ctx *ext.Context) error {
4944
cb := ctx.Update.CallbackQuery
5045

51-
priceagentID, parseErr := parseIDFromCallbackData(cb.Data, "m04_01_")
46+
_, priceagent, parseErr := parseMenuPriceagent(ctx)
5247
if parseErr != nil {
53-
return fmt.Errorf("setNotificationAlwaysHandler: failed to parse priceagentID from callback data: %w", parseErr)
54-
}
55-
56-
priceagent, dbErr := database.GetPriceagentForUserByID(ctx.EffectiveUser.Id, priceagentID)
57-
if dbErr != nil {
58-
return fmt.Errorf("setNotificationAlwaysHandler: failed to get priceagent from database: %w", dbErr)
48+
return fmt.Errorf("setNotificationAlwaysHandler: failed to parse callback data: %w", parseErr)
5949
}
6050

6151
newNotifSettings := models.NotificationSettings{

0 commit comments

Comments
 (0)