github.com/condensat/bank-core@v0.1.0/database/query/batchinfo.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/encoding"
    13  	"github.com/condensat/bank-core/database/model"
    14  
    15  	"github.com/jinzhu/gorm"
    16  )
    17  
    18  var (
    19  	ErrInvalidBatchInfoID       = errors.New("Invalid BatchInfoID")
    20  	ErrInvalidBatchStatus       = errors.New("Invalid BatchInfo Status")
    21  	ErrInvalidBatchInfoDataType = errors.New("Invalid BatchInfo DataType")
    22  )
    23  
    24  func AddBatchInfo(db database.Context, batchID model.BatchID, status model.BatchStatus, dataType encoding.DataType, data model.BatchInfoData) (model.BatchInfo, error) {
    25  	gdb := db.DB().(*gorm.DB)
    26  	if db == nil {
    27  		return model.BatchInfo{}, database.ErrInvalidDatabase
    28  	}
    29  
    30  	if batchID == 0 {
    31  		return model.BatchInfo{}, ErrInvalidBatchID
    32  	}
    33  	if len(status) == 0 {
    34  		return model.BatchInfo{}, ErrInvalidBatchStatus
    35  	}
    36  	if len(dataType) == 0 {
    37  		return model.BatchInfo{}, ErrInvalidBatchInfoDataType
    38  	}
    39  
    40  	timestamp := time.Now().UTC().Truncate(time.Second)
    41  	result := model.BatchInfo{
    42  		Timestamp: timestamp,
    43  		BatchID:   batchID,
    44  		Status:    status,
    45  		Type:      dataType,
    46  		Data:      data,
    47  	}
    48  	err := gdb.Create(&result).Error
    49  	if err != nil {
    50  		return model.BatchInfo{}, err
    51  	}
    52  
    53  	return result, nil
    54  
    55  }
    56  
    57  func GetBatchInfo(db database.Context, ID model.BatchInfoID) (model.BatchInfo, error) {
    58  	gdb := db.DB().(*gorm.DB)
    59  	if db == nil {
    60  		return model.BatchInfo{}, database.ErrInvalidDatabase
    61  	}
    62  
    63  	if ID == 0 {
    64  		return model.BatchInfo{}, ErrInvalidBatchInfoID
    65  	}
    66  
    67  	var result model.BatchInfo
    68  	err := gdb.
    69  		Where(&model.BatchInfo{ID: ID}).
    70  		First(&result).Error
    71  	if err != nil {
    72  		return model.BatchInfo{}, err
    73  	}
    74  
    75  	return result, nil
    76  }
    77  
    78  func GetBatchHistory(db database.Context, batchID model.BatchID) ([]model.BatchInfo, error) {
    79  	gdb := db.DB().(*gorm.DB)
    80  	if db == nil {
    81  		return nil, database.ErrInvalidDatabase
    82  	}
    83  
    84  	if batchID == 0 {
    85  		return nil, ErrInvalidBatchID
    86  	}
    87  
    88  	var list []*model.BatchInfo
    89  	err := gdb.
    90  		Where(model.BatchInfo{
    91  			BatchID: batchID,
    92  		}).
    93  		Order("id ASC").
    94  		Find(&list).Error
    95  
    96  	if err != nil && err != gorm.ErrRecordNotFound {
    97  		return nil, err
    98  	}
    99  
   100  	return convertBatchInfoList(list), nil
   101  }
   102  
   103  func GetBatchInfoByStatusAndType(db database.Context, status model.BatchStatus, dataType encoding.DataType) ([]model.BatchInfo, error) {
   104  	gdb := db.DB().(*gorm.DB)
   105  	if db == nil {
   106  		return nil, database.ErrInvalidDatabase
   107  	}
   108  
   109  	if len(status) == 0 {
   110  		return nil, ErrInvalidWithdrawStatus
   111  	}
   112  	if len(dataType) == 0 {
   113  		return nil, ErrInvalidBatchInfoDataType
   114  	}
   115  
   116  	var list []*model.BatchInfo
   117  	err := gdb.
   118  		Where(model.BatchInfo{
   119  			Status: status,
   120  			Type:   dataType,
   121  		}).
   122  		Order("id ASC").
   123  		Find(&list).Error
   124  
   125  	if err != nil && err != gorm.ErrRecordNotFound {
   126  		return nil, err
   127  	}
   128  
   129  	return convertBatchInfoList(list), nil
   130  }
   131  
   132  func GetLastBatchInfo(db database.Context, batchID model.BatchID) (model.BatchInfo, error) {
   133  	gdb := db.DB().(*gorm.DB)
   134  	if db == nil {
   135  		return model.BatchInfo{}, database.ErrInvalidDatabase
   136  	}
   137  
   138  	if batchID == 0 {
   139  		return model.BatchInfo{}, ErrInvalidBatchID
   140  	}
   141  
   142  	subQueryLast := gdb.Model(&model.BatchInfo{}).
   143  		Select("MAX(id)").
   144  		Group("batch_id").
   145  		SubQuery()
   146  
   147  	var result model.BatchInfo
   148  	err := gdb.Model(&model.BatchInfo{}).
   149  		Where("batch_info.id IN (?)", subQueryLast).
   150  		Where(model.BatchInfo{
   151  			BatchID: batchID,
   152  		}).First(&result).Error
   153  
   154  	if err != nil {
   155  		return model.BatchInfo{}, err
   156  	}
   157  
   158  	return result, nil
   159  }
   160  
   161  func GetLastBatchInfoByStatusAndNetwork(db database.Context, status model.BatchStatus, network model.BatchNetwork) ([]model.BatchInfo, error) {
   162  	gdb := db.DB().(*gorm.DB)
   163  	if db == nil {
   164  		return nil, database.ErrInvalidDatabase
   165  	}
   166  
   167  	if len(status) == 0 {
   168  		return nil, ErrInvalidWithdrawStatus
   169  	}
   170  	if len(network) == 0 {
   171  		return nil, ErrInvalidNetwork
   172  	}
   173  
   174  	subQueryLast := gdb.Model(&model.BatchInfo{}).
   175  		Select("MAX(id)").
   176  		Group("batch_id").
   177  		SubQuery()
   178  
   179  	subQueryNetwork := gdb.Model(&model.Batch{}).
   180  		Select("id").
   181  		Where(model.Batch{
   182  			Network: network,
   183  		}).
   184  		SubQuery()
   185  
   186  	var list []*model.BatchInfo
   187  	err := gdb.Model(&model.BatchInfo{}).
   188  		Joins("JOIN (?) AS b ON batch_info.batch_id = b.id", subQueryNetwork).
   189  		Where("batch_info.id IN (?)", subQueryLast).
   190  		Where(model.BatchInfo{
   191  			Status: status,
   192  		}).
   193  		Order("id ASC").
   194  		Find(&list).Error
   195  
   196  	if err != nil && err != gorm.ErrRecordNotFound {
   197  		return nil, err
   198  	}
   199  
   200  	return convertBatchInfoList(list), nil
   201  }
   202  
   203  func convertBatchInfoList(list []*model.BatchInfo) []model.BatchInfo {
   204  	var result []model.BatchInfo
   205  	for _, curr := range list {
   206  		if curr != nil {
   207  			result = append(result, *curr)
   208  		}
   209  	}
   210  
   211  	return result[:]
   212  }
   213  
   214  func BatchPagingCount(db database.Context, countByPage int) (int, error) {
   215  	if countByPage <= 0 {
   216  		countByPage = 1
   217  	}
   218  
   219  	switch gdb := db.DB().(type) {
   220  	case *gorm.DB:
   221  
   222  		var result int
   223  		err := gdb.
   224  			Model(&model.BatchInfo{}).
   225  			Group("batch_id").
   226  			Count(&result).Error
   227  		var partialPage int
   228  		if result%countByPage > 0 {
   229  			partialPage = 1
   230  		}
   231  		return result/countByPage + partialPage, err
   232  
   233  	default:
   234  		return 0, database.ErrInvalidDatabase
   235  	}
   236  }
   237  
   238  func BatchPage(db database.Context, batchID model.BatchID, countByPage int) ([]model.BatchID, error) {
   239  	switch gdb := db.DB().(type) {
   240  	case *gorm.DB:
   241  
   242  		if countByPage <= 0 {
   243  			countByPage = 1
   244  		}
   245  
   246  		subQueryLast := gdb.Model(&model.BatchInfo{}).
   247  			Select("MAX(id)").
   248  			Group("batch_id").
   249  			SubQuery()
   250  
   251  		var list []*model.BatchInfo
   252  		err := gdb.Model(&model.BatchInfo{}).
   253  			Where("batch_info.id IN (?)", subQueryLast).
   254  			Where("id >= ?", batchID).
   255  			Order("batch_id ASC").
   256  			Limit(countByPage).
   257  			Find(&list).Error
   258  
   259  		if err != nil && err != gorm.ErrRecordNotFound {
   260  			return nil, err
   261  		}
   262  
   263  		return convertBatchInfoIDs(list), nil
   264  
   265  	default:
   266  		return nil, database.ErrInvalidDatabase
   267  	}
   268  }
   269  
   270  func convertBatchInfoIDs(list []*model.BatchInfo) []model.BatchID {
   271  	var result []model.BatchID
   272  	for _, curr := range list {
   273  		if curr != nil {
   274  			result = append(result, curr.BatchID)
   275  		}
   276  	}
   277  
   278  	return result[:]
   279  }