email.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package user
  2. import (
  3. "net/http"
  4. "github.com/cockroachdb/errors"
  5. "gogs.io/gogs/internal/conf"
  6. "gogs.io/gogs/internal/context"
  7. "gogs.io/gogs/internal/database"
  8. )
  9. // EmResp holds email response data.
  10. type EmResp struct {
  11. EmStr string `json:"email"`
  12. VfBl bool `json:"verified"`
  13. PrBl bool `json:"primary"`
  14. }
  15. // EmReq holds email request data.
  16. type EmReq struct {
  17. EmStrs []string `json:"emails"`
  18. }
  19. func toEmResp(e *database.EmailAddress) *EmResp {
  20. return &EmResp{
  21. EmStr: e.Email,
  22. VfBl: e.IsActivated,
  23. PrBl: e.IsPrimary,
  24. }
  25. }
  26. func ListEmails(c *context.APIContext) {
  27. emails, err := database.Handle.Users().ListEmails(c.Req.Context(), c.User.ID)
  28. if err != nil {
  29. c.Error(err, "get email addresses")
  30. return
  31. }
  32. resps := make([]*EmResp, len(emails))
  33. for i := range emails {
  34. resps[i] = toEmResp(emails[i])
  35. }
  36. c.JSONSuccess(&resps)
  37. }
  38. func AddEmail(c *context.APIContext, form EmReq) {
  39. if len(form.EmStrs) == 0 {
  40. c.Status(http.StatusUnprocessableEntity)
  41. return
  42. }
  43. resps := make([]*EmResp, 0, len(form.EmStrs))
  44. for _, email := range form.EmStrs {
  45. err := database.Handle.Users().AddEmail(c.Req.Context(), c.User.ID, email, !conf.Auth.RequireEmailConfirmation)
  46. if err != nil {
  47. if database.IsErrEmailAlreadyUsed(err) {
  48. c.ErrorStatus(http.StatusUnprocessableEntity, errors.Errorf("email address has been used: %s", err.(database.ErrEmailAlreadyUsed).Email()))
  49. } else {
  50. c.Error(err, "add email addresses")
  51. }
  52. return
  53. }
  54. resps = append(resps, &EmResp{
  55. EmStr: email,
  56. VfBl: !conf.Auth.RequireEmailConfirmation,
  57. })
  58. }
  59. c.JSON(http.StatusCreated, &resps)
  60. }
  61. func DeleteEmail(c *context.APIContext, form EmReq) {
  62. for _, email := range form.EmStrs {
  63. if email == c.User.Email {
  64. c.ErrorStatus(http.StatusBadRequest, errors.Errorf("cannot delete primary email %q", email))
  65. return
  66. }
  67. err := database.Handle.Users().DeleteEmail(c.Req.Context(), c.User.ID, email)
  68. if err != nil {
  69. c.Error(err, "delete email addresses")
  70. return
  71. }
  72. }
  73. c.NoContent()
  74. }