github.com/s7techlab/cckit@v0.10.5/examples/fabcar/fabcar_mapper.go (about) 1 package fabcar 2 3 import ( 4 "strconv" 5 6 "github.com/s7techlab/cckit/router" 7 "github.com/s7techlab/cckit/state/mapping" 8 ) 9 10 type ( 11 Mapper struct { 12 // main entry 13 Car *Car 14 15 // secondary entities 16 Owners []*CarOwner 17 Details []*CarDetail 18 19 State *mapping.EntryMapper 20 } 21 ) 22 23 func (m *Mapper) View() *CarView { 24 return &CarView{ 25 Car: m.Car, 26 Owners: &CarOwners{Items: m.Owners}, 27 Details: &CarDetails{Items: m.Details}, 28 } 29 } 30 31 func CreateCarID(car *Car) []string { 32 return []string{car.Make, car.Model, strconv.Itoa(int(car.Number))} 33 } 34 35 func (m *Mapper) CreateCar(ctx router.Context, req *CreateCarRequest) { 36 updatedAt, _ := ctx.Stub().GetTxTimestamp() 37 38 m.Car = &Car{ 39 Make: req.Make, 40 Model: req.Model, 41 Colour: req.Colour, 42 Number: req.Number, 43 UpdatedAt: updatedAt, 44 } 45 46 m.Car.Id = CreateCarID(m.Car) 47 48 m.SetCarOwners(ctx, req.Owners) 49 m.SetCarDetails(ctx, req.Details) 50 51 m.State.Commands.Insert(m.Car) 52 m.State.Event = mapping.EventFromPayload(&CarCreated{ 53 Id: m.Car.Id, 54 Make: m.Car.Make, 55 Model: m.Car.Model, 56 Colour: m.Car.Colour, 57 Number: m.Car.Number, 58 }) 59 } 60 61 func (m *Mapper) SetCar(ctx router.Context, req *UpdateCarRequest) { 62 updatedAt, _ := ctx.Stub().GetTxTimestamp() 63 m.Car.UpdatedAt = updatedAt 64 m.Car.Colour = req.Color 65 66 if len(req.Owners) > 0 { 67 m.SetCarOwners(ctx, req.Owners) 68 } 69 70 if len(req.Details) > 0 { 71 m.SetCarDetails(ctx, req.Details) 72 } 73 74 m.State.Commands.Put(m.Car) 75 m.State.Event = &mapping.Event{Payload: &CarUpdated{ 76 Id: m.Car.Id, 77 Colour: m.Car.Colour, 78 }} 79 } 80 81 func (m *Mapper) SetCarOwners(ctx router.Context, reqs []*SetCarOwner) { 82 updatedAt, _ := ctx.Stub().GetTxTimestamp() 83 84 for _, req := range reqs { 85 carOwner := &CarOwner{ 86 CarId: m.Car.Id, 87 FirstName: req.FirstName, 88 SecondName: req.SecondName, 89 VehiclePassport: req.VehiclePassport, 90 UpdatedAt: updatedAt, 91 } 92 93 var exists bool 94 for i, owner := range m.Owners { 95 if owner.FirstName == carOwner.FirstName && owner.SecondName == carOwner.SecondName { 96 m.Owners[i] = carOwner 97 exists = true 98 } 99 } 100 101 if !exists { 102 m.Owners = append(m.Owners, carOwner) 103 } 104 105 m.State.Commands.Put(carOwner) 106 } 107 108 m.State.Event = &mapping.Event{Payload: &CarOwnersUpdated{ 109 Owners: &CarOwners{Items: m.Owners}, 110 }} 111 } 112 113 func (m *Mapper) SetCarDetails(ctx router.Context, reqs []*SetCarDetail) { 114 updatedAt, _ := ctx.Stub().GetTxTimestamp() 115 116 for _, req := range reqs { 117 carDetail := &CarDetail{ 118 CarId: m.Car.Id, 119 Type: req.Type, 120 Make: req.Make, 121 UpdatedAt: updatedAt, 122 } 123 124 var exists bool 125 for i, room := range m.Details { 126 if room.Type == carDetail.Type { 127 m.Details[i] = carDetail 128 exists = true 129 } 130 } 131 132 if !exists { 133 m.Details = append(m.Details, carDetail) 134 } 135 136 m.State.Commands.Put(carDetail) 137 } 138 139 m.State.Event = &mapping.Event{Payload: &CarDetailsUpdated{ 140 Details: &CarDetails{Items: m.Details}, 141 }} 142 }