Skip to content

Commit 7824924

Browse files
authored
GRPC endpoint get single escrow transaction by ID (#620)
* no need to validate current block height * functionality test get escrow by id
1 parent c26349b commit 7824924

File tree

7 files changed

+322
-54
lines changed

7 files changed

+322
-54
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/sirupsen/logrus"
9+
"github.com/spf13/viper"
10+
rpcModel "github.com/zoobc/zoobc-core/common/model"
11+
rpcService "github.com/zoobc/zoobc-core/common/service"
12+
"github.com/zoobc/zoobc-core/common/util"
13+
"google.golang.org/grpc"
14+
)
15+
16+
func main() {
17+
var apiRPCPort int
18+
if err := util.LoadConfig("../../../resource", "config", "toml"); err != nil {
19+
logrus.Fatal(err)
20+
} else {
21+
apiRPCPort = viper.GetInt("apiRPCPort")
22+
if apiRPCPort == 0 {
23+
apiRPCPort = 8080
24+
}
25+
}
26+
27+
conn, err := grpc.Dial(fmt.Sprintf(":%d", apiRPCPort), grpc.WithInsecure())
28+
if err != nil {
29+
log.Fatalf("did not connect: %s", err)
30+
}
31+
defer conn.Close()
32+
33+
c := rpcService.NewEscrowTransactionServiceClient(conn)
34+
35+
response, err := c.GetEscrowTransaction(context.Background(), &rpcModel.GetEscrowTransactionRequest{
36+
ID: -2747806915165203447,
37+
})
38+
39+
if err != nil {
40+
log.Fatalf("error calling : %s", err)
41+
}
42+
43+
log.Printf("response from remote : %s", response)
44+
45+
}

api/handler/escrowTransactionHandler.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,10 @@ func (eh *EscrowTransactionHandler) GetEscrowTransactions(
1919
) (*model.GetEscrowTransactionsResponse, error) {
2020
return eh.Service.GetEscrowTransactions(req)
2121
}
22+
23+
func (eh *EscrowTransactionHandler) GetEscrowTransaction(
24+
_ context.Context,
25+
req *model.GetEscrowTransactionRequest,
26+
) (*model.Escrow, error) {
27+
return eh.Service.GetEscrowTransaction(req)
28+
}

