160 lines
3.6 KiB
Go
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
|
|
}
|