forked from stellar/go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
operations.go
114 lines (104 loc) · 3.16 KB
/
operations.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package resourceadapter
import (
"context"
"fmt"
"github.com/andskur/go/protocols/horizon/operations"
"github.com/andskur/go/services/horizon/internal/db2/history"
"github.com/andskur/go/services/horizon/internal/httpx"
"github.com/andskur/go/support/render/hal"
"github.com/andskur/go/xdr"
)
// NewOperation creates a new operation resource, finding the appropriate type to use
// based upon the row's type.
func NewOperation(
ctx context.Context,
row history.Operation,
ledger history.Ledger,
) (result hal.Pageable, err error) {
base := operations.Base{}
PopulateBaseOperation(ctx, &base, row, ledger)
switch row.Type {
case xdr.OperationTypeBumpSequence:
e := operations.BumpSequence{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeCreateAccount:
e := operations.CreateAccount{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypePayment:
e := operations.Payment{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypePathPayment:
e := operations.PathPayment{}
e.Payment.Base = base
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeManageOffer:
e := operations.ManageOffer{}
e.CreatePassiveOffer.Base = base
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeCreatePassiveOffer:
e := operations.CreatePassiveOffer{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeSetOptions:
e := operations.SetOptions{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeChangeTrust:
e := operations.ChangeTrust{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeAllowTrust:
e := operations.AllowTrust{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeAccountMerge:
e := operations.AccountMerge{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeInflation:
e := operations.Inflation{Base: base}
err = row.UnmarshalDetails(&e)
result = e
case xdr.OperationTypeManageData:
e := operations.ManageData{Base: base}
err = row.UnmarshalDetails(&e)
result = e
default:
result = base
}
return
}
// Populate fills out this resource using `row` as the source.
func PopulateBaseOperation(
ctx context.Context,
dest *operations.Base,
row history.Operation,
ledger history.Ledger,
) {
dest.ID = fmt.Sprintf("%d", row.ID)
dest.PT = row.PagingToken()
dest.SourceAccount = row.SourceAccount
populateOperationType(dest, row)
dest.LedgerCloseTime = ledger.ClosedAt
dest.TransactionHash = row.TransactionHash
lb := hal.LinkBuilder{Base: httpx.BaseURL(ctx)}
self := fmt.Sprintf("/operations/%d", row.ID)
dest.Links.Self = lb.Link(self)
dest.Links.Succeeds = lb.Linkf("/effects?order=desc&cursor=%s", dest.PT)
dest.Links.Precedes = lb.Linkf("/effects?order=asc&cursor=%s", dest.PT)
dest.Links.Transaction = lb.Linkf("/transactions/%s", row.TransactionHash)
dest.Links.Effects = lb.Link(self, "effects")
}
func populateOperationType(dest *operations.Base, row history.Operation) {
var ok bool
dest.TypeI = int32(row.Type)
dest.Type, ok = operations.TypeNames[row.Type]
if !ok {
dest.Type = "unknown"
}
}