2021-11-11 15:03:30 +08:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-11-11 15:03:30 +08:00
package user
import (
"context"
"fmt"
"strings"
"code.gitea.io/gitea/models/db"
2022-10-18 06:50:37 +01:00
"code.gitea.io/gitea/modules/util"
2021-11-11 15:03:30 +08:00
)
// ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
type ErrUserRedirectNotExist struct {
Name string
}
// IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
func IsErrUserRedirectNotExist ( err error ) bool {
_ , ok := err . ( ErrUserRedirectNotExist )
return ok
}
func ( err ErrUserRedirectNotExist ) Error ( ) string {
return fmt . Sprintf ( "user redirect does not exist [name: %s]" , err . Name )
}
2022-10-18 06:50:37 +01:00
func ( err ErrUserRedirectNotExist ) Unwrap ( ) error {
return util . ErrNotExist
}
2021-11-11 15:03:30 +08:00
// Redirect represents that a user name should be redirected to another
type Redirect struct {
ID int64 ` xorm:"pk autoincr" `
LowerName string ` xorm:"UNIQUE(s) INDEX NOT NULL" `
RedirectUserID int64 // userID to redirect to
}
// TableName provides the real table name
func ( Redirect ) TableName ( ) string {
return "user_redirect"
}
func init ( ) {
db . RegisterModel ( new ( Redirect ) )
}
// LookupUserRedirect look up userID if a user has a redirect name
2023-09-25 15:17:37 +02:00
func LookupUserRedirect ( ctx context . Context , userName string ) ( int64 , error ) {
2021-11-11 15:03:30 +08:00
userName = strings . ToLower ( userName )
redirect := & Redirect { LowerName : userName }
2023-09-25 15:17:37 +02:00
if has , err := db . GetEngine ( ctx ) . Get ( redirect ) ; err != nil {
2021-11-11 15:03:30 +08:00
return 0 , err
} else if ! has {
return 0 , ErrUserRedirectNotExist { Name : userName }
}
return redirect . RedirectUserID , nil
}
// NewUserRedirect create a new user redirect
func NewUserRedirect ( ctx context . Context , ID int64 , oldUserName , newUserName string ) error {
oldUserName = strings . ToLower ( oldUserName )
newUserName = strings . ToLower ( newUserName )
2023-07-03 18:05:59 +08:00
if err := DeleteUserRedirect ( ctx , oldUserName ) ; err != nil {
return err
}
2021-11-11 15:03:30 +08:00
if err := DeleteUserRedirect ( ctx , newUserName ) ; err != nil {
return err
}
return db . Insert ( ctx , & Redirect {
LowerName : oldUserName ,
RedirectUserID : ID ,
} )
}
// DeleteUserRedirect delete any redirect from the specified user name to
// anything else
func DeleteUserRedirect ( ctx context . Context , userName string ) error {
userName = strings . ToLower ( userName )
_ , err := db . GetEngine ( ctx ) . Delete ( & Redirect { LowerName : userName } )
return err
}