1 Star 0 Fork 0

谈子文/keyauth-tz

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
dao.go 3.57 KB
一键复制 编辑 原始数据 按行查看 历史
谈子文 提交于 2023-10-27 01:41 . 更新policy 和 role api create 功能
package impl
import (
"context"
"fmt"
"gitee.com/talk-about-articles/keyauth-tz/apps/role"
"github.com/infraboard/mcube/exception"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func (s *service) save(ctx context.Context, ins *role.Role) error {
// insertOne 和 insertMany 会根据定义模型的bson标签完成对应的文档类型入库,主要是bson标签
if _, err := s.col.InsertOne(ctx, ins); err != nil {
return exception.NewInternalServerError("inserted role(%s) document error, %s",
ins.Spec.Name, err)
}
return nil
}
// GET,Describe
// filter 过滤器(Collection),类似于mysql的where条件
// 过滤器内容就是按照文档中的任意一个键值对作为过滤条件 完成过滤查询
// 调用Decode方法来进行反序列化 bytes --> Object (查询出来数据的反序列化)
func (s *service) get(ctx context.Context, id string) (*role.Role, error) {
// 以主键的键值对为条件过滤 就是在json串中匹配 "_id: 1" 的json串
filter := bson.M{"_id": id}
ins := role.NewDefaultRole()
// 通过Decode反序列化为Object对象
if err := s.col.FindOne(ctx, filter).Decode(ins); err != nil {
if err == mongo.ErrNoDocuments {
return nil, exception.NewNotFound("role %s not found", id)
}
return nil, exception.NewInternalServerError("find role %s error, %s", id, err)
}
return ins, nil
}
func newQueryRoleRequest(r *role.QueryRoleRequest) *queryRoleRequest {
return &queryRoleRequest{
r,
}
}
type queryRoleRequest struct {
*role.QueryRoleRequest
}
func (r *queryRoleRequest) FindOptions() *options.FindOptions {
pageSize := int64(r.Page.PageSize)
skip := int64(r.Page.PageSize) * int64(r.Page.PageNumber-1)
opt := &options.FindOptions{
// 排序: Order By create_at Desc
Sort: bson.D{
{Key: "create_at", Value: -1},
},
Limit: &pageSize,
Skip: &skip,
}
return opt
}
// 过滤条件
// 由于Mongodb支持嵌套,JSON,如何过滤嵌套里面的条件,使用.访问嵌套对象属性
func (r *queryRoleRequest) FindFilter() bson.M {
filter := bson.M{}
if len(r.RoleNames) > 0 {
// IN ()
filter["spec.name"] = bson.M{"$in": r.RoleNames}
}
return filter
}
func (s *service) query(ctx context.Context, req *queryRoleRequest) (*role.RoleSet, error) {
resp, err := s.col.Find(ctx, req.FindFilter(), req.FindOptions())
if err != nil {
return nil, exception.NewInternalServerError("find role error, error is %s", err)
}
set := role.NewRoleSet()
// 循环
for resp.Next(ctx) {
ins := role.NewDefaultRole()
if err := resp.Decode(ins); err != nil {
return nil, exception.NewInternalServerError("decode role error, error is %s", err)
}
set.Add(ins)
}
// count
count, err := s.col.CountDocuments(ctx, req.FindFilter())
if err != nil {
return nil, exception.NewInternalServerError("get role count error, error is %s", err)
}
set.Total = count
return set, nil
}
func (s *service) update(ctx context.Context, ins *role.Role) error {
if _, err := s.col.UpdateByID(ctx, ins.Id, ins); err != nil {
return exception.NewInternalServerError("inserted role(%s) document error, %s",
ins.Spec.Name, err)
}
return nil
}
func (s *service) deleteRole(ctx context.Context, ins *role.Role) error {
if ins == nil || ins.Id == "" {
return fmt.Errorf("role is nil")
}
result, err := s.col.DeleteOne(ctx, bson.M{"_id": ins.Id})
if err != nil {
return exception.NewInternalServerError("delete role(%s) error, %s", ins.Id, err)
}
if result.DeletedCount == 0 {
return exception.NewNotFound("role %s not found", ins.Id)
}
return nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/talk-about-articles/keyauth-tz.git
git@gitee.com:talk-about-articles/keyauth-tz.git
talk-about-articles
keyauth-tz
keyauth-tz
v1.0.17

搜索帮助