token.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package model
  2. import (
  3. "errors"
  4. _ "gorm.io/driver/sqlite"
  5. "one-api/common"
  6. "strings"
  7. )
  8. type Token struct {
  9. Id int `json:"id"`
  10. UserId int `json:"user_id"`
  11. Key string `json:"key" gorm:"uniqueIndex"`
  12. Status int `json:"status" gorm:"default:1"`
  13. Name string `json:"name" gorm:"index" `
  14. CreatedTime int64 `json:"created_time" gorm:"bigint"`
  15. AccessedTime int64 `json:"accessed_time" gorm:"bigint"`
  16. }
  17. func GetAllUserTokens(userId int, startIdx int, num int) ([]*Token, error) {
  18. var tokens []*Token
  19. var err error
  20. err = DB.Where("user_id = ?", userId).Order("id desc").Limit(num).Offset(startIdx).Find(&tokens).Error
  21. return tokens, err
  22. }
  23. func SearchUserTokens(userId int, keyword string) (tokens []*Token, err error) {
  24. err = DB.Where("user_id = ?", userId).Where("id = ? or name LIKE ?", keyword, keyword+"%").Find(&tokens).Error
  25. return tokens, err
  26. }
  27. func ValidateUserToken(key string) (token *Token, err error) {
  28. if key == "" {
  29. return nil, errors.New("未提供 token")
  30. }
  31. key = strings.Replace(key, "Bearer ", "", 1)
  32. token = &Token{}
  33. err = DB.Where("key = ?", key).First(token).Error
  34. if err == nil {
  35. if token.Status != common.TokenStatusEnabled {
  36. return nil, errors.New("该 token 已被禁用")
  37. }
  38. go func() {
  39. token.AccessedTime = common.GetTimestamp()
  40. err := token.Update()
  41. if err != nil {
  42. common.SysError("更新 token 访问时间失败:" + err.Error())
  43. }
  44. }()
  45. return token, nil
  46. }
  47. return nil, err
  48. }
  49. func GetTokenByIds(id int, userId int) (*Token, error) {
  50. if id == 0 || userId == 0 {
  51. return nil, errors.New("id 或 userId 为空!")
  52. }
  53. token := Token{Id: id, UserId: userId}
  54. var err error = nil
  55. err = DB.First(&token, "id = ? and user_id = ?", id, userId).Error
  56. return &token, err
  57. }
  58. func (token *Token) Insert() error {
  59. var err error
  60. err = DB.Create(token).Error
  61. return err
  62. }
  63. func (token *Token) Update() error {
  64. var err error
  65. err = DB.Model(token).Updates(token).Error
  66. return err
  67. }
  68. func (token *Token) Delete() error {
  69. var err error
  70. err = DB.Delete(token).Error
  71. return err
  72. }
  73. func DeleteTokenById(id int, userId int) (err error) {
  74. // Why we need userId here? In case user want to delete other's token.
  75. if id == 0 || userId == 0 {
  76. return errors.New("id 或 userId 为空!")
  77. }
  78. token := Token{Id: id, UserId: userId}
  79. err = DB.Where(token).First(&token).Error
  80. if err != nil {
  81. return err
  82. }
  83. return token.Delete()
  84. }