github.com/condensat/bank-core@v0.1.0/database/query/operationstatus.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  	ErrInvalidOperationStatus = errors.New("Invalid OperationStatus")
    19  )
    20  
    21  // AddOrUpdateOperationStatus
    22  func AddOrUpdateOperationStatus(db database.Context, operation model.OperationStatus) (model.OperationStatus, error) {
    23  	var result model.OperationStatus
    24  	gdb := db.DB().(*gorm.DB)
    25  	if db == nil {
    26  		return result, database.ErrInvalidDatabase
    27  	}
    28  
    29  	if operation.OperationInfoID == 0 {
    30  		return result, ErrInvalidOperationInfoID
    31  	}
    32  
    33  	if len(operation.State) == 0 {
    34  		return result, ErrInvalidOperationStatus
    35  	}
    36  
    37  	operation.LastUpdate = time.Now().UTC().Truncate(time.Second)
    38  
    39  	err := gdb.
    40  		Where(model.OperationStatus{
    41  			OperationInfoID: operation.OperationInfoID,
    42  		}).
    43  		Assign(operation).
    44  		FirstOrCreate(&result).Error
    45  
    46  	return result, err
    47  }
    48  
    49  type DepositInfos struct {
    50  	Count  int
    51  	Active int
    52  }
    53  
    54  func DepositsInfos(db database.Context) (DepositInfos, error) {
    55  	gdb := db.DB().(*gorm.DB)
    56  	if gdb == nil {
    57  		return DepositInfos{}, database.ErrInvalidDatabase
    58  	}
    59  
    60  	var totalOperations int64
    61  	err := gdb.Model(&model.OperationStatus{}).
    62  		Count(&totalOperations).Error
    63  	if err != nil {
    64  		return DepositInfos{}, err
    65  	}
    66  
    67  	var activeOperations int64
    68  	err = gdb.Model(&model.OperationStatus{}).
    69  		Where("state <> ?", "settled").
    70  		Count(&activeOperations).Error
    71  	if err != nil {
    72  		return DepositInfos{}, err
    73  	}
    74  
    75  	return DepositInfos{
    76  		Count:  int(totalOperations),
    77  		Active: int(activeOperations),
    78  	}, nil
    79  }
    80  
    81  // GetOperationStatus
    82  func GetOperationStatus(db database.Context, operationInfoID model.OperationInfoID) (model.OperationStatus, error) {
    83  	gdb := db.DB().(*gorm.DB)
    84  	if db == nil {
    85  		return model.OperationStatus{}, database.ErrInvalidDatabase
    86  	}
    87  
    88  	if operationInfoID == 0 {
    89  		return model.OperationStatus{}, ErrInvalidOperationInfoID
    90  	}
    91  
    92  	var result model.OperationStatus
    93  	err := gdb.
    94  		Where(model.OperationStatus{
    95  			OperationInfoID: operationInfoID,
    96  		}).
    97  		First(&result).Error
    98  	if err != nil {
    99  		return model.OperationStatus{}, err
   100  	}
   101  
   102  	return result, nil
   103  }
   104  
   105  func FindActiveOperationStatus(db database.Context) ([]model.OperationStatus, error) {
   106  	gdb := db.DB().(*gorm.DB)
   107  
   108  	var list []*model.OperationStatus
   109  	err := gdb.
   110  		Where("state <> ?", "settled").
   111  		Or("accounted <> ?", "settled").
   112  		Find(&list).Error
   113  
   114  	if err != nil && err != gorm.ErrRecordNotFound {
   115  		return nil, err
   116  	}
   117  
   118  	return convertOperationStatusList(list), nil
   119  }
   120  
   121  func FindActiveOperationInfo(db database.Context) ([]model.OperationInfo, error) {
   122  	gdb := db.DB().(*gorm.DB)
   123  
   124  	subQueryState := gdb.Model(&model.OperationStatus{}).
   125  		Select("operation_info_id").
   126  		Where("state <> ?", "settled").
   127  		Or("accounted <> ?", "settled").
   128  		SubQuery()
   129  
   130  	var list []*model.OperationInfo
   131  	err := gdb.Model(&model.OperationInfo{}).
   132  		Joins("JOIN (?) AS os ON operation_info.id = os.operation_info_id", subQueryState).
   133  		Find(&list).Error
   134  
   135  	if err != nil && err != gorm.ErrRecordNotFound {
   136  		return nil, err
   137  	}
   138  
   139  	return convertOperationInfoList(list), nil
   140  }
   141  
   142  func convertOperationStatusList(list []*model.OperationStatus) []model.OperationStatus {
   143  	var result []model.OperationStatus
   144  	for _, curr := range list {
   145  		if curr == nil {
   146  			continue
   147  		}
   148  		result = append(result, *curr)
   149  	}
   150  
   151  	return result[:]
   152  }