wpw-final/internal/biz/core/handler_users.go
2022-12-02 20:40:23 +07:00

160 lines
3.6 KiB
Go

package coresvc
import (
"context"
"crypto/ed25519"
"wpw-common/pkg/gen/biz/core"
"wpw-common/pkg/gen/biz/core/structs"
"gorm.io/gorm"
)
var _ core.CoreService = (*CoreService)(nil)
func (c *CoreService) GetUserList(ctx context.Context, request *structs.GetUserListRequest) (r *structs.GetUserListResponse, err error) {
c.logger.Infow("get users request", "req", request)
var user *structs.User
if user, err = c.getAndCheckSessionAdmin(ctx); err != nil {
err = c.wrapServiceError(err)
return
}
_ = user
if err = c.checkRequest(ctx, request); err != nil {
return
}
r = structs.NewGetUserListResponse()
r.Pagination = request.Pagination
// query scopes
scopes := []scopeFunc{
c.ScPaginate(request.Pagination),
}
// using search term
if searchTerm := request.SearchTerm; searchTerm != "" {
scopes = append(scopes, c.ScSearchTerm(request.SearchTerm,
"username", "display_name"))
}
// get users
tx := c.db.Scopes(scopes...).
Preload("Roles").
Find(&r.Users)
if err = tx.Error; err != nil {
err = c.wrapServiceError(err)
return
}
// get total users count
tx = c.db.Model(structs.User{}).Count(&r.TotalUsers)
if err = tx.Error; err != nil {
err = c.wrapServiceError(err)
return
}
// strip users data
for _, user := range r.Users {
c.stripConfidentialUserData(user)
}
return
}
func (c *CoreService) CreateUser(ctx context.Context, request *structs.CreateUserRequest) (r *structs.CreateUserResponse, err error) {
c.logger.Infow("create user request", "req", request)
var user *structs.User
if user, err = c.getAndCheckSessionAdmin(ctx); err != nil {
return
}
_ = user
// validate
requestUser := request.User
if err = c.checkRequest(ctx, requestUser); err != nil {
return
}
daoUser := structs.NewUser()
// pass necessary data.
daoUser.Username = requestUser.Username
daoUser.Password = c.passwordHasher(requestUser.Password)
daoUser.DisplayName = requestUser.DisplayName
var (
pri ed25519.PrivateKey
pub ed25519.PublicKey
)
if pri, pub, err = c.getEd25519KeyPair(); err != nil {
err = c.wrapServiceError(err)
return
}
daoUser.PrivateKey = pri
daoUser.PublicKey = pub
tx := c.db.Create(daoUser)
if err = tx.Error; err != nil {
err = c.wrapServiceError(err)
return
}
r = structs.NewCreateUserResponse()
return
}
func (c *CoreService) DeleteUsers(ctx context.Context, request *structs.DeleteUsersRequest) (r *structs.DeleteUsersResponse, err error) {
c.logger.Infow("delete users request", "req", request)
var user *structs.User
if user, err = c.getAndCheckSessionAdmin(ctx); err != nil {
return
}
_ = user
if err = c.checkRequest(ctx, request); err != nil {
return
}
var targetUsers []*structs.User
tx := c.db.
Where("id IN ?", request.UserIds).Select("id").
Preload("Roles").
Find(&targetUsers)
if err = tx.Error; err != nil {
err = c.wrapServiceError(err)
return
}
var qualifiedTargetUsers []*structs.User
var (
idsSuccess []int64
idsIgnored []int64
)
err = c.db.Transaction(func(tx *gorm.DB) (err error) {
for _, targetUser := range targetUsers {
if targetUser.ID == user.ID || c.isSystemUser(targetUser) {
idsIgnored = append(idsIgnored, targetUser.ID)
continue
}
qualifiedTargetUsers = append(qualifiedTargetUsers, targetUser)
idsSuccess = append(idsSuccess, targetUser.ID)
}
if len(qualifiedTargetUsers) <= 0 {
// has nothing to do with.
return
}
tx = tx.Delete(qualifiedTargetUsers)
if err = tx.Error; err != nil {
return
}
return
})
if err != nil {
err = c.wrapServiceError(err)
return
}
r = structs.NewDeleteUsersResponse()
r.Success = idsSuccess
r.Ignored = idsIgnored
return
}