github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/web/manage/user/user.go (about) 1 package manageuser 2 3 import ( 4 "net/http" 5 "strconv" 6 "strings" 7 8 "github.com/ngocphuongnb/tetua/app/auth" 9 "github.com/ngocphuongnb/tetua/app/entities" 10 e "github.com/ngocphuongnb/tetua/app/entities" 11 "github.com/ngocphuongnb/tetua/app/repositories" 12 "github.com/ngocphuongnb/tetua/app/server" 13 "github.com/ngocphuongnb/tetua/app/services" 14 "github.com/ngocphuongnb/tetua/app/utils" 15 "github.com/ngocphuongnb/tetua/views" 16 ) 17 18 func Index(c server.Context) error { 19 c.Meta().Title = "Manage users" 20 status := http.StatusOK 21 page := c.QueryInt("page", 1) 22 search := c.Query("q") 23 data, err := repositories.User.Paginate(c.Context(), &e.UserFilter{Filter: &entities.Filter{Page: page, Search: search}}) 24 25 if err != nil { 26 status = http.StatusBadRequest 27 c.WithError("Error getting users", err) 28 } 29 30 return c.Status(status).Render(views.ManageUserIndex(data, search)) 31 } 32 33 func Compose(c server.Context) (err error) { 34 return composeView(c, &entities.User{}, false) 35 } 36 37 func Save(c server.Context) (err error) { 38 var user *entities.User 39 userID := c.ParamInt("id", 0) 40 data := getUserSaveData(c) 41 42 if c.Messages().HasError() { 43 return composeView(c, data, true) 44 } 45 46 if userID > 0 { 47 data.ID = userID 48 user, err = repositories.User.Update(c.Context(), data) 49 } else { 50 user, err = repositories.User.Create(c.Context(), data) 51 } 52 53 if err != nil { 54 c.WithError("Error saving user", err) 55 return composeView(c, data, true) 56 } 57 58 return c.Redirect("/manage/users/" + strconv.Itoa(user.ID)) 59 } 60 61 func Delete(c server.Context) error { 62 user, err := getProcessingUser(c) 63 64 if user.ID == 1 { 65 return c.Status(http.StatusBadRequest).SendString("Error deleting user") 66 } 67 68 if err != nil { 69 c.Logger().Error("Error deleting user", err) 70 return c.Status(http.StatusBadRequest).SendString("Error deleting user") 71 } 72 73 if err := repositories.User.DeleteByID(c.Context(), user.ID); err != nil { 74 c.Logger().Error("Error deleting user", err) 75 return c.Status(http.StatusBadRequest).SendString("Error deleting user") 76 } 77 78 return c.Status(http.StatusOK).SendString("Success") 79 } 80 81 func getProcessingUser(c server.Context) (user *entities.User, err error) { 82 if c.Param("id") == "new" { 83 return &entities.User{}, nil 84 } 85 86 return repositories.User.ByID(c.Context(), c.ParamInt("id")) 87 } 88 89 func composeView(c server.Context, composeData *entities.User, isSave bool) (err error) { 90 var roles []*entities.Role 91 user, err := getProcessingUser(c) 92 c.Meta().Title = "Create User" 93 94 if err != nil { 95 c.WithError("Query editting user error", err) 96 } else { 97 if !isSave { 98 composeData = user 99 } 100 } 101 102 if roles, err = repositories.Role.All(c.Context()); err != nil { 103 c.WithError("Load roles error", err) 104 } 105 106 if user.ID > 0 { 107 c.Meta().Title = "Edit User: " + user.Username 108 user.RoleIDs = []int{} 109 for _, role := range user.Roles { 110 user.RoleIDs = append(user.RoleIDs, role.ID) 111 } 112 } 113 114 return c.Render(views.ManageUserCompose(user.ID, composeData, roles, auth.Providers())) 115 } 116 117 func getUserSaveData(c server.Context) *entities.User { 118 var err error 119 user := &entities.User{} 120 data := &entities.UserMutation{} 121 if err = c.BodyParser(data); err != nil { 122 c.WithError("Error parsing body", err) 123 return &entities.User{} 124 } 125 126 user.Username = utils.SanitizePlainText(strings.TrimSpace(data.Username)) 127 user.DisplayName = utils.SanitizePlainText(strings.TrimSpace(data.DisplayName)) 128 user.Email = utils.SanitizePlainText(strings.TrimSpace(data.Email)) 129 user.URL = utils.SanitizePlainText(strings.TrimSpace(data.URL)) 130 user.Bio = utils.SanitizeMarkdown(strings.TrimSpace(data.Bio)) 131 user.Provider = utils.SanitizePlainText(strings.TrimSpace(data.Provider)) 132 user.ProviderID = utils.SanitizePlainText(strings.TrimSpace(data.ProviderID)) 133 user.ProviderUsername = utils.SanitizePlainText(strings.TrimSpace(data.ProviderUsername)) 134 user.ProviderAvatar = utils.SanitizePlainText(strings.TrimSpace(data.ProviderAvatar)) 135 user.Password = utils.SanitizePlainText(strings.TrimSpace(data.Password)) 136 user.RoleIDs = data.RoleIDs 137 user.Active = data.Active 138 139 if avatarImage, err := services.SaveFile(c, "avatar_image"); err != nil { 140 c.WithError("Error saving avatar image", err) 141 } else if avatarImage != nil { 142 user.AvatarImageID = avatarImage.ID 143 } 144 145 if data.Username == "" || len(data.Username) > 250 { 146 c.Messages().AppendError("Username is required and can't be more than 250 characters") 147 } 148 149 if data.Password != "" { 150 if user.Password, err = utils.GenerateHash(data.Password); err != nil { 151 c.WithError("Error generating password hash", err) 152 return user 153 } 154 } 155 156 return user 157 }