gitea源码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "io"
  9. "os"
  10. "code.gitea.io/gitea/models/db"
  11. user_model "code.gitea.io/gitea/models/user"
  12. "code.gitea.io/gitea/modules/avatar"
  13. "code.gitea.io/gitea/modules/log"
  14. "code.gitea.io/gitea/modules/storage"
  15. )
  16. // UploadAvatar saves custom avatar for user.
  17. func UploadAvatar(ctx context.Context, u *user_model.User, data []byte) error {
  18. avatarData, err := avatar.ProcessAvatarImage(data)
  19. if err != nil {
  20. return err
  21. }
  22. return db.WithTx(ctx, func(ctx context.Context) error {
  23. u.UseCustomAvatar = true
  24. u.Avatar = avatar.HashAvatar(u.ID, data)
  25. if err = user_model.UpdateUserCols(ctx, u, "use_custom_avatar", "avatar"); err != nil {
  26. return fmt.Errorf("updateUser: %w", err)
  27. }
  28. if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error {
  29. _, err := w.Write(avatarData)
  30. return err
  31. }); err != nil {
  32. return fmt.Errorf("Failed to create dir %s: %w", u.CustomAvatarRelativePath(), err)
  33. }
  34. return nil
  35. })
  36. }
  37. // DeleteAvatar deletes the user's custom avatar.
  38. func DeleteAvatar(ctx context.Context, u *user_model.User) error {
  39. aPath := u.CustomAvatarRelativePath()
  40. log.Trace("DeleteAvatar[%d]: %s", u.ID, aPath)
  41. return db.WithTx(ctx, func(ctx context.Context) error {
  42. hasAvatar := len(u.Avatar) > 0
  43. u.UseCustomAvatar = false
  44. u.Avatar = ""
  45. if _, err := db.GetEngine(ctx).ID(u.ID).Cols("avatar, use_custom_avatar").Update(u); err != nil {
  46. return fmt.Errorf("DeleteAvatar: %w", err)
  47. }
  48. if hasAvatar {
  49. if err := storage.Avatars.Delete(aPath); err != nil {
  50. if !errors.Is(err, os.ErrNotExist) {
  51. return fmt.Errorf("failed to remove %s: %w", aPath, err)
  52. }
  53. log.Warn("Deleting avatar %s but it doesn't exist", aPath)
  54. }
  55. }
  56. return nil
  57. })
  58. }