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  }