api/service/escrowTransactionApiService.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type (
1414
// EscrowTransactionServiceInterface interface that contain methods of escrow transaction
1515
EscrowTransactionServiceInterface interface {
1616
GetEscrowTransactions(request *model.GetEscrowTransactionsRequest) (*model.GetEscrowTransactionsResponse, error)
17+
GetEscrowTransaction(request *model.GetEscrowTransactionRequest) (*model.Escrow, error)
1718
}
1819
// EscrowTransactionService struct that contain fields that needed
1920
escrowTransactionService struct {
@@ -59,7 +60,7 @@ func (es *escrowTransactionService) GetEscrowTransactions(
5960
}
6061
caseQuery.And(caseQuery.In("status", statuses...))
6162
}
62-
if params.GetID() > 0 {
63+
if params.GetID() != 0 {
6364
caseQuery.And(caseQuery.Equal("id", params.GetID()))
6465
}
6566

@@ -108,3 +109,32 @@ func (es *escrowTransactionService) GetEscrowTransactions(
108109
Escrows: escrows,
109110
}, nil
110111
}
112+
113+
// GetEscrowTransaction to get escrow by id and status
114+
func (es *escrowTransactionService) GetEscrowTransaction(
115+
request *model.GetEscrowTransactionRequest,
116+
) (*model.Escrow, error) {
117+
var (
118+
escrowQuery = query.NewEscrowTransactionQuery()
119+
escrow model.Escrow
120+
row *sql.Row
121+
err error
122+
)
123+
124+
caseQuery := query.CaseQuery{
125+
Query: bytes.NewBuffer([]byte{}),
126+
}
127+
128+
caseQuery.Select(escrowQuery.TableName, escrowQuery.Fields...)
129+
caseQuery.Where(caseQuery.Equal("id", request.GetID()))
130+
caseQuery.Where(caseQuery.Equal("latest", 1))
131+
132+
qStr, qArgs := caseQuery.Build()
133+
134+
row, _ = es.Query.ExecuteSelectRow(qStr, false, qArgs...)
135+
err = escrowQuery.Scan(&escrow, row)
136+
if err != nil {
137+
return nil, status.Error(codes.InvalidArgument, err.Error())
138+
}
139+
return &escrow, nil
140+
}

api/service/escrowTransactionApiService_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,84 @@ func TestEscrowTransactionService_GetEscrowTransactions(t *testing.T) {
123123
})
124124
}
125125
}
126+
127+
type (
128+
mockExecutorGetEscrow struct {
129+
query.ExecutorInterface
130+
}
131+
)
132+
133+
func (*mockExecutorGetEscrow) ExecuteSelectRow(string, bool, ...interface{}) (*sql.Row, error) {
134+
db, mock, _ := sqlmock.New()
135+
mockedRow := mock.NewRows(query.NewEscrowTransactionQuery().Fields)
136+
mockedRow.AddRow(
137+
int64(1),
138+
"BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN",
139+
"BCZD_VxfO2S9aziIL3cn_cXW7uPDVPOrnXuP98GEAUC7",
140+
"BCZKLvgUYZ1KKx-jtF9KoJskjVPvB9jpIjfzzI6zDW0J",
141+
int64(10),
142+
int64(1),
143+
uint64(120),
144+
model.EscrowStatus_Approved,
145+
uint32(0),
146+
true,
147+
"",
148+
)
149+
mock.ExpectQuery("").WillReturnRows(mockedRow)
150+
row := db.QueryRow("")
151+
return row, nil
152+
}
153+
154+
func Test_escrowTransactionService_GetEscrowTransaction(t *testing.T) {
155+
type fields struct {
156+
Query query.ExecutorInterface
157+
}
158+
type args struct {
159+
request *model.GetEscrowTransactionRequest
160+
}
161+
tests := []struct {
162+
name string
163+
fields fields
164+
args args
165+
want *model.Escrow
166+
wantErr bool
167+
}{
168+
{
169+
name: "wantSuccess",
170+
fields: fields{
171+
Query: &mockExecutorGetEscrow{},
172+
},
173+
args: args{
174+
request: &model.GetEscrowTransactionRequest{
175+
ID: 918263123,
176+
},
177+
},
178+
want: &model.Escrow{
179+
ID: 1,
180+
SenderAddress: "BCZnSfqpP5tqFQlMTYkDeBVFWnbyVK7vLr5ORFpTjgtN",
181+
RecipientAddress: "BCZD_VxfO2S9aziIL3cn_cXW7uPDVPOrnXuP98GEAUC7",
182+
ApproverAddress: "BCZKLvgUYZ1KKx-jtF9KoJskjVPvB9jpIjfzzI6zDW0J",
183+
Amount: 10,
184+
Commission: 1,
185+
Timeout: 120,
186+
Status: model.EscrowStatus_Approved,
187+
Latest: true,
188+
},
189+
},
190+
}
191+
for _, tt := range tests {
192+
t.Run(tt.name, func(t *testing.T) {
193+
es := &escrowTransactionService{
194+
Query: tt.fields.Query,
195+
}
196+
got, err := es.GetEscrowTransaction(tt.args.request)
197+
if (err != nil) != tt.wantErr {
198+
t.Errorf("GetEscrowTransaction() error = %v, wantErr %v", err, tt.wantErr)
199+
return
200+
}
201+
if !reflect.DeepEqual(got, tt.want) {
202+
t.Errorf("GetEscrowTransaction() got = %v, want %v", got, tt.want)
203+
}
204+
})
205+
}
206+
}

common/model/escrow.pb.go

Lines changed: 75 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)