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  }