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