Prechádzať zdrojové kódy

refactor(tgbot): share numeric keypad transitions (#6211)

Co-authored-by: n0ctal <[email protected]>
n0ctal 12 hodín pred
rodič
commit
238e4bb314

+ 18 - 0
internal/web/service/tgbot/numeric_input.go

@@ -0,0 +1,18 @@
+package tgbot
+
+// updateNumericInput applies one key from the shared inline number pad.
+// Key -2 clears the value, -1 removes the last decimal digit, and 0..9 append
+// a digit. Callers retain their own validation and keyboard labels.
+func updateNumericInput(value, key int) int {
+	switch key {
+	case -2:
+		return 0
+	case -1:
+		if value > 0 {
+			return value / 10
+		}
+		return value
+	default:
+		return value*10 + key
+	}
+}

+ 38 - 0
internal/web/service/tgbot/numeric_input_test.go

@@ -0,0 +1,38 @@
+package tgbot
+
+import (
+	"os"
+	"strings"
+	"testing"
+)
+
+func TestUpdateNumericInput(t *testing.T) {
+	tests := []struct {
+		name       string
+		value, key int
+		want       int
+	}{
+		{name: "append digit", value: 12, key: 3, want: 123},
+		{name: "append zero", value: 12, key: 0, want: 120},
+		{name: "backspace", value: 123, key: -1, want: 12},
+		{name: "backspace zero", value: 0, key: -1, want: 0},
+		{name: "clear", value: 123, key: -2, want: 0},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := updateNumericInput(tt.value, tt.key); got != tt.want {
+				t.Fatalf("updateNumericInput(%d, %d) = %d, want %d", tt.value, tt.key, got, tt.want)
+			}
+		})
+	}
+}
+
+func TestNumericInputTransitionIsUsedByEveryKeypad(t *testing.T) {
+	source, err := os.ReadFile("tgbot_router.go")
+	if err != nil {
+		t.Fatalf("read tgbot_router.go: %v", err)
+	}
+	if got := strings.Count(string(source), "updateNumericInput("); got != 6 {
+		t.Fatalf("numeric keypad transition call sites = %d, want 6", got)
+	}
+}

+ 6 - 60
internal/web/service/tgbot/tgbot_router.go

@@ -439,16 +439,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 4 {
 							num, err := strconv.Atoi(dataArray[3])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
@@ -509,16 +500,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 3 {
 							num, err := strconv.Atoi(dataArray[2])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
@@ -639,16 +621,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 4 {
 							num, err := strconv.Atoi(dataArray[3])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
@@ -721,16 +694,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 3 {
 							num, err := strconv.Atoi(dataArray[2])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
@@ -827,16 +791,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 4 {
 							num, err := strconv.Atoi(dataArray[3])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
@@ -900,16 +855,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
 						if len(dataArray) == 3 {
 							num, err := strconv.Atoi(dataArray[2])
 							if err == nil {
-								switch num {
-								case -2:
-									inputNumber = 0
-								case -1:
-									if inputNumber > 0 {
-										inputNumber = (inputNumber / 10)
-									}
-								default:
-									inputNumber = (inputNumber * 10) + num
-								}
+								inputNumber = updateNumericInput(inputNumber, num)
 							}
 							if inputNumber == oldInputNumber {
 								t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))