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 }