@@ -5,13 +5,15 @@ package user
55
66import (
77 "context"
8+ "fmt"
89
910 "code.gitea.io/gitea/models/db"
1011)
1112
1213// Badge represents a user badge
1314type Badge struct {
14- ID int64 `xorm:"pk autoincr"`
15+ ID int64 `xorm:"pk autoincr"`
16+ Slug string `xorm:"UNIQUE"`
1517 Description string
1618 ImageURL string
1719}
@@ -39,3 +41,84 @@ func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) {
3941 count , err := sess .FindAndCount (& badges )
4042 return badges , count , err
4143}
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+ }
0 commit comments