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  }