Skip to content

Commit 9b3d770

Browse files
authored
Merge pull request #12 from lynxrv21/feature/query-accounts-transfers
feat: add query accounts and transfers endpoints with filtering support Looks good
2 parents 4b39e8d + 2ab4e3d commit 9b3d770

18 files changed

Lines changed: 2038 additions & 735 deletions

bruno/Query Accounts.bru

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
meta {
2+
name: Query Accounts
3+
type: http
4+
seq: 9
5+
}
6+
7+
post {
8+
url: {{url}}/accounts/query
9+
body: json
10+
auth: none
11+
}
12+
13+
body:json {
14+
{
15+
"filter": {
16+
"user_data128": "1000",
17+
"user_data64": "100",
18+
"user_data32": "10",
19+
"code": "5",
20+
"ledger": "1",
21+
"timestamp_min": "0",
22+
"timestamp_max": "0",
23+
"limit": 10,
24+
"flags": {
25+
"reversed": false
26+
}
27+
}
28+
}
29+
}
30+
31+
docs {
32+
## Query Accounts
33+
34+
Query accounts based on flexible filter criteria including UserData fields, code, ledger, and timestamp ranges.
35+
36+
### Filter Fields:
37+
38+
- **user_data128** (optional): Hex string representation of a 128-bit value
39+
- **user_data64** (optional): 64-bit unsigned integer
40+
- **user_data32** (optional): 32-bit unsigned integer
41+
- **code** (optional): Account code
42+
- **ledger** (optional): Ledger number
43+
- **timestamp_min** (optional): Minimum timestamp (nanoseconds)
44+
- **timestamp_max** (optional): Maximum timestamp (nanoseconds)
45+
- **limit** (required): Maximum number of accounts to return
46+
- **flags** (optional):
47+
- **reversed**: If true, returns accounts in reverse chronological order
48+
49+
### Examples:
50+
51+
#### Query by UserData128
52+
```json
53+
{
54+
"filter": {
55+
"user_data128": "1000",
56+
"limit": 10
57+
}
58+
}
59+
```
60+
61+
#### Query by multiple criteria
62+
```json
63+
{
64+
"filter": {
65+
"user_data64": "100",
66+
"code": "5",
67+
"ledger": "1",
68+
"limit": 20
69+
}
70+
}
71+
```
72+
73+
#### Query with timestamp range
74+
```json
75+
{
76+
"filter": {
77+
"user_data64": "100",
78+
"timestamp_min": "1700000000000000000",
79+
"timestamp_max": "1700001000000000000",
80+
"limit": 50
81+
}
82+
}
83+
```
84+
85+
#### Query in reverse order
86+
```json
87+
{
88+
"filter": {
89+
"user_data64": "100",
90+
"limit": 10,
91+
"flags": {
92+
"reversed": true
93+
}
94+
}
95+
}
96+
```
97+
98+
### Response:
99+
100+
Returns an array of Account objects matching the filter criteria:
101+
102+
```json
103+
{
104+
"accounts": [
105+
{
106+
"id": "1001",
107+
"debits_pending": "0",
108+
"debits_posted": "1000",
109+
"credits_pending": "0",
110+
"credits_posted": "500",
111+
"user_data128": "1000",
112+
"user_data64": "100",
113+
"user_data32": "10",
114+
"ledger": "1",
115+
"code": "5",
116+
"flags": {
117+
"linked": false,
118+
"debits_must_not_exceed_credits": false,
119+
"credits_must_not_exceed_debits": false,
120+
"history": true
121+
},
122+
"timestamp": "1700000000000000000"
123+
}
124+
]
125+
}
126+
```
127+
128+
### Note:
129+
130+
This is a preview API and is subject to breaking changes in future versions.
131+
}

