提交 4b61416e 编写于 作者: aaronchen2k2k's avatar aaronchen2k2k

clean codes

上级 2a68f17b
package agentConfig
import myZap "github.com/aaronchen2k/deeptest/internal/pkg/core/zap"
type Config struct {
System System `mapstructure:"system" json:"system" yaml:"system"`
Zap myZap.Zap `mapstructure:"zap" json:"zap" yaml:"zap"`
}
type System struct {
Level string `mapstructure:"level" json:"level" yaml:"level"` // debug,release,test
Addr string `mapstructure:"addr" json:"addr" yaml:"addr"`
TimeFormat string `mapstructure:"time-format" json:"timeFormat" yaml:"time-format"`
}
package agentConfig
const (
AgentCheckInterval = 60 * 60
)
package agentConfig
import (
"github.com/spf13/viper"
)
var (
CONFIG Config // 配置
VIPER *viper.Viper // viper
)
package agentCron
import (
"fmt"
agentConfig "github.com/aaronchen2k/deeptest/internal/agent/config"
"github.com/aaronchen2k/deeptest/internal/pkg/lib/cron"
"github.com/aaronchen2k/deeptest/internal/pkg/lib/date"
"github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/kataras/iris/v12"
"sync"
"time"
)
type AgentCron struct {
syncMap sync.Map
}
func NewAgentCron() *AgentCron {
inst := &AgentCron{}
return inst
}
func (s *AgentCron) Init() {
s.syncMap.Store("isRunning", false)
s.syncMap.Store("lastCompletedTime", int64(0))
cronUtils.AddTask(
"check",
fmt.Sprintf("@every %ds", agentConfig.AgentCheckInterval),
func() {
isRunning, _ := s.syncMap.Load("isRunning")
lastCompletedTime, _ := s.syncMap.Load("lastCompletedTime")
if isRunning.(bool) || time.Now().Unix()-lastCompletedTime.(int64) < agentConfig.AgentCheckInterval {
logUtils.Infof("skip this iteration " + dateUtils.DateTimeStr(time.Now()))
return
}
s.syncMap.Store("isRunning", true)
// do somethings
s.syncMap.Store("isRunning", false)
s.syncMap.Store("lastCompletedTime", time.Now().Unix())
},
)
iris.RegisterOnInterrupt(func() {
cronUtils.Stop()
})
}
package agentViper
import (
"bytes"
"fmt"
agentConfig "github.com/aaronchen2k/deeptest/internal/agent/config"
"github.com/aaronchen2k/deeptest/internal/pkg/consts"
myZap "github.com/aaronchen2k/deeptest/internal/pkg/core/zap"
"github.com/fsnotify/fsnotify"
"github.com/snowlyg/helper/dir"
"github.com/spf13/viper"
)
// Init 初始化系统配置
// - 第一次初始化系统配置,会自动生成配置文件 config.yaml 和 casbin 的规则文件 rbac_model.conf
// - 热监控系统配置项,如果发生变化会重写配置文件内的配置项
func Init() {
config := consts.ConfigFileAgent
fmt.Printf("配置文件路径为%s\n", config)
v := viper.New()
agentConfig.VIPER = v
agentConfig.VIPER.SetConfigType("yaml")
if !dir.IsExist(config) { //没有配置文件,写入默认配置
var yamlDefault = []byte(`
system:
level: debug # debug,release,test
addr: "127.0.0.1:8085"
time-format: "2006-01-02 15:04:05"
zap:
level: info
format: console
prefix: '[OP-ONLINE]'
director: log
link-name: latest_log
show-line: true
encode-level: LowercaseColorLevelEncoder
stacktrace-key: stacktrace
log-in-console: true`)
if err := agentConfig.VIPER.ReadConfig(bytes.NewBuffer(yamlDefault)); err != nil {
panic(fmt.Errorf("读取默认配置文件错误: %w ", err))
}
if err := agentConfig.VIPER.Unmarshal(&agentConfig.CONFIG); err != nil {
panic(fmt.Errorf("同步配置文件错误: %w ", err))
}
if err := agentConfig.VIPER.WriteConfigAs(config); err != nil {
panic(fmt.Errorf("写入配置文件错误: %w ", err))
}
return
}
// 存在配置文件,读取配置文件内容
agentConfig.VIPER.SetConfigFile(config)
err := agentConfig.VIPER.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置错误: %w ", err))
}
// 监控配置文件变化
agentConfig.VIPER.WatchConfig()
agentConfig.VIPER.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置发生变化:", e.Name)
if err := agentConfig.VIPER.Unmarshal(&agentConfig.CONFIG); err != nil {
fmt.Println(err)
}
})
if err := v.Unmarshal(&agentConfig.CONFIG); err != nil {
fmt.Println(err)
}
myZap.ZapInst = agentConfig.CONFIG.Zap
}
package agentZap
import (
"github.com/aaronchen2k/deeptest/internal/agent/consts"
"github.com/aaronchen2k/deeptest/internal/pkg/core/zap"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/snowlyg/helper/dir"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// level 日志级别
var level zapcore.Level
// Init 初始化日志服务
func Init() {
var logger *zap.Logger
if !dir.IsExist(agentConsts.CONFIG.Zap.Director) { // 判断是否有Director文件夹
dir.InsureDir(agentConsts.CONFIG.Zap.Director)
}
switch agentConsts.CONFIG.Zap.Level { // 初始化配置文件的Level
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "warn":
level = zap.WarnLevel
case "error":
level = zap.ErrorLevel
case "dpanic":
level = zap.DPanicLevel
case "panic":
level = zap.PanicLevel
case "fatal":
level = zap.FatalLevel
default:
level = zap.InfoLevel
}
if level == zap.DebugLevel || level == zap.ErrorLevel {
logger = zap.New(myZap.GetEncoderCore(level), zap.AddStacktrace(level))
} else {
logger = zap.New(myZap.GetEncoderCore(level))
}
if agentConsts.CONFIG.Zap.ShowLine {
logger = logger.WithOptions(zap.AddCaller())
}
logUtils.LoggerStandard = logger
}
package arith
import (
"fmt"
"golang.org/x/net/context"
)
type ArithCtrl struct {
}
func NewArithCtrl() *ArithCtrl {
return &ArithCtrl{}
}
func (c *ArithCtrl) Add(ctx context.Context, args *Request, reply *Response) error {
reply.C = args.A + args.B
fmt.Printf("call: %d + %d = %d\n", args.A, args.B, reply.C)
return nil
}
package arith
type Request struct {
A int
B int
}
package arith
type Response struct {
C int
}
package rpc
import (
"encoding/json"
"github.com/aaronchen2k/deeptest/internal/comm/domain"
fileUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/file"
httpUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/http"
"testing"
)
func TestUpload(t *testing.T) {
result := commDomain.TestResult{Name: "RasaResult Title"}
zipFile := "/Users/aaron/testResult.zip"
result.Payload = nil
uploadResultUrl := httpUtils.GenUrl("http://localhost:8085/", "client/build/uploadResult")
files := []string{zipFile}
extraParams := map[string]string{}
json, _ := json.Marshal(result)
extraParams["result"] = string(json)
fileUtils.Upload(uploadResultUrl, files, extraParams)
}
package grpc
import (
agentConsts "github.com/aaronchen2k/deeptest/internal/agent/consts"
"github.com/aaronchen2k/deeptest/internal/agent/modules/grpc/service"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"google.golang.org/grpc/credentials"
"net"
// [...]
pb "github.com/aaronchen2k/deeptest/internal/comm/grpc/proto/greater"
"google.golang.org/grpc"
)
func NewGrpcModule() (grpcServer *grpc.Server) {
listen, err := net.Listen("tcp", agentConsts.CONFIG.System.Addr)
if err != nil {
logUtils.Errorf("failed to listen: %v", err)
}
creds, err := credentials.NewServerTLSFromFile("cert/test.pem", "cert/test.key")
if err != nil {
logUtils.Errorf("failed to generate credentials %v", err.Error())
}
var opts []grpc.ServerOption
opts = append(opts, grpc.Creds(creds))
//opts = append(opts, grpc.UnaryInterceptor(interceptor))
grpcServer = grpc.NewServer(opts...)
grpcServer = grpc.NewServer(grpc.Creds(creds))
// register service
pb.RegisterGreeterServer(grpcServer, &service.Greeter{})
logUtils.Infof("start agent")
grpcServer.Serve(listen)
return
}
package service
import (
"context"
pb "github.com/aaronchen2k/deeptest/internal/comm/grpc/proto/greater"
)
type Greeter struct {
pb.GreeterServer
}
func (c *Greeter) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "hello " + in.GetName()}, nil
}
package kvm
import (
pb "github.com/aaronchen2k/deeptest/internal/comm/grpc/proto/greater"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"log"
"testing"
"time"
)
const ()
func TestGrpc(t *testing.T) {
// Set up a connection to the server.
creds, err := credentials.NewClientTLSFromFile("cert/test.pem", "*.deeptest.com")
if err != nil {
log.Fatal(err)
}
conn, err := grpc.Dial("localhost:8086", grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "aaron"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
}
package kvm
import (
"bytes"
"crypto/tls"
"encoding/json"
pb "github.com/aaronchen2k/deeptest/internal/comm/grpc/proto/greater"
"log"
"net/http"
"testing"
)
const ()
func TestHttp(t *testing.T) {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := http.Client{Transport: tr}
buf := new(bytes.Buffer)
err := json.NewEncoder(buf).Encode(pb.HelloRequest{Name: "aaron"})
if err != nil {
log.Fatal(err)
}
resp, err := client.Post("https://local.deeptest.com:8086/helloworld.Greeter/SayHello", "application/json", buf)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var reply pb.HelloReply
err = json.NewDecoder(resp.Body).Decode(&reply)
if err != nil {
log.Fatal(err)
}
log.Printf("Greeting: %s", reply.GetMessage())
}
package commConsts
var (
Language = "zh"
Language = ""
Verbose = true
IsRelease bool
ExeDir string
......
......@@ -8,7 +8,6 @@ import (
langUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/lang"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"github.com/kataras/iris/v12"
"io/ioutil"
"regexp"
......@@ -37,7 +36,7 @@ func LoadScriptByProject(projectPath string) (scriptFiles []string) {
return
}
func GetScriptContent(pth string) (script model.TestScript, err error) {
func GetScriptContent(pth string) (script serverDomain.TestScript, err error) {
script.Code = fileUtils.ReadFile(pth)
return
......
......@@ -17,7 +17,7 @@ const (
funcRegex = `(?U)e\(['"](.+)['"]\)`
singleLineCommentsRegex = `.*(?://|#)(.+)$`
mutiLineCommentsRegex = `/\*+(.+)\*+/`
multiLineCommentsRegex = `/\*+(.+)\*+/`
)
func Extract(scriptPaths []string) error {
......@@ -146,7 +146,7 @@ func extractFromComments(file string) (stepObjs []*commDomain.ZtfStep) {
if len(arr3) > 1 { // find single line comments on top
desc = strings.TrimSpace(arr3[1])
} else {
myExp := regexp.MustCompile(mutiLineCommentsRegex)
myExp := regexp.MustCompile(multiLineCommentsRegex)
arr4 := myExp.FindStringSubmatch(preLine)
if len(arr4) > 1 { // find muti line comments on top
desc = strings.TrimSpace(arr4[1])
......
......@@ -58,17 +58,11 @@ type ErrMsg struct {
}
var (
NoErr = ErrMsg{0, "请求成功"}
CommonErr = ErrMsg{1001, "请求失败"}
NeedInitErr = ErrMsg{2001, "前往初始化数据库"}
AuthErr = ErrMsg{4001, "会话超时,请重新登录!"}
AuthExpireErr = ErrMsg{4002, "token 过期,请刷新token"}
AuthActionErr = ErrMsg{4003, "权限错误"}
ParamErr = ErrMsg{4004, "参数解析失败"}
SystemErr = ErrMsg{5000, "系统错误"}
DataEmptyErr = ErrMsg{5001, "数据为空"}
TokenCacheErr = ErrMsg{5002, "TOKEN CACHE 错误"}
NoErr = ErrMsg{0, "请求成功"}
RequestErr = ErrMsg{200, "请求失败"}
ParamErr = ErrMsg{100, "参数错误"}
BizErrNameNotExist = ErrMsg{10000, "名称不存在"}
BizErrProjectNotInit = ErrMsg{10100, "项目未初始化"}
NeedInitErr = ErrMsg{1000, "数据未初始化"}
BizErrProjectNotInit = ErrMsg{2000, "项目未初始化"}
BizErrNameNotExist = ErrMsg{3000, "未找到该名称的记录"}
)
......@@ -13,7 +13,6 @@ import (
var I118Prt *message.Printer
func Init(lang string, app string) {
langRes := filepath.Join("res", app, lang, "messages.json")
bytes, _ := resUtils.ReadRes(langRes)
......
......@@ -3,8 +3,6 @@ package web
import (
stdContext "context"
"fmt"
"github.com/aaronchen2k/deeptest/internal/comm/consts"
"github.com/aaronchen2k/deeptest/internal/pkg/lib/i118"
"github.com/aaronchen2k/deeptest/internal/pkg/lib/lang"
"github.com/aaronchen2k/deeptest/internal/server/config"
"github.com/aaronchen2k/deeptest/internal/server/core/log"
......@@ -61,7 +59,6 @@ func Init() *WebServer {
serverConfig.Init()
serverLog.Init()
i118Utils.Init(commConsts.Language, commConsts.AppServer)
langUtils.GetExtToNameMap()
app := iris.New()
......
package middleware
import (
commConsts "github.com/aaronchen2k/deeptest/internal/comm/consts"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
i118Utils "github.com/aaronchen2k/deeptest/internal/pkg/lib/i118"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
"net/http"
......@@ -9,14 +11,20 @@ import (
"github.com/kataras/iris/v12/context"
)
// InitCheck 初始化检测中间件
func InitCheck() iris.Handler {
return func(ctx *context.Context) {
if dao.GetDB() == nil {
ctx.StopWithJSON(http.StatusOK, domain.Response{Code: domain.NeedInitErr.Code, Data: nil, Msg: domain.NeedInitErr.Msg})
} else {
ctx.Next()
ctx.StopWithJSON(http.StatusOK,
domain.Response{Code: domain.NeedInitErr.Code, Data: nil, Msg: domain.NeedInitErr.Msg})
return
}
// 处理请求
lang := ctx.URLParam("lang")
if lang != commConsts.Language {
commConsts.Language = lang
i118Utils.Init(commConsts.Language, commConsts.AppServer)
}
ctx.Next()
}
}
......@@ -5,12 +5,8 @@ import (
configUtils "github.com/aaronchen2k/deeptest/internal/comm/helper/config"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/web/validate"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/service"
"strings"
"github.com/kataras/iris/v12"
"go.uber.org/zap"
)
type ConfigCtrl struct {
......@@ -26,16 +22,14 @@ func (c *ConfigCtrl) SaveConfig(ctx iris.Context) {
projectPath := ctx.URLParam("currProject")
req := commDomain.ProjectConf{}
if err := ctx.ReadJSON(&req); err != nil {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
err := ctx.ReadJSON(&req)
if err != nil {
logUtils.Errorf(domain.ParamErr.Msg, err.Error())
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: ""})
return
}
err := configUtils.SaveConfig(req, projectPath)
err = configUtils.SaveConfig(req, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: c.ErrCode(err), Data: nil})
return
......@@ -43,7 +37,7 @@ func (c *ConfigCtrl) SaveConfig(ctx iris.Context) {
projects, currProject, currProjectConfig, scriptTree, err := c.ProjectService.GetByUser(projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......
......@@ -23,14 +23,14 @@ func (c *FileCtrl) Upload(ctx iris.Context) {
f, fh, err := ctx.FormFile("file")
if err != nil {
logUtils.Errorf("文件上传失败", zap.String("ctx.FormFile(\"file\")", err.Error()))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
defer f.Close()
data, err := c.FileService.UploadFile(ctx, fh)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: data, Msg: domain.NoErr.Msg})
......@@ -51,7 +51,7 @@ func (c *FileCtrl) ListDir(ctx iris.Context) {
data, err := c.FileService.LoadDirs(parentDir)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: data, Msg: domain.NoErr.Msg})
......
package controller
import (
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/web/validate"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/service"
"strings"
"github.com/kataras/iris/v12"
"go.uber.org/zap"
)
type ProductCtrl struct {
ProductService *service.ProductService `inject:""`
BaseCtrl
}
func NewProductCtrl() *ProductCtrl {
return &ProductCtrl{}
}
// Query 分页列表
func (c *ProductCtrl) List(ctx iris.Context) {
var req serverDomain.ReqPaginate
if err := ctx.ReadQuery(&req); err != nil {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
}
req.ConvertParams()
data, err := c.ProductService.Paginate(req)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: data, Msg: domain.NoErr.Msg})
}
// Get 详情
func (c *ProductCtrl) Get(ctx iris.Context) {
var req domain.ReqId
if err := ctx.ReadParams(&req); err != nil {
logUtils.Errorf("参数解析失败", zap.String("错误:", err.Error()))
ctx.JSON(domain.Response{Code: domain.ParamErr.Code, Data: nil, Msg: domain.ParamErr.Msg})
return
}
product, err := c.ProductService.FindById(req.Id)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: domain.SystemErr.Msg})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: product, Msg: domain.NoErr.Msg})
}
// Create 添加
func (c *ProductCtrl) Create(ctx iris.Context) {
req := model.Product{}
if err := ctx.ReadJSON(&req); err != nil {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
}
id, err := c.ProductService.Create(req)
if err != nil {
ctx.JSON(domain.Response{
Code: c.ErrCode(err),
Data: nil,
})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: iris.Map{"id": id}, Msg: domain.NoErr.Msg})
}
// Update 更新
func (c *ProductCtrl) Update(ctx iris.Context) {
var reqId domain.ReqId
if err := ctx.ReadParams(&reqId); err != nil {
logUtils.Errorf("参数解析失败", zap.String("错误:", err.Error()))
ctx.JSON(domain.Response{Code: domain.ParamErr.Code, Data: nil, Msg: domain.ParamErr.Msg})
return
}
var req model.Product
if err := ctx.ReadJSON(&req); err != nil {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
}
err := c.ProductService.Update(reqId.Id, req)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: nil, Msg: domain.NoErr.Msg})
}
// Delete 删除
func (c *ProductCtrl) Delete(ctx iris.Context) {
var req domain.ReqId
if err := ctx.ReadParams(&req); err != nil {
logUtils.Errorf("参数解析失败", zap.String("错误:", err.Error()))
ctx.JSON(domain.Response{Code: domain.ParamErr.Code, Data: nil, Msg: domain.ParamErr.Msg})
return
}
err := c.ProductService.DeleteById(req.Id)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: nil, Msg: domain.NoErr.Msg})
}
......@@ -30,7 +30,7 @@ func (c *ProjectCtrl) List(ctx iris.Context) {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
}
......@@ -38,7 +38,7 @@ func (c *ProjectCtrl) List(ctx iris.Context) {
data, err := c.ProjectService.Paginate(req)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......@@ -55,7 +55,7 @@ func (c *ProjectCtrl) Get(ctx iris.Context) {
}
product, err := c.ProjectService.FindById(req.Id)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: domain.SystemErr.Msg})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: domain.RequestErr.Msg})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: product, Msg: domain.NoErr.Msg})
......@@ -68,14 +68,14 @@ func (c *ProjectCtrl) Create(ctx iris.Context) {
if err != nil || req.Path == "" {
logUtils.Errorf("参数验证失败 %s", err.Error())
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "参数验证失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "参数验证失败"})
return
}
req.Path = strings.TrimSpace(req.Path)
id, err := c.ProjectService.Create(req)
if err != nil {
ctx.JSON(domain.Response{Code: domain.CommonErr.Code, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Msg: err.Error()})
return
}
......@@ -96,14 +96,14 @@ func (c *ProjectCtrl) Update(ctx iris.Context) {
errs := validate.ValidRequest(err)
if len(errs) > 0 {
logUtils.Errorf("参数验证失败", zap.String("错误", strings.Join(errs, ";")))
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: strings.Join(errs, ";")})
return
}
}
err := c.ProjectService.Update(reqId.Id, req)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: nil, Msg: domain.NoErr.Msg})
......@@ -119,7 +119,7 @@ func (c *ProjectCtrl) Delete(ctx iris.Context) {
}
err := c.ProjectService.DeleteById(req.Id)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......@@ -135,7 +135,7 @@ func (c *ProjectCtrl) GetByUser(ctx iris.Context) {
projects, currProject, currProjectConfig, scriptTree, err := c.ProjectService.GetByUser(projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......
......@@ -27,7 +27,7 @@ func (c *SyncCtrl) SyncFromZentao(ctx iris.Context) {
if err != nil {
logUtils.Errorf("参数验证失败 %s", err.Error())
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......@@ -48,7 +48,7 @@ func (c *SyncCtrl) SyncToZentao(ctx iris.Context) {
if commitProductId == 0 {
msg := fmt.Sprintf("参数验证失败")
logUtils.Errorf(msg)
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: msg})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: msg})
return
}
......
......@@ -26,14 +26,14 @@ func (c *TestBugCtrl) GetBugData(ctx iris.Context) {
err := ctx.ReadJSON(&req)
if err != nil {
logUtils.Errorf("参数验证失败 %s", err.Error())
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
bug := zentaoUtils.PrepareBug(projectPath, req.Seq, strconv.Itoa(req.Id))
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "获取禅道缺陷步骤失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "获取禅道缺陷步骤失败"})
return
}
......@@ -46,13 +46,13 @@ func (c *TestBugCtrl) Submit(ctx iris.Context) {
req := commDomain.ZtfBug{}
if err := ctx.ReadJSON(&req); err != nil {
logUtils.Errorf("参数验证失败,错误%s", err.Error())
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
err := c.TestBugService.Submit(req, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......
package controller
import (
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/service"
)
type TestCaseCtrl struct {
TestCaseService *service.TestCaseService `inject:""`
BaseCtrl
}
func NewTestCaseCtrl() *TestCaseCtrl {
return &TestCaseCtrl{}
}
......@@ -23,7 +23,7 @@ func (c *TestExecCtrl) List(ctx iris.Context) {
data, err := c.TestExecService.List(projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......@@ -43,7 +43,7 @@ func (c *TestExecCtrl) Get(ctx iris.Context) {
exec, err := c.TestExecService.Get(projectPath, seq)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil,
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil,
Msg: fmt.Sprintf("获取编号为%s的日志失败。", seq)})
return
}
......@@ -63,7 +63,7 @@ func (c *TestExecCtrl) Delete(ctx iris.Context) {
err := c.TestExecService.Delete(projectPath, seq)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......
......@@ -30,7 +30,7 @@ func (c *TestResultCtrl) Submit(ctx iris.Context) {
err = c.TestResultService.Submit(req, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.CommonErr.Code, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Msg: err.Error()})
return
}
......
......@@ -26,7 +26,7 @@ func (c *TestScriptCtrl) Get(ctx iris.Context) {
script, err := scriptUtils.GetScriptContent(scriptPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: domain.SystemErr.Msg})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: domain.RequestErr.Msg})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: script, Msg: domain.NoErr.Msg})
......@@ -44,7 +44,7 @@ func (c *TestScriptCtrl) Extract(ctx iris.Context) {
script, err := scriptUtils.GetScriptContent(scriptPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: domain.SystemErr.Msg})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: domain.RequestErr.Msg})
return
}
ctx.JSON(domain.Response{Code: domain.NoErr.Code, Data: script, Msg: domain.NoErr.Msg})
......
package controller
import (
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/service"
)
type TestSetCtrl struct {
TestSetService *service.TestSetService `inject:""`
BaseCtrl
}
func NewTestSetCtrl() *TestSetCtrl {
return &TestSetCtrl{}
}
package controller
import (
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/service"
)
type TestSuiteCtrl struct {
TestSuiteService *service.TestSuiteService `inject:""`
BaseCtrl
}
func NewTestSuiteCtrl() *TestSuiteCtrl {
return &TestSuiteCtrl{}
}
......@@ -33,13 +33,13 @@ func (c *ZentaoCtrl) ListModule(ctx iris.Context) {
projectPath := ctx.URLParam("currProject")
productId, err := ctx.URLParamInt("productId")
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
data, err := zentaoUtils.ListModuleForCase(productId, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "获取禅道模块失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "获取禅道模块失败"})
return
}
......@@ -50,13 +50,13 @@ func (c *ZentaoCtrl) ListSuite(ctx iris.Context) {
projectPath := ctx.URLParam("currProject")
productId, err := ctx.URLParamInt("productId")
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
data, err := zentaoUtils.ListSuiteByProduct(productId, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "获取禅道套件失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "获取禅道套件失败"})
return
}
......@@ -67,13 +67,13 @@ func (c *ZentaoCtrl) ListTask(ctx iris.Context) {
projectPath := ctx.URLParam("currProject")
productId, err := ctx.URLParamInt("productId")
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
data, err := zentaoUtils.ListTaskByProduct(productId, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "获取禅道任务失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "获取禅道任务失败"})
return
}
......@@ -86,13 +86,13 @@ func (c *ZentaoCtrl) GetDataForBugSubmition(ctx iris.Context) {
req := commDomain.FuncResult{}
if err := ctx.ReadJSON(&req); err != nil {
logUtils.Errorf("参数验证失败 %s", err.Error())
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
fields, err := zentaoUtils.GetBugFiledOptions(req, projectPath)
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: "获取禅道缺陷属性失败"})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: "获取禅道缺陷属性失败"})
return
}
......@@ -104,7 +104,7 @@ func (c *ZentaoCtrl) GetDataForBugSubmition(ctx iris.Context) {
func (c *ZentaoCtrl) ListLang(ctx iris.Context) {
data, err := zentaoUtils.ListLang()
if err != nil {
ctx.JSON(domain.Response{Code: domain.SystemErr.Code, Data: nil, Msg: err.Error()})
ctx.JSON(domain.Response{Code: domain.RequestErr.Code, Data: nil, Msg: err.Error()})
return
}
......
package serverDomain
import (
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
)
type TestCaseReqPaginate struct {
domain.PaginateReq
Name string `json:"name"`
Keywords string `json:"keywords"`
Enabled string `json:"enabled"`
}
package serverDomain
import (
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
)
type TestScript struct {
Version int `json:"version"`
Name string `json:"name"`
Code string `json:"code"`
Desc string `json:"desc"`
type TestScriptReqPaginate struct {
domain.PaginateReq
Keywords string `json:"keywords"`
Enabled string `json:"enabled"`
ProjectId uint `json:"projectId"`
}
......@@ -16,15 +16,12 @@ type IndexModule struct {
ZentaoModule *index.ZentaoModule `inject:""`
ConfigModule *index.ConfigModule `inject:""`
SyncModule *index.SyncModule `inject:""`
ProductModule *index.ProductModule `inject:""`
ProjectModule *index.ProjectModule `inject:""`
TestScriptModule *index.TestScriptModule `inject:""`
TestExecModule *index.TestExecModule `inject:""`
TestResultModule *index.TestResultModule `inject:""`
TestBugModule *index.TestBugModule `inject:""`
TestSuiteModule *index.TestSuiteModule `inject:""`
TestSetModule *index.TestSetModule `inject:""`
}
func NewIndexModule() *IndexModule {
......
package index
import (
"github.com/aaronchen2k/deeptest/internal/server/core/module"
"github.com/aaronchen2k/deeptest/internal/server/middleware"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/controller"
"github.com/kataras/iris/v12"
)
type ProductModule struct {
ProductCtrl *controller.ProductCtrl `inject:""`
}
func NewProductModule() *ProductModule {
return &ProductModule{}
}
// Party 产品
func (m *ProductModule) Party() module.WebModule {
handler := func(index iris.Party) {
index.Use(middleware.InitCheck())
index.Get("/", m.ProductCtrl.List).Name = "产品列表"
index.Get("/{id:uint}", m.ProductCtrl.Get).Name = "产品详情"
index.Post("/", m.ProductCtrl.Create).Name = "创建产品"
index.Post("/{id:uint}", m.ProductCtrl.Update).Name = "编辑产品"
index.Delete("/{id:uint}", m.ProductCtrl.Delete).Name = "删除产品"
}
return module.NewModule("/products", handler)
}
package index
import (
"github.com/aaronchen2k/deeptest/internal/server/core/module"
"github.com/aaronchen2k/deeptest/internal/server/middleware"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/controller"
"github.com/kataras/iris/v12"
)
type TestCaseModule struct {
TestCaseCtrl *controller.TestCaseCtrl `inject:""`
}
func NewTestCaseModule() *TestCaseModule {
return &TestCaseModule{}
}
// Party 用例
func (m *TestCaseModule) Party() module.WebModule {
handler := func(index iris.Party) {
index.Use(middleware.InitCheck())
}
return module.NewModule("/testCases", handler)
}
package index
import (
"github.com/aaronchen2k/deeptest/internal/server/core/module"
"github.com/aaronchen2k/deeptest/internal/server/middleware"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/controller"
"github.com/kataras/iris/v12"
)
type TestSetModule struct {
TestSetCtrl *controller.TestSetCtrl `inject:""`
}
func NewTestSetModule() *TestSetModule {
return &TestSetModule{}
}
// Party 测试集
func (m *TestSetModule) Party() module.WebModule {
handler := func(index iris.Party) {
index.Use(middleware.InitCheck())
}
return module.NewModule("/sets", handler)
}
package index
import (
"github.com/aaronchen2k/deeptest/internal/server/core/module"
"github.com/aaronchen2k/deeptest/internal/server/middleware"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/controller"
"github.com/kataras/iris/v12"
)
type TestSuiteModule struct {
TestSuiteCtrl *controller.TestSuiteCtrl `inject:""`
}
func NewTestSuiteModule() *TestSuiteModule {
return &TestSuiteModule{}
}
// Party 套件
func (m *TestSuiteModule) Party() module.WebModule {
handler := func(index iris.Party) {
index.Use(middleware.InitCheck())
}
return module.NewModule("/suites", handler)
}
......@@ -3,10 +3,5 @@ package model
var (
Models = []interface{}{
&Project{},
&TestCase{},
&TestExec{},
&TestScript{},
&TestSuite{},
&TestSet{},
}
)
package model
type Product struct {
BaseModel
Name string `json:"name"`
Desc string `json:"desc" gorm:"column:descr"`
SchemaId uint `json:"schemaId"`
OrgId uint `json:"orgId"`
}
func (Product) TableName() string {
return "biz_product"
}
package model
type TestCase struct {
BaseModel
Version int `json:"version"`
Name string `json:"name"`
Desc string `json:"desc"`
}
func (TestCase) TableName() string {
return "biz_test_case"
}
package model
type TestExec struct {
BaseModel
Name string `json:"name"`
Cases string `json:"cases"`
ProjectId uint `json:"projectId"`
}
func (TestExec) TableName() string {
return "biz_test_exec"
}
package model
type TestScript struct {
BaseModel
Version int `json:"version"`
Name string `json:"name"`
Code string `json:"code"`
Desc string `json:"desc"`
ProjectId uint `json:"projectId"`
}
func (TestScript) TableName() string {
return "biz_test_script"
}
package model
type TestSet struct {
BaseModel
Version int `json:"version"`
Name string `json:"name"`
Code string `json:"code"`
Desc string `json:"desc"`
ProjectId uint `json:"projectId"`
}
func (TestSet) TableName() string {
return "biz_test_set"
}
package model
type TestSuite struct {
BaseModel
Version int `json:"version"`
Name string `json:"name"`
Code string `json:"code"`
Desc string `json:"desc"`
ProjectId uint `json:"projectId"`
}
func (TestSuite) TableName() string {
return "biz_test_suite"
}
package repo
import (
"errors"
"fmt"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
commonUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/common"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type ProductRepo struct {
DB *gorm.DB `inject:""`
}
func NewProductRepo() *ProductRepo {
return &ProductRepo{}
}
func (r *ProductRepo) Paginate(req serverDomain.ReqPaginate) (data domain.PageData, err error) {
var count int64
db := r.DB.Model(&model.Product{}).Where("NOT deleted")
if req.Keywords != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", req.Keywords))
}
if req.Enabled != "" {
db = db.Where("disabled = ?", commonUtils.IsDisable(req.Enabled))
}
err = db.Count(&count).Error
if err != nil {
logUtils.Errorf("count product error", zap.String("error:", err.Error()))
return
}
pos := make([]*model.Product, 0)
err = db.
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&pos).Error
if err != nil {
logUtils.Errorf("query product error %s", err.Error())
return
}
data.Populate(pos, count, req.Page, req.PageSize)
return
}
func (r *ProductRepo) FindById(id uint) (po model.Product, err error) {
err = r.DB.Model(&model.Product{}).Where("id = ?", id).First(&po).Error
if err != nil {
logUtils.Errorf("find product by id error %s", err.Error())
return
}
return
}
func (r *ProductRepo) Create(product model.Product) (id uint, err error) {
if _, err := r.FindByName(product.Name); !errors.Is(err, gorm.ErrRecordNotFound) {
return 0, fmt.Errorf("%d", domain.BizErrNameNotExist.Code)
}
err = r.DB.Model(&model.Product{}).Create(&product).Error
if err != nil {
logUtils.Errorf("add product error %s", err.Error())
return 0, err
}
id = product.ID
return
}
func (r *ProductRepo) Update(id uint, product model.Product) error {
err := r.DB.Model(&model.Product{}).Where("id = ?", id).Updates(&product).Error
if err != nil {
logUtils.Errorf("update product error %s", err.Error())
return err
}
return nil
}
func (r *ProductRepo) BatchDelete(id uint) (err error) {
ids, err := r.GetChildrenIds(id)
if err != nil {
return err
}
r.DB.Transaction(func(tx *gorm.DB) (err error) {
err = r.DeleteChildren(ids, tx)
if err != nil {
return
}
err = r.DeleteById(id, tx)
if err != nil {
return
}
return
})
return
}
func (r *ProductRepo) DeleteById(id uint, tx *gorm.DB) (err error) {
err = tx.Model(&model.Product{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("delete product by id error %s", err.Error())
return
}
return
}
func (r *ProductRepo) DeleteChildren(ids []int, tx *gorm.DB) (err error) {
err = tx.Model(&model.Product{}).Where("id IN (?)", ids).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("batch delete product error %s", err.Error())
return err
}
return nil
}
func (r *ProductRepo) GetChildrenIds(id uint) (ids []int, err error) {
tmpl := `
WITH RECURSIVE product AS (
SELECT * FROM biz_product WHERE id = %d
UNION ALL
SELECT child.* FROM biz_product child, product WHERE child.parent_id = product.id
)
SELECT id FROM product WHERE id != %d
`
sql := fmt.Sprintf(tmpl, id, id)
err = r.DB.Raw(sql).Scan(&ids).Error
if err != nil {
logUtils.Errorf("get children product error %s", err.Error())
return
}
return
}
func (r *ProductRepo) FindByName(name string, ids ...uint) (po model.Product, err error) {
db := r.DB.Model(&model.Product{}).Where("name = ?", name)
if len(ids) == 1 {
db.Where("id != ?", ids[0])
}
err = db.First(&po).Error
if err != nil {
logUtils.Errorf("find product by name error %s", err.Error())
return
}
return
}
package repo
import (
"errors"
"fmt"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
commonUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/common"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type TestCaseRepo struct {
DB *gorm.DB `inject:""`
}
func NewTestCaseRepo() *TestCaseRepo {
return &TestCaseRepo{}
}
func (r *TestCaseRepo) Paginate(req serverDomain.TestCaseReqPaginate) (data domain.PageData, err error) {
var count int64
db := r.DB.Model(&model.TestCase{}).Where("NOT deleted")
if req.Keywords != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", req.Keywords))
}
if req.Enabled != "" {
db = db.Where("disabled = ?", commonUtils.IsDisable(req.Enabled))
}
err = db.Count(&count).Error
if err != nil {
logUtils.Errorf("count product error", zap.String("error:", err.Error()))
return
}
testCases := make([]*model.TestCase, 0)
err = db.
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&testCases).Error
if err != nil {
logUtils.Errorf("query product error", zap.String("error:", err.Error()))
return
}
data.Populate(testCases, count, req.Page, req.PageSize)
return
}
func (r *TestCaseRepo) FindById(id uint) (model.TestCase, error) {
product := model.TestCase{}
err := r.DB.Model(&model.TestCase{}).Where("id = ?", id).First(&product).Error
if err != nil {
logUtils.Errorf("find product by id error", zap.String("error:", err.Error()))
return product, err
}
return product, nil
}
func (r *TestCaseRepo) Create(po model.TestCase) (id uint, err error) {
if _, err := r.FindByName(po.Name); !errors.Is(err, gorm.ErrRecordNotFound) {
return 0, fmt.Errorf("%d", domain.BizErrNameNotExist.Code)
}
err = r.DB.Model(&model.TestCase{}).Create(&po).Error
if err != nil {
logUtils.Errorf("add product error", zap.String("error:", err.Error()))
return 0, err
}
id = po.ID
return
}
func (r *TestCaseRepo) Update(id uint, po model.TestCase) (err error) {
err = r.DB.Model(&model.TestCase{}).Where("id = ?", id).Updates(&po).Error
if err != nil {
logUtils.Errorf("update product error", zap.String("error:", err.Error()))
return err
}
return
}
func (r *TestCaseRepo) DeleteById(id uint) (err error) {
err = r.DB.Model(&model.TestCase{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("delete case by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestCaseRepo) FindByName(name string, ids ...uint) (po model.TestCase, err error) {
db := r.DB.Model(&model.TestCase{}).Where("name = ?", name)
if len(ids) == 1 {
db.Where("id != ?", ids[0])
}
err = db.First(&po).Error
if err != nil {
logUtils.Errorf("find product by name error", zap.String("name:", name), zap.Uints("ids:", ids), zap.String("error:", err.Error()))
return
}
return
}
package repo
import (
"gorm.io/gorm"
)
type TestExecRepo struct {
DB *gorm.DB `inject:""`
ProjectRepo *ProjectRepo `inject:""`
}
func NewTestExecRepo() *TestExecRepo {
return &TestExecRepo{}
}
package repo
import (
"errors"
"fmt"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
commonUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/common"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type TestScriptRepo struct {
DB *gorm.DB `inject:""`
}
func NewTestScriptRepo() *TestScriptRepo {
return &TestScriptRepo{}
}
func (r *TestScriptRepo) Paginate(req serverDomain.TestScriptReqPaginate) (data domain.PageData, err error) {
var count int64
db := r.DB.Model(&model.TestScript{}).Where("NOT deleted")
if req.Keywords != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", req.Keywords))
}
if req.Enabled != "" {
db = db.Where("disabled = ?", commonUtils.IsDisable(req.Enabled))
}
err = db.Count(&count).Error
if err != nil {
logUtils.Errorf("count product error", zap.String("error:", err.Error()))
return
}
testScripts := make([]*model.TestScript, 0)
err = db.
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&testScripts).Error
if err != nil {
logUtils.Errorf("query product error", zap.String("error:", err.Error()))
return
}
data.Populate(testScripts, count, req.Page, req.PageSize)
return
}
func (r *TestScriptRepo) FindById(id uint) (model.TestScript, error) {
product := model.TestScript{}
err := r.DB.Model(&model.TestScript{}).Where("id = ?", id).First(&product).Error
if err != nil {
logUtils.Errorf("find product by id error", zap.String("error:", err.Error()))
return product, err
}
return product, nil
}
func (r *TestScriptRepo) Create(po model.TestScript) (id uint, err error) {
if _, err := r.FindByName(po.Name); !errors.Is(err, gorm.ErrRecordNotFound) {
return 0, fmt.Errorf("%d", domain.BizErrNameNotExist.Code)
}
err = r.DB.Model(&model.TestScript{}).Create(&po).Error
if err != nil {
logUtils.Errorf("add product error", zap.String("error:", err.Error()))
return 0, err
}
id = po.ID
return
}
func (r *TestScriptRepo) Update(id uint, po model.TestScript) (err error) {
err = r.DB.Model(&model.TestScript{}).Where("id = ?", id).Updates(&po).Error
if err != nil {
logUtils.Errorf("update product error", zap.String("error:", err.Error()))
return err
}
return
}
func (r *TestScriptRepo) DeleteById(id uint) (err error) {
err = r.DB.Model(&model.TestScript{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("delete script by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestScriptRepo) FindByName(name string, ids ...uint) (po model.TestScript, err error) {
db := r.DB.Model(&model.TestScript{}).Where("name = ?", name)
if len(ids) == 1 {
db.Where("id != ?", ids[0])
}
err = db.First(&po).Error
if err != nil {
logUtils.Errorf("find product by name error", zap.String("name:", name), zap.Uints("ids:", ids), zap.String("error:", err.Error()))
return
}
return
}
package repo
import (
"errors"
"fmt"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
commonUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/common"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type TestSetRepo struct {
DB *gorm.DB `inject:""`
}
func NewTestSetRepo() *TestSetRepo {
return &TestSetRepo{}
}
func (r *TestSetRepo) Paginate(req serverDomain.ReqPaginate) (data domain.PageData, err error) {
var count int64
db := r.DB.Model(&model.TestSet{}).Where("NOT deleted")
if req.Keywords != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", req.Keywords))
}
if req.Enabled != "" {
db = db.Where("disabled = ?", commonUtils.IsDisable(req.Enabled))
}
err = db.Count(&count).Error
if err != nil {
logUtils.Errorf("count product error", zap.String("error:", err.Error()))
return
}
testSets := make([]*model.TestSet, 0)
err = db.
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&testSets).Error
if err != nil {
logUtils.Errorf("query product error", zap.String("error:", err.Error()))
return
}
data.Populate(testSets, count, req.Page, req.PageSize)
return
}
func (r *TestSetRepo) FindById(id uint) (po model.TestSet, err error) {
err = r.DB.Model(&model.TestSet{}).Where("id = ?", id).First(&po).Error
if err != nil {
logUtils.Errorf("find product by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSetRepo) Create(po model.TestSet) (id uint, err error) {
if _, err := r.FindByName(po.Name); !errors.Is(err, gorm.ErrRecordNotFound) {
return 0, fmt.Errorf("%d", domain.BizErrNameNotExist.Code)
}
err = r.DB.Model(&model.TestSet{}).Create(&po).Error
if err != nil {
logUtils.Errorf("add product error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSetRepo) Update(id uint, testSet model.TestSet) (err error) {
err = r.DB.Model(&model.TestSet{}).Where("id = ?", id).Updates(&testSet).Error
if err != nil {
logUtils.Errorf("update product error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSetRepo) DeleteById(id uint) (err error) {
err = r.DB.Model(&model.TestSet{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("delete set by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSetRepo) FindByName(name string, ids ...uint) (po model.TestSet, err error) {
db := r.DB.Model(&model.TestSet{}).Where("name = ?", name)
if len(ids) == 1 {
db.Where("id != ?", ids[0])
}
err = db.First(&po).Error
if err != nil {
logUtils.Errorf("find product by name error %s", err.Error())
return
}
return
}
package repo
import (
"errors"
"fmt"
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
commonUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/common"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
type TestSuiteRepo struct {
DB *gorm.DB `inject:""`
}
func NewTestSuiteRepo() *TestSuiteRepo {
return &TestSuiteRepo{}
}
func (r *TestSuiteRepo) Paginate(req serverDomain.ReqPaginate) (data domain.PageData, err error) {
var count int64
db := r.DB.Model(&model.TestSuite{}).Where("NOT deleted")
if req.Keywords != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", req.Keywords))
}
if req.Enabled != "" {
db = db.Where("disabled = ?", commonUtils.IsDisable(req.Enabled))
}
err = db.Count(&count).Error
if err != nil {
logUtils.Errorf("count product error", zap.String("error:", err.Error()))
return
}
testSuites := make([]*model.TestSuite, 0)
err = db.
Scopes(dao.PaginateScope(req.Page, req.PageSize, req.Order, req.Field)).
Find(&testSuites).Error
if err != nil {
logUtils.Errorf("query product error", zap.String("error:", err.Error()))
return
}
data.Populate(testSuites, count, req.Page, req.PageSize)
return
}
func (r *TestSuiteRepo) FindById(id uint) (testSuite model.TestSuite, err error) {
err = r.DB.Model(&model.TestSuite{}).Where("id = ?", id).First(&testSuite).Error
if err != nil {
logUtils.Errorf("find product by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSuiteRepo) Create(testSuite model.TestSuite) (id uint, err error) {
if _, err := r.FindByName(testSuite.Name); !errors.Is(err, gorm.ErrRecordNotFound) {
return 0, fmt.Errorf("%d", domain.BizErrNameNotExist.Code)
}
err = r.DB.Model(&model.TestSuite{}).Create(&testSuite).Error
if err != nil {
logUtils.Errorf("add product error %s", err.Error())
return 0, err
}
id = testSuite.ID
return
}
func (r *TestSuiteRepo) Update(id uint, testSuite model.TestSuite) (err error) {
err = r.DB.Model(&model.TestSuite{}).Where("id = ?", id).Updates(&testSuite).Error
if err != nil {
logUtils.Errorf("update product error %s", err.Error())
return err
}
return nil
}
func (r *TestSuiteRepo) DeleteById(id uint) (err error) {
err = r.DB.Model(&model.TestSuite{}).Where("id = ?", id).
Updates(map[string]interface{}{"deleted": true}).Error
if err != nil {
logUtils.Errorf("delete suite by id error", zap.String("error:", err.Error()))
return
}
return
}
func (r *TestSuiteRepo) FindByName(name string, ids ...uint) (testSuite model.TestSuite, err error) {
db := r.DB.Model(&model.TestSuite{}).Where("name = ?", testSuite)
if len(ids) == 1 {
db.Where("id != ?", ids[0])
}
err = db.First(&testSuite).Error
if err != nil {
logUtils.Errorf("find product by name error %s", err.Error())
return
}
return
}
package service
import (
"github.com/aaronchen2k/deeptest/internal/pkg/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/model"
"github.com/aaronchen2k/deeptest/internal/server/modules/v1/repo"
)
type ProductService struct {
ProductRepo *repo.ProductRepo `inject:""`
}
func NewProductService() *ProductService {
return &ProductService{}
}
func (s *ProductService) Paginate(req serverDomain.ReqPaginate) (ret domain.PageData, err error) {
ret, err = s.ProductRepo.Paginate(req)
if err != nil {
return
}
return
}
func (s *ProductService) FindById(id uint) (model.Product, error) {
return s.ProductRepo.FindById(id)
}
func (s *ProductService) Create(product model.Product) (uint, error) {
return s.ProductRepo.Create(product)
}
func (s *ProductService) Update(id uint, product model.Product) error {
return s.ProductRepo.Update(id, product)
}
func (s *ProductService) DeleteById(id uint) error {
return s.ProductRepo.BatchDelete(id)
}
package service
import (
"context"
"fmt"
pb "github.com/aaronchen2k/deeptest/internal/comm/grpc/proto/greater"
logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"log"
"time"
)
type RpcService struct{}
func NewRpcService() *RpcService {
return &RpcService{}
}
func (s *RpcService) SayHello(nodeIp string, nodePort int, req *pb.HelloRequest) (
reply *pb.HelloReply) {
// Set up a connection to the server.
creds, err := credentials.NewClientTLSFromFile("cert/test.pem", "*.deeptest.com")
if err != nil {
logUtils.Errorf("credentials.NewClientTLSFromFile fail, error %s", err.Error())
return
}
url := fmt.Sprintf("%s:%d", nodeIp, nodePort)
conn, err := grpc.Dial(url, grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("did not connect: %v", err)
logUtils.Errorf("grpc.Dial %s fail, error %s", url, err.Error())
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
reply, err = c.SayHello(ctx, req)
if err != nil {
logUtils.Errorf("SayHello fail, error %s", url, err.Error())
}
return
}
......@@ -12,8 +12,7 @@ import (
)
type TestExecService struct {
TestExecRepo *repo.TestExecRepo `inject:""`
ProjectRepo *repo.ProjectRepo `inject:""`
ProjectRepo *repo.ProjectRepo `inject:""`
}
func NewTestExecService() *TestExecService {
......
package service
type TestSetService struct {
}
func NewTestSetService() *TestSetService {
return &TestSetService{}
}
package service
type TestSuiteService struct {
}
func NewTestSuiteService() *TestSuiteService {
return &TestSuiteService{}
}
......@@ -39,7 +39,7 @@ export default defineComponent({
const { locale } = useI18n();
const locales: string[] = ['zh-CN', 'zh-TW', 'en-US'];
const locales: string[] = ['zh-CN', 'en-US'];
const languageLabels: {[key: string]: string} = {
'zh-CN': '简体中文',
'en-US': 'English',
......
......@@ -49,7 +49,8 @@ export default defineComponent({
const projects = computed<any[]>(() => store.state.project.projects);
const currProject = computed<any>(() => store.state.project.currProject);
store.dispatch('project/fetchProject', '');
store.dispatch('project/fetchProject', '')
const switchProject = (newProject, oldProject) => {
const routerPath = router.currentRoute.value.path
......
......@@ -4,9 +4,9 @@
*/
import axios, { AxiosPromise, AxiosRequestConfig, AxiosResponse } from 'axios';
import { notification } from "ant-design-vue";
import router from '@/config/routes';
import settings from '@/config/settings';
import { getCache, setCache } from '@/utils/localCache';
import i18n from "@/config/i18n";
export interface ResponseData {
code: number;
......@@ -98,7 +98,7 @@ request.interceptors.request.use(
config.params = { ...config.params, ts: Date.now() };
if (!config.params.currProject) {
const projectPath = await getCache(settings.currProject);
config.params = { ...config.params, currProject: projectPath };
config.params = { ...config.params, currProject: projectPath, lang: i18n.global.locale.value };
}
console.log('=== request ===', config.url, config)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册