channel.go 4.4 KB

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