github.com/s7techlab/cckit@v0.10.5/examples/fabcar/fabcar.go (about)

     1  package fabcar
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"google.golang.org/protobuf/types/known/emptypb"
     7  
     8  	"github.com/s7techlab/cckit/router"
     9  	"github.com/s7techlab/cckit/state/mapping"
    10  )
    11  
    12  type FabCarService struct{}
    13  
    14  func (f *FabCarService) CreateMaker(ctx router.Context, req *CreateMakerRequest) (*Maker, error) {
    15  	if err := router.ValidateRequest(req); err != nil {
    16  		return nil, err
    17  	}
    18  
    19  	maker := &Maker{
    20  		Name:           req.Name,
    21  		Country:        req.Country,
    22  		FoundationYear: req.FoundationYear,
    23  	}
    24  
    25  	mapper := f.carMapper()
    26  	mapper.State.Commands.Insert(maker)
    27  	mapper.State.Event = mapping.EventFromPayload(&MakerCreated{
    28  		Name:           maker.Name,
    29  		Country:        maker.Country,
    30  		FoundationYear: maker.FoundationYear,
    31  	})
    32  
    33  	if err := mapper.State.Apply(State(ctx), Event(ctx)); err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	return maker, nil
    38  }
    39  
    40  func (f *FabCarService) DeleteMaker(ctx router.Context, name *MakerName) (*Maker, error) {
    41  	if err := router.ValidateRequest(name); err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	maker, err := f.GetMaker(ctx, name)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	if err = State(ctx).Delete(maker); err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	if err = Event(ctx).Set(&MakerDeleted{
    55  		Name:           maker.Name,
    56  		Country:        maker.Country,
    57  		FoundationYear: maker.FoundationYear,
    58  	}); err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	return maker, nil
    63  }
    64  
    65  func (f *FabCarService) GetMaker(ctx router.Context, name *MakerName) (*Maker, error) {
    66  	if err := router.ValidateRequest(name); err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	maker, err := State(ctx).Get(name, &Maker{})
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  
    75  	return maker.(*Maker), nil
    76  }
    77  
    78  func (f *FabCarService) ListMakers(ctx router.Context, _ *emptypb.Empty) (*Makers, error) {
    79  	res, err := State(ctx).List(&Maker{})
    80  	if err != nil {
    81  		return nil, err
    82  	}
    83  
    84  	return res.(*Makers), nil
    85  }
    86  
    87  func (f *FabCarService) carMapper() *Mapper {
    88  	return &Mapper{
    89  		State: &mapping.EntryMapper{},
    90  	}
    91  }
    92  
    93  func (f *FabCarService) carMapperByView(carView *CarView) *Mapper {
    94  	return &Mapper{
    95  		Car: carView.Car,
    96  
    97  		Owners:  carView.Owners.Items,
    98  		Details: carView.Details.Items,
    99  
   100  		State: &mapping.EntryMapper{},
   101  	}
   102  }
   103  
   104  func (f *FabCarService) CreateCar(ctx router.Context, req *CreateCarRequest) (*CarView, error) {
   105  	if err := router.ValidateRequest(req); err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	_, err := f.GetMaker(ctx, &MakerName{Name: req.Make})
   110  	if err != nil {
   111  		return nil, fmt.Errorf("maker is not created: %w", err)
   112  	}
   113  
   114  	mapper := f.carMapper()
   115  	mapper.CreateCar(ctx, req)
   116  
   117  	if err = mapper.State.Apply(State(ctx), Event(ctx)); err != nil {
   118  		return nil, err
   119  	}
   120  
   121  	return mapper.View(), nil
   122  }
   123  
   124  func (f *FabCarService) UpdateCar(ctx router.Context, req *UpdateCarRequest) (*CarView, error) {
   125  	if err := router.ValidateRequest(req); err != nil {
   126  		return nil, err
   127  	}
   128  
   129  	carView, err := f.GetCarView(ctx, &CarId{Id: req.Id})
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  
   134  	mapper := f.carMapperByView(carView)
   135  	mapper.SetCar(ctx, req)
   136  
   137  	if err = mapper.State.Apply(State(ctx), Event(ctx)); err != nil {
   138  		return nil, err
   139  	}
   140  
   141  	return mapper.View(), nil
   142  }
   143  
   144  func (f *FabCarService) DeleteCar(ctx router.Context, id *CarId) (*CarView, error) {
   145  	if err := router.ValidateRequest(id); err != nil {
   146  		return nil, err
   147  	}
   148  
   149  	carView, err := f.GetCarView(ctx, id)
   150  	if err != nil {
   151  		return nil, err
   152  	}
   153  
   154  	for _, owner := range carView.Owners.Items {
   155  		if err = State(ctx).Delete(owner); err != nil {
   156  			return nil, err
   157  		}
   158  	}
   159  
   160  	for _, details := range carView.Details.Items {
   161  		if err = State(ctx).Delete(details); err != nil {
   162  			return nil, err
   163  		}
   164  	}
   165  
   166  	if err = State(ctx).Delete(carView.Car); err != nil {
   167  		return nil, err
   168  	}
   169  
   170  	if err = Event(ctx).Set(&CarDeleted{
   171  		Id:      carView.Car.Id,
   172  		Make:    carView.Car.Make,
   173  		Model:   carView.Car.Model,
   174  		Colour:  carView.Car.Colour,
   175  		Number:  carView.Car.Number,
   176  		Owners:  carView.Owners,
   177  		Details: carView.Details,
   178  	}); err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	return carView, nil
   183  }
   184  
   185  func (f *FabCarService) GetCar(ctx router.Context, id *CarId) (*Car, error) {
   186  	if err := router.ValidateRequest(id); err != nil {
   187  		return nil, err
   188  	}
   189  
   190  	car, err := State(ctx).Get(id, &Car{})
   191  	if err != nil {
   192  		return nil, err
   193  	}
   194  
   195  	return car.(*Car), nil
   196  }
   197  
   198  func (f *FabCarService) GetCarView(ctx router.Context, id *CarId) (*CarView, error) {
   199  	if err := router.ValidateRequest(id); err != nil {
   200  		return nil, err
   201  	}
   202  
   203  	var (
   204  		carView = &CarView{}
   205  		err     error
   206  	)
   207  
   208  	carView.Car, err = f.GetCar(ctx, id)
   209  	if err != nil {
   210  		return nil, err
   211  	}
   212  
   213  	carView.Owners, err = f.ListCarOwners(ctx, id)
   214  	if err != nil {
   215  		return nil, err
   216  	}
   217  
   218  	carView.Details, err = f.ListCarDetails(ctx, id)
   219  	if err != nil {
   220  		return nil, err
   221  	}
   222  
   223  	return carView, nil
   224  }
   225  
   226  func (f *FabCarService) ListCars(ctx router.Context, _ *emptypb.Empty) (*Cars, error) {
   227  	res, err := State(ctx).List(&Car{})
   228  	if err != nil {
   229  		return nil, err
   230  	}
   231  
   232  	return res.(*Cars), nil
   233  }
   234  
   235  func (f *FabCarService) UpdateCarOwners(ctx router.Context, req *UpdateCarOwnersRequest) (*CarOwners, error) {
   236  	if err := router.ValidateRequest(req); err != nil {
   237  		return nil, err
   238  	}
   239  
   240  	carView, err := f.GetCarView(ctx, &CarId{Id: req.CarId})
   241  	if err != nil {
   242  		return nil, err
   243  	}
   244  
   245  	mapper := f.carMapperByView(carView)
   246  	mapper.SetCarOwners(ctx, req.Owners)
   247  
   248  	if err = mapper.State.Apply(State(ctx), Event(ctx)); err != nil {
   249  		return nil, err
   250  	}
   251  
   252  	return mapper.View().Owners, nil
   253  }
   254  
   255  func (f *FabCarService) DeleteCarOwner(ctx router.Context, id *CarOwnerId) (*CarOwner, error) {
   256  	if err := router.ValidateRequest(id); err != nil {
   257  		return nil, err
   258  	}
   259  
   260  	carOwner, err := f.GetCarOwner(ctx, id)
   261  	if err != nil {
   262  		return nil, err
   263  	}
   264  
   265  	if err = State(ctx).Delete(carOwner); err != nil {
   266  		return nil, err
   267  	}
   268  
   269  	return carOwner, nil
   270  }
   271  
   272  func (f *FabCarService) GetCarOwner(ctx router.Context, id *CarOwnerId) (*CarOwner, error) {
   273  	if err := router.ValidateRequest(id); err != nil {
   274  		return nil, err
   275  	}
   276  
   277  	carOwner, err := State(ctx).Get(id, &CarOwner{})
   278  	if err != nil {
   279  		return nil, err
   280  	}
   281  
   282  	return carOwner.(*CarOwner), nil
   283  }
   284  
   285  func (f *FabCarService) ListCarOwners(ctx router.Context, id *CarId) (*CarOwners, error) {
   286  	if err := router.ValidateRequest(id); err != nil {
   287  		return nil, err
   288  	}
   289  
   290  	carOwner, err := State(ctx).ListWith(&CarOwner{}, id.Id)
   291  	if err != nil {
   292  		return nil, err
   293  	}
   294  
   295  	return carOwner.(*CarOwners), nil
   296  }
   297  
   298  func (f *FabCarService) UpdateCarDetails(ctx router.Context, req *UpdateCarDetailsRequest) (*CarDetails, error) {
   299  	if err := router.ValidateRequest(req); err != nil {
   300  		return nil, err
   301  	}
   302  
   303  	carView, err := f.GetCarView(ctx, &CarId{Id: req.CarId})
   304  	if err != nil {
   305  		return nil, err
   306  	}
   307  
   308  	mapper := f.carMapperByView(carView)
   309  	mapper.SetCarDetails(ctx, req.Details)
   310  
   311  	if err = mapper.State.Apply(State(ctx), Event(ctx)); err != nil {
   312  		return nil, err
   313  	}
   314  
   315  	return mapper.View().Details, nil
   316  }
   317  
   318  func (f *FabCarService) DeleteCarDetail(ctx router.Context, id *CarDetailId) (*CarDetail, error) {
   319  	if err := router.ValidateRequest(id); err != nil {
   320  		return nil, err
   321  	}
   322  
   323  	carDetail, err := f.GetCarDetail(ctx, id)
   324  	if err != nil {
   325  		return nil, err
   326  	}
   327  
   328  	if err = State(ctx).Delete(carDetail); err != nil {
   329  		return nil, err
   330  	}
   331  
   332  	return carDetail, nil
   333  }
   334  
   335  func (f *FabCarService) GetCarDetail(ctx router.Context, id *CarDetailId) (*CarDetail, error) {
   336  	if err := router.ValidateRequest(id); err != nil {
   337  		return nil, err
   338  	}
   339  
   340  	carDetail, err := State(ctx).Get(id, &CarDetail{})
   341  	if err != nil {
   342  		return nil, err
   343  	}
   344  
   345  	return carDetail.(*CarDetail), nil
   346  }
   347  
   348  func (f *FabCarService) ListCarDetails(ctx router.Context, id *CarId) (*CarDetails, error) {
   349  	if err := router.ValidateRequest(id); err != nil {
   350  		return nil, err
   351  	}
   352  
   353  	carDetail, err := State(ctx).ListWith(&CarDetail{}, id.Id)
   354  	if err != nil {
   355  		return nil, err
   356  	}
   357  
   358  	return carDetail.(*CarDetails), nil
   359  }