github.com/condensat/bank-core@v0.1.0/database/query/ssmaddress.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  	ErrInvalidSsmAddressID     = errors.New("Invalid SsmAddressID")
    19  	ErrInvalidSsmPublicAddress = errors.New("Invalid PublicAddress ID")
    20  )
    21  
    22  func AddSsmAddress(db database.Context, address model.SsmAddress, info model.SsmAddressInfo) (model.SsmAddressID, error) {
    23  	gdb := db.DB().(*gorm.DB)
    24  	if db == nil {
    25  		return 0, database.ErrInvalidDatabase
    26  	}
    27  
    28  	if !address.IsValid() {
    29  		return 0, errors.New("Invalid address")
    30  	}
    31  	info.SsmAddressID = model.SsmAddressID(1)
    32  	if !info.IsValid() {
    33  		return 0, errors.New("Invalid address info")
    34  	}
    35  
    36  	result := address
    37  	err := gdb.Create(&result).Error
    38  	if err != nil {
    39  		return 0, err
    40  	}
    41  
    42  	info.SsmAddressID = result.ID
    43  	if !info.IsValid() {
    44  		return model.SsmAddressID(0), errors.New("Invalid address info")
    45  	}
    46  	err = gdb.Create(&info).Error
    47  	if err != nil {
    48  		return 0, err
    49  	}
    50  
    51  	_, err = UpdateSsmAddressState(db, result.ID, model.SsmAddressStatusUnused)
    52  	if err != nil {
    53  		return 0, nil
    54  	}
    55  
    56  	return result.ID, nil
    57  }
    58  
    59  func CountSsmAddress(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint) (int, error) {
    60  	gdb := db.DB().(*gorm.DB)
    61  	if db == nil {
    62  		return 0, database.ErrInvalidDatabase
    63  	}
    64  
    65  	if len(chain) == 0 {
    66  		return 0, errors.New("Invalid chain")
    67  	}
    68  
    69  	if len(fingerprint) == 0 {
    70  		return 0, errors.New("Invalid fingerprint")
    71  	}
    72  
    73  	result := 0
    74  	err := gdb.Model(&model.SsmAddressInfo{}).Where(&model.SsmAddressInfo{
    75  		Chain:       chain,
    76  		Fingerprint: fingerprint,
    77  	}).Count(&result).Error
    78  	if err != nil {
    79  		return 0, err
    80  	}
    81  
    82  	return result, nil
    83  }
    84  
    85  func CountSsmAddressByState(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint, state model.SsmAddressStatus) (int, error) {
    86  	gdb := db.DB().(*gorm.DB)
    87  	if db == nil {
    88  		return 0, database.ErrInvalidDatabase
    89  	}
    90  
    91  	if len(chain) == 0 {
    92  		return 0, errors.New("Invalid chain")
    93  	}
    94  
    95  	if len(fingerprint) == 0 {
    96  		return 0, errors.New("Invalid fingerprint")
    97  	}
    98  
    99  	subQueryInfo := gdb.
   100  		Model(&model.SsmAddressInfo{}).
   101  		Where(&model.SsmAddressInfo{
   102  			Chain:       chain,
   103  			Fingerprint: fingerprint,
   104  		}).
   105  		SubQuery()
   106  
   107  	subQueryLast := gdb.Model(&model.SsmAddressState{}).
   108  		Select("MAX(id)").
   109  		Group("ssm_address_id").
   110  		SubQuery()
   111  
   112  	result := 0
   113  	err := gdb.Model(&model.SsmAddressState{}).
   114  		Joins("JOIN (?) AS i ON i.ssm_address_id = ssm_address_state.ssm_address_id", subQueryInfo).
   115  		Where("state = ?", state).
   116  		Where("ssm_address_state.id IN (?)", subQueryLast).
   117  		Count(&result).Error
   118  
   119  	if err != nil {
   120  		return 0, err
   121  	}
   122  
   123  	return result, nil
   124  }
   125  
   126  func GetSsmAddress(db database.Context, addressID model.SsmAddressID) (model.SsmAddress, error) {
   127  	gdb := db.DB().(*gorm.DB)
   128  	if db == nil {
   129  		return model.SsmAddress{}, database.ErrInvalidDatabase
   130  	}
   131  
   132  	if addressID == 0 {
   133  		return model.SsmAddress{}, ErrInvalidSsmAddressID
   134  	}
   135  
   136  	var result model.SsmAddress
   137  	err := gdb.
   138  		Where(&model.SsmAddress{ID: addressID}).
   139  		First(&result).Error
   140  	if err != nil {
   141  		return model.SsmAddress{}, err
   142  	}
   143  
   144  	return result, nil
   145  }
   146  
   147  func GetSsmAddressInfo(db database.Context, addressID model.SsmAddressID) (model.SsmAddressInfo, error) {
   148  	gdb := db.DB().(*gorm.DB)
   149  	if db == nil {
   150  		return model.SsmAddressInfo{}, database.ErrInvalidDatabase
   151  	}
   152  
   153  	if addressID == 0 {
   154  		return model.SsmAddressInfo{}, ErrInvalidSwapID
   155  	}
   156  
   157  	var result model.SsmAddressInfo
   158  	err := gdb.
   159  		Where(&model.SsmAddressInfo{SsmAddressID: addressID}).
   160  		First(&result).Error
   161  	if err != nil {
   162  		return model.SsmAddressInfo{}, err
   163  	}
   164  
   165  	return result, nil
   166  }
   167  
   168  func NextSsmAddressID(db database.Context, chain model.SsmChain, fingerprint model.SsmFingerprint) (model.SsmAddressID, error) {
   169  	gdb := db.DB().(*gorm.DB)
   170  	if db == nil {
   171  		return 0, database.ErrInvalidDatabase
   172  	}
   173  
   174  	if len(chain) == 0 {
   175  		return 0, errors.New("Invalid chain")
   176  	}
   177  
   178  	if len(fingerprint) == 0 {
   179  		return 0, errors.New("Invalid fingerprint")
   180  	}
   181  
   182  	subQueryInfo := gdb.
   183  		Model(&model.SsmAddressInfo{}).
   184  		Where(&model.SsmAddressInfo{
   185  			Chain:       chain,
   186  			Fingerprint: fingerprint,
   187  		}).
   188  		SubQuery()
   189  
   190  	subQueryLast := gdb.Model(&model.SsmAddressState{}).
   191  		Select("MAX(id)").
   192  		Group("ssm_address_id").
   193  		SubQuery()
   194  
   195  	result := model.SsmAddressState{}
   196  	err := gdb.Model(&model.SsmAddressState{}).
   197  		Joins("JOIN (?) AS i ON i.ssm_address_id = ssm_address_state.ssm_address_id", subQueryInfo).
   198  		Where("ssm_address_state.id IN (?)", subQueryLast).
   199  		Where("state = ?", model.SsmAddressStatusUnused).
   200  		First(&result).Error
   201  	if err != nil {
   202  		return 0, err
   203  	}
   204  
   205  	return result.SsmAddressID, nil
   206  }
   207  
   208  func GetSsmAddressByPublicAddress(db database.Context, publicAddress model.SsmPublicAddress) (model.SsmAddress, error) {
   209  	gdb := db.DB().(*gorm.DB)
   210  	if db == nil {
   211  		return model.SsmAddress{}, database.ErrInvalidDatabase
   212  	}
   213  
   214  	if len(publicAddress) == 0 {
   215  		return model.SsmAddress{}, ErrInvalidCryptoAddressID
   216  	}
   217  
   218  	var result model.SsmAddress
   219  	err := gdb.
   220  		Where(&model.SsmAddress{PublicAddress: publicAddress}).
   221  		First(&result).Error
   222  	if err != nil {
   223  		return model.SsmAddress{}, err
   224  	}
   225  
   226  	return result, nil
   227  }
   228  
   229  func GetSsmAddressState(db database.Context, addressID model.SsmAddressID) (model.SsmAddressState, error) {
   230  	gdb := db.DB().(*gorm.DB)
   231  	if db == nil {
   232  		return model.SsmAddressState{}, database.ErrInvalidDatabase
   233  	}
   234  
   235  	if addressID == 0 {
   236  		return model.SsmAddressState{}, ErrInvalidSsmAddressID
   237  	}
   238  
   239  	var result model.SsmAddressState
   240  	err := gdb.
   241  		Where(&model.SsmAddressState{SsmAddressID: addressID}).
   242  		Last(&result).Error
   243  	if err != nil {
   244  		return model.SsmAddressState{}, err
   245  	}
   246  
   247  	return result, nil
   248  }
   249  
   250  func UpdateSsmAddressState(db database.Context, addressID model.SsmAddressID, status model.SsmAddressStatus) (model.SsmAddressState, error) {
   251  	gdb := db.DB().(*gorm.DB)
   252  	if db == nil {
   253  		return model.SsmAddressState{}, database.ErrInvalidDatabase
   254  	}
   255  
   256  	if addressID == 0 {
   257  		return model.SsmAddressState{}, ErrInvalidSsmAddressID
   258  	}
   259  	if len(status) == 0 {
   260  		return model.SsmAddressState{}, ErrInvalidSsmAddressID
   261  	}
   262  
   263  	result := model.SsmAddressState{
   264  		SsmAddressID: addressID,
   265  		Timestamp:    time.Now().UTC().Truncate(time.Second),
   266  		State:        status,
   267  	}
   268  	err := gdb.Create(&result).Error
   269  	if err != nil {
   270  		return model.SsmAddressState{}, err
   271  	}
   272  
   273  	return result, nil
   274  }