bruno/Query Transfers.bru

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
meta {
2+
name: Query Transfers
3+
type: http
4+
seq: 8
5+
}
6+
7+
post {
8+
url: {{url}}/transfers/query
9+
body: json
10+
auth: none
11+
}
12+
13+
body:json {
14+
{
15+
"filter": {
16+
"user_data128": "1000",
17+
"user_data64": "100",
18+
"user_data32": "10",
19+
"code": "5",
20+
"ledger": "1",
21+
"timestamp_min": "0",
22+
"timestamp_max": "0",
23+
"limit": 10,
24+
"flags": {
25+
"reversed": false
26+
}
27+
}
28+
}
29+
}
30+
31+
docs {
32+
## Query Transfers
33+
34+
Query transfers based on flexible filter criteria including UserData fields, code, ledger, and timestamp ranges.
35+
36+
### Filter Fields:
37+
38+
- **user_data128** (optional): Hex string representation of a 128-bit value
39+
- **user_data64** (optional): 64-bit unsigned integer
40+
- **user_data32** (optional): 32-bit unsigned integer
41+
- **code** (optional): Transfer code
42+
- **ledger** (optional): Ledger number
43+
- **timestamp_min** (optional): Minimum timestamp (nanoseconds)
44+
- **timestamp_max** (optional): Maximum timestamp (nanoseconds)
45+
- **limit** (required): Maximum number of transfers to return
46+
- **flags** (optional):
47+
- **reversed**: If true, returns transfers in reverse chronological order
48+
49+
### Examples:
50+
51+
#### Query by UserData128
52+
```json
53+
{
54+
"filter": {
55+
"user_data128": "1000",
56+
"limit": 10
57+
}
58+
}
59+
```
60+
61+
#### Query by multiple criteria
62+
```json
63+
{
64+
"filter": {
65+
"user_data64": "100",
66+
"code": "5",
67+
"ledger": "1",
68+
"limit": 20
69+
}
70+
}
71+
```
72+
73+
#### Query with timestamp range
74+
```json
75+
{
76+
"filter": {
77+
"user_data64": "100",
78+
"timestamp_min": "1700000000000000000",
79+
"timestamp_max": "1700001000000000000",
80+
"limit": 50
81+
}
82+
}
83+
```
84+
85+
#### Query in reverse order
86+
```json
87+
{
88+
"filter": {
89+
"user_data64": "100",
90+
"limit": 10,
91+
"flags": {
92+
"reversed": true
93+
}
94+
}
95+
}
96+
```
97+
98+
### Response:
99+
100+
Returns an array of Transfer objects matching the filter criteria:
101+
102+
```json
103+
{
104+
"transfers": [
105+
{
106+
"id": "1001",
107+
"debit_account_id": "100",
108+
"credit_account_id": "200",
109+
"amount": 1000,
110+
"user_data128": "1000",
111+
"user_data64": "100",
112+
"user_data32": "10",
113+
"ledger": "1",
114+
"code": "5",
115+
"transfer_flags": {
116+
"linked": false,
117+
"pending": false,
118+
"post_pending_transfer": false,
119+
"void_pending_transfer": false,
120+
"balancing_debit": false,
121+
"balancing_credit": false
122+
},
123+
"timestamp": "1700000000000000000"
124+
}
125+
]
126+
}
127+
```
128+
129+
### Note:
130+
131+
This is a preview API and is subject to breaking changes in future versions.
132+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/prometheus/common v0.63.0 // indirect
4646
github.com/prometheus/procfs v0.16.0 // indirect
4747
github.com/rogpeppe/go-internal v1.14.1 // indirect
48+
github.com/stretchr/objx v0.5.2 // indirect
4849
github.com/tidwall/match v1.1.1 // indirect
4950
github.com/tidwall/pretty v1.2.1 // indirect
5051
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect

grpc/convert.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,38 @@ func ResultsToReply(results []types.TransferEventResult, transfers []types.Trans
122122
}
123123
return replies
124124
}
125+
126+
func QueryFilterFromProtoToTigerbeetle(pFilter *proto.QueryFilter) (*types.QueryFilter, error) {
127+
if pFilter == nil {
128+
return nil, nil
129+
}
130+
131+
var userData128 types.Uint128
132+
if pFilter.UserData128 != nil && *pFilter.UserData128 != "" {
133+
var err error
134+
userData128, err = types.HexStringToUint128(*pFilter.UserData128)
135+
if err != nil {
136+
slog.Error("invalid UserData128 hex string", "hex", *pFilter.UserData128, "error", err)
137+
return nil, err
138+
}
139+
}
140+
141+
var flags types.QueryFilterFlags
142+
if pFilter.Flags != nil {
143+
flags = types.QueryFilterFlags{
144+
Reversed: lo.FromPtrOr(pFilter.Flags.Reversed, false),
145+
}
146+
}
147+
148+
return &types.QueryFilter{
149+
UserData128: userData128,
150+
UserData64: lo.FromPtrOr(pFilter.UserData64, 0),
151+
UserData32: lo.FromPtrOr(pFilter.UserData32, 0),
152+
Code: uint16(lo.FromPtrOr(pFilter.Code, 0)),
153+
Ledger: lo.FromPtrOr(pFilter.Ledger, 0),
154+
TimestampMin: lo.FromPtrOr(pFilter.TimestampMin, 0),
155+
TimestampMax: lo.FromPtrOr(pFilter.TimestampMax, 0),
156+
Limit: pFilter.Limit,
157+
Flags: flags.ToUint32(),
158+
}, nil
159+
}

0 commit comments

Comments
 (0)