Add permissions helper functions
This commit is contained in:
parent
f6ffe04b18
commit
27aa61b75b
1 changed files with 118 additions and 0 deletions
118
helpers/permissions.go
Normal file
118
helpers/permissions.go
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
package helpers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.readonly.ch/bouzoure/pop-camarades/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Permissions = []string{
|
||||||
|
// Members
|
||||||
|
"show_member",
|
||||||
|
"create_member",
|
||||||
|
"edit_member",
|
||||||
|
"show_archived_member",
|
||||||
|
"archive_member",
|
||||||
|
"restore_member",
|
||||||
|
"purge_member",
|
||||||
|
"convert_member_to_contact",
|
||||||
|
// Contacts
|
||||||
|
"show_contact",
|
||||||
|
"create_contact",
|
||||||
|
"edit_contact",
|
||||||
|
"show_archived_contact",
|
||||||
|
"archive_contact",
|
||||||
|
"restore_contact",
|
||||||
|
"purge_contact",
|
||||||
|
"convert_contact_to_member",
|
||||||
|
}
|
||||||
|
|
||||||
|
func PermissionsGetSections(userid uint, permission string) ([]uint, error) {
|
||||||
|
var sections []uint
|
||||||
|
|
||||||
|
found := false
|
||||||
|
for _, item := range Permissions {
|
||||||
|
if item == permission {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
return sections, fmt.Errorf("unknown permission")
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := GetDatabase()
|
||||||
|
if err != nil {
|
||||||
|
return sections, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var user models.User
|
||||||
|
result := db.Find(&user, "id = ?", userid)
|
||||||
|
|
||||||
|
if result.RowsAffected < 1 {
|
||||||
|
return sections, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if user.IsAdmin {
|
||||||
|
var allSections []models.Section
|
||||||
|
db.Find(&allSections)
|
||||||
|
|
||||||
|
for _, s := range allSections {
|
||||||
|
sections = append(sections, s.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sections, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var userRoles []models.UserRole
|
||||||
|
result = db.Joins(
|
||||||
|
"Role",
|
||||||
|
).Find(
|
||||||
|
&userRoles,
|
||||||
|
fmt.Sprintf(
|
||||||
|
"user_id = ? AND Role__%s = ?",
|
||||||
|
permission,
|
||||||
|
),
|
||||||
|
userid,
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.RowsAffected < 1 {
|
||||||
|
return sections, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, userRole := range userRoles {
|
||||||
|
sections = append(sections, userRole.SectionID)
|
||||||
|
|
||||||
|
var childSections []models.Section
|
||||||
|
db.Find(
|
||||||
|
&childSections,
|
||||||
|
"parent_section_id = ?",
|
||||||
|
userRole.SectionID,
|
||||||
|
)
|
||||||
|
|
||||||
|
for _, childSection := range childSections {
|
||||||
|
sections = append(sections, childSection.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sections, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func PermissionsCheckSection(userid uint, permission string, section uint) (bool, error) {
|
||||||
|
sections, err := PermissionsGetSections(userid, permission)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
allow := false
|
||||||
|
for _, s := range sections {
|
||||||
|
if s == section {
|
||||||
|
allow = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allow, nil
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue