Files
nl-blogs/server/repositories/role_repository.go
2026-01-15 13:51:44 +08:00

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
}