github.com/condensat/bank-core@v0.1.0/database/query/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 query
     6  
     7  import (
     8  	"errors"
     9  
    10  	"github.com/condensat/bank-core/database"
    11  	"github.com/condensat/bank-core/database/model"
    12  
    13  	"github.com/jinzhu/gorm"
    14  )
    15  
    16  var (
    17  	ErrInvalidWithdrawTargetID   = errors.New("Invalid WithdrawTargetID")
    18  	ErrInvalidWithdrawTargetData = errors.New("Invalid WithdrawTarget Data")
    19  )
    20  
    21  func AddWithdrawTarget(db database.Context, withdrawID model.WithdrawID, dataType model.WithdrawTargetType, data model.WithdrawTargetData) (model.WithdrawTarget, error) {
    22  	gdb := db.DB().(*gorm.DB)
    23  	if db == nil {
    24  		return model.WithdrawTarget{}, database.ErrInvalidDatabase
    25  	}
    26  
    27  	if withdrawID == 0 {
    28  		return model.WithdrawTarget{}, ErrInvalidWithdrawID
    29  	}
    30  	if len(dataType) == 0 {
    31  		return model.WithdrawTarget{}, model.ErrInvalidDataType
    32  	}
    33  
    34  	result := model.WithdrawTarget{
    35  		WithdrawID: withdrawID,
    36  		Type:       dataType,
    37  		Data:       data,
    38  	}
    39  	err := gdb.Create(&result).Error
    40  	if err != nil {
    41  		return model.WithdrawTarget{}, err
    42  	}
    43  
    44  	return result, nil
    45  
    46  }
    47  
    48  func GetWithdrawTarget(db database.Context, ID model.WithdrawTargetID) (model.WithdrawTarget, error) {
    49  	gdb := db.DB().(*gorm.DB)
    50  	if db == nil {
    51  		return model.WithdrawTarget{}, database.ErrInvalidDatabase
    52  	}
    53  
    54  	if ID == 0 {
    55  		return model.WithdrawTarget{}, ErrInvalidWithdrawTargetID
    56  	}
    57  
    58  	var result model.WithdrawTarget
    59  	err := gdb.
    60  		Where(&model.WithdrawTarget{ID: ID}).
    61  		First(&result).Error
    62  	if err != nil {
    63  		return model.WithdrawTarget{}, err
    64  	}
    65  
    66  	return result, nil
    67  }
    68  
    69  func GetWithdrawTargetByWithdrawID(db database.Context, withdrawID model.WithdrawID) (model.WithdrawTarget, error) {
    70  	gdb := db.DB().(*gorm.DB)
    71  	if db == nil {
    72  		return model.WithdrawTarget{}, database.ErrInvalidDatabase
    73  	}
    74  
    75  	if withdrawID == 0 {
    76  		return model.WithdrawTarget{}, ErrInvalidWithdrawID
    77  	}
    78  
    79  	var result model.WithdrawTarget
    80  	err := gdb.
    81  		Where(&model.WithdrawTarget{WithdrawID: withdrawID}).
    82  		First(&result).Error
    83  	if err != nil {
    84  		return model.WithdrawTarget{}, err
    85  	}
    86  
    87  	return result, nil
    88  }
    89  
    90  func GetLastWithdrawTargetByStatus(db database.Context, status model.WithdrawStatus) ([]model.WithdrawTarget, error) {
    91  	gdb := db.DB().(*gorm.DB)
    92  	if db == nil {
    93  		return nil, database.ErrInvalidDatabase
    94  	}
    95  
    96  	if len(status) == 0 {
    97  		return nil, ErrInvalidWithdrawStatus
    98  	}
    99  
   100  	subQueryLast := gdb.Model(&model.WithdrawInfo{}).
   101  		Select("MAX(id)").
   102  		Group("withdraw_id").
   103  		SubQuery()
   104  
   105  	subQueryInfo := gdb.Model(&model.WithdrawInfo{}).
   106  		Select("withdraw_id").
   107  		Where("id IN (?)", subQueryLast).
   108  		Where(model.WithdrawInfo{
   109  			Status: status,
   110  		}).
   111  		SubQuery()
   112  
   113  	var list []*model.WithdrawTarget
   114  	err := gdb.Model(&model.WithdrawTarget{}).
   115  		Joins("JOIN (?) AS i ON withdraw_target.withdraw_id = i.withdraw_id", subQueryInfo).
   116  		Order("id ASC").
   117  		Find(&list).Error
   118  
   119  	if err != nil && err != gorm.ErrRecordNotFound {
   120  		return nil, err
   121  	}
   122  
   123  	return converWithdrawTarget(list), nil
   124  }
   125  
   126  func converWithdrawTarget(list []*model.WithdrawTarget) []model.WithdrawTarget {
   127  	var result []model.WithdrawTarget
   128  	for _, curr := range list {
   129  		if curr != nil {
   130  			result = append(result, *curr)
   131  		}
   132  	}
   133  
   134  	return result[:]
   135  
   136  }