complete role crud

This commit is contained in:
yanghao05
2023-02-04 19:54:29 +08:00
parent 2fb6bba903
commit 285e1f1c51
13 changed files with 270 additions and 19 deletions

View File

@@ -5,6 +5,7 @@ import (
"atom/modules/auth/controller"
"atom/modules/auth/dao"
"atom/modules/auth/routes"
"atom/modules/auth/service"
"log"
"go.uber.org/dig"
@@ -22,6 +23,9 @@ func init() {
}
//service
if err := container.Container.Provide(service.NewRoleService); err != nil {
log.Fatal(err)
}
// dao
if err := container.Container.Provide(dao.NewRoleDao); err != nil {

View File

@@ -1,28 +1,50 @@
package controller
import (
"atom/common/request"
"atom/common/response"
"atom/database/models"
"atom/modules/auth/dto"
"atom/providers/config"
"atom/modules/auth/service"
"github.com/gin-gonic/gin"
)
type RoleController interface {
GetName(*gin.Context) (string, error)
GetByFilter(*gin.Context, dto.RoleRequestFilter, request.PageFilter) (*response.PageResponse[*models.SysRole], error)
Create(*gin.Context, dto.RoleRequestForm) error
Delete(*gin.Context, int) error
UpdateByID(*gin.Context, int, dto.RoleRequestForm) error
}
type roleControllerImpl struct {
conf *config.Config
roleSvc service.RoleService
}
func NewRoleController(conf *config.Config) RoleController {
return &roleControllerImpl{conf: conf}
func NewRoleController(
roleSvc service.RoleService,
) RoleController {
return &roleControllerImpl{
roleSvc: roleSvc,
}
}
func (c *roleControllerImpl) GetName(ctx *gin.Context) (string, error) {
return "Role", nil
func (c *roleControllerImpl) GetByFilter(
ctx *gin.Context,
filter dto.RoleRequestFilter,
page request.PageFilter,
) (*response.PageResponse[*models.SysRole], error) {
return c.roleSvc.GetByFilter(ctx, filter, page)
}
func (c *roleControllerImpl) Create(ctx *gin.Context, req *dto.RoleCreateRequest) error {
return nil
func (c *roleControllerImpl) Create(ctx *gin.Context, req dto.RoleRequestForm) error {
_, err := c.roleSvc.Create(ctx, req)
return err
}
func (c *roleControllerImpl) UpdateByID(ctx *gin.Context, id int, req dto.RoleRequestForm) error {
_, err := c.roleSvc.UpdateByID(ctx, uint64(id), req)
return err
}
func (c *roleControllerImpl) Delete(ctx *gin.Context, id int) error {
return c.roleSvc.DeleteByID(ctx, uint64(id))
}

View File

@@ -1,12 +1,15 @@
package dao
import (
"atom/common/request"
"atom/database/models"
"atom/database/query"
"atom/modules/auth/dto"
"context"
)
type RoleDao interface {
GetByFilter(context.Context, dto.RoleRequestFilter, request.PageFilter) ([]*models.SysRole, uint64, error)
FindByID(context.Context, uint64) (*models.SysRole, error)
Create(context.Context, *models.SysRole) (*models.SysRole, error)
UpdateByID(context.Context, *models.SysRole) (*models.SysRole, error)
@@ -22,6 +25,35 @@ func NewRoleDao(query *query.Query) RoleDao {
return &roleDaoImpl{query: query}
}
func (dao *roleDaoImpl) GetByFilter(ctx context.Context, filter dto.RoleRequestFilter, page request.PageFilter) ([]*models.SysRole, uint64, error) {
role := dao.query.SysRole
query := role.WithContext(ctx)
if filter.DefaultRouter != nil {
query = query.Where(role.DefaultRouter.Eq(*filter.DefaultRouter))
}
if filter.Name != nil {
query = query.Where(role.Name.Like(*filter.Name))
}
if filter.ParentID != nil {
query = query.Where(role.ParentID.Eq(uint64(*filter.ParentID)))
}
total, err := query.Count()
if err != nil {
return nil, 0, err
}
items, err := query.Find()
if err != nil {
return nil, 0, err
}
return items, uint64(total), nil
}
func (dao *roleDaoImpl) FindByID(ctx context.Context, id uint64) (*models.SysRole, error) {
role := dao.query.SysRole
return role.WithContext(ctx).Where(role.ID.Eq(id)).First()

View File

@@ -1,7 +1,12 @@
package dto
type RoleCreateRequest struct {
UUID string `json:"alias,omitempty"`
type RoleRequestFilter struct {
Name *string `form:"name"`
ParentID *uint `form:"parent_id"`
DefaultRouter *string `form:"default_router"`
}
type RoleRequestForm struct {
Name string `json:"name,omitempty"`
ParentID uint `json:"parent_id,omitempty"`
DefaultRouter string `json:"default_router,omitempty"`

View File

@@ -1,8 +1,11 @@
package routes
import (
"atom/common/err"
"atom/common/request"
"atom/contracts"
"atom/modules/auth/controller"
"atom/modules/auth/dto"
"atom/providers/http"
"github.com/rogeecn/gen"
@@ -29,9 +32,29 @@ func NewRoute(
func (r *Route) Register() {
group := r.svc.Engine.Group("auth")
{
roleGroup := group.Group("role")
roleGroup := group.Group("roles")
{
roleGroup.GET("/roles", gen.DataFunc(r.role.GetName))
roleGroup.GET("", gen.DataFunc2(
r.role.GetByFilter,
gen.BindQuery(dto.RoleRequestFilter{}, err.BindQueryFailed),
gen.BindQuery(request.PageFilter{}, err.BindQueryFailed),
))
roleGroup.POST("", gen.Func1(
r.role.Create,
gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed),
))
roleGroup.PUT("/:id", gen.Func2(
r.role.UpdateByID,
gen.Int("role_id", err.BindPathFailed.Format("id")),
gen.BindBody(dto.RoleRequestForm{}, err.BindBodyFailed),
))
roleGroup.DELETE("/:id", gen.Func1(
r.role.Delete,
gen.Int("role_id", err.BindPathFailed.Format("id")),
))
}
permissionGroup := group.Group("permission")

View File

@@ -1,20 +1,75 @@
package service
import (
"atom/common/request"
"atom/common/response"
"atom/database/models"
"atom/modules/auth/dao"
"atom/modules/auth/dto"
"atom/providers/uuid"
"context"
)
type RoleService interface {
Create(ctx context.Context) error
GetByFilter(context.Context, dto.RoleRequestFilter, request.PageFilter) (*response.PageResponse[*models.SysRole], error)
Create(context.Context, dto.RoleRequestForm) (*models.SysRole, error)
UpdateByID(context.Context, uint64, dto.RoleRequestForm) (*models.SysRole, error)
DeleteByID(context.Context, uint64) error
}
type roleService struct {
dao dao.RoleDao
uuid *uuid.Generator
}
func NewRoleService() RoleService {
return &roleService{}
func NewRoleService(
dao dao.RoleDao,
uuid *uuid.Generator,
) RoleService {
return &roleService{
dao: dao,
uuid: uuid,
}
}
func (svc *roleService) Create(ctx context.Context) error {
return nil
func (svc *roleService) GetByFilter(
ctx context.Context,
filter dto.RoleRequestFilter,
page request.PageFilter,
) (*response.PageResponse[*models.SysRole], error) {
items, count, err := svc.dao.GetByFilter(ctx, filter, page)
if err != nil {
return nil, err
}
return &response.PageResponse[*models.SysRole]{
Items: items,
Total: count,
}, nil
}
func (svc *roleService) Create(ctx context.Context, req dto.RoleRequestForm) (*models.SysRole, error) {
model := models.SysRole{
UUID: svc.uuid.MustGenerate(),
Name: req.Name,
ParentID: uint64(req.ParentID),
DefaultRouter: req.DefaultRouter,
}
return svc.dao.Create(ctx, &model)
}
func (svc *roleService) UpdateByID(ctx context.Context, id uint64, req dto.RoleRequestForm) (*models.SysRole, error) {
model, err := svc.dao.FindByID(ctx, id)
if err != nil {
return nil, err
}
model.Name = req.Name
model.ParentID = uint64(req.ParentID)
model.DefaultRouter = req.DefaultRouter
return svc.dao.UpdateByID(ctx, model)
}
func (svc *roleService) DeleteByID(ctx context.Context, id uint64) error {
return svc.dao.DeleteByID(ctx, id)
}