channel.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package model
  2. import (
  3. "one-api/common"
  4. )
  5. type Channel struct {
  6. Id int `json:"id"`
  7. Type int `json:"type" gorm:"default:0"`
  8. Key string `json:"key" gorm:"not null"`
  9. Status int `json:"status" gorm:"default:1"`
  10. Name string `json:"name" gorm:"index"`
  11. Weight int `json:"weight"`
  12. CreatedTime int64 `json:"created_time" gorm:"bigint"`
  13. TestTime int64 `json:"test_time" gorm:"bigint"`
  14. ResponseTime int `json:"response_time"` // in milliseconds
  15. BaseURL string `json:"base_url" gorm:"column:base_url"`
  16. Other string `json:"other"`
  17. Balance float64 `json:"balance"` // in USD
  18. BalanceUpdatedTime int64 `json:"balance_updated_time" gorm:"bigint"`
  19. Models string `json:"models"`
  20. Group string `json:"group" gorm:"type:varchar(32);default:'default'"`
  21. }
  22. func GetAllChannels(startIdx int, num int, selectAll bool) ([]*Channel, error) {
  23. var channels []*Channel
  24. var err error
  25. if selectAll {
  26. err = DB.Order("id desc").Find(&channels).Error
  27. } else {
  28. err = DB.Order("id desc").Limit(num).Offset(startIdx).Omit("key").Find(&channels).Error
  29. }
  30. return channels, err
  31. }
  32. func SearchChannels(keyword string) (channels []*Channel, err error) {
  33. err = DB.Omit("key").Where("id = ? or name LIKE ?", keyword, keyword+"%").Find(&channels).Error
  34. return channels, err
  35. }
  36. func GetChannelById(id int, selectAll bool) (*Channel, error) {
  37. channel := Channel{Id: id}
  38. var err error = nil
  39. if selectAll {
  40. err = DB.First(&channel, "id = ?", id).Error
  41. } else {
  42. err = DB.Omit("key").First(&channel, "id = ?", id).Error
  43. }
  44. return &channel, err
  45. }
  46. func GetRandomChannel() (*Channel, error) {
  47. channel := Channel{}
  48. var err error = nil
  49. if common.UsingSQLite {
  50. err = DB.Where("status = ? and `group` = ?", common.ChannelStatusEnabled, "default").Order("RANDOM()").Limit(1).First(&channel).Error
  51. } else {
  52. err = DB.Where("status = ? and `group` = ?", common.ChannelStatusEnabled, "default").Order("RAND()").Limit(1).First(&channel).Error
  53. }
  54. return &channel, err
  55. }
  56. func BatchInsertChannels(channels []Channel) error {
  57. var err error
  58. err = DB.Create(&channels).Error
  59. if err != nil {
  60. return err
  61. }
  62. for _, channel_ := range channels {
  63. err = channel_.AddAbilities()
  64. if err != nil {
  65. return err
  66. }
  67. }
  68. return nil
  69. }
  70. func (channel *Channel) Insert() error {
  71. var err error
  72. err = DB.Create(channel).Error
  73. if err != nil {
  74. return err
  75. }
  76. err = channel.AddAbilities()
  77. return err
  78. }
  79. func (channel *Channel) Update() error {
  80. var err error
  81. err = DB.Model(channel).Updates(channel).Error
  82. if err != nil {
  83. return err
  84. }
  85. err = channel.UpdateAbilities()
  86. return err
  87. }
  88. func (channel *Channel) UpdateResponseTime(responseTime int64) {
  89. err := DB.Model(channel).Select("response_time", "test_time").Updates(Channel{
  90. TestTime: common.GetTimestamp(),
  91. ResponseTime: int(responseTime),
  92. }).Error
  93. if err != nil {
  94. common.SysError("failed to update response time: " + err.Error())
  95. }
  96. }
  97. func (channel *Channel) UpdateBalance(balance float64) {
  98. err := DB.Model(channel).Select("balance_updated_time", "balance").Updates(Channel{
  99. BalanceUpdatedTime: common.GetTimestamp(),
  100. Balance: balance,
  101. }).Error
  102. if err != nil {
  103. common.SysError("failed to update balance: " + err.Error())
  104. }
  105. }
  106. func (channel *Channel) Delete() error {
  107. var err error
  108. err = DB.Delete(channel).Error
  109. if err != nil {
  110. return err
  111. }
  112. err = channel.DeleteAbilities()
  113. return err
  114. }
  115. func UpdateChannelStatusById(id int, status int) {
  116. err := UpdateAbilityStatus(id, status == common.ChannelStatusEnabled)
  117. if err != nil {
  118. common.SysError("failed to update ability status: " + err.Error())
  119. }
  120. err = DB.Model(&Channel{}).Where("id = ?", id).Update("status", status).Error
  121. if err != nil {
  122. common.SysError("failed to update channel status: " + err.Error())
  123. }
  124. }