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  }