1
1
mirror of https://github.com/go-gitea/gitea synced 2025-01-31 12:04:28 +00:00

fix lints

This commit is contained in:
techknowlogick 2024-09-07 22:29:09 -04:00
parent 10463ec271
commit 52bc49dc8c
12 changed files with 60 additions and 226 deletions

View File

@ -6,11 +6,9 @@ package user
import ( import (
"context" "context"
"fmt" "fmt"
"net/url"
"strings" "strings"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/setting"
"xorm.io/builder" "xorm.io/builder"
"xorm.io/xorm" "xorm.io/xorm"
@ -36,10 +34,6 @@ func init() {
db.RegisterModel(new(UserBadge)) db.RegisterModel(new(UserBadge))
} }
func AdminCreateBadge(ctx context.Context, badge *Badge) error {
return CreateBadge(ctx, badge)
}
// GetUserBadges returns the user's badges. // GetUserBadges returns the user's badges.
func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) { func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) {
sess := db.GetEngine(ctx). sess := db.GetEngine(ctx).
@ -52,13 +46,13 @@ func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) {
return badges, count, err return badges, count, err
} }
// GetBadgeUsers returns the badges users. // GetBadgeUsers returns the users that have a specific badge.
func GetBadgeUsers(ctx context.Context, b *Badge) ([]*User, int64, error) { func GetBadgeUsers(ctx context.Context, b *Badge) ([]*User, int64, error) {
sess := db.GetEngine(ctx). sess := db.GetEngine(ctx).
Select("`user`.*"). Select("`user`.*").
Join("INNER", "user_badge", "`user_badge`.user_id=user.id"). Join("INNER", "user_badge", "`user_badge`.user_id=user.id").
Where("user_badge.badge_id=?", b.ID) Join("INNER", "badge", "`user_badge`.badge_id=badge.id").
Where("badge.slug=?", b.Slug)
users := make([]*User, 0, 8) users := make([]*User, 0, 8)
count, err := sess.FindAndCount(&users) count, err := sess.FindAndCount(&users)
return users, count, err return users, count, err
@ -66,20 +60,13 @@ func GetBadgeUsers(ctx context.Context, b *Badge) ([]*User, int64, error) {
// CreateBadge creates a new badge. // CreateBadge creates a new badge.
func CreateBadge(ctx context.Context, badge *Badge) error { func CreateBadge(ctx context.Context, badge *Badge) error {
isExist, err := IsBadgeExist(ctx, 0, badge.Slug) // this will fail if the badge already exists due to the UNIQUE constraint
_, err := db.GetEngine(ctx).Insert(badge)
if err != nil {
return err
} else if isExist {
return ErrBadgeAlreadyExist{badge.Slug}
}
_, err = db.GetEngine(ctx).Insert(badge)
return err return err
} }
// GetBadge returns a badge // GetBadge returns a specific badge
func GetBadge(ctx context.Context, slug string) (*Badge, error) { func GetBadge(ctx context.Context, slug string) (*Badge, error) {
badge := new(Badge) badge := new(Badge)
has, err := db.GetEngine(ctx).Where("slug=?", slug).Get(badge) has, err := db.GetEngine(ctx).Where("slug=?", slug).Get(badge)
@ -89,22 +76,9 @@ func GetBadge(ctx context.Context, slug string) (*Badge, error) {
return badge, err return badge, err
} }
// GetBadgeByID returns a badge
func GetBadgeByID(ctx context.Context, id int64) (*Badge, error) {
badge := new(Badge)
has, err := db.GetEngine(ctx).Where("id=?", id).Get(badge)
if err != nil {
return nil, err
} else if !has {
return nil, ErrBadgeNotExist{ID: id}
}
return badge, err
}
// UpdateBadge updates a badge based on its slug. // UpdateBadge updates a badge based on its slug.
func UpdateBadge(ctx context.Context, badge *Badge) error { func UpdateBadge(ctx context.Context, badge *Badge) error {
_, err := db.GetEngine(ctx).Where("id=?", badge.ID).Cols("slug", "description", "image_url").Update(badge) _, err := db.GetEngine(ctx).Where("slug=?", badge.Slug).Cols("description", "image_url").Update(badge)
return err return err
} }
@ -114,24 +88,8 @@ func DeleteBadge(ctx context.Context, badge *Badge) error {
return err return err
} }
// DeleteUserBadgeRecord deletes a user badge record.
func DeleteUserBadgeRecord(ctx context.Context, badge *Badge) error {
userBadge := &UserBadge{
BadgeID: badge.ID,
}
_, err := db.GetEngine(ctx).Where("badge_id=?", userBadge.BadgeID).Delete(userBadge)
return err
}
// AddUserBadge adds a badge to a user. // AddUserBadge adds a badge to a user.
func AddUserBadge(ctx context.Context, u *User, badge *Badge) error { func AddUserBadge(ctx context.Context, u *User, badge *Badge) error {
isExist, err := IsBadgeUserExist(ctx, u.ID, badge.ID)
if err != nil {
return err
} else if isExist {
return ErrBadgeAlreadyExist{}
}
return AddUserBadges(ctx, u, []*Badge{badge}) return AddUserBadges(ctx, u, []*Badge{badge})
} }
@ -140,11 +98,11 @@ func AddUserBadges(ctx context.Context, u *User, badges []*Badge) error {
return db.WithTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error {
for _, badge := range badges { for _, badge := range badges {
// hydrate badge and check if it exists // hydrate badge and check if it exists
has, err := db.GetEngine(ctx).Where("id=?", badge.ID).Get(badge) has, err := db.GetEngine(ctx).Where("slug=?", badge.Slug).Get(badge)
if err != nil { if err != nil {
return err return err
} else if !has { } else if !has {
return ErrBadgeNotExist{ID: badge.ID} return ErrBadgeNotExist{Slug: badge.Slug}
} }
if err := db.Insert(ctx, &UserBadge{ if err := db.Insert(ctx, &UserBadge{
BadgeID: badge.ID, BadgeID: badge.ID,
@ -162,11 +120,19 @@ func RemoveUserBadge(ctx context.Context, u *User, badge *Badge) error {
return RemoveUserBadges(ctx, u, []*Badge{badge}) return RemoveUserBadges(ctx, u, []*Badge{badge})
} }
// RemoveUserBadges removes badges from a user. // RemoveUserBadges removes specific badges from a user.
func RemoveUserBadges(ctx context.Context, u *User, badges []*Badge) error { func RemoveUserBadges(ctx context.Context, u *User, badges []*Badge) error {
return db.WithTx(ctx, func(ctx context.Context) error { return db.WithTx(ctx, func(ctx context.Context) error {
for _, badge := range badges { for _, badge := range badges {
if _, err := db.GetEngine(ctx).Delete(&UserBadge{BadgeID: badge.ID, UserID: u.ID}); err != nil { subQuery := builder.
Select("id").
From("badge").
Where(builder.Eq{"slug": badge.Slug})
if _, err := db.GetEngine(ctx).
Where("`user_badge`.user_id=?", u.ID).
And(builder.In("badge_id", subQuery)).
Delete(&UserBadge{}); err != nil {
return err return err
} }
} }
@ -180,28 +146,6 @@ func RemoveAllUserBadges(ctx context.Context, u *User) error {
return err return err
} }
// HTMLURL returns the badges full link.
func (u *Badge) HTMLURL() string {
return setting.AppURL + url.PathEscape(u.Slug)
}
// IsBadgeExist checks if given badge slug exist,
// it is used when creating/updating a badge slug
func IsBadgeExist(ctx context.Context, uid int64, slug string) (bool, error) {
if len(slug) == 0 {
return false, nil
}
return db.GetEngine(ctx).
Where("slug!=?", uid).
Get(&Badge{Slug: strings.ToLower(slug)})
}
// IsBadgeUserExist checks if given badge id, uid exist,
func IsBadgeUserExist(ctx context.Context, uid, bid int64) (bool, error) {
return db.GetEngine(ctx).
Get(&UserBadge{UserID: uid, BadgeID: bid})
}
// SearchBadgeOptions represents the options when fdin badges // SearchBadgeOptions represents the options when fdin badges
type SearchBadgeOptions struct { type SearchBadgeOptions struct {
db.ListOptions db.ListOptions

View File

@ -131,7 +131,6 @@ func (err ErrBadgeAlreadyExist) Unwrap() error {
// ErrBadgeNotExist represents a "BadgeNotExist" kind of error. // ErrBadgeNotExist represents a "BadgeNotExist" kind of error.
type ErrBadgeNotExist struct { type ErrBadgeNotExist struct {
Slug string Slug string
ID int64
} }
// IsErrBadgeNotExist checks if an error is a ErrBadgeNotExist. // IsErrBadgeNotExist checks if an error is a ErrBadgeNotExist.
@ -141,7 +140,7 @@ func IsErrBadgeNotExist(err error) bool {
} }
func (err ErrBadgeNotExist) Error() string { func (err ErrBadgeNotExist) Error() string {
return fmt.Sprintf("badge does not exist [slug: %s | id: %d]", err.Slug, err.ID) return fmt.Sprintf("badge does not exist [slug: %s]", err.Slug)
} }
// Unwrap unwraps this error as a ErrNotExist error // Unwrap unwraps this error as a ErrNotExist error

View File

@ -26,7 +26,7 @@ const (
ErrUsername = "UsernameError" ErrUsername = "UsernameError"
// ErrInvalidGroupTeamMap is returned when a group team mapping is invalid // ErrInvalidGroupTeamMap is returned when a group team mapping is invalid
ErrInvalidGroupTeamMap = "InvalidGroupTeamMap" ErrInvalidGroupTeamMap = "InvalidGroupTeamMap"
ErrInvalidImageURL = "InvalidImageURL" // ErrInvalidSlug is returned when a slug is invalid
ErrInvalidSlug = "InvalidSlug" ErrInvalidSlug = "InvalidSlug"
) )
@ -40,7 +40,6 @@ func AddBindingRules() {
addGlobOrRegexPatternRule() addGlobOrRegexPatternRule()
addUsernamePatternRule() addUsernamePatternRule()
addValidGroupTeamMapRule() addValidGroupTeamMapRule()
addValidImageURLBindingRule()
addSlugPatternRule() addSlugPatternRule()
} }
@ -98,24 +97,6 @@ func addValidSiteURLBindingRule() {
}) })
} }
func addValidImageURLBindingRule() {
// URL validation rule
binding.AddRule(&binding.Rule{
IsMatch: func(rule string) bool {
return strings.HasPrefix(rule, "ValidImageUrl")
},
IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) {
str := fmt.Sprintf("%v", val)
if len(str) != 0 && !IsValidImageURL(str) {
errs.Add([]string{name}, ErrInvalidImageURL, "ImageURL")
return false, errs
}
return true, errs
},
})
}
func addSlugPatternRule() { func addSlugPatternRule() {
binding.AddRule(&binding.Rule{ binding.AddRule(&binding.Rule{
IsMatch: func(rule string) bool { IsMatch: func(rule string) bool {

View File

@ -6,7 +6,6 @@ package validation
import ( import (
"net" "net"
"net/url" "net/url"
"path/filepath"
"regexp" "regexp"
"strings" "strings"
@ -51,29 +50,6 @@ func IsValidSiteURL(uri string) bool {
return false return false
} }
// IsValidImageURL checks if URL is valid and points to an image
func IsValidImageURL(uri string) bool {
u, err := url.ParseRequestURI(uri)
if err != nil {
return false
}
if !validPort(portOnly(u.Host)) {
return false
}
for _, scheme := range setting.Service.ValidSiteURLSchemes {
if scheme == u.Scheme {
// Check if the path has an image file extension
ext := strings.ToLower(filepath.Ext(u.Path))
if ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp" || ext == ".svg" || ext == ".webp" {
return true
}
}
}
return false
}
// IsEmailDomainListed checks whether the domain of an email address // IsEmailDomainListed checks whether the domain of an email address
// matches a list of domains // matches a list of domains
func IsEmailDomainListed(globs []glob.Glob, email string) bool { func IsEmailDomainListed(globs []glob.Glob, email string) bool {

View File

@ -138,8 +138,6 @@ func Validate(errs binding.Errors, data map[string]any, f Form, l translation.Lo
data["ErrorMsg"] = trName + l.TrString("form.username_error") data["ErrorMsg"] = trName + l.TrString("form.username_error")
case validation.ErrInvalidGroupTeamMap: case validation.ErrInvalidGroupTeamMap:
data["ErrorMsg"] = trName + l.TrString("form.invalid_group_team_map_error", errs[0].Message) data["ErrorMsg"] = trName + l.TrString("form.invalid_group_team_map_error", errs[0].Message)
case validation.ErrInvalidImageURL:
data["ErrorMsg"] = l.TrString("form.invalid_image_url_error")
case validation.ErrInvalidSlug: case validation.ErrInvalidSlug:
data["ErrorMsg"] = l.TrString("form.invalid_slug_error") data["ErrorMsg"] = l.TrString("form.invalid_slug_error")
default: default:

View File

@ -3032,7 +3032,7 @@ badges.edit_badge = Edit Badge
badges.update_badge = Update Badge badges.update_badge = Update Badge
badges.delete_badge = Delete Badge badges.delete_badge = Delete Badge
badges.delete_badge_desc = Are you sure you want to permanently delete this badge? badges.delete_badge_desc = Are you sure you want to permanently delete this badge?
badges.users_with_badge = Users with Badge (%d) badges.users_with_badge = Users with Badge (%s)
badges.add_user = Add User badges.add_user = Add User
badges.remove_user = Remove User badges.remove_user = Remove User
badges.delete_user_desc = Are you sure you want to remove this badge from the user? badges.delete_user_desc = Are you sure you want to remove this badge from the user?

View File

@ -1,10 +1,10 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
// Copyright 2024 The Gitea Authors. // Copyright 2024 The Gitea Authors.
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
package admin package admin
import ( import (
"fmt"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
@ -86,11 +86,8 @@ func NewBadgePost(ctx *context.Context) {
return return
} }
if err := user_model.AdminCreateBadge(ctx, b); err != nil { if err := user_model.CreateBadge(ctx, b); err != nil {
switch { switch {
case user_model.IsErrBadgeAlreadyExist(err):
ctx.Data["Err_Slug"] = true
ctx.RenderWithErr(ctx.Tr("form.slug_been_taken"), tplBadgeNew, &form)
default: default:
ctx.ServerError("CreateBadge", err) ctx.ServerError("CreateBadge", err)
} }
@ -104,17 +101,16 @@ func NewBadgePost(ctx *context.Context) {
} }
func prepareBadgeInfo(ctx *context.Context) *user_model.Badge { func prepareBadgeInfo(ctx *context.Context) *user_model.Badge {
b, err := user_model.GetBadgeByID(ctx, ctx.ParamsInt64(":badgeid")) b, err := user_model.GetBadge(ctx, ctx.PathParam(":badge_slug"))
if err != nil { if err != nil {
if user_model.IsErrBadgeNotExist(err) { if user_model.IsErrBadgeNotExist(err) {
ctx.Redirect(setting.AppSubURL + "/admin/badges") ctx.Redirect(setting.AppSubURL + "/admin/badges")
} else { } else {
ctx.ServerError("GetBadgeByID", err) ctx.ServerError("GetBadge", err)
} }
return nil return nil
} }
ctx.Data["Badge"] = b ctx.Data["Badge"] = b
ctx.Data["Image"] = b.ImageURL != ""
users, count, err := user_model.GetBadgeUsers(ctx, b) users, count, err := user_model.GetBadgeUsers(ctx, b)
if err != nil { if err != nil {
@ -171,13 +167,10 @@ func EditBadgePost(ctx *context.Context) {
} }
if form.Slug != "" { if form.Slug != "" {
if err := user_service.RenameBadge(ctx, ctx.Data["Badge"].(*user_model.Badge), form.Slug); err != nil { if err := user_service.UpdateBadge(ctx, ctx.Data["Badge"].(*user_model.Badge)); err != nil {
switch { switch {
case user_model.IsErrBadgeAlreadyExist(err):
ctx.Data["Err_Slug"] = true
ctx.RenderWithErr(ctx.Tr("form.slug_been_taken"), tplBadgeEdit, &form)
default: default:
ctx.ServerError("RenameBadge", err) ctx.ServerError("UpdateBadge", err)
} }
return return
} }
@ -194,18 +187,18 @@ func EditBadgePost(ctx *context.Context) {
log.Trace("Badge updated by admin (%s): %s", ctx.Doer.Name, b.Slug) log.Trace("Badge updated by admin (%s): %s", ctx.Doer.Name, b.Slug)
ctx.Flash.Success(ctx.Tr("admin.badges.update_success")) ctx.Flash.Success(ctx.Tr("admin.badges.update_success"))
ctx.Redirect(setting.AppSubURL + "/admin/badges/" + url.PathEscape(ctx.Params(":badgeid"))) ctx.Redirect(setting.AppSubURL + "/admin/badges/" + url.PathEscape(ctx.PathParam(":badge_slug")))
} }
// DeleteBadge response for deleting a badge // DeleteBadge response for deleting a badge
func DeleteBadge(ctx *context.Context) { func DeleteBadge(ctx *context.Context) {
b, err := user_model.GetBadgeByID(ctx, ctx.ParamsInt64(":badgeid")) b, err := user_model.GetBadge(ctx, ctx.PathParam(":badge_slug"))
if err != nil { if err != nil {
ctx.ServerError("GetBadgeByID", err) ctx.ServerError("GetBadge", err)
return return
} }
if err = user_service.DeleteBadge(ctx, b, true); err != nil { if err = user_service.DeleteBadge(ctx, b); err != nil {
ctx.ServerError("DeleteBadge", err) ctx.ServerError("DeleteBadge", err)
return return
} }
@ -217,10 +210,10 @@ func DeleteBadge(ctx *context.Context) {
} }
func BadgeUsers(ctx *context.Context) { func BadgeUsers(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("admin.badges.users_with_badge", ctx.ParamsInt64(":badgeid")) ctx.Data["Title"] = ctx.Tr("admin.badges.users_with_badge", ctx.PathParam(":badge_slug"))
ctx.Data["PageIsAdminBadges"] = true ctx.Data["PageIsAdminBadges"] = true
users, _, err := user_model.GetBadgeUsers(ctx, &user_model.Badge{ID: ctx.ParamsInt64(":badgeid")}) users, _, err := user_model.GetBadgeUsers(ctx, &user_model.Badge{Slug: ctx.PathParam(":badge_slug")})
if err != nil { if err != nil {
ctx.ServerError("GetBadgeUsers", err) ctx.ServerError("GetBadgeUsers", err)
return return
@ -246,7 +239,7 @@ func BadgeUsersPost(ctx *context.Context) {
return return
} }
if err = user_model.AddUserBadge(ctx, u, &user_model.Badge{ID: ctx.ParamsInt64(":badgeid")}); err != nil { if err = user_model.AddUserBadge(ctx, u, &user_model.Badge{Slug: ctx.PathParam(":badge_slug")}); err != nil {
if user_model.IsErrBadgeNotExist(err) { if user_model.IsErrBadgeNotExist(err) {
ctx.Flash.Error(ctx.Tr("admin.badges.not_found")) ctx.Flash.Error(ctx.Tr("admin.badges.not_found"))
} else { } else {
@ -261,21 +254,21 @@ func BadgeUsersPost(ctx *context.Context) {
// DeleteBadgeUser delete a badge from a user // DeleteBadgeUser delete a badge from a user
func DeleteBadgeUser(ctx *context.Context) { func DeleteBadgeUser(ctx *context.Context) {
if user, err := user_model.GetUserByID(ctx, ctx.FormInt64("id")); err != nil { user, err := user_model.GetUserByID(ctx, ctx.FormInt64("id"))
if err != nil {
if user_model.IsErrUserNotExist(err) { if user_model.IsErrUserNotExist(err) {
ctx.Flash.Error(ctx.Tr("form.user_not_exist")) ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
} else { } else {
ctx.ServerError("GetUserByName", err) ctx.ServerError("GetUserByName", err)
return return
} }
} else { }
if err := user_model.RemoveUserBadge(ctx, user, &user_model.Badge{ID: ctx.ParamsInt64(":badgeid")}); err == nil { if err := user_model.RemoveUserBadge(ctx, user, &user_model.Badge{Slug: ctx.PathParam(":badge_slug")}); err == nil {
ctx.Flash.Success(ctx.Tr("admin.badges.user_remove_success")) ctx.Flash.Success(ctx.Tr("admin.badges.user_remove_success"))
} else { } else {
ctx.Flash.Error("DeleteUser: " + err.Error()) ctx.Flash.Error("DeleteUser: " + err.Error())
return return
} }
}
ctx.JSONRedirect(setting.AppSubURL + "/admin/badges/" + ctx.Params(":badgeid") + "/users") ctx.JSONRedirect(fmt.Sprintf("%s/admin/badges/%s/users", setting.AppSubURL, ctx.PathParam(":badge_slug")))
} }

View File

@ -9,16 +9,13 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/sitemap"
"code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/context"
) )
func RenderBadgeSearch(ctx *context.Context, opts *user_model.SearchBadgeOptions, tplName base.TplName) { func RenderBadgeSearch(ctx *context.Context, opts *user_model.SearchBadgeOptions, tplName base.TplName) {
// Sitemap index for sitemap paths // Sitemap index for sitemap paths
opts.Page = int(ctx.ParamsInt64("idx")) opts.Page = int(ctx.PathParamInt64("idx"))
isSitemap := ctx.Params("idx") != ""
if opts.Page <= 1 { if opts.Page <= 1 {
opts.Page = ctx.FormInt("page") opts.Page = ctx.FormInt("page")
} }
@ -26,10 +23,6 @@ func RenderBadgeSearch(ctx *context.Context, opts *user_model.SearchBadgeOptions
opts.Page = 1 opts.Page = 1
} }
if isSitemap {
opts.PageSize = setting.UI.SitemapPagingNum
}
var ( var (
badges []*user_model.Badge badges []*user_model.Badge
count int64 count int64
@ -69,17 +62,6 @@ func RenderBadgeSearch(ctx *context.Context, opts *user_model.SearchBadgeOptions
return return
} }
} }
if isSitemap {
m := sitemap.NewSitemap()
for _, item := range badges {
m.Add(sitemap.URL{URL: item.HTMLURL()})
}
ctx.Resp.Header().Set("Content-Type", "text/xml")
if _, err := m.WriteTo(ctx.Resp); err != nil {
log.Error("Failed writing sitemap: %v", err)
}
return
}
ctx.Data["Keyword"] = opts.Keyword ctx.Data["Keyword"] = opts.Keyword
ctx.Data["Total"] = count ctx.Data["Total"] = count

View File

@ -725,11 +725,11 @@ func registerRoutes(m *web.Router) {
m.Group("/badges", func() { m.Group("/badges", func() {
m.Get("", admin.Badges) m.Get("", admin.Badges)
m.Combo("/new").Get(admin.NewBadge).Post(web.Bind(forms.AdminCreateBadgeForm{}), admin.NewBadgePost) m.Combo("/new").Get(admin.NewBadge).Post(web.Bind(forms.AdminCreateBadgeForm{}), admin.NewBadgePost)
m.Get("/{badgeid}", admin.ViewBadge) m.Get("/{badge_slug}", admin.ViewBadge)
m.Combo("/{badgeid}/edit").Get(admin.EditBadge).Post(web.Bind(forms.AdminCreateBadgeForm{}), admin.EditBadgePost) m.Combo("/{badge_slug}/edit").Get(admin.EditBadge).Post(web.Bind(forms.AdminCreateBadgeForm{}), admin.EditBadgePost)
m.Post("/{badgeid}/delete", admin.DeleteBadge) m.Post("/{badge_slug}/delete", admin.DeleteBadge)
m.Combo("/{badgeid}/users").Get(admin.BadgeUsers).Post(admin.BadgeUsersPost) m.Combo("/{badge_slug}/users").Get(admin.BadgeUsers).Post(admin.BadgeUsersPost)
m.Post("/{badgeid}/users/delete", admin.DeleteBadgeUser) m.Post("/{badge_slug}/users/delete", admin.DeleteBadgeUser)
}) })
m.Group("/emails", func() { m.Group("/emails", func() {

View File

@ -11,51 +11,22 @@ import (
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
) )
// RenameBadge changes the slug of a badge. // UpdateBadgeDescription changes the description and/or image of a badge
func RenameBadge(ctx context.Context, b *user_model.Badge, newSlug string) error { func UpdateBadge(ctx context.Context, b *user_model.Badge) error {
if newSlug == b.Slug {
return nil
}
olderSlug := b.Slug
ctx, committer, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return err return err
} }
defer committer.Close() defer committer.Close()
isExist, err := user_model.IsBadgeExist(ctx, b.ID, newSlug)
if err != nil {
return err
}
if isExist {
return user_model.ErrBadgeAlreadyExist{
Slug: newSlug,
}
}
b.Slug = newSlug
if err := user_model.UpdateBadge(ctx, b); err != nil { if err := user_model.UpdateBadge(ctx, b); err != nil {
b.Slug = olderSlug
return err return err
} }
if err = committer.Commit(); err != nil { return committer.Commit()
b.Slug = olderSlug
return err
}
return nil
} }
// DeleteBadge completely and permanently deletes everything of a badge // DeleteBadge remove record of badge in the database
func DeleteBadge(ctx context.Context, b *user_model.Badge, purge bool) error { func DeleteBadge(ctx context.Context, b *user_model.Badge) error {
if purge {
err := user_model.DeleteUserBadgeRecord(ctx, b)
if err != nil {
return err
}
}
ctx, committer, err := db.TxContext(ctx) ctx, committer, err := db.TxContext(ctx)
if err != nil { if err != nil {
return err return err

View File

@ -8,9 +8,9 @@
{{template "base/disable_form_autofill"}} {{template "base/disable_form_autofill"}}
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
<div class="required non-local field {{if .Err_Slug}}error{{end}}"> <div class="non-local field {{if .Err_Slug}}error{{end}}" disabled=disabled>
<label for="slug">{{ctx.Locale.Tr "admin.badges.slug"}}</label> <label for="slug">{{ctx.Locale.Tr "admin.badges.slug"}}</label>
<input autofocus required id="slug" name="slug" value="{{.Badge.Slug}}"> <input disabled=disabled id="slug" name="slug" value="{{.Badge.Slug}}">
</div> </div>
<div class="field {{if .Err_Description}}error{{end}}"> <div class="field {{if .Err_Description}}error{{end}}">
<label for="description">{{ctx.Locale.Tr "admin.badges.description"}}</label> <label for="description">{{ctx.Locale.Tr "admin.badges.description"}}</label>

View File

@ -40,11 +40,6 @@
</th> </th>
<th>{{ctx.Locale.Tr "admin.badges.description"}}</th> <th>{{ctx.Locale.Tr "admin.badges.description"}}</th>
<th></th> <th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -52,18 +47,13 @@
<tr> <tr>
<td>{{.ID}}</td> <td>{{.ID}}</td>
<td> <td>
<a href="{{$.Link}}/{{.ID}}">{{.Slug}}</a> <a href="{{$.Link}}/{{.Slug}}">{{.Slug}}</a>
</td> </td>
<td class="gt-ellipsis tw-max-w-48">{{.Description}}</td> <td class="gt-ellipsis tw-max-w-48">{{.Description}}</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td> <td>
<div class="tw-flex tw-gap-2"> <div class="tw-flex tw-gap-2">
<a href="{{$.Link}}/{{.ID}}" data-tooltip-content="{{ctx.Locale.Tr "admin.badges.details"}}">{{svg "octicon-star"}}</a> <a href="{{$.Link}}/{{.Slug}}" data-tooltip-content="{{ctx.Locale.Tr "admin.badges.details"}}">{{svg "octicon-star"}}</a>
<a href="{{$.Link}}/{{.ID}}/edit" data-tooltip-content="{{ctx.Locale.Tr "edit"}}">{{svg "octicon-pencil"}}</a> <a href="{{$.Link}}/{{.Slug}}/edit" data-tooltip-content="{{ctx.Locale.Tr "edit"}}">{{svg "octicon-pencil"}}</a>
</div> </div>
</td> </td>
</tr> </tr>