Skip to content

Commit 32bf5ed

Browse files
API handlers to return error containing error key
1 parent 082cbd9 commit 32bf5ed

6 files changed

+437
-9
lines changed

api/openapi.json

+17
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,23 @@
690690
"properties": {
691691
"error": {
692692
"type": "string"
693+
},
694+
"error_key": {
695+
"enum": [
696+
"err-gasless-jetton-is-not-supported",
697+
"err-gasless-temporary",
698+
"err-gasless-signature",
699+
"err-gasless-pending-messages",
700+
"err-gasless-bad-request",
701+
"err-gasless-operation-is-not-supported",
702+
"err-gasless-user-disabled",
703+
"err-gasless-estimating-commission",
704+
"err-gasless-commission",
705+
"err-gasless-balance",
706+
"err-gasless-bootstrap-transfer-disabled",
707+
"err-gasless-unknown"
708+
],
709+
"type": "string"
693710
}
694711
},
695712
"required": [

api/openapi.yml

+15
Original file line numberDiff line numberDiff line change
@@ -7391,3 +7391,18 @@ components:
73917391
properties:
73927392
error:
73937393
type: string
7394+
error_key:
7395+
type: string
7396+
enum:
7397+
- "err-gasless-jetton-is-not-supported"
7398+
- "err-gasless-temporary"
7399+
- "err-gasless-signature"
7400+
- "err-gasless-pending-messages"
7401+
- "err-gasless-bad-request"
7402+
- "err-gasless-operation-is-not-supported"
7403+
- "err-gasless-user-disabled"
7404+
- "err-gasless-estimating-commission"
7405+
- "err-gasless-commission"
7406+
- "err-gasless-balance"
7407+
- "err-gasless-bootstrap-transfer-disabled"
7408+
- "err-gasless-unknown"

pkg/api/converters.go

+41-7
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ package api
33
import (
44
"context"
55
"encoding/json"
6+
"errors"
67
"fmt"
7-
imgGenerator "github.com/tonkeeper/opentonapi/pkg/image"
88
"math/big"
99
"reflect"
1010
"strconv"
1111
"strings"
1212
"unicode"
1313

14+
imgGenerator "github.com/tonkeeper/opentonapi/pkg/image"
15+
1416
"github.com/go-faster/jx"
1517
"github.com/tonkeeper/tongo"
1618
"github.com/tonkeeper/tongo/boc"
@@ -22,15 +24,47 @@ import (
2224
walletPkg "github.com/tonkeeper/opentonapi/pkg/wallet"
2325
)
2426

25-
func toError(code int, err error) *oas.ErrorStatusCode {
26-
if strings.HasPrefix(err.Error(), "failed to connect to") || strings.Contains(err.Error(), "host=") {
27-
return &oas.ErrorStatusCode{StatusCode: code, Response: oas.Error{Error: "unknown error"}}
27+
// Error helps to pass additional information about an error from private tonapi2 handlers.
28+
type Error struct {
29+
Code int
30+
Message string
31+
Key string
32+
}
33+
34+
func (e Error) Error() string {
35+
return e.Message
36+
}
37+
38+
// censor removes sensitive information from the error message.
39+
func censor(msg string) string {
40+
if strings.HasPrefix(msg, "failed to connect to") || strings.Contains(msg, "host=") {
41+
return "unknown error"
42+
}
43+
return msg
44+
}
45+
46+
func errorKey(s string) oas.OptErrorErrorKey {
47+
if s == "" {
48+
return oas.OptErrorErrorKey{}
49+
}
50+
return oas.NewOptErrorErrorKey(oas.ErrorErrorKey(s))
51+
}
52+
53+
func toError(defaultCode int, err error) *oas.ErrorStatusCode {
54+
var e Error
55+
if errors.As(err, &e) {
56+
return &oas.ErrorStatusCode{
57+
StatusCode: e.Code,
58+
Response: oas.Error{
59+
Error: censor(e.Message),
60+
ErrorKey: errorKey(e.Key),
61+
},
62+
}
2863
}
2964
if s, ok := status.FromError(err); ok {
30-
return &oas.ErrorStatusCode{StatusCode: code, Response: oas.Error{Error: s.Message()}}
65+
return &oas.ErrorStatusCode{StatusCode: defaultCode, Response: oas.Error{Error: censor(s.Message())}}
3166
}
32-
msg := err.Error()
33-
return &oas.ErrorStatusCode{StatusCode: code, Response: oas.Error{Error: msg}}
67+
return &oas.ErrorStatusCode{StatusCode: defaultCode, Response: oas.Error{Error: censor(err.Error())}}
3468
}
3569

3670
func anyToJSONRawMap(a any) map[string]jx.Raw { //todo: переписать этот ужас

pkg/oas/oas_json_gen.go

+111-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)