github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/setting/setting.go (about) 1 package websetting 2 3 import ( 4 "net/http" 5 "strings" 6 "time" 7 8 "github.com/ngocphuongnb/tetua/app/config" 9 "github.com/ngocphuongnb/tetua/app/entities" 10 "github.com/ngocphuongnb/tetua/app/repositories" 11 "github.com/ngocphuongnb/tetua/app/server" 12 "github.com/ngocphuongnb/tetua/app/services" 13 "github.com/ngocphuongnb/tetua/app/utils" 14 "github.com/ngocphuongnb/tetua/views" 15 ) 16 17 func Index(c server.Context) (err error) { 18 var user *entities.User 19 c.Meta().Title = "Settings" 20 user, err = repositories.User.ByID(c.Context(), c.User().ID) 21 22 if err != nil { 23 c.WithError("Error while getting user", err) 24 } 25 26 return c.Render(views.UserSetting(user)) 27 } 28 29 func Save(c server.Context) (err error) { 30 user := c.User() 31 data := getSettingSaveData(c) 32 33 if c.Messages().HasError() { 34 return c.Render(views.UserSetting(user)) 35 } 36 37 if data.Username == "" || data.Email == "" { 38 c.Messages().AppendError("Username and email are required") 39 return c.Render(views.UserSetting(user)) 40 } 41 42 existedUsers, err := repositories.User.ByUsernameOrEmail(c.Context(), data.Username, data.Email) 43 44 if err == nil && len(existedUsers) > 0 { 45 existedUsers = utils.SliceFilter(existedUsers, func(existedUser *entities.User) bool { 46 return existedUser.ID != user.ID 47 }) 48 49 if len(existedUsers) > 0 { 50 c.Messages().AppendError("Username or email is already taken") 51 return c.Render(views.UserSetting(user)) 52 } 53 } 54 55 user, err = repositories.User.Setting(c.Context(), user.ID, data) 56 57 if err != nil { 58 user = c.User() 59 c.WithError("Error saving user", err) 60 return c.Render(views.UserSetting(user)) 61 } 62 63 user, err = repositories.User.ByID(c.Context(), user.ID) 64 65 if err != nil { 66 user = c.User() 67 c.WithError("Error saving user", err) 68 return c.Render(views.UserSetting(user)) 69 } 70 71 exp := time.Now().Add(time.Hour * 100 * 365 * 24) 72 jwtToken, err := user.JwtClaim(exp) 73 74 if err != nil { 75 c.Logger().Error("Error setting jwt", err) 76 return c.Status(http.StatusBadRequest).Render(views.Error("Something went wrong")) 77 } 78 79 c.Cookie(&server.Cookie{ 80 Name: config.APP_TOKEN_KEY, 81 Value: jwtToken, 82 Expires: exp, 83 HTTPOnly: false, 84 SameSite: "lax", 85 Secure: true, 86 }) 87 88 return c.Redirect("/settings") 89 } 90 91 func getSettingSaveData(c server.Context) *entities.SettingMutation { 92 var err error 93 data := &entities.SettingMutation{} 94 if err = c.BodyParser(data); err != nil { 95 c.WithError("Error parsing body", err) 96 return data 97 } 98 99 data.Username = strings.TrimSpace(data.Username) 100 data.DisplayName = strings.TrimSpace(data.DisplayName) 101 data.Email = strings.TrimSpace(data.Email) 102 data.URL = strings.TrimSpace(data.URL) 103 data.Bio = strings.TrimSpace(data.Bio) 104 data.BioHTML, err = utils.MarkdownToHtml(data.Bio) 105 106 if err != nil { 107 c.WithError("Error convert markdown to html", err) 108 } 109 110 if avatarImage, err := services.SaveFile(c, "avatar_image"); err != nil { 111 c.WithError("Error saving avatar image", err) 112 } else if avatarImage != nil { 113 data.AvatarImageID = avatarImage.ID 114 } 115 116 if data.Username == "" || len(data.Username) > 250 { 117 c.Messages().AppendError("Username is required and can't be more than 250 characters") 118 } 119 120 if data.Password != "" { 121 if data.Password, err = utils.GenerateHash(data.Password); err != nil { 122 c.WithError("Error generating password hash", err) 123 return data 124 } 125 } 126 127 return data 128 }