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  }