Refactor callTelemtJSON function in main.go to accept multiple success HTTP status codes, enhancing error handling for user creation requests. Introduce httpStatusInList helper function to streamline status code validation.
Publish telemt-bot Docker image / build-and-push (push) Successful in 57s
Publish telemt-bot Docker image / build-and-push (push) Successful in 57s
This commit is contained in:
@@ -465,7 +465,7 @@ func (b *bot) handleCreateUser(ctx context.Context, chatID int64, text string) e
|
|||||||
|
|
||||||
req := createUserRequest{Username: username}
|
req := createUserRequest{Username: username}
|
||||||
var created createUserResponse
|
var created createUserResponse
|
||||||
if err := b.callTelemtJSON(ctx, http.MethodPost, "/v1/users", req, &created, http.StatusCreated); err != nil {
|
if err := b.callTelemtJSON(ctx, http.MethodPost, "/v1/users", req, &created, http.StatusCreated, http.StatusAccepted); err != nil {
|
||||||
return b.sendMessage(ctx, chatID, "Ошибка создания пользователя: "+err.Error())
|
return b.sendMessage(ctx, chatID, "Ошибка создания пользователя: "+err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -889,7 +889,7 @@ func (b *bot) handleCreateUserDirect(ctx context.Context, chatID int64, username
|
|||||||
|
|
||||||
req := createUserRequest{Username: username}
|
req := createUserRequest{Username: username}
|
||||||
var created createUserResponse
|
var created createUserResponse
|
||||||
if err := b.callTelemtJSON(ctx, http.MethodPost, "/v1/users", req, &created, http.StatusCreated); err != nil {
|
if err := b.callTelemtJSON(ctx, http.MethodPost, "/v1/users", req, &created, http.StatusCreated, http.StatusAccepted); err != nil {
|
||||||
return b.sendMessageWithKeyboard(ctx, chatID,
|
return b.sendMessageWithKeyboard(ctx, chatID,
|
||||||
"Ошибка создания пользователя: "+err.Error(), mainMenuKeyboard())
|
"Ошибка создания пользователя: "+err.Error(), mainMenuKeyboard())
|
||||||
}
|
}
|
||||||
@@ -939,7 +939,19 @@ func (b *bot) callTelemt(ctx context.Context, path string, out any) error {
|
|||||||
return b.callTelemtJSON(ctx, http.MethodGet, path, nil, out, http.StatusOK)
|
return b.callTelemtJSON(ctx, http.MethodGet, path, nil, out, http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *bot) callTelemtJSON(ctx context.Context, method, path string, payload any, out any, successStatus int) error {
|
func httpStatusInList(code int, allowed []int) bool {
|
||||||
|
for _, c := range allowed {
|
||||||
|
if code == c {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bot) callTelemtJSON(ctx context.Context, method, path string, payload any, out any, successStatuses ...int) error {
|
||||||
|
if len(successStatuses) == 0 {
|
||||||
|
return errors.New("callTelemtJSON: at least one success HTTP status required")
|
||||||
|
}
|
||||||
cctx, cancel := context.WithTimeout(ctx, b.cfg.TelemtTimeout)
|
cctx, cancel := context.WithTimeout(ctx, b.cfg.TelemtTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
@@ -973,13 +985,13 @@ func (b *bot) callTelemtJSON(ctx context.Context, method, path string, payload a
|
|||||||
|
|
||||||
var env telemtEnvelope
|
var env telemtEnvelope
|
||||||
if err := json.NewDecoder(resp.Body).Decode(&env); err != nil {
|
if err := json.NewDecoder(resp.Body).Decode(&env); err != nil {
|
||||||
if resp.StatusCode != successStatus {
|
if !httpStatusInList(resp.StatusCode, successStatuses) {
|
||||||
return fmt.Errorf("telemt status %s", resp.Status)
|
return fmt.Errorf("telemt status %s", resp.Status)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("telemt decode response: %w", err)
|
return fmt.Errorf("telemt decode response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.StatusCode != successStatus {
|
if !httpStatusInList(resp.StatusCode, successStatuses) {
|
||||||
if env.Error != nil {
|
if env.Error != nil {
|
||||||
return fmt.Errorf("%s: %s", env.Error.Code, env.Error.Message)
|
return fmt.Errorf("%s: %s", env.Error.Code, env.Error.Message)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user