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 }