197 lines
4.0 KiB
Go
197 lines
4.0 KiB
Go
package permission
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
|
|
"git.selly.red/Selly-Modules/mongodb"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
"git.selly.red/Selly-Modules/usermngmt/internal"
|
|
"git.selly.red/Selly-Modules/usermngmt/model"
|
|
)
|
|
|
|
// Create ...
|
|
func Create(payload model.PermissionCreateOptions) (result string, err error) {
|
|
var (
|
|
ctx = context.Background()
|
|
)
|
|
|
|
// Validate payload
|
|
if err = payload.Validate(); err != nil {
|
|
return
|
|
}
|
|
|
|
// New permission data from payload
|
|
doc := newPermission(payload)
|
|
|
|
// Create permission
|
|
if err = create(ctx, doc); err != nil {
|
|
return
|
|
}
|
|
|
|
result = doc.ID.Hex()
|
|
return
|
|
}
|
|
|
|
// newPermission ...
|
|
func newPermission(payload model.PermissionCreateOptions) model.DBPermission {
|
|
timeNow := internal.Now()
|
|
roleID, _ := mongodb.NewIDFromString(payload.RoleID)
|
|
return model.DBPermission{
|
|
ID: mongodb.NewObjectID(),
|
|
Name: payload.Name,
|
|
Code: payload.Code,
|
|
RoleID: roleID,
|
|
Desc: payload.Desc,
|
|
CreatedAt: timeNow,
|
|
UpdatedAt: timeNow,
|
|
}
|
|
}
|
|
|
|
// Update ...
|
|
func Update(permissionID string, payload model.PermissionUpdateOptions) error {
|
|
var (
|
|
ctx = context.Background()
|
|
)
|
|
|
|
// Validate payload
|
|
if err := payload.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Find permissionID exists or not
|
|
id, isValid := mongodb.NewIDFromString(permissionID)
|
|
if !isValid {
|
|
return errors.New(internal.ErrorInvalidPermission)
|
|
}
|
|
if !isPermissionIDExisted(ctx, id) {
|
|
return errors.New(internal.ErrorNotFoundPermission)
|
|
}
|
|
|
|
// Setup condition
|
|
cond := bson.M{
|
|
"_id": id,
|
|
}
|
|
|
|
// Setup update data
|
|
roleID, _ := mongodb.NewIDFromString(payload.RoleID)
|
|
updateData := bson.M{
|
|
"$set": bson.M{
|
|
"name": payload.Name,
|
|
"code": payload.Code,
|
|
"roleId": roleID,
|
|
"desc": payload.Desc,
|
|
"updatedAt": internal.Now(),
|
|
},
|
|
}
|
|
|
|
// Update
|
|
if err := updateOneByCondition(ctx, cond, updateData); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Delete ...
|
|
func Delete(permissionID string) error {
|
|
var (
|
|
ctx = context.Background()
|
|
)
|
|
|
|
// Find permissionID exists or not
|
|
id, isValid := mongodb.NewIDFromString(permissionID)
|
|
if !isValid {
|
|
return errors.New(internal.ErrorInvalidPermission)
|
|
}
|
|
if !isPermissionIDExisted(ctx, id) {
|
|
return errors.New(internal.ErrorNotFoundPermission)
|
|
}
|
|
|
|
// Delete
|
|
if err := deleteOneByCondition(ctx, bson.M{"_id": id}); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func FindByIDAndDelete(permissionID string) (*model.Permission, error) {
|
|
var (
|
|
ctx = context.Background()
|
|
)
|
|
|
|
// Find permissionID exists or not
|
|
id, isValid := mongodb.NewIDFromString(permissionID)
|
|
if !isValid {
|
|
return nil, errors.New(internal.ErrorInvalidPermission)
|
|
}
|
|
cond := bson.M{"_id": id}
|
|
doc, err := findOneAndDelete(ctx, cond)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
res := getResponse(doc)
|
|
return &res, nil
|
|
}
|
|
|
|
// All ...
|
|
func All(queryParams model.PermissionAllQuery) (r model.PermissionAll) {
|
|
var (
|
|
ctx = context.Background()
|
|
wg sync.WaitGroup
|
|
cond = bson.M{}
|
|
)
|
|
query := model.CommonQuery{
|
|
Page: queryParams.Page,
|
|
Limit: queryParams.Limit,
|
|
Sort: queryParams.Sort,
|
|
RoleID: queryParams.RoleID,
|
|
}
|
|
|
|
// Assign condition
|
|
query.SetDefaultLimit()
|
|
query.AssignRoleID(cond)
|
|
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
docs := findByCondition(ctx, cond, query.GetFindOptionsUsingPage())
|
|
r.List = getResponseList(docs)
|
|
}()
|
|
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
r.Total = countByCondition(ctx, cond)
|
|
}()
|
|
|
|
wg.Wait()
|
|
|
|
r.Limit = query.Limit
|
|
return
|
|
}
|
|
|
|
func getResponseList(permissions []model.DBPermission) []model.Permission {
|
|
res := make([]model.Permission, 0)
|
|
for _, permission := range permissions {
|
|
res = append(res, getResponse(permission))
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func getResponse(permission model.DBPermission) model.Permission {
|
|
return model.Permission{
|
|
ID: permission.ID.Hex(),
|
|
Name: permission.Name,
|
|
Code: permission.Code,
|
|
RoleID: permission.RoleID.Hex(),
|
|
Desc: permission.Desc,
|
|
CreatedAt: permission.CreatedAt,
|
|
UpdatedAt: permission.UpdatedAt,
|
|
}
|
|
}
|