diff --git a/internal/server/modules/v1/controller/site.go b/internal/server/modules/v1/controller/site.go new file mode 100644 index 0000000000000000000000000000000000000000..e87eaedec3091bed92a88bdff741e172f5b7bc18 --- /dev/null +++ b/internal/server/modules/v1/controller/site.go @@ -0,0 +1,72 @@ +package controller + +import ( + commConsts "github.com/aaronchen2k/deeptest/internal/comm/consts" + serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain" + "github.com/aaronchen2k/deeptest/internal/server/modules/v1/service" + "github.com/kataras/iris/v12" +) + +type SiteCtrl struct { + SiteService *service.SiteService `inject:""` + BaseCtrl +} + +func NewSiteCtrl() *SiteCtrl { + return &SiteCtrl{} +} + +// List 分页列表 +func (c *SiteCtrl) List(ctx iris.Context) { + projectPath := ctx.URLParam("currProject") + + if projectPath == "" { + ctx.JSON(c.SuccessResp(make([]serverDomain.TestReportSummary, 0))) + return + } + + data, err := c.SiteService.List(projectPath) + if err != nil { + ctx.JSON(c.ErrResp(commConsts.Failure, err.Error())) + return + } + + ctx.JSON(c.SuccessResp(data)) +} + +// Get 详情 +func (c *SiteCtrl) Get(ctx iris.Context) { + projectPath := ctx.URLParam("currProject") + + seq := ctx.Params().Get("seq") + if seq == "" { + c.ErrResp(commConsts.ParamErr, "seq") + return + } + + exec, err := c.SiteService.Get(projectPath, seq) + if err != nil { + ctx.JSON(c.ErrResp(commConsts.Failure, err.Error())) + return + } + ctx.JSON(c.SuccessResp(exec)) +} + +// Delete 删除 +func (c *SiteCtrl) Delete(ctx iris.Context) { + projectPath := ctx.URLParam("currProject") + + seq := ctx.Params().Get("seq") + if seq == "" { + c.ErrResp(commConsts.ParamErr, "seq") + return + } + + err := c.SiteService.Delete(projectPath, seq) + if err != nil { + ctx.JSON(c.ErrResp(commConsts.Failure, err.Error())) + return + } + + ctx.JSON(c.SuccessResp(nil)) +} diff --git a/internal/server/modules/v1/index.go b/internal/server/modules/v1/index.go index 8945fef46b28a47843e9c4d5334d0344bfa76e31..86b15d278d804231d34467236dfc03ff3c9eb92a 100644 --- a/internal/server/modules/v1/index.go +++ b/internal/server/modules/v1/index.go @@ -13,6 +13,8 @@ import ( type IndexModule struct { FileModule *index.FileModule `inject:""` + SiteModule *index.SiteModule `inject:""` + ZentaoModule *index.ZentaoModule `inject:""` ConfigModule *index.ConfigModule `inject:""` SyncModule *index.SyncModule `inject:""` @@ -42,6 +44,7 @@ func (m *IndexModule) Party() module.WebModule { modules := []module.WebModule{ m.FileModule.Party(), + m.SiteModule.Party(), m.ZentaoModule.Party(), m.ConfigModule.Party(), m.SyncModule.Party(), diff --git a/internal/server/modules/v1/index/site.go b/internal/server/modules/v1/index/site.go new file mode 100644 index 0000000000000000000000000000000000000000..b06dcb65e5d871f5e3d1d71be2f666d5cd4ef25f --- /dev/null +++ b/internal/server/modules/v1/index/site.go @@ -0,0 +1,28 @@ +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 SiteModule struct { + SiteCtrl *controller.SiteCtrl `inject:""` +} + +func NewSiteModule() *SiteModule { + return &SiteModule{} +} + +// Party 执行 +func (m *SiteModule) Party() module.WebModule { + handler := func(index iris.Party) { + index.Use(middleware.InitCheck()) + + index.Get("/", m.SiteCtrl.List).Name = "执行列表" + index.Get("/{seq:string}", m.SiteCtrl.Get).Name = "执行详情" + index.Delete("/{seq:string}", m.SiteCtrl.Delete).Name = "删除执行" + } + return module.NewModule("/sites", handler) +} diff --git a/internal/server/modules/v1/model/models.go b/internal/server/modules/v1/model/models.go index 5c0a098bce57d0664bb7d13c674f557d1c8dd3cd..bdc553dec2c4f4e69057c7f59e87b6c93adc4937 100644 --- a/internal/server/modules/v1/model/models.go +++ b/internal/server/modules/v1/model/models.go @@ -3,5 +3,6 @@ package model var ( Models = []interface{}{ &Project{}, + &Site{}, } ) diff --git a/internal/server/modules/v1/model/site.go b/internal/server/modules/v1/model/site.go new file mode 100644 index 0000000000000000000000000000000000000000..2f560125f52e87e5f1aca43c3d028fda961827c8 --- /dev/null +++ b/internal/server/modules/v1/model/site.go @@ -0,0 +1,16 @@ +package model + +type Site struct { + BaseModel + + Name string `json:"name"` + Url string `json:"url"` + Username string `json:"username"` + Password string `json:"password"` + + IsDefault bool `json:"isDefault"` +} + +func (Site) TableName() string { + return "biz_site" +} diff --git a/internal/server/modules/v1/repo/site.go b/internal/server/modules/v1/repo/site.go new file mode 100644 index 0000000000000000000000000000000000000000..6f6f9dfe061cdde59e74dd4b2e2e181b7f205c0b --- /dev/null +++ b/internal/server/modules/v1/repo/site.go @@ -0,0 +1,134 @@ +package repo + +import ( + "errors" + "fmt" + logUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/log" + "github.com/aaronchen2k/deeptest/internal/server/modules/v1/model" + "github.com/fatih/color" + "gorm.io/gorm" +) + +type SiteRepo struct { + DB *gorm.DB `inject:""` +} + +func NewSiteRepo() *SiteRepo { + return &SiteRepo{} +} + +func (r *SiteRepo) List() (sites []model.Site, err error) { + err = r.DB.Model(&model.Site{}). + Where("NOT deleted"). + Find(&sites).Error + + return +} + +func (r *SiteRepo) FindById(id uint) (po model.Site, err error) { + err = r.DB.Model(&model.Site{}). + Where("id = ?", id). + Where("NOT deleted"). + First(&po).Error + if err != nil { + logUtils.Errorf(color.RedString("find site by id failed, error: %s.", err.Error())) + return + } + + return +} + +func (r *SiteRepo) Create(project model.Site) (id uint, err error) { + po, err := r.FindDuplicate(project.Name, project.Url, 0) + if po.ID != 0 { + return 0, errors.New(fmt.Sprintf("站点%s(%s)已存在", project.Name, project.Url)) + } + + err = r.DB.Model(&model.Site{}).Create(&project).Error + if err != nil { + logUtils.Errorf(color.RedString("create project failed, error: %s.", err.Error())) + return 0, err + } + + id = project.ID + + return +} + +func (r *SiteRepo) Update(id uint, project model.Site) error { + po, err := r.FindDuplicate(project.Name, project.Url, id) + if po.ID != 0 { + return errors.New(fmt.Sprintf("站点%s(%s)已存在", project.Name, project.Url)) + } + + err = r.DB.Model(&model.Site{}).Where("id = ?", id).Updates(&project).Error + if err != nil { + logUtils.Errorf(color.RedString("update project failed, error: %s.", err.Error())) + return err + } + + return nil +} + +func (r *SiteRepo) DeleteByPath(pth string) (err error) { + err = r.DB.Where("path = ?", pth). + Delete(&model.Site{}). + Error + if err != nil { + logUtils.Errorf(color.RedString("delete project failed, error: %s.", err.Error())) + return + } + + return +} + +func (r *SiteRepo) FindDuplicate(name, url string, id uint) (po model.Site, err error) { + db := r.DB.Model(&model.Site{}). + Where("NOT deleted"). + Where("name = ? OR url = ?", name, url) + + if id != 0 { + db.Where("id != ?", id) + } + err = db.First(&po).Error + + return +} + +func (r *SiteRepo) GetCurrSiteByUser() (currSite model.Site, err error) { + err = r.DB.Model(&model.Site{}). + Where("is_default"). + Where("NOT deleted"). + First(&currSite).Error + + return +} + +func (r *SiteRepo) RemoveDefaultTag() (err error) { + err = r.DB.Model(&model.Site{}). + Where("true"). + Update("is_default", false).Error + + return err +} + +func (r *SiteRepo) SetCurrSite(id uint) (err error) { + r.RemoveDefaultTag() + + if id == 0 { + po := model.Site{} + err := r.DB.Model(&model.Site{}). + Where("NOT deleted"). + Order("id DESC"). + First(&po).Error + if err == nil { + id = po.ID + } + } + + err = r.DB.Model(&model.Site{}). + Where("id = ?", id). + Update("is_default", true).Error + + return err +} diff --git a/internal/server/modules/v1/service/site.go b/internal/server/modules/v1/service/site.go new file mode 100644 index 0000000000000000000000000000000000000000..0107bcacb67285ca134a00f21207612da7c74db0 --- /dev/null +++ b/internal/server/modules/v1/service/site.go @@ -0,0 +1,52 @@ +package service + +import ( + commConsts "github.com/aaronchen2k/deeptest/internal/comm/consts" + commDomain "github.com/aaronchen2k/deeptest/internal/comm/domain" + analysisUtils "github.com/aaronchen2k/deeptest/internal/comm/helper/analysis" + fileUtils "github.com/aaronchen2k/deeptest/internal/pkg/lib/file" + serverDomain "github.com/aaronchen2k/deeptest/internal/server/modules/v1/domain" + "github.com/aaronchen2k/deeptest/internal/server/modules/v1/repo" + "github.com/jinzhu/copier" + "path/filepath" +) + +type SiteService struct { + ProjectRepo *repo.ProjectRepo `inject:""` +} + +func NewSiteService() *SiteService { + return &SiteService{} +} + +func (s *SiteService) List(projectPath string) (ret []serverDomain.TestReportSummary, err error) { + reportFiles := analysisUtils.ListReport(projectPath) + + for _, seq := range reportFiles { + var summary serverDomain.TestReportSummary + + report, err1 := analysisUtils.ReadReportByProjectSeq(projectPath, seq) + if err1 != nil { // ignore wrong json result + continue + } + copier.Copy(&summary, report) + + summary.Seq = seq + ret = append(ret, summary) + } + + return +} + +func (s *SiteService) Get(projectPath string, seq string) (report commDomain.ZtfReport, err error) { + return analysisUtils.ReadReportByProjectSeq(projectPath, seq) +} + +func (s *SiteService) Delete(projectPath string, seq string) (err error) { + dir := filepath.Join(projectPath, commConsts.LogDirName) + + di := filepath.Join(dir, seq) + err = fileUtils.RmDir(di) + + return +}