github.com/condensat/bank-core@v0.1.0/database/query/swap.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  const (
    18  	DefaultSwapValidity time.Duration = 24 * time.Hour
    19  )
    20  
    21  var (
    22  	ErrInvalidSwapID     = errors.New("Invalid SwapID")
    23  	ErrInvalidSwapType   = errors.New("Invalid Swap Type")
    24  	ErrInvalidSwapAmount = errors.New("Invalid Amount")
    25  )
    26  
    27  func AddSwap(db database.Context, swapType model.SwapType, cryptoAddressID model.CryptoAddressID, debitAsset model.AssetID, debitAmount model.Float, creditAsset model.AssetID, creditAmount model.Float) (model.Swap, error) {
    28  	gdb := db.DB().(*gorm.DB)
    29  	if db == nil {
    30  		return model.Swap{}, database.ErrInvalidDatabase
    31  	}
    32  
    33  	if len(swapType) == 0 {
    34  		return model.Swap{}, ErrInvalidSwapType
    35  	}
    36  	if cryptoAddressID == 0 {
    37  		return model.Swap{}, ErrInvalidCryptoAddressID
    38  	}
    39  	if debitAsset == 0 {
    40  		return model.Swap{}, ErrInvalidAssetHash
    41  	}
    42  	if debitAmount <= 0.0 {
    43  		return model.Swap{}, ErrInvalidSwapAmount
    44  	}
    45  	if creditAsset == 0 {
    46  		return model.Swap{}, ErrInvalidAssetHash
    47  	}
    48  	if creditAmount <= 0.0 {
    49  		return model.Swap{}, ErrInvalidSwapAmount
    50  	}
    51  
    52  	timestamp := time.Now().UTC().Truncate(time.Second)
    53  	result := model.Swap{
    54  		Timestamp:       timestamp,
    55  		ValidUntil:      timestamp.Add(DefaultSwapValidity),
    56  		Type:            swapType,
    57  		CryptoAddressID: cryptoAddressID,
    58  		DebitAsset:      debitAsset,
    59  		DebitAmount:     debitAmount,
    60  		CreditAsset:     creditAsset,
    61  		CreditAmount:    creditAmount,
    62  	}
    63  	err := gdb.Create(&result).Error
    64  	if err != nil {
    65  		return model.Swap{}, err
    66  	}
    67  
    68  	return result, nil
    69  
    70  }
    71  
    72  func GetSwap(db database.Context, swapID model.SwapID) (model.Swap, error) {
    73  	gdb := db.DB().(*gorm.DB)
    74  	if db == nil {
    75  		return model.Swap{}, database.ErrInvalidDatabase
    76  	}
    77  
    78  	if swapID == 0 {
    79  		return model.Swap{}, ErrInvalidSwapID
    80  	}
    81  
    82  	var result model.Swap
    83  	err := gdb.
    84  		Where(&model.Swap{ID: swapID}).
    85  		First(&result).Error
    86  	if err != nil {
    87  		return model.Swap{}, err
    88  	}
    89  
    90  	return result, nil
    91  }
    92  
    93  func GetSwapByCryptoAddressID(db database.Context, cryptoAddressID model.CryptoAddressID) (model.Swap, error) {
    94  	gdb := db.DB().(*gorm.DB)
    95  	if db == nil {
    96  		return model.Swap{}, database.ErrInvalidDatabase
    97  	}
    98  
    99  	if cryptoAddressID == 0 {
   100  		return model.Swap{}, ErrInvalidCryptoAddressID
   101  	}
   102  
   103  	var result model.Swap
   104  	err := gdb.
   105  		Where(&model.Swap{CryptoAddressID: cryptoAddressID}).
   106  		First(&result).Error
   107  	if err != nil {
   108  		return model.Swap{}, err
   109  	}
   110  
   111  	return result, nil
   112  }