Skip to content

Commit d367804

Browse files
committed
support create/update farm with stellar address
1 parent 7908c98 commit d367804

File tree

1 file changed

+57
-24
lines changed

1 file changed

+57
-24
lines changed

node-registrar/client/farm.go

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ import (
66
"fmt"
77
"net/http"
88
"net/url"
9+
"strings"
910
"time"
11+
"unicode"
1012

1113
"github.com/pkg/errors"
1214
)
1315

1416
var ErrorFarmNotFround = fmt.Errorf("failed to get requested farm from node regiatrar")
1517

16-
func (c *RegistrarClient) CreateFarm(farmName string, dedicated bool) (farmID uint64, err error) {
17-
return c.createFarm(farmName, dedicated)
18+
func (c *RegistrarClient) CreateFarm(farmName, stellarAddr string, dedicated bool) (farmID uint64, err error) {
19+
return c.createFarm(farmName, stellarAddr, dedicated)
1820
}
1921

2022
func (c *RegistrarClient) UpdateFarm(farmID uint64, opts ...UpdateFarmOpts) (err error) {
@@ -30,12 +32,13 @@ func (c *RegistrarClient) ListFarms(opts ...ListFarmOpts) (farms []Farm, err err
3032
}
3133

3234
type farmCfg struct {
33-
farmName string
34-
farmID uint64
35-
twinID uint64
36-
dedicated bool
37-
page uint32
38-
size uint32
35+
farmName string
36+
farmID uint64
37+
twinID uint64
38+
dedicated bool
39+
stellarAddress string
40+
page uint32
41+
size uint32
3942
}
4043

4144
type (
@@ -91,26 +94,29 @@ func UpdateFarmWithDedicated() UpdateFarmOpts {
9194
}
9295
}
9396

94-
func (c *RegistrarClient) createFarm(farmName string, dedicated bool) (farmID uint64, err error) {
95-
err = c.ensureTwinID()
96-
if err != nil {
97+
func (c *RegistrarClient) createFarm(farmName, stellarAddr string, dedicated bool) (farmID uint64, err error) {
98+
if err := c.ensureTwinID(); err != nil {
9799
return farmID, errors.Wrap(err, "failed to ensure twin id")
98100
}
99101

102+
if err = validateStellarAddress(stellarAddr); err != nil {
103+
return
104+
}
105+
100106
url, err := url.JoinPath(c.baseURL, "farms")
101107
if err != nil {
102108
return farmID, errors.Wrap(err, "failed to construct registrar url")
103109
}
104110

105111
data := Farm{
106-
FarmName: farmName,
107-
TwinID: c.twinID,
108-
Dedicated: dedicated,
112+
FarmName: farmName,
113+
TwinID: c.twinID,
114+
Dedicated: dedicated,
115+
StellarAddress: stellarAddr,
109116
}
110117

111118
var body bytes.Buffer
112-
err = json.NewEncoder(&body).Encode(data)
113-
if err != nil {
119+
if err = json.NewEncoder(&body).Encode(data); err != nil {
114120
return farmID, errors.Wrap(err, "failed to encode request body")
115121
}
116122

@@ -150,8 +156,7 @@ func (c *RegistrarClient) createFarm(farmName string, dedicated bool) (farmID ui
150156
}
151157

152158
func (c *RegistrarClient) updateFarm(farmID uint64, opts []UpdateFarmOpts) (err error) {
153-
err = c.ensureTwinID()
154-
if err != nil {
159+
if c.ensureTwinID(); err != nil {
155160
return errors.Wrap(err, "failed to ensure twin id")
156161
}
157162

@@ -163,8 +168,13 @@ func (c *RegistrarClient) updateFarm(farmID uint64, opts []UpdateFarmOpts) (err
163168
var body bytes.Buffer
164169
data := parseUpdateFarmOpts(opts)
165170

166-
err = json.NewEncoder(&body).Encode(data)
167-
if err != nil {
171+
if stellarAddr, ok := data["stellar_address"]; ok {
172+
if err = validateStellarAddress(stellarAddr.(string)); err != nil {
173+
return
174+
}
175+
}
176+
177+
if err = json.NewEncoder(&body).Encode(data); err != nil {
168178
return errors.Wrap(err, "failed to encode request body")
169179
}
170180

@@ -215,8 +225,7 @@ func (c *RegistrarClient) getFarm(id uint64) (farm Farm, err error) {
215225
}
216226
defer resp.Body.Close()
217227

218-
err = json.NewDecoder(resp.Body).Decode(&farm)
219-
if err != nil {
228+
if err = json.NewDecoder(resp.Body).Decode(&farm); err != nil {
220229
return farm, err
221230
}
222231

@@ -253,8 +262,7 @@ func (c *RegistrarClient) listFarms(opts ...ListFarmOpts) (farms []Farm, err err
253262
return farms, errors.Wrapf(err, "failed to get list farms with status code %s", resp.Status)
254263
}
255264
defer resp.Body.Close()
256-
err = json.NewDecoder(resp.Body).Decode(&farms)
257-
if err != nil {
265+
if err = json.NewDecoder(resp.Body).Decode(&farms); err != nil {
258266
return farms, errors.Wrap(err, "failed to decode response body")
259267
}
260268

@@ -318,6 +326,31 @@ func parseUpdateFarmOpts(opts []UpdateFarmOpts) map[string]any {
318326
if cfg.dedicated {
319327
data["dedicated"] = true
320328
}
329+
if len(cfg.stellarAddress) != 0 {
330+
data["stellar_address"] = cfg.stellarAddress
331+
}
321332

322333
return data
323334
}
335+
336+
func validateStellarAddress(stellarAddr string) error {
337+
stellarAddr = strings.TrimSpace(stellarAddr)
338+
if len(stellarAddr) != 56 {
339+
return fmt.Errorf("invalid stellar address %s, address length should be 56 characters", stellarAddr)
340+
}
341+
if stellarAddr[0] != 'G' {
342+
return fmt.Errorf("invalid stellar address %s, address should should start with 'G'", stellarAddr)
343+
}
344+
345+
if strings.Compare(stellarAddr, strings.ToUpper(stellarAddr)) != 0 {
346+
return fmt.Errorf("invalid stellar address %s, address should be all uppercase", stellarAddr)
347+
}
348+
349+
// check if not alphanumeric
350+
for _, c := range stellarAddr {
351+
if !unicode.IsLetter(c) && !unicode.IsNumber(c) {
352+
return fmt.Errorf("invalid stellar address %s, address character should be alphanumeric only", stellarAddr)
353+
}
354+
}
355+
return nil
356+
}

0 commit comments

Comments
 (0)