github.com/condensat/bank-core@v0.1.0/database/query/ssmaddress.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 ErrInvalidSsmAddressID = errors.New("Invalid SsmAddressID") 19 ErrInvalidSsmPublicAddress = errors.New("Invalid PublicAddress ID") 20 ) 21 22 func AddSsmAddress(db database.Context, address model.SsmAddress, info model.SsmAddressInfo) (model.SsmAddressID, error) { 23 gdb := db.DB().(*gorm.DB) 24 if db == nil { 25 return 0, database.ErrInvalidDatabase 26 } 27 28 if !address.IsValid() { 29 return 0, errors.New("Invalid address") 30 } 31 info.SsmAddressID = model.SsmAddressID(1) 32 if !info.IsValid() { 33 return 0, errors.New("Invalid address info") 34 } 35 36 result := address 37 err := gdb.Create(&result).Error 38 if err != nil { 39 return 0, err 40 } 41 42 info.SsmAddressID = result.ID 43 if !info.IsValid() { 44 return model.SsmAddressID(0), errors.New("Invalid address info") 45 } 46 err = gdb.Create(&info).Error 47 if err != nil { 48 return 0, err 49 } 50 51 _, err = UpdateSsmAddressState(db, result.ID, model.SsmAddressStatusUnused) 52 if err != nil { 53 return 0, nil 54 } 55 56 return result.ID, nil 57 } 58 59 func CountSsmAddress(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint) (int, error) { 60 gdb := db.DB().(*gorm.DB) 61 if db == nil { 62 return 0, database.ErrInvalidDatabase 63 } 64 65 if len(chain) == 0 { 66 return 0, errors.New("Invalid chain") 67 } 68 69 if len(fingerprint) == 0 { 70 return 0, errors.New("Invalid fingerprint") 71 } 72 73 result := 0 74 err := gdb.Model(&model.SsmAddressInfo{}).Where(&model.SsmAddressInfo{ 75 Chain: chain, 76 Fingerprint: fingerprint, 77 }).Count(&result).Error 78 if err != nil { 79 return 0, err 80 } 81 82 return result, nil 83 } 84 85 func CountSsmAddressByState(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint, state model.SsmAddressStatus) (int, error) { 86 gdb := db.DB().(*gorm.DB) 87 if db == nil { 88 return 0, database.ErrInvalidDatabase 89 } 90 91 if len(chain) == 0 { 92 return 0, errors.New("Invalid chain") 93 } 94 95 if len(fingerprint) == 0 { 96 return 0, errors.New("Invalid fingerprint") 97 } 98 99 subQueryInfo := gdb. 100 Model(&model.SsmAddressInfo{}). 101 Where(&model.SsmAddressInfo{ 102 Chain: chain, 103 Fingerprint: fingerprint, 104 }). 105 SubQuery() 106 107 subQueryLast := gdb.Model(&model.SsmAddressState{}). 108 Select("MAX(id)"). 109 Group("ssm_address_id"). 110 SubQuery() 111 112 result := 0 113 err := gdb.Model(&model.SsmAddressState{}). 114 Joins("JOIN (?) AS i ON i.ssm_address_id = ssm_address_state.ssm_address_id", subQueryInfo). 115 Where("state = ?", state). 116 Where("ssm_address_state.id IN (?)", subQueryLast). 117 Count(&result).Error 118 119 if err != nil { 120 return 0, err 121 } 122 123 return result, nil 124 } 125 126 func GetSsmAddress(db database.Context, addressID model.SsmAddressID) (model.SsmAddress, error) { 127 gdb := db.DB().(*gorm.DB) 128 if db == nil { 129 return model.SsmAddress{}, database.ErrInvalidDatabase 130 } 131 132 if addressID == 0 { 133 return model.SsmAddress{}, ErrInvalidSsmAddressID 134 } 135 136 var result model.SsmAddress 137 err := gdb. 138 Where(&model.SsmAddress{ID: addressID}). 139 First(&result).Error 140 if err != nil { 141 return model.SsmAddress{}, err 142 } 143 144 return result, nil 145 } 146 147 func GetSsmAddressInfo(db database.Context, addressID model.SsmAddressID) (model.SsmAddressInfo, error) { 148 gdb := db.DB().(*gorm.DB) 149 if db == nil { 150 return model.SsmAddressInfo{}, database.ErrInvalidDatabase 151 } 152 153 if addressID == 0 { 154 return model.SsmAddressInfo{}, ErrInvalidSwapID 155 } 156 157 var result model.SsmAddressInfo 158 err := gdb. 159 Where(&model.SsmAddressInfo{SsmAddressID: addressID}). 160 First(&result).Error 161 if err != nil { 162 return model.SsmAddressInfo{}, err 163 } 164 165 return result, nil 166 } 167 168 func NextSsmAddressID(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint) (model.SsmAddressID, error) { 169 gdb := db.DB().(*gorm.DB) 170 if db == nil { 171 return 0, database.ErrInvalidDatabase 172 } 173 174 if len(chain) == 0 { 175 return 0, errors.New("Invalid chain") 176 } 177 178 if len(fingerprint) == 0 { 179 return 0, errors.New("Invalid fingerprint") 180 } 181 182 subQueryInfo := gdb. 183 Model(&model.SsmAddressInfo{}). 184 Where(&model.SsmAddressInfo{ 185 Chain: chain, 186 Fingerprint: fingerprint, 187 }). 188 SubQuery() 189 190 subQueryLast := gdb.Model(&model.SsmAddressState{}). 191 Select("MAX(id)"). 192 Group("ssm_address_id"). 193 SubQuery() 194 195 result := model.SsmAddressState{} 196 err := gdb.Model(&model.SsmAddressState{}). 197 Joins("JOIN (?) AS i ON i.ssm_address_id = ssm_address_state.ssm_address_id", subQueryInfo). 198 Where("ssm_address_state.id IN (?)", subQueryLast). 199 Where("state = ?", model.SsmAddressStatusUnused). 200 First(&result).Error 201 if err != nil { 202 return 0, err 203 } 204 205 return result.SsmAddressID, nil 206 } 207 208 func GetSsmAddressByPublicAddress(db database.Context, publicAddress model.SsmPublicAddress) (model.SsmAddress, error) { 209 gdb := db.DB().(*gorm.DB) 210 if db == nil { 211 return model.SsmAddress{}, database.ErrInvalidDatabase 212 } 213 214 if len(publicAddress) == 0 { 215 return model.SsmAddress{}, ErrInvalidCryptoAddressID 216 } 217 218 var result model.SsmAddress 219 err := gdb. 220 Where(&model.SsmAddress{PublicAddress: publicAddress}). 221 First(&result).Error 222 if err != nil { 223 return model.SsmAddress{}, err 224 } 225 226 return result, nil 227 } 228 229 func GetSsmAddressState(db database.Context, addressID model.SsmAddressID) (model.SsmAddressState, error) { 230 gdb := db.DB().(*gorm.DB) 231 if db == nil { 232 return model.SsmAddressState{}, database.ErrInvalidDatabase 233 } 234 235 if addressID == 0 { 236 return model.SsmAddressState{}, ErrInvalidSsmAddressID 237 } 238 239 var result model.SsmAddressState 240 err := gdb. 241 Where(&model.SsmAddressState{SsmAddressID: addressID}). 242 Last(&result).Error 243 if err != nil { 244 return model.SsmAddressState{}, err 245 } 246 247 return result, nil 248 } 249 250 func UpdateSsmAddressState(db database.Context, addressID model.SsmAddressID, status model.SsmAddressStatus) (model.SsmAddressState, error) { 251 gdb := db.DB().(*gorm.DB) 252 if db == nil { 253 return model.SsmAddressState{}, database.ErrInvalidDatabase 254 } 255 256 if addressID == 0 { 257 return model.SsmAddressState{}, ErrInvalidSsmAddressID 258 } 259 if len(status) == 0 { 260 return model.SsmAddressState{}, ErrInvalidSsmAddressID 261 } 262 263 result := model.SsmAddressState{ 264 SsmAddressID: addressID, 265 Timestamp: time.Now().UTC().Truncate(time.Second), 266 State: status, 267 } 268 err := gdb.Create(&result).Error 269 if err != nil { 270 return model.SsmAddressState{}, err 271 } 272 273 return result, nil 274 }