github.com/condensat/bank-core@v0.1.0/database/query/batchinfo.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/encoding" 13 "github.com/condensat/bank-core/database/model" 14 15 "github.com/jinzhu/gorm" 16 ) 17 18 var ( 19 ErrInvalidBatchInfoID = errors.New("Invalid BatchInfoID") 20 ErrInvalidBatchStatus = errors.New("Invalid BatchInfo Status") 21 ErrInvalidBatchInfoDataType = errors.New("Invalid BatchInfo DataType") 22 ) 23 24 func AddBatchInfo(db database.Context, batchID model.BatchID, status model.BatchStatus, dataType encoding.DataType, data model.BatchInfoData) (model.BatchInfo, error) { 25 gdb := db.DB().(*gorm.DB) 26 if db == nil { 27 return model.BatchInfo{}, database.ErrInvalidDatabase 28 } 29 30 if batchID == 0 { 31 return model.BatchInfo{}, ErrInvalidBatchID 32 } 33 if len(status) == 0 { 34 return model.BatchInfo{}, ErrInvalidBatchStatus 35 } 36 if len(dataType) == 0 { 37 return model.BatchInfo{}, ErrInvalidBatchInfoDataType 38 } 39 40 timestamp := time.Now().UTC().Truncate(time.Second) 41 result := model.BatchInfo{ 42 Timestamp: timestamp, 43 BatchID: batchID, 44 Status: status, 45 Type: dataType, 46 Data: data, 47 } 48 err := gdb.Create(&result).Error 49 if err != nil { 50 return model.BatchInfo{}, err 51 } 52 53 return result, nil 54 55 } 56 57 func GetBatchInfo(db database.Context, ID model.BatchInfoID) (model.BatchInfo, error) { 58 gdb := db.DB().(*gorm.DB) 59 if db == nil { 60 return model.BatchInfo{}, database.ErrInvalidDatabase 61 } 62 63 if ID == 0 { 64 return model.BatchInfo{}, ErrInvalidBatchInfoID 65 } 66 67 var result model.BatchInfo 68 err := gdb. 69 Where(&model.BatchInfo{ID: ID}). 70 First(&result).Error 71 if err != nil { 72 return model.BatchInfo{}, err 73 } 74 75 return result, nil 76 } 77 78 func GetBatchHistory(db database.Context, batchID model.BatchID) ([]model.BatchInfo, error) { 79 gdb := db.DB().(*gorm.DB) 80 if db == nil { 81 return nil, database.ErrInvalidDatabase 82 } 83 84 if batchID == 0 { 85 return nil, ErrInvalidBatchID 86 } 87 88 var list []*model.BatchInfo 89 err := gdb. 90 Where(model.BatchInfo{ 91 BatchID: batchID, 92 }). 93 Order("id ASC"). 94 Find(&list).Error 95 96 if err != nil && err != gorm.ErrRecordNotFound { 97 return nil, err 98 } 99 100 return convertBatchInfoList(list), nil 101 } 102 103 func GetBatchInfoByStatusAndType(db database.Context, status model.BatchStatus, dataType encoding.DataType) ([]model.BatchInfo, error) { 104 gdb := db.DB().(*gorm.DB) 105 if db == nil { 106 return nil, database.ErrInvalidDatabase 107 } 108 109 if len(status) == 0 { 110 return nil, ErrInvalidWithdrawStatus 111 } 112 if len(dataType) == 0 { 113 return nil, ErrInvalidBatchInfoDataType 114 } 115 116 var list []*model.BatchInfo 117 err := gdb. 118 Where(model.BatchInfo{ 119 Status: status, 120 Type: dataType, 121 }). 122 Order("id ASC"). 123 Find(&list).Error 124 125 if err != nil && err != gorm.ErrRecordNotFound { 126 return nil, err 127 } 128 129 return convertBatchInfoList(list), nil 130 } 131 132 func GetLastBatchInfo(db database.Context, batchID model.BatchID) (model.BatchInfo, error) { 133 gdb := db.DB().(*gorm.DB) 134 if db == nil { 135 return model.BatchInfo{}, database.ErrInvalidDatabase 136 } 137 138 if batchID == 0 { 139 return model.BatchInfo{}, ErrInvalidBatchID 140 } 141 142 subQueryLast := gdb.Model(&model.BatchInfo{}). 143 Select("MAX(id)"). 144 Group("batch_id"). 145 SubQuery() 146 147 var result model.BatchInfo 148 err := gdb.Model(&model.BatchInfo{}). 149 Where("batch_info.id IN (?)", subQueryLast). 150 Where(model.BatchInfo{ 151 BatchID: batchID, 152 }).First(&result).Error 153 154 if err != nil { 155 return model.BatchInfo{}, err 156 } 157 158 return result, nil 159 } 160 161 func GetLastBatchInfoByStatusAndNetwork(db database.Context, status model.BatchStatus, network model.BatchNetwork) ([]model.BatchInfo, error) { 162 gdb := db.DB().(*gorm.DB) 163 if db == nil { 164 return nil, database.ErrInvalidDatabase 165 } 166 167 if len(status) == 0 { 168 return nil, ErrInvalidWithdrawStatus 169 } 170 if len(network) == 0 { 171 return nil, ErrInvalidNetwork 172 } 173 174 subQueryLast := gdb.Model(&model.BatchInfo{}). 175 Select("MAX(id)"). 176 Group("batch_id"). 177 SubQuery() 178 179 subQueryNetwork := gdb.Model(&model.Batch{}). 180 Select("id"). 181 Where(model.Batch{ 182 Network: network, 183 }). 184 SubQuery() 185 186 var list []*model.BatchInfo 187 err := gdb.Model(&model.BatchInfo{}). 188 Joins("JOIN (?) AS b ON batch_info.batch_id = b.id", subQueryNetwork). 189 Where("batch_info.id IN (?)", subQueryLast). 190 Where(model.BatchInfo{ 191 Status: status, 192 }). 193 Order("id ASC"). 194 Find(&list).Error 195 196 if err != nil && err != gorm.ErrRecordNotFound { 197 return nil, err 198 } 199 200 return convertBatchInfoList(list), nil 201 } 202 203 func convertBatchInfoList(list []*model.BatchInfo) []model.BatchInfo { 204 var result []model.BatchInfo 205 for _, curr := range list { 206 if curr != nil { 207 result = append(result, *curr) 208 } 209 } 210 211 return result[:] 212 } 213 214 func BatchPagingCount(db database.Context, countByPage int) (int, error) { 215 if countByPage <= 0 { 216 countByPage = 1 217 } 218 219 switch gdb := db.DB().(type) { 220 case *gorm.DB: 221 222 var result int 223 err := gdb. 224 Model(&model.BatchInfo{}). 225 Group("batch_id"). 226 Count(&result).Error 227 var partialPage int 228 if result%countByPage > 0 { 229 partialPage = 1 230 } 231 return result/countByPage + partialPage, err 232 233 default: 234 return 0, database.ErrInvalidDatabase 235 } 236 } 237 238 func BatchPage(db database.Context, batchID model.BatchID, countByPage int) ([]model.BatchID, error) { 239 switch gdb := db.DB().(type) { 240 case *gorm.DB: 241 242 if countByPage <= 0 { 243 countByPage = 1 244 } 245 246 subQueryLast := gdb.Model(&model.BatchInfo{}). 247 Select("MAX(id)"). 248 Group("batch_id"). 249 SubQuery() 250 251 var list []*model.BatchInfo 252 err := gdb.Model(&model.BatchInfo{}). 253 Where("batch_info.id IN (?)", subQueryLast). 254 Where("id >= ?", batchID). 255 Order("batch_id ASC"). 256 Limit(countByPage). 257 Find(&list).Error 258 259 if err != nil && err != gorm.ErrRecordNotFound { 260 return nil, err 261 } 262 263 return convertBatchInfoIDs(list), nil 264 265 default: 266 return nil, database.ErrInvalidDatabase 267 } 268 } 269 270 func convertBatchInfoIDs(list []*model.BatchInfo) []model.BatchID { 271 var result []model.BatchID 272 for _, curr := range list { 273 if curr != nil { 274 result = append(result, curr.BatchID) 275 } 276 } 277 278 return result[:] 279 }