167 lines
4.1 KiB
Go
167 lines
4.1 KiB
Go
package repositories
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/niangaodev/art-code/config"
|
|
"github.com/niangaodev/art-code/models"
|
|
)
|
|
|
|
// GetRoles 获取所有角色
|
|
func GetRoles() ([]models.Role, error) {
|
|
query := "SELECT id, name, description, created_at, updated_at FROM roles"
|
|
rows, err := config.DB.Query(query)
|
|
if err != nil {
|
|
log.Printf("Error getting roles: %v", err)
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var roles []models.Role
|
|
for rows.Next() {
|
|
var role models.Role
|
|
if err := rows.Scan(&role.ID, &role.Name, &role.Description, &role.CreatedAt, &role.UpdatedAt); err != nil {
|
|
log.Printf("Error scanning role: %v", err)
|
|
continue
|
|
}
|
|
|
|
// 获取权限
|
|
permissions, _ := GetPermissionsByRoleID(role.ID)
|
|
role.Permissions = permissions
|
|
|
|
roles = append(roles, role)
|
|
}
|
|
|
|
return roles, nil
|
|
}
|
|
|
|
// GetRoleByID 根据ID获取角色
|
|
func GetRoleByID(id uint) (*models.Role, error) {
|
|
query := "SELECT id, name, description, created_at, updated_at FROM roles WHERE id = ?"
|
|
row := config.DB.QueryRow(query, id)
|
|
|
|
var role models.Role
|
|
if err := row.Scan(&role.ID, &role.Name, &role.Description, &role.CreatedAt, &role.UpdatedAt); err != nil {
|
|
log.Printf("Error getting role by ID: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
// 获取权限
|
|
permissions, _ := GetPermissionsByRoleID(role.ID)
|
|
role.Permissions = permissions
|
|
|
|
return &role, nil
|
|
}
|
|
|
|
// GetRoleByName 根据名称获取角色
|
|
func GetRoleByName(name string) (*models.Role, error) {
|
|
query := "SELECT id, name, description, created_at, updated_at FROM roles WHERE name = ?"
|
|
row := config.DB.QueryRow(query, name)
|
|
|
|
var role models.Role
|
|
if err := row.Scan(&role.ID, &role.Name, &role.Description, &role.CreatedAt, &role.UpdatedAt); err != nil {
|
|
log.Printf("Error getting role by name: %v", err)
|
|
return nil, err
|
|
}
|
|
|
|
return &role, nil
|
|
}
|
|
|
|
// CreateRole 创建角色
|
|
func CreateRole(role *models.Role) error {
|
|
query := "INSERT INTO roles (name, description, created_at, updated_at) VALUES (?, ?, NOW(), NOW())"
|
|
result, err := config.DB.Exec(query, role.Name, role.Description)
|
|
if err != nil {
|
|
log.Printf("Error creating role: %v", err)
|
|
return err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
role.ID = uint(id)
|
|
role.CreatedAt = time.Now()
|
|
role.UpdatedAt = time.Now()
|
|
|
|
return nil
|
|
}
|
|
|
|
// UpdateRole 更新角色
|
|
func UpdateRole(role *models.Role) error {
|
|
query := "UPDATE roles SET name = ?, description = ?, updated_at = NOW() WHERE id = ?"
|
|
_, err := config.DB.Exec(query, role.Name, role.Description, role.ID)
|
|
if err != nil {
|
|
log.Printf("Error updating role: %v", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteRole 删除角色
|
|
func DeleteRole(id uint) error {
|
|
query := "DELETE FROM roles WHERE id = ?"
|
|
_, err := config.DB.Exec(query, id)
|
|
if err != nil {
|
|
log.Printf("Error deleting role: %v", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// AssignPermissionsToRole 给角色分配权限
|
|
func AssignPermissionsToRole(roleID uint, permissionIDs []uint) error {
|
|
// 开启事务
|
|
tx, err := config.DB.Begin()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 先删除旧权限
|
|
_, err = tx.Exec("DELETE FROM role_permissions WHERE role_id = ?", roleID)
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
// 插入新权限
|
|
stmt, err := tx.Prepare("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)")
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
for _, permID := range permissionIDs {
|
|
_, err = stmt.Exec(roleID, permID)
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
}
|
|
|
|
return tx.Commit()
|
|
}
|
|
|
|
// BuildRoleResponse 构建角色响应
|
|
func BuildRoleResponse(role *models.Role) *models.RoleResponse {
|
|
return &models.RoleResponse{
|
|
ID: role.ID,
|
|
Name: role.Name,
|
|
Description: role.Description,
|
|
Permissions: BuildPermissionsResponse(role.Permissions),
|
|
CreatedAt: role.CreatedAt.Format("2006-01-02 15:04:05"),
|
|
UpdatedAt: role.UpdatedAt.Format("2006-01-02 15:04:05"),
|
|
}
|
|
}
|
|
|
|
// BuildRolesResponse 构建角色列表响应
|
|
func BuildRolesResponse(roles []models.Role) []models.RoleResponse {
|
|
var responses []models.RoleResponse
|
|
for _, role := range roles {
|
|
responses = append(responses, *BuildRoleResponse(&role))
|
|
}
|
|
return responses
|
|
}
|