Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 

105 рядки
3.3 KiB

  1. package model
  2. import (
  3. "github.com/QuantumNous/new-api/common"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/clause"
  6. )
  7. // ChannelAssetCredential stores the channel asset credentials separately
  8. // from the channel video-generation key. For DoubaoVideo (official
  9. // Volcengine) channels BaseURL optionally holds a dedicated asset API base
  10. // (the asset gateway), falling back to the channel base URL when empty.
  11. type ChannelAssetCredential struct {
  12. Id int `json:"id"`
  13. ChannelId int `json:"channel_id" gorm:"uniqueIndex;not null"`
  14. AccessKey string `json:"-" gorm:"not null;size:255"`
  15. SecretKey string `json:"-" gorm:"not null;size:255"`
  16. PoolID string `json:"pool_id" gorm:"size:255"`
  17. BaseURL string `json:"base_url" gorm:"size:255"`
  18. CreatedAt int64 `json:"created_at" gorm:"bigint;not null"`
  19. UpdatedAt int64 `json:"updated_at" gorm:"bigint;not null"`
  20. }
  21. // ChannelAssetCredentialSummary is safe to expose in channel management APIs.
  22. type ChannelAssetCredentialSummary struct {
  23. ChannelId int
  24. PoolID string
  25. BaseURL string
  26. }
  27. func GetChannelAssetCredential(channelID int) (*ChannelAssetCredential, error) {
  28. var credential ChannelAssetCredential
  29. err := DB.Where("channel_id = ?", channelID).First(&credential).Error
  30. if err == gorm.ErrRecordNotFound {
  31. return nil, nil
  32. }
  33. if err != nil {
  34. return nil, err
  35. }
  36. return &credential, nil
  37. }
  38. func UpsertChannelAssetCredential(credential *ChannelAssetCredential) error {
  39. return DB.Transaction(func(tx *gorm.DB) error {
  40. return UpsertChannelAssetCredentialWithTx(tx, credential)
  41. })
  42. }
  43. func UpsertChannelAssetCredentialWithTx(tx *gorm.DB, credential *ChannelAssetCredential) error {
  44. now := common.GetTimestamp()
  45. credential.CreatedAt = now
  46. credential.UpdatedAt = now
  47. return tx.Clauses(clause.OnConflict{
  48. Columns: []clause.Column{{Name: "channel_id"}},
  49. DoUpdates: clause.Assignments(map[string]any{
  50. "access_key": credential.AccessKey,
  51. "secret_key": credential.SecretKey,
  52. "pool_id": credential.PoolID,
  53. "base_url": credential.BaseURL,
  54. "updated_at": credential.UpdatedAt,
  55. }),
  56. }).Create(credential).Error
  57. }
  58. func DeleteChannelAssetCredentialWithTx(tx *gorm.DB, channelID int) error {
  59. return tx.Where("channel_id = ?", channelID).Delete(&ChannelAssetCredential{}).Error
  60. }
  61. func DeleteChannelAssetCredential(channelID int) error {
  62. return DB.Transaction(func(tx *gorm.DB) error {
  63. return DeleteChannelAssetCredentialWithTx(tx, channelID)
  64. })
  65. }
  66. func DeleteChannelAssetCredentialsWithTx(tx *gorm.DB, channelIDs []int) error {
  67. if len(channelIDs) == 0 {
  68. return nil
  69. }
  70. return tx.Where("channel_id IN ?", channelIDs).Delete(&ChannelAssetCredential{}).Error
  71. }
  72. func DeleteChannelAssetCredentials(channelIDs []int) error {
  73. return DB.Transaction(func(tx *gorm.DB) error {
  74. return DeleteChannelAssetCredentialsWithTx(tx, channelIDs)
  75. })
  76. }
  77. func GetChannelAssetCredentialSummaries(channelIDs []int) (map[int]ChannelAssetCredentialSummary, error) {
  78. summaries := make(map[int]ChannelAssetCredentialSummary)
  79. if len(channelIDs) == 0 {
  80. return summaries, nil
  81. }
  82. var rows []ChannelAssetCredentialSummary
  83. if err := DB.Model(&ChannelAssetCredential{}).
  84. Select("channel_id", "pool_id", "base_url").
  85. Where("channel_id IN ?", channelIDs).
  86. Find(&rows).Error; err != nil {
  87. return nil, err
  88. }
  89. for _, row := range rows {
  90. summaries[row.ChannelId] = row
  91. }
  92. return summaries, nil
  93. }