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() }