github.com/condensat/bank-core@v0.1.0/database/query/swapinfo.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 ErrInvalidSwapInfoID = errors.New("Invalid SwapInfoID") 19 ErrInvalidSwapPayload = errors.New("Invalid Swap Payload") 20 ) 21 22 func AddSwapInfo(db database.Context, swapID model.SwapID, status model.SwapStatus, payload model.Payload) (model.SwapInfo, error) { 23 gdb := db.DB().(*gorm.DB) 24 if db == nil { 25 return model.SwapInfo{}, database.ErrInvalidDatabase 26 } 27 28 if swapID == 0 { 29 return model.SwapInfo{}, ErrInvalidSwapID 30 } 31 if len(status) == 0 { 32 return model.SwapInfo{}, ErrInvalidSwapType 33 } 34 if len(payload) == 0 { 35 return model.SwapInfo{}, ErrInvalidSwapPayload 36 } 37 38 timestamp := time.Now().UTC().Truncate(time.Second) 39 result := model.SwapInfo{ 40 Timestamp: timestamp, 41 SwapID: swapID, 42 Status: status, 43 Payload: payload, 44 } 45 err := gdb.Create(&result).Error 46 if err != nil { 47 return model.SwapInfo{}, err 48 } 49 50 return result, nil 51 } 52 53 type SwapInfos struct { 54 Count int 55 Active int 56 } 57 58 func SwapssInfos(db database.Context) (SwapInfos, error) { 59 gdb := db.DB().(*gorm.DB) 60 if gdb == nil { 61 return SwapInfos{}, database.ErrInvalidDatabase 62 } 63 64 subQueryLast := gdb.Model(&model.SwapInfo{}). 65 Select("MAX(id)"). 66 Group("swap_id"). 67 SubQuery() 68 69 var totalSwaps int64 70 err := gdb.Model(&model.SwapInfo{}). 71 Where("id IN (?)", subQueryLast). 72 Count(&totalSwaps).Error 73 if err != nil { 74 return SwapInfos{}, err 75 } 76 77 var activeSwaps int64 78 err = gdb.Model(&model.SwapInfo{}). 79 Where("swap_info.id IN (?)", subQueryLast). 80 Where("status <> ?", "finalized"). 81 Count(&activeSwaps).Error 82 if err != nil { 83 return SwapInfos{}, err 84 } 85 86 return SwapInfos{ 87 Count: int(totalSwaps), 88 Active: int(activeSwaps), 89 }, nil 90 } 91 92 func GetSwapInfo(db database.Context, swapInfoID model.SwapInfoID) (model.SwapInfo, error) { 93 gdb := db.DB().(*gorm.DB) 94 if db == nil { 95 return model.SwapInfo{}, database.ErrInvalidDatabase 96 } 97 98 if swapInfoID == 0 { 99 return model.SwapInfo{}, ErrInvalidSwapInfoID 100 } 101 102 var result model.SwapInfo 103 err := gdb. 104 Where(&model.SwapInfo{ID: swapInfoID}). 105 First(&result).Error 106 if err != nil { 107 return model.SwapInfo{}, err 108 } 109 110 return result, nil 111 } 112 113 func GetSwapInfoBySwapID(db database.Context, swapID model.SwapID) (model.SwapInfo, error) { 114 gdb := db.DB().(*gorm.DB) 115 if db == nil { 116 return model.SwapInfo{}, database.ErrInvalidDatabase 117 } 118 119 if swapID == 0 { 120 return model.SwapInfo{}, ErrInvalidSwapID 121 } 122 123 var result model.SwapInfo 124 err := gdb. 125 Where(&model.SwapInfo{SwapID: swapID}). 126 Last(&result).Error 127 if err != nil { 128 return model.SwapInfo{}, err 129 } 130 131 return result, nil 132 } 133 134 func SwapPagingCount(db database.Context, countByPage int) (int, error) { 135 if countByPage <= 0 { 136 countByPage = 1 137 } 138 139 switch gdb := db.DB().(type) { 140 case *gorm.DB: 141 142 var result int 143 err := gdb. 144 Model(&model.SwapInfo{}). 145 Group("swap_id"). 146 Count(&result).Error 147 var partialPage int 148 if result%countByPage > 0 { 149 partialPage = 1 150 } 151 return result/countByPage + partialPage, err 152 153 default: 154 return 0, database.ErrInvalidDatabase 155 } 156 } 157 158 func SwapPage(db database.Context, swapID model.SwapID, countByPage int) ([]model.SwapID, error) { 159 switch gdb := db.DB().(type) { 160 case *gorm.DB: 161 162 if countByPage <= 0 { 163 countByPage = 1 164 } 165 166 subQueryLast := gdb.Model(&model.SwapInfo{}). 167 Select("MAX(id)"). 168 Group("swap_id"). 169 SubQuery() 170 171 var list []*model.SwapInfo 172 err := gdb.Model(&model.SwapInfo{}). 173 Where("swap_info.id IN (?)", subQueryLast). 174 Where("id >= ?", swapID). 175 Order("swap_id ASC"). 176 Limit(countByPage). 177 Find(&list).Error 178 179 if err != nil && err != gorm.ErrRecordNotFound { 180 return nil, err 181 } 182 183 return convertSwapInfoIDs(list), nil 184 185 default: 186 return nil, database.ErrInvalidDatabase 187 } 188 } 189 190 func convertSwapInfoIDs(list []*model.SwapInfo) []model.SwapID { 191 var result []model.SwapID 192 for _, curr := range list { 193 if curr != nil { 194 result = append(result, curr.SwapID) 195 } 196 } 197 198 return result[:] 199 }