@@ -37,6 +37,8 @@ func (a *app) AcceptTx(ctx apptypes.Context, tx interface{}) bool {
37
37
switch tx .(type ) {
38
38
case * types.TxPayload_TxCreateLease :
39
39
return true
40
+ case * types.TxPayload_TxCloseLease :
41
+ return true
40
42
}
41
43
return false
42
44
}
@@ -46,6 +48,9 @@ func (a *app) CheckTx(ctx apptypes.Context, tx interface{}) tmtypes.ResponseChec
46
48
case * types.TxPayload_TxCreateLease :
47
49
resp , _ := a .doCheckCreateTx (ctx , tx .TxCreateLease )
48
50
return resp
51
+ case * types.TxPayload_TxCloseLease :
52
+ resp , _ := a .doCheckCloseTx (ctx , tx .TxCloseLease )
53
+ return resp
49
54
}
50
55
return tmtypes.ResponseCheckTx {
51
56
Code : code .UNKNOWN_TRANSACTION ,
@@ -57,6 +62,8 @@ func (a *app) DeliverTx(ctx apptypes.Context, tx interface{}) tmtypes.ResponseDe
57
62
switch tx := tx .(type ) {
58
63
case * types.TxPayload_TxCreateLease :
59
64
return a .doDeliverCreateTx (ctx , tx .TxCreateLease )
65
+ case * types.TxPayload_TxCloseLease :
66
+ return a .doDeliverCloseTx (ctx , tx .TxCloseLease )
60
67
}
61
68
return tmtypes.ResponseDeliverTx {
62
69
Code : code .UNKNOWN_TRANSACTION ,
@@ -200,7 +207,7 @@ func (a *app) doCheckCreateTx(ctx apptypes.Context, tx *types.TxCreateLease) (tm
200
207
}
201
208
202
209
func (a * app ) doDeliverCreateTx (ctx apptypes.Context , tx * types.TxCreateLease ) tmtypes.ResponseDeliverTx {
203
- cresp , order := a .doCheckCreateTx (ctx , tx )
210
+ cresp , matchedOrder := a .doCheckCreateTx (ctx , tx )
204
211
if ! cresp .IsOK () {
205
212
return tmtypes.ResponseDeliverTx {
206
213
Code : cresp .Code ,
@@ -224,13 +231,47 @@ func (a *app) doDeliverCreateTx(ctx apptypes.Context, tx *types.TxCreateLease) t
224
231
}
225
232
}
226
233
227
- order .State = types .Order_MATCHED
228
- if err := a .State ().Order ().Save (order ); err != nil {
234
+ group , err := a .State ().DeploymentGroup ().Get (tx .Deployment , tx .Group )
235
+ if err != nil {
236
+ return tmtypes.ResponseDeliverTx {
237
+ Code : code .ERROR ,
238
+ Log : err .Error (),
239
+ }
240
+ }
241
+ if group == nil {
229
242
return tmtypes.ResponseDeliverTx {
230
243
Code : code .INVALID_TRANSACTION ,
244
+ Log : "group not found" ,
245
+ }
246
+ }
247
+
248
+ orders , err := a .State ().Order ().ForGroup (group )
249
+ if err != nil {
250
+ return tmtypes.ResponseDeliverTx {
251
+ Code : code .ERROR ,
231
252
Log : err .Error (),
232
253
}
233
254
}
255
+ if orders == nil {
256
+ return tmtypes.ResponseDeliverTx {
257
+ Code : code .INVALID_TRANSACTION ,
258
+ Log : "orders not found" ,
259
+ }
260
+ }
261
+
262
+ for _ , order := range orders {
263
+ if order .Seq != matchedOrder .Seq {
264
+ order .State = types .Order_CLOSED
265
+ } else {
266
+ order .State = types .Order_MATCHED
267
+ }
268
+ if err := a .State ().Order ().Save (order ); err != nil {
269
+ return tmtypes.ResponseDeliverTx {
270
+ Code : code .INVALID_TRANSACTION ,
271
+ Log : err .Error (),
272
+ }
273
+ }
274
+ }
234
275
235
276
tags := apptypes .NewTags (a .Name (), apptypes .TxTypeCreateLease )
236
277
tags = append (tags , tmcommon.KVPair {Key : []byte (apptypes .TagNameDeployment ), Value : lease .Deployment })
@@ -241,6 +282,108 @@ func (a *app) doDeliverCreateTx(ctx apptypes.Context, tx *types.TxCreateLease) t
241
282
}
242
283
}
243
284
285
+ func (a * app ) doCheckCloseTx (ctx apptypes.Context , tx * types.TxCloseLease ) (tmtypes.ResponseCheckTx , * types.Lease ) {
286
+ if tx .Lease == nil {
287
+ return tmtypes.ResponseCheckTx {
288
+ Code : code .INVALID_TRANSACTION ,
289
+ Log : "empty lease" ,
290
+ }, nil
291
+ }
292
+
293
+ // lookup provider
294
+ lease , err := a .State ().Lease ().GetByKey (tx .Lease )
295
+ if err != nil {
296
+ return tmtypes.ResponseCheckTx {
297
+ Code : code .ERROR ,
298
+ Log : err .Error (),
299
+ }, nil
300
+ }
301
+ if lease == nil {
302
+ return tmtypes.ResponseCheckTx {
303
+ Code : code .INVALID_TRANSACTION ,
304
+ Log : "lease not found" ,
305
+ }, nil
306
+ }
307
+
308
+ if lease .State != types .Lease_ACTIVE {
309
+ return tmtypes.ResponseCheckTx {
310
+ Code : code .INVALID_TRANSACTION ,
311
+ Log : "lease not active" ,
312
+ }, nil
313
+ }
314
+
315
+ return tmtypes.ResponseCheckTx {}, lease
316
+ }
317
+
318
+ func (a * app ) doDeliverCloseTx (ctx apptypes.Context , tx * types.TxCloseLease ) tmtypes.ResponseDeliverTx {
319
+ cresp , lease := a .doCheckCloseTx (ctx , tx )
320
+ if ! cresp .IsOK () {
321
+ return tmtypes.ResponseDeliverTx {
322
+ Code : cresp .Code ,
323
+ Log : cresp .Log ,
324
+ }
325
+ }
326
+
327
+ group , err := a .State ().DeploymentGroup ().Get (lease .Deployment , lease .Group )
328
+ if err != nil {
329
+ return tmtypes.ResponseDeliverTx {
330
+ Code : code .ERROR ,
331
+ Log : err .Error (),
332
+ }
333
+ }
334
+ if group == nil {
335
+ return tmtypes.ResponseDeliverTx {
336
+ Code : code .INVALID_TRANSACTION ,
337
+ Log : "group not found" ,
338
+ }
339
+ }
340
+
341
+ order , err := a .State ().Order ().Get (lease .Deployment , lease .Group , lease .Order )
342
+ if err != nil {
343
+ return tmtypes.ResponseDeliverTx {
344
+ Code : code .ERROR ,
345
+ Log : err .Error (),
346
+ }
347
+ }
348
+ if order == nil {
349
+ return tmtypes.ResponseDeliverTx {
350
+ Code : code .INVALID_TRANSACTION ,
351
+ Log : "order not found" ,
352
+ }
353
+ }
354
+
355
+ order .State = types .Order_CLOSED
356
+ if err := a .State ().Order ().Save (order ); err != nil {
357
+ return tmtypes.ResponseDeliverTx {
358
+ Code : code .INVALID_TRANSACTION ,
359
+ Log : err .Error (),
360
+ }
361
+ }
362
+
363
+ group .State = types .DeploymentGroup_OPEN
364
+ if err := a .State ().DeploymentGroup ().Save (group ); err != nil {
365
+ return tmtypes.ResponseDeliverTx {
366
+ Code : code .INVALID_TRANSACTION ,
367
+ Log : err .Error (),
368
+ }
369
+ }
370
+
371
+ lease .State = types .Lease_CLOSED
372
+ if err := a .State ().Lease ().Save (lease ); err != nil {
373
+ return tmtypes.ResponseDeliverTx {
374
+ Code : code .INVALID_TRANSACTION ,
375
+ Log : err .Error (),
376
+ }
377
+ }
378
+
379
+ tags := apptypes .NewTags (a .Name (), apptypes .TxTypeCloseLease )
380
+ tags = append (tags , tmcommon.KVPair {Key : []byte (apptypes .TagNameLease ), Value : state .IDForLease (lease )})
381
+
382
+ return tmtypes.ResponseDeliverTx {
383
+ Tags : tags ,
384
+ }
385
+ }
386
+
244
387
func (a * app ) doQuery (key base.Bytes ) tmtypes.ResponseQuery {
245
388
lease , err := a .State ().Lease ().GetByKey (key )
246
389
0 commit comments