2024-08-05 09:11:43 +00:00
|
|
|
package svc
|
|
|
|
|
2024-08-12 14:20:13 +00:00
|
|
|
import (
|
|
|
|
"ark-permission/internal/config"
|
2024-08-19 16:59:38 +00:00
|
|
|
"ark-permission/internal/domain"
|
2024-08-12 14:20:13 +00:00
|
|
|
"ark-permission/internal/domain/repository"
|
2024-08-18 14:09:51 +00:00
|
|
|
domainUseCase "ark-permission/internal/domain/usecase"
|
2024-08-19 16:59:38 +00:00
|
|
|
"ark-permission/internal/entity"
|
2024-08-12 14:20:13 +00:00
|
|
|
"ark-permission/internal/lib/required"
|
2024-08-18 14:09:51 +00:00
|
|
|
"ark-permission/internal/model"
|
2024-08-12 14:20:13 +00:00
|
|
|
repo "ark-permission/internal/repository"
|
2024-08-18 14:09:51 +00:00
|
|
|
"ark-permission/internal/usecase"
|
2024-08-12 14:20:13 +00:00
|
|
|
ers "code.30cm.net/wanderland/library-go/errors"
|
|
|
|
"code.30cm.net/wanderland/library-go/errors/code"
|
2024-08-18 14:09:51 +00:00
|
|
|
"context"
|
2024-08-12 14:20:13 +00:00
|
|
|
"github.com/zeromicro/go-zero/core/stores/redis"
|
2024-08-18 14:09:51 +00:00
|
|
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
2024-08-12 14:20:13 +00:00
|
|
|
)
|
2024-08-05 09:11:43 +00:00
|
|
|
|
|
|
|
type ServiceContext struct {
|
|
|
|
Config config.Config
|
2024-08-12 14:20:13 +00:00
|
|
|
|
|
|
|
Validate required.Validate
|
|
|
|
Redis redis.Redis
|
|
|
|
TokenRedisRepo repository.TokenRepository
|
2024-08-18 14:09:51 +00:00
|
|
|
PolicyAgent domainUseCase.OpaUseCase
|
2024-08-19 16:59:38 +00:00
|
|
|
PermissionTree usecase.PermissionTree
|
2024-08-19 01:39:05 +00:00
|
|
|
|
2024-08-19 16:59:38 +00:00
|
|
|
Conn sqlx.SqlConn
|
|
|
|
Permission model.PermissionModel
|
|
|
|
RoleRepo model.RoleModel
|
|
|
|
RolePermissionRepo model.RolePermissionModel
|
2024-08-05 09:11:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
2024-08-12 14:20:13 +00:00
|
|
|
newRedis, err := redis.NewRedis(c.RedisCluster, redis.Cluster())
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-08-18 14:09:51 +00:00
|
|
|
|
2024-08-12 14:20:13 +00:00
|
|
|
ers.Scope = code.CloudEPPermission
|
2024-08-18 14:09:51 +00:00
|
|
|
sqlConn := sqlx.NewMysql(c.DB.DsnString)
|
|
|
|
|
|
|
|
pa, err := usecase.NewOpaUseCase(usecase.OpaUseCaseParam{})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
// TODO policy 權限還要再組合過,我的角度會把 UID 當成一種 RoleID 這樣就可以針對每一個人克制權限,,初期也可以使用最簡安的來做統一,再想一下
|
|
|
|
err = pa.LoadPolicy(context.Background(), []domainUseCase.Policy{})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-08-12 14:20:13 +00:00
|
|
|
|
2024-08-19 16:59:38 +00:00
|
|
|
t := usecase.NewPermissionTree()
|
|
|
|
pm := model.NewPermissionModel(sqlConn)
|
|
|
|
permission, err := pm.FindAllOpenPermission(context.Background())
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, item := range permission {
|
|
|
|
err := t.AddPermission(item.Id, entity.Permission{
|
|
|
|
ID: item.Id,
|
|
|
|
Parent: item.Parent.Int64,
|
|
|
|
Name: item.Name,
|
|
|
|
HTTPPath: item.HttpPath,
|
|
|
|
HTTPMethod: item.HttpMethod,
|
|
|
|
|
|
|
|
Status: int(item.Status),
|
|
|
|
Type: domain.PermissionType(item.Type),
|
|
|
|
CreateTime: item.CreateTime,
|
|
|
|
UpdateTime: item.UpdateTime,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
2024-08-05 09:11:43 +00:00
|
|
|
return &ServiceContext{
|
2024-08-12 14:20:13 +00:00
|
|
|
Config: c,
|
|
|
|
Validate: required.MustValidator(),
|
|
|
|
Redis: *newRedis,
|
|
|
|
TokenRedisRepo: repo.NewTokenRepository(repo.TokenRepositoryParam{
|
|
|
|
Store: newRedis,
|
|
|
|
}),
|
2024-08-19 16:59:38 +00:00
|
|
|
PolicyAgent: pa,
|
|
|
|
PermissionTree: *t,
|
|
|
|
Permission: pm,
|
|
|
|
RoleRepo: model.NewRoleModel(sqlConn),
|
|
|
|
RolePermissionRepo: model.NewRolePermissionModel(sqlConn),
|
|
|
|
Conn: sqlConn,
|
2024-08-05 09:11:43 +00:00
|
|
|
}
|
|
|
|
}
|