1 Star 0 Fork 0

megnhao / restful-api-demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
host.go 4.03 KB
一键复制 编辑 原始数据 按行查看 历史
megnhao 提交于 2022-05-14 09:40 . 添加更新的逻辑
package impl
import (
"context"
"fmt"
"gitee.com/megnhao/restful-api-demo/apps/host"
"github.com/infraboard/mcube/sqlbuilder"
)
//业务处理层
func (i *HostServiceimpl) CreateHost(ctx context.Context, ins *host.Host) (*host.Host, error) {
//直接打印日志
i.l.Debug("create host")
//带format的日志打印
// i.l.Debug("create host ", ins.Name)
// //携带额外的meta数据信息,常用于trace系统
// i.l.With(logger.NewAny("request-id", "req")).Debug("create host with meta kv")
//校验数据的合法性
if err := ins.Validate(); err != nil {
return nil, err
}
//有dao模块负责对象的入库
if err := i.save(ctx, ins); err != nil {
return nil, err
}
return ins, nil
}
func (i *HostServiceimpl) QueryHost(ctx context.Context, req *host.QueryHostRequest) (
*host.HostSet, error) {
b := sqlbuilder.NewBuilder(QueryHostSQL)
if req.Keywords != "" {
b.Where("r.`name`LIKE ? OR r.description LIKE ? OR r.private_ip LIKE ? OR r.public_ip LIKE ?",
"%"+req.Keywords+"%",
"%"+req.Keywords+"%",
req.Keywords+"%",
req.Keywords+"%",
)
}
b.Limit(req.OffSet(), req.GetPageSize())
querSQL, args := b.Build()
i.l.Debugf("query sql :%s,arr:%v", querSQL, args)
// query stmt, 构建一个Prepare语句
stmt, err := i.db.PrepareContext(ctx, querSQL)
if err != nil {
return nil, err
}
defer stmt.Close()
rows, err := stmt.QueryContext(ctx, args...)
if err != nil {
return nil, err
}
defer rows.Close()
set := host.NewHostSet()
for rows.Next() {
//每扫描一行就要把数据读取出来
ins := host.NewHost()
if err := rows.Scan(
&ins.Id, &ins.Vendor, &ins.Region, &ins.CreateAt, &ins.ExpireAt,
&ins.Type, &ins.Name, &ins.Description, &ins.Status, &ins.UpdateAt, &ins.SyncAt,
&ins.Account, &ins.PublicIP, &ins.PrivateIP,
&ins.CPU, &ins.Memory, &ins.GPUSpec, &ins.GPUAmount, &ins.OSType, &ins.OSName, &ins.SerialNumber,
); err != nil {
return nil, err
}
set.Add(ins)
}
countSQL, args := b.BuildCount()
i.l.Debugf("countSQL sql :%s,arr:%v", countSQL, args)
countStmt, err := i.db.PrepareContext(ctx, countSQL)
if err != nil {
return nil, err
}
defer stmt.Close()
if err := countStmt.QueryRowContext(ctx, args...).Scan(&set.Total); err != nil {
return nil, err
}
return set, nil
}
func (i *HostServiceimpl) DescribeHost(ctx context.Context, req *host.DescribeHostRequest) (
*host.Host, error) {
b := sqlbuilder.NewBuilder(QueryHostSQL)
b.Where("r.id = ?", req.Id)
querSQL, args := b.Build()
i.l.Debugf("query sql :%s,arr:%v", querSQL, args)
// query stmt, 构建一个Prepare语句
stmt, err := i.db.PrepareContext(ctx, querSQL)
if err != nil {
return nil, err
}
defer stmt.Close()
ins := host.NewHost()
err = stmt.QueryRowContext(ctx, args...).Scan(
&ins.Id, &ins.Vendor, &ins.Region, &ins.CreateAt, &ins.ExpireAt,
&ins.Type, &ins.Name, &ins.Description, &ins.Status, &ins.UpdateAt, &ins.SyncAt,
&ins.Account, &ins.PublicIP, &ins.PrivateIP,
&ins.CPU, &ins.Memory, &ins.GPUSpec, &ins.GPUAmount, &ins.OSType, &ins.OSName, &ins.SerialNumber,
)
if err != nil {
return nil, err
}
return ins, nil
}
func (i *HostServiceimpl) UpdateHost(ctx context.Context, req *host.UpdateHostRequest) (
*host.Host, error) {
//获取已有的对象
ins, err := i.DescribeHost(ctx, host.NewDescribeHostRequestWithId(req.Id))
if err != nil {
return nil, err
}
//更新的模式,更新对象
switch req.UpdateMode {
case host.UPDATE_MODE_PATCH:
if err := ins.Patch(req.Host); err != nil {
return nil, err
}
case host.UPDATE_MODE_PUT:
if err := ins.Put(req.Host); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("update_mode only requred put/patch")
}
//检查更新的数据是否合法
if err := ins.Validate(); err != nil {
return nil, fmt.Errorf("start tx error %s", err)
}
//更新数据库里面的数据
if err := i.update(ctx, ins); err != nil {
return nil, err
}
//返回更新后的数据
return ins, nil
}
func (i *HostServiceimpl) DeleteHost(ctx context.Context, req *host.DeleteHostRequest) (*host.Host, error) {
return nil, nil
}
Go
1
https://gitee.com/megnhao/restful-api-demo.git
git@gitee.com:megnhao/restful-api-demo.git
megnhao
restful-api-demo
restful-api-demo
e06e71524eb4

搜索帮助