party/internal/data/permissions.go

53 lines
1.0 KiB
Go

package data
import (
"context"
"database/sql"
"time"
)
type Permissions []string
func (p Permissions) Include(code string) bool {
for i := range p {
if code == p[i] {
return true
}
}
return false
}
type PermissionModel struct {
DB *sql.DB
}
func (m PermissionModel) GetAllForUser(userID int64) (Permissions, error) {
query := `
SELECT permissions.code
FROM permissions
INNER JOIN roles_permissions ON roles_permissions.permission_id = permissions.id
INNER JOIN roles ON roles_permissions.role_id = roles.id
INNER JOIN users_roles ON users_roles.role_id = roles.id
WHERE users_roles.user_id = $1`
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
rows, err := m.DB.QueryContext(ctx, query, userID)
if err != nil {
return nil, err
}
defer rows.Close()
var permissions Permissions
for rows.Next() {
var permission string
if err := rows.Scan(&permission); err != nil {
return nil, err
}
permissions = append(permissions, permission)
}
return permissions, rows.Err()
}