gitea源码

badge.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "fmt"
  7. "code.gitea.io/gitea/models/db"
  8. )
  9. // Badge represents a user badge
  10. type Badge struct {
  11. ID int64 `xorm:"pk autoincr"`
  12. Slug string `xorm:"UNIQUE"`
  13. Description string
  14. ImageURL string
  15. }
  16. // UserBadge represents a user badge
  17. type UserBadge struct { //nolint:revive // export stutter
  18. ID int64 `xorm:"pk autoincr"`
  19. BadgeID int64
  20. UserID int64 `xorm:"INDEX"`
  21. }
  22. func init() {
  23. db.RegisterModel(new(Badge))
  24. db.RegisterModel(new(UserBadge))
  25. }
  26. // GetUserBadges returns the user's badges.
  27. func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) {
  28. sess := db.GetEngine(ctx).
  29. Select("`badge`.*").
  30. Join("INNER", "user_badge", "`user_badge`.badge_id=badge.id").
  31. Where("user_badge.user_id=?", u.ID)
  32. badges := make([]*Badge, 0, 8)
  33. count, err := sess.FindAndCount(&badges)
  34. return badges, count, err
  35. }
  36. // CreateBadge creates a new badge.
  37. func CreateBadge(ctx context.Context, badge *Badge) error {
  38. _, err := db.GetEngine(ctx).Insert(badge)
  39. return err
  40. }
  41. // GetBadge returns a badge
  42. func GetBadge(ctx context.Context, slug string) (*Badge, error) {
  43. badge := new(Badge)
  44. has, err := db.GetEngine(ctx).Where("slug=?", slug).Get(badge)
  45. if !has {
  46. return nil, err
  47. }
  48. return badge, err
  49. }
  50. // UpdateBadge updates a badge based on its slug.
  51. func UpdateBadge(ctx context.Context, badge *Badge) error {
  52. _, err := db.GetEngine(ctx).Where("slug=?", badge.Slug).Update(badge)
  53. return err
  54. }
  55. // DeleteBadge deletes a badge.
  56. func DeleteBadge(ctx context.Context, badge *Badge) error {
  57. _, err := db.GetEngine(ctx).Where("slug=?", badge.Slug).Delete(badge)
  58. return err
  59. }
  60. // AddUserBadge adds a badge to a user.
  61. func AddUserBadge(ctx context.Context, u *User, badge *Badge) error {
  62. return AddUserBadges(ctx, u, []*Badge{badge})
  63. }
  64. // AddUserBadges adds badges to a user.
  65. func AddUserBadges(ctx context.Context, u *User, badges []*Badge) error {
  66. return db.WithTx(ctx, func(ctx context.Context) error {
  67. for _, badge := range badges {
  68. // hydrate badge and check if it exists
  69. has, err := db.GetEngine(ctx).Where("slug=?", badge.Slug).Get(badge)
  70. if err != nil {
  71. return err
  72. } else if !has {
  73. return fmt.Errorf("badge with slug %s doesn't exist", badge.Slug)
  74. }
  75. if err := db.Insert(ctx, &UserBadge{
  76. BadgeID: badge.ID,
  77. UserID: u.ID,
  78. }); err != nil {
  79. return err
  80. }
  81. }
  82. return nil
  83. })
  84. }
  85. // RemoveUserBadge removes a badge from a user.
  86. func RemoveUserBadge(ctx context.Context, u *User, badge *Badge) error {
  87. return RemoveUserBadges(ctx, u, []*Badge{badge})
  88. }
  89. // RemoveUserBadges removes badges from a user.
  90. func RemoveUserBadges(ctx context.Context, u *User, badges []*Badge) error {
  91. return db.WithTx(ctx, func(ctx context.Context) error {
  92. for _, badge := range badges {
  93. if _, err := db.GetEngine(ctx).
  94. Join("INNER", "badge", "badge.id = `user_badge`.badge_id").
  95. Where("`user_badge`.user_id=? AND `badge`.slug=?", u.ID, badge.Slug).
  96. Delete(&UserBadge{}); err != nil {
  97. return err
  98. }
  99. }
  100. return nil
  101. })
  102. }
  103. // RemoveAllUserBadges removes all badges from a user.
  104. func RemoveAllUserBadges(ctx context.Context, u *User) error {
  105. _, err := db.GetEngine(ctx).Where("user_id=?", u.ID).Delete(&UserBadge{})
  106. return err
  107. }