github.com/condensat/bank-core@v0.1.0/database/query/operationstatus.go (about) 1 // Copyright 2020 Condensat Tech. All rights reserved. 2 // Use of this source code is governed by a MIT 3 // license that can be found in the LICENSE file. 4 5 package query 6 7 import ( 8 "errors" 9 "time" 10 11 "github.com/condensat/bank-core/database" 12 "github.com/condensat/bank-core/database/model" 13 14 "github.com/jinzhu/gorm" 15 ) 16 17 var ( 18 ErrInvalidOperationStatus = errors.New("Invalid OperationStatus") 19 ) 20 21 // AddOrUpdateOperationStatus 22 func AddOrUpdateOperationStatus(db database.Context, operation model.OperationStatus) (model.OperationStatus, error) { 23 var result model.OperationStatus 24 gdb := db.DB().(*gorm.DB) 25 if db == nil { 26 return result, database.ErrInvalidDatabase 27 } 28 29 if operation.OperationInfoID == 0 { 30 return result, ErrInvalidOperationInfoID 31 } 32 33 if len(operation.State) == 0 { 34 return result, ErrInvalidOperationStatus 35 } 36 37 operation.LastUpdate = time.Now().UTC().Truncate(time.Second) 38 39 err := gdb. 40 Where(model.OperationStatus{ 41 OperationInfoID: operation.OperationInfoID, 42 }). 43 Assign(operation). 44 FirstOrCreate(&result).Error 45 46 return result, err 47 } 48 49 type DepositInfos struct { 50 Count int 51 Active int 52 } 53 54 func DepositsInfos(db database.Context) (DepositInfos, error) { 55 gdb := db.DB().(*gorm.DB) 56 if gdb == nil { 57 return DepositInfos{}, database.ErrInvalidDatabase 58 } 59 60 var totalOperations int64 61 err := gdb.Model(&model.OperationStatus{}). 62 Count(&totalOperations).Error 63 if err != nil { 64 return DepositInfos{}, err 65 } 66 67 var activeOperations int64 68 err = gdb.Model(&model.OperationStatus{}). 69 Where("state <> ?", "settled"). 70 Count(&activeOperations).Error 71 if err != nil { 72 return DepositInfos{}, err 73 } 74 75 return DepositInfos{ 76 Count: int(totalOperations), 77 Active: int(activeOperations), 78 }, nil 79 } 80 81 // GetOperationStatus 82 func GetOperationStatus(db database.Context, operationInfoID model.OperationInfoID) (model.OperationStatus, error) { 83 gdb := db.DB().(*gorm.DB) 84 if db == nil { 85 return model.OperationStatus{}, database.ErrInvalidDatabase 86 } 87 88 if operationInfoID == 0 { 89 return model.OperationStatus{}, ErrInvalidOperationInfoID 90 } 91 92 var result model.OperationStatus 93 err := gdb. 94 Where(model.OperationStatus{ 95 OperationInfoID: operationInfoID, 96 }). 97 First(&result).Error 98 if err != nil { 99 return model.OperationStatus{}, err 100 } 101 102 return result, nil 103 } 104 105 func FindActiveOperationStatus(db database.Context) ([]model.OperationStatus, error) { 106 gdb := db.DB().(*gorm.DB) 107 108 var list []*model.OperationStatus 109 err := gdb. 110 Where("state <> ?", "settled"). 111 Or("accounted <> ?", "settled"). 112 Find(&list).Error 113 114 if err != nil && err != gorm.ErrRecordNotFound { 115 return nil, err 116 } 117 118 return convertOperationStatusList(list), nil 119 } 120 121 func FindActiveOperationInfo(db database.Context) ([]model.OperationInfo, error) { 122 gdb := db.DB().(*gorm.DB) 123 124 subQueryState := gdb.Model(&model.OperationStatus{}). 125 Select("operation_info_id"). 126 Where("state <> ?", "settled"). 127 Or("accounted <> ?", "settled"). 128 SubQuery() 129 130 var list []*model.OperationInfo 131 err := gdb.Model(&model.OperationInfo{}). 132 Joins("JOIN (?) AS os ON operation_info.id = os.operation_info_id", subQueryState). 133 Find(&list).Error 134 135 if err != nil && err != gorm.ErrRecordNotFound { 136 return nil, err 137 } 138 139 return convertOperationInfoList(list), nil 140 } 141 142 func convertOperationStatusList(list []*model.OperationStatus) []model.OperationStatus { 143 var result []model.OperationStatus 144 for _, curr := range list { 145 if curr == nil { 146 continue 147 } 148 result = append(result, *curr) 149 } 150 151 return result[:] 152 }