You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

redirect.go 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "fmt"
  7. "strings"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/modules/util"
  10. )
  11. // ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error.
  12. type ErrUserRedirectNotExist struct {
  13. Name string
  14. }
  15. // IsErrUserRedirectNotExist check if an error is an ErrUserRedirectNotExist.
  16. func IsErrUserRedirectNotExist(err error) bool {
  17. _, ok := err.(ErrUserRedirectNotExist)
  18. return ok
  19. }
  20. func (err ErrUserRedirectNotExist) Error() string {
  21. return fmt.Sprintf("user redirect does not exist [name: %s]", err.Name)
  22. }
  23. func (err ErrUserRedirectNotExist) Unwrap() error {
  24. return util.ErrNotExist
  25. }
  26. // Redirect represents that a user name should be redirected to another
  27. type Redirect struct {
  28. ID int64 `xorm:"pk autoincr"`
  29. LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
  30. RedirectUserID int64 // userID to redirect to
  31. }
  32. // TableName provides the real table name
  33. func (Redirect) TableName() string {
  34. return "user_redirect"
  35. }
  36. func init() {
  37. db.RegisterModel(new(Redirect))
  38. }
  39. // LookupUserRedirect look up userID if a user has a redirect name
  40. func LookupUserRedirect(userName string) (int64, error) {
  41. userName = strings.ToLower(userName)
  42. redirect := &Redirect{LowerName: userName}
  43. if has, err := db.GetEngine(db.DefaultContext).Get(redirect); err != nil {
  44. return 0, err
  45. } else if !has {
  46. return 0, ErrUserRedirectNotExist{Name: userName}
  47. }
  48. return redirect.RedirectUserID, nil
  49. }
  50. // NewUserRedirect create a new user redirect
  51. func NewUserRedirect(ctx context.Context, ID int64, oldUserName, newUserName string) error {
  52. oldUserName = strings.ToLower(oldUserName)
  53. newUserName = strings.ToLower(newUserName)
  54. if err := DeleteUserRedirect(ctx, newUserName); err != nil {
  55. return err
  56. }
  57. return db.Insert(ctx, &Redirect{
  58. LowerName: oldUserName,
  59. RedirectUserID: ID,
  60. })
  61. }
  62. // DeleteUserRedirect delete any redirect from the specified user name to
  63. // anything else
  64. func DeleteUserRedirect(ctx context.Context, userName string) error {
  65. userName = strings.ToLower(userName)
  66. _, err := db.GetEngine(ctx).Delete(&Redirect{LowerName: userName})
  67. return err
  68. }