Skip to content

Commit 001c356

Browse files
qzhongwoodWeifan
authored and
Weifan
committed
Ticket
1 parent b5855db commit 001c356

File tree

11 files changed

+784
-0
lines changed

11 files changed

+784
-0
lines changed
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package ticket
2+
3+
import (
4+
txgen "hyperledger.abchain.org/chaincode/lib/txgen"
5+
ccpb "hyperledger.abchain.org/chaincode/modules/ticket/protos"
6+
pb "hyperledger.abchain.org/chaincode/modules/ticket/protos"
7+
txutil "hyperledger.abchain.org/core/tx"
8+
)
9+
10+
type GeneralCall struct {
11+
txgen.TxCaller
12+
}
13+
14+
const (
15+
16+
Method_Add = "TICKET.UPDATE"
17+
Method_Apply = "TICKET.QUERY"
18+
Method_Query = "TICKET.CONTRACT"
19+
)
20+
21+
func (i *GeneralCall) Add(owner []byte, id []byte, ticketCat int, desc string) error {
22+
23+
ct := new(ccpb.Ticket)
24+
ct.Id = id
25+
ct.Owner = txutil.NewAddressFromHash(owner).PBMessage()
26+
ct.TicketCat = int32(ticketCat)
27+
ct.Desc = desc
28+
29+
30+
if err := i.Invoke(Method_Add, ct); err != nil {
31+
return err
32+
}
33+
34+
return nil
35+
}
36+
37+
38+
func (i *GeneralCall) Apply(owner []byte, id []byte) error {
39+
40+
ct := new(ccpb.ApplyTicket)
41+
ct.Id = id
42+
ct.Owner = txutil.NewAddressFromHash(owner).PBMessage()
43+
44+
return i.Invoke(Method_Apply, ct)
45+
}
46+
47+
func (i *GeneralCall) Query(owner []byte, id []byte) (int, string) {
48+
49+
msg := &pb.QueryTicket{
50+
Owner: txutil.NewAddressFromHash(owner).PBMessage(),
51+
Id: id,
52+
}
53+
54+
data, err := i.TxCaller.Query(Method_Query, msg)
55+
if err != nil {
56+
return -1, ""
57+
}
58+
59+
d := &pb.Ticket{}
60+
err = txgen.SyncQueryResult(d, data)
61+
if err != nil {
62+
return -1, ""
63+
}
64+
65+
ret := new(pb.Ticket_s)
66+
ret.LoadFromPB(d)
67+
return int(ret.TicketCat), ret.Dest
68+
}
69+
70+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package ticket
2+
3+
import (
4+
"github.com/golang/protobuf/proto"
5+
rpc "hyperledger.abchain.org/chaincode/lib/caller"
6+
pb "hyperledger.abchain.org/chaincode/modules/ticket/protos"
7+
"hyperledger.abchain.org/chaincode/shim"
8+
txutil "hyperledger.abchain.org/core/tx"
9+
)
10+
11+
12+
type addHandler struct{ TicketConfig }
13+
type applyHandler struct{ TicketConfig }
14+
type queryHandler struct{ TicketConfig }
15+
16+
func AddHandler(cfg TicketConfig) addHandler {
17+
return addHandler{TicketConfig: cfg}
18+
}
19+
func ApplyHandler(cfg TicketConfig) applyHandler {
20+
return applyHandler{TicketConfig: cfg}
21+
}
22+
func QueryHandler(cfg TicketConfig) queryHandler {
23+
return queryHandler{TicketConfig: cfg}
24+
}
25+
26+
func (h addHandler) Msg() proto.Message { return new(pb.Ticket) }
27+
func (h applyHandler) Msg() proto.Message { return new(pb.ApplyTicket) }
28+
func (h queryHandler) Msg() proto.Message { return new(pb.QueryTicket) }
29+
30+
31+
func (h addHandler) Call(stub shim.ChaincodeStubInterface, parser txutil.Parser) ([]byte, error) {
32+
33+
msg := parser.GetMessage().(*pb.Ticket)
34+
35+
addr := msg.GetOwner().GetHash()
36+
37+
err := h.NewTx(stub, parser.GetNonce()).Add(addr, msg.Id, int(msg.TicketCat), msg.Desc)
38+
if err != nil {
39+
return nil, err
40+
}
41+
return []byte("done"), nil
42+
}
43+
44+
func (h applyHandler) Call(stub shim.ChaincodeStubInterface, parser txutil.Parser) ([]byte, error) {
45+
msg := parser.GetMessage().(*pb.ApplyTicket)
46+
47+
err := h.NewTx(stub, parser.GetNonce()).Apply(msg.GetOwner().GetHash(), msg.Id)
48+
if err != nil {
49+
return nil, err
50+
}
51+
return []byte("done"), nil
52+
}
53+
54+
func (h queryHandler) Call(stub shim.ChaincodeStubInterface, parser txutil.Parser) ([]byte, error) {
55+
56+
msg := parser.GetMessage().(*pb.QueryTicket)
57+
catalogy, desc := h.NewTx(stub, parser.GetNonce()).Query(msg.GetOwner().GetHash(), msg.Id)
58+
59+
data := &pb.Ticket_s{}
60+
data.TicketCat = int32(catalogy)
61+
data.Dest = desc
62+
return rpc.EncodeRPCResult(data.ToPB())
63+
}
64+

chaincode/modules/ticket/cc.go

+45
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package ticket
22

3+
import (
4+
"hyperledger.abchain.org/chaincode/lib/runtime"
5+
txgen "hyperledger.abchain.org/chaincode/lib/txgen"
6+
"hyperledger.abchain.org/chaincode/shim"
7+
)
8+
39
type TicketTx interface {
10+
411
//add an ticket belong to the owner, which MUST has an unique id,
512
//or error will be returned if the id is duplicated
613
//ticket catalogy MUST start from 1 (0 or less is not allowed)
@@ -12,3 +19,41 @@ type TicketTx interface {
1219
//ticket is not exist
1320
Query(owner []byte, id []byte) (int, string)
1421
}
22+
23+
type TicketConfig interface {
24+
NewTx(shim.ChaincodeStubInterface, []byte) TicketTx
25+
}
26+
27+
type StandardTicketConfig struct {
28+
Root string
29+
*runtime.Config
30+
}
31+
32+
func NewConfig(tag string) *StandardTicketConfig {
33+
cfg := runtime.NewConfig()
34+
35+
return &StandardTicketConfig{ticket_tag_prefix + tag, cfg}
36+
}
37+
38+
type baseTicketTx struct {
39+
*runtime.ChaincodeRuntime
40+
nonce []byte
41+
}
42+
43+
44+
const (
45+
ticket_tag_prefix = "Ticket_"
46+
)
47+
48+
func (cfg *StandardTicketConfig) NewTx(stub shim.ChaincodeStubInterface, nonce []byte) TicketTx {
49+
return &baseTicketTx{runtime.NewRuntime(cfg.Root, stub, cfg.Config), nonce}
50+
}
51+
52+
type InnerInvokeConfig struct {
53+
txgen.InnerChaincode
54+
}
55+
56+
func (c InnerInvokeConfig) NewTx(stub shim.ChaincodeStubInterface, nc []byte) TicketTx {
57+
return &GeneralCall{c.NewInnerTxInterface(stub, nc)}
58+
}
59+

0 commit comments

Comments
 (0)