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  }