fixed authorization
This commit is contained in:
@@ -0,0 +1,229 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"authorization/models"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type PermissionRepository struct {
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
func NewPermissionRepository(db *sql.DB) *PermissionRepository {
|
||||
return &PermissionRepository{db: db}
|
||||
}
|
||||
|
||||
// GetPermissionByResourceAndAction finds a permission by resource and action
|
||||
func (r *PermissionRepository) GetPermissionByResourceAndAction(resource, action string) (*models.Permission, error) {
|
||||
query := `
|
||||
SELECT id, permission_name, description, resource, action
|
||||
FROM permissions
|
||||
WHERE resource = ? AND action = ?
|
||||
LIMIT 1
|
||||
`
|
||||
|
||||
var perm models.Permission
|
||||
err := r.db.QueryRow(query, resource, action).Scan(
|
||||
&perm.ID,
|
||||
&perm.PermissionName,
|
||||
&perm.Description,
|
||||
&perm.Resource,
|
||||
&perm.Action,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, fmt.Errorf("permission not found for resource=%s, action=%s", resource, action)
|
||||
}
|
||||
return nil, fmt.Errorf("error querying permission: %w", err)
|
||||
}
|
||||
|
||||
return &perm, nil
|
||||
}
|
||||
|
||||
// GetPolicyAttributesByPermission retrieves all policy attributes for a permission
|
||||
func (r *PermissionRepository) GetPolicyAttributesByPermission(permissionID int) ([]models.PolicyAttribute, error) {
|
||||
query := `
|
||||
SELECT id, attribute_name, attribute_type, comparison, attribute_value, permission_id
|
||||
FROM policy_attributes
|
||||
WHERE permission_id = ?
|
||||
`
|
||||
|
||||
rows, err := r.db.Query(query, permissionID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error querying policy attributes: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var attributes []models.PolicyAttribute
|
||||
for rows.Next() {
|
||||
var attr models.PolicyAttribute
|
||||
err := rows.Scan(
|
||||
&attr.ID,
|
||||
&attr.AttributeName,
|
||||
&attr.AttributeType,
|
||||
&attr.Comparison,
|
||||
&attr.AttributeValue,
|
||||
&attr.PermissionID,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error scanning policy attribute: %w", err)
|
||||
}
|
||||
attributes = append(attributes, attr)
|
||||
}
|
||||
|
||||
return attributes, nil
|
||||
}
|
||||
|
||||
// GetUserAttributes retrieves all attributes for a user
|
||||
func (r *PermissionRepository) GetUserAttributes(userID string) (map[string]string, error) {
|
||||
query := `
|
||||
SELECT attribute_name, attribute_value
|
||||
FROM user_attributes
|
||||
WHERE user_id = ?
|
||||
`
|
||||
|
||||
rows, err := r.db.Query(query, userID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error querying user attributes: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
attributes := make(map[string]string)
|
||||
for rows.Next() {
|
||||
var name, value string
|
||||
err := rows.Scan(&name, &value)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error scanning user attribute: %w", err)
|
||||
}
|
||||
attributes[name] = value
|
||||
}
|
||||
|
||||
return attributes, nil
|
||||
}
|
||||
|
||||
// GetUserByID retrieves user details
|
||||
func (r *PermissionRepository) GetUserByID(userID string) (*models.User, error) {
|
||||
query := `
|
||||
SELECT user_id, first_name, middle_name, last_name, suffix, email_address,
|
||||
account_type, emp_id, reg, prov, aProv, mun, bgy, is_logged_in,
|
||||
first_logged_in, address, contact_number, device_id, role_id,
|
||||
role_dps, is_deleted, secret_key, is_activated, created_at, updated_at
|
||||
FROM users
|
||||
WHERE user_id = ? AND is_deleted = 'N'
|
||||
LIMIT 1
|
||||
`
|
||||
|
||||
var user models.User
|
||||
err := r.db.QueryRow(query, userID).Scan(
|
||||
&user.UserID,
|
||||
&user.FirstName,
|
||||
&user.MiddleName,
|
||||
&user.LastName,
|
||||
&user.Suffix,
|
||||
&user.EmailAddress,
|
||||
&user.AccountType,
|
||||
&user.EmpID,
|
||||
&user.Reg,
|
||||
&user.Prov,
|
||||
&user.AProv,
|
||||
&user.Mun,
|
||||
&user.Bgy,
|
||||
&user.IsLoggedIn,
|
||||
&user.FirstLoggedIn,
|
||||
&user.Address,
|
||||
&user.ContactNumber,
|
||||
&user.DeviceID,
|
||||
&user.RoleID,
|
||||
&user.RoleDPS,
|
||||
&user.IsDeleted,
|
||||
&user.SecretKey,
|
||||
&user.IsActivated,
|
||||
&user.CreatedAt,
|
||||
&user.UpdatedAt,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, fmt.Errorf("user not found: %s", userID)
|
||||
}
|
||||
return nil, fmt.Errorf("error querying user: %w", err)
|
||||
}
|
||||
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
// GetAllPermissions retrieves all permissions (for caching)
|
||||
func (r *PermissionRepository) GetAllPermissions() ([]models.Permission, error) {
|
||||
query := `
|
||||
SELECT id, permission_name, description, resource, action
|
||||
FROM permissions
|
||||
ORDER BY id
|
||||
`
|
||||
|
||||
rows, err := r.db.Query(query)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error querying all permissions: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var permissions []models.Permission
|
||||
for rows.Next() {
|
||||
var perm models.Permission
|
||||
err := rows.Scan(
|
||||
&perm.ID,
|
||||
&perm.PermissionName,
|
||||
&perm.Description,
|
||||
&perm.Resource,
|
||||
&perm.Action,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error scanning permission: %w", err)
|
||||
}
|
||||
permissions = append(permissions, perm)
|
||||
}
|
||||
|
||||
return permissions, nil
|
||||
}
|
||||
|
||||
// GetAllPolicyAttributes retrieves all policy attributes (for caching)
|
||||
func (r *PermissionRepository) GetAllPolicyAttributes() (map[int][]models.PolicyAttribute, error) {
|
||||
query := `
|
||||
SELECT id, attribute_name, attribute_type, comparison, attribute_value, permission_id
|
||||
FROM policy_attributes
|
||||
ORDER BY permission_id, id
|
||||
`
|
||||
|
||||
rows, err := r.db.Query(query)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error querying all policy attributes: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
attributesByPermission := make(map[int][]models.PolicyAttribute)
|
||||
for rows.Next() {
|
||||
var attr models.PolicyAttribute
|
||||
err := rows.Scan(
|
||||
&attr.ID,
|
||||
&attr.AttributeName,
|
||||
&attr.AttributeType,
|
||||
&attr.Comparison,
|
||||
&attr.AttributeValue,
|
||||
&attr.PermissionID,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error scanning policy attribute: %w", err)
|
||||
}
|
||||
attributesByPermission[attr.PermissionID] = append(attributesByPermission[attr.PermissionID], attr)
|
||||
}
|
||||
|
||||
return attributesByPermission, nil
|
||||
}
|
||||
|
||||
// Helper function to parse IN clause values
|
||||
// func parseINValues(value string) []string {
|
||||
// // Remove spaces and split by comma
|
||||
// value = strings.ReplaceAll(value, " ", "")
|
||||
// return strings.Split(value, ",")
|
||||
// }
|
||||
Reference in New Issue
Block a user