mirror of https://github.com/veypi/OneAuth.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
|
1 week ago
|
package user
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/veypi/vbase/cfg"
|
||
|
|
"github.com/veypi/vbase/models"
|
||
|
|
"github.com/veypi/vigo"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
// User specific permissions (data-level or direct assignment)
|
||
|
|
|
||
|
|
type GetPermissionsReq struct {
|
||
|
|
UserID string `src:"path@user_id" desc:"User ID"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func getPermissions(x *vigo.X, req *GetPermissionsReq) ([]models.UserPermission, error) {
|
||
|
|
var userPermissions []models.UserPermission
|
||
|
|
if err := cfg.DB().Where("user_id = ?", req.UserID).Find(&userPermissions).Error; err != nil {
|
||
|
|
return nil, vigo.ErrDatabase.WithError(err)
|
||
|
|
}
|
||
|
|
return userPermissions, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
type UpdatePermissionsReq struct {
|
||
|
|
UserID string `src:"path@user_id" desc:"User ID"`
|
||
|
|
Permissions []struct {
|
||
|
|
PermissionID string `json:"permission_id"`
|
||
|
|
ResourceID string `json:"resource_id"`
|
||
|
|
} `json:"permissions" src:"json" desc:"List of User Permissions"`
|
||
|
|
}
|
||
|
|
|
||
|
|
func updatePermissions(x *vigo.X, req *UpdatePermissionsReq) error {
|
||
|
|
var user models.User
|
||
|
|
if err := cfg.DB().First(&user, "id = ?", req.UserID).Error; err != nil {
|
||
|
|
return vigo.ErrNotFound
|
||
|
|
}
|
||
|
|
|
||
|
|
grantor := ""
|
||
|
|
if uid := x.Get("user_id"); uid != nil {
|
||
|
|
if s, ok := uid.(string); ok {
|
||
|
|
grantor = s
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return cfg.DB().Transaction(func(tx *gorm.DB) error {
|
||
|
|
if err := tx.Where("user_id = ?", req.UserID).Delete(&models.UserPermission{}).Error; err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(req.Permissions) > 0 {
|
||
|
|
userPermissions := make([]models.UserPermission, 0, len(req.Permissions))
|
||
|
|
for _, p := range req.Permissions {
|
||
|
|
userPermissions = append(userPermissions, models.UserPermission{
|
||
|
|
UserID: req.UserID,
|
||
|
|
PermissionID: p.PermissionID,
|
||
|
|
ResourceID: p.ResourceID,
|
||
|
|
GrantedBy: grantor,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
if err := tx.Create(&userPermissions).Error; err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
})
|
||
|
|
}
|