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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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(ctx context.Context, userName string) (int64, error) {
  41. userName = strings.ToLower(userName)
  42. redirect := &Redirect{LowerName: userName}
  43. if has, err := db.GetEngine(ctx).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, oldUserName); err != nil {
  55. return err
  56. }
  57. if err := DeleteUserRedirect(ctx, newUserName); err != nil {
  58. return err
  59. }
  60. return db.Insert(ctx, &Redirect{
  61. LowerName: oldUserName,
  62. RedirectUserID: ID,
  63. })
  64. }
  65. // DeleteUserRedirect delete any redirect from the specified user name to
  66. // anything else
  67. func DeleteUserRedirect(ctx context.Context, userName string) error {
  68. userName = strings.ToLower(userName)
  69. _, err := db.GetEngine(ctx).Delete(&Redirect{LowerName: userName})
  70. return err
  71. }