github.com/condensat/bank-core@v0.1.0/database/model/withdrawtarget.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 model 6 7 import ( 8 "github.com/condensat/bank-core/database/encoding" 9 ) 10 11 type WithdrawTargetID ID 12 type WithdrawTargetType encoding.DataType 13 type WithdrawTargetData encoding.Data 14 15 const ( 16 // Fiat 17 WithdrawTargetSepa WithdrawTargetType = "sepa" 18 WithdrawTargetSwift WithdrawTargetType = "swift" 19 WithdrawTargetCard WithdrawTargetType = "card" 20 21 // Crypto 22 WithdrawTargetOnChain WithdrawTargetType = "onchain" 23 WithdrawTargetLiquid WithdrawTargetType = "liquid" 24 WithdrawTargetLightning WithdrawTargetType = "lightning" 25 ) 26 27 type WithdrawTarget struct { 28 ID WithdrawTargetID `gorm:"primary_key"` 29 WithdrawID WithdrawID `gorm:"index;not null"` // [FK] Reference to Withdraw table 30 Type WithdrawTargetType `gorm:"index;not null;size:16"` // DataType [onchain, liquid, lightning, sepa, swift, card] 31 Data WithdrawTargetData `gorm:"type:blob;not null;default:'{}'"` // WithdrawTarget data 32 } 33 34 // WithdrawTargetCryptoData data type for WithdrawTargetType crypto, liquid & lightning 35 type WithdrawTargetCryptoData struct { 36 Chain string `json:"chain,omitempty"` 37 PublicKey string `json:"publickey,omitempty"` 38 } 39 40 // WithdrawTargetFiatData data type for WithdrawTargetType sepa, swift & cb 41 type WithdrawTargetFiatData struct { 42 Network string `json:"network,omitempty"` 43 } 44 45 // WithdrawTargetSepaData data type for WithdrawTargetType sepa 46 type WithdrawTargetSepaData struct { 47 WithdrawTargetFiatData 48 BIC string `json:"bic,omitempty"` 49 IBAN string `json:"iban,omitempty"` 50 } 51 52 func FromSepaData(withdrawID WithdrawID, sepa WithdrawTargetSepaData) WithdrawTarget { 53 if withdrawID > 0 { 54 sepa.WithdrawTargetFiatData.Network = "sepa" 55 } 56 data, _ := encoding.EncodeData(&sepa) 57 return WithdrawTarget{ 58 WithdrawID: withdrawID, 59 Type: WithdrawTargetSepa, 60 Data: WithdrawTargetData(data), 61 } 62 } 63 64 func (p *WithdrawTarget) SepaData() (WithdrawTargetSepaData, error) { 65 switch p.Type { 66 67 case WithdrawTargetSepa: 68 var data WithdrawTargetSepaData 69 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 70 return data, err 71 72 default: 73 return WithdrawTargetSepaData{}, ErrInvalidDataType 74 } 75 } 76 77 // WithdrawTargetSwiftData data type for WithdrawTargetType sepa 78 type WithdrawTargetSwiftData struct { 79 WithdrawTargetFiatData 80 CountryCode string `json:"country_code,omitempty"` 81 Bank string `json:"bank,omitempty"` 82 Account string `json:"account,omitempty"` 83 } 84 85 func FromSwiftData(withdrawID WithdrawID, swift WithdrawTargetSwiftData) WithdrawTarget { 86 if withdrawID > 0 { 87 swift.WithdrawTargetFiatData.Network = "swift" 88 } 89 data, _ := encoding.EncodeData(&swift) 90 return WithdrawTarget{ 91 WithdrawID: withdrawID, 92 Type: WithdrawTargetSwift, 93 Data: WithdrawTargetData(data), 94 } 95 } 96 97 func (p *WithdrawTarget) SwiftData() (WithdrawTargetSwiftData, error) { 98 switch p.Type { 99 100 case WithdrawTargetSwift: 101 var data WithdrawTargetSwiftData 102 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 103 return data, err 104 105 default: 106 return WithdrawTargetSwiftData{}, ErrInvalidDataType 107 } 108 } 109 110 // WithdrawTargetCardData data type for WithdrawTargetType card 111 type WithdrawTargetCardData struct { 112 WithdrawTargetFiatData 113 PAN string `json:"pan,omitempty"` 114 } 115 116 func FromCardData(withdrawID WithdrawID, card WithdrawTargetCardData) WithdrawTarget { 117 if withdrawID > 0 { 118 card.WithdrawTargetFiatData.Network = "card" 119 } 120 data, _ := encoding.EncodeData(&card) 121 return WithdrawTarget{ 122 WithdrawID: withdrawID, 123 Type: WithdrawTargetCard, 124 Data: WithdrawTargetData(data), 125 } 126 } 127 128 func (p *WithdrawTarget) CardData() (WithdrawTargetCardData, error) { 129 switch p.Type { 130 131 case WithdrawTargetCard: 132 var data WithdrawTargetCardData 133 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 134 return data, err 135 136 default: 137 return WithdrawTargetCardData{}, ErrInvalidDataType 138 } 139 } 140 141 // WithdrawTargetOnChainData data type for WithdrawTargetType crypto 142 type WithdrawTargetOnChainData struct { 143 WithdrawTargetCryptoData 144 } 145 146 func FromOnChainData(withdrawID WithdrawID, chain string, onChain WithdrawTargetOnChainData) WithdrawTarget { 147 if withdrawID > 0 { 148 onChain.WithdrawTargetCryptoData.Chain = chain 149 } 150 data, _ := encoding.EncodeData(&onChain) 151 return WithdrawTarget{ 152 WithdrawID: withdrawID, 153 Type: WithdrawTargetOnChain, 154 Data: WithdrawTargetData(data), 155 } 156 } 157 158 func (p *WithdrawTarget) OnChainData() (WithdrawTargetOnChainData, error) { 159 switch p.Type { 160 161 case WithdrawTargetOnChain: 162 var data WithdrawTargetOnChainData 163 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 164 return data, err 165 166 default: 167 return WithdrawTargetOnChainData{}, ErrInvalidDataType 168 } 169 } 170 171 // WithdrawTargetLiquidData data type for WithdrawTargetType liquid 172 type WithdrawTargetLiquidData struct { 173 WithdrawTargetCryptoData 174 } 175 176 func FromLiquidData(withdrawID WithdrawID, liquid WithdrawTargetLiquidData) WithdrawTarget { 177 if withdrawID > 0 { 178 liquid.WithdrawTargetCryptoData.Chain = "liquid" 179 } 180 data, _ := encoding.EncodeData(&liquid) 181 return WithdrawTarget{ 182 WithdrawID: withdrawID, 183 Type: WithdrawTargetLiquid, 184 Data: WithdrawTargetData(data), 185 } 186 } 187 188 func (p *WithdrawTarget) LiquidData() (WithdrawTargetLiquidData, error) { 189 switch p.Type { 190 191 case WithdrawTargetLiquid: 192 var data WithdrawTargetLiquidData 193 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 194 return data, err 195 196 default: 197 return WithdrawTargetLiquidData{}, ErrInvalidDataType 198 } 199 } 200 201 // WithdrawTargetLightningData data type for WithdrawTargetType Lightning 202 type WithdrawTargetLightningData struct { 203 WithdrawTargetCryptoData 204 Invoice string `json:"invoice,omitempty"` 205 } 206 207 func FromLightningData(withdrawID WithdrawID, lightning WithdrawTargetLightningData) WithdrawTarget { 208 if withdrawID > 0 { 209 lightning.WithdrawTargetCryptoData.Chain = "lightning" 210 } 211 data, _ := encoding.EncodeData(&lightning) 212 return WithdrawTarget{ 213 WithdrawID: withdrawID, 214 Type: WithdrawTargetLightning, 215 Data: WithdrawTargetData(data), 216 } 217 } 218 219 func (p *WithdrawTarget) LightningData() (WithdrawTargetLightningData, error) { 220 switch p.Type { 221 222 case WithdrawTargetLightning: 223 var data WithdrawTargetLightningData 224 err := encoding.DecodeData(&data, encoding.Data(p.Data)) 225 return data, err 226 227 default: 228 return WithdrawTargetLightningData{}, ErrInvalidDataType 229 } 230 }