zentao.go 8.3 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1
package zentaoHelper
2 3

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"encoding/json"
5 6 7
	"errors"
	"fmt"
	"github.com/bitly/go-simplejson"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	"github.com/easysoft/zentaoatf/internal/pkg/domain"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	configHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/config"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11 12
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
	"github.com/easysoft/zentaoatf/internal/server/modules/v1/model"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13 14 15 16
	"github.com/easysoft/zentaoatf/pkg/domain"
	httpUtils "github.com/easysoft/zentaoatf/pkg/lib/http"
	i118Utils "github.com/easysoft/zentaoatf/pkg/lib/i118"
	logUtils "github.com/easysoft/zentaoatf/pkg/lib/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17
	"path"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18 19
	"regexp"
	"strings"
20 21
)

22
func GetConfig(baseUrl string) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
23
	url := baseUrl + "?mode=getconfig"
24 25 26
	bytes, err := httpUtils.Get(url)
	if err != nil {
		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27 28 29 30 31 32 33
	}

	json, _ := simplejson.NewJson(bytes)
	commConsts.ZenTaoVersion, _ = json.Get("version").String()
	commConsts.SessionId, _ = json.Get("sessionID").String()
	commConsts.SessionVar, _ = json.Get("sessionVar").String()
	requestType, _ := json.Get("requestType").String()
aaronchen2k2k's avatar
i118  
aaronchen2k2k 已提交
34
	commConsts.RequestType = requestType
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35 36
	commConsts.RequestFix, _ = json.Get("requestFix").String()

37
	return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38 39
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
func Login(config commDomain.WorkspaceConf) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41 42 43 44 45 46 47 48
	url := GenApiUrl("tokens", nil, config.Url)

	params := map[string]string{
		"account":  config.Username,
		"password": config.Password,
	}
	bodyBytes, err := httpUtils.Post(url, params)
	if err != nil {
49
		err = ZentaoLoginErr(err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51 52
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
53 54
	jsn, err := simplejson.NewJson(bodyBytes)
	if err != nil {
55
		err = ZentaoLoginErr(err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
56 57

		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58 59
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
60 61 62
	if jsn == nil {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63 64
	mp, err := jsn.Map()
	if err != nil {
65
		err = ZentaoLoginErr(err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
66 67 68

		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70 71 72

	val, ok := mp["token"]
	if ok {
		commConsts.SessionId = val.(string)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
73 74 75
		if commConsts.Verbose {
			logUtils.Info(i118Utils.Sprintf("success_to_login"))
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
76 77

	} else {
78
		err = ZentaoLoginErr(fmt.Sprintf("err response: %#v", string(bodyBytes)))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79 80

		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81 82 83 84 85
	}

	return
}

86
func ListLang() (langs []serverDomain.ZentaoLang, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87 88
	for key, mp := range commConsts.LangMap {
		langs = append(langs, serverDomain.ZentaoLang{Code: key, Name: mp["name"]})
89 90 91 92 93
	}

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95 96
func LoadSiteProduct(currSite serverDomain.ZentaoSite, currProductId int) (
	products []serverDomain.ZentaoProduct, currProduct serverDomain.ZentaoProduct, err error) {

97
	if currSite.Url == "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98
		products = []serverDomain.ZentaoProduct{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99 100 101 102 103 104 105 106
		return
	}
	config := commDomain.WorkspaceConf{
		Url:      currSite.Url,
		Username: currSite.Username,
		Password: currSite.Password,
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
107
	products, err = loadProduct(config)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
	if err != nil {
109
		products = make([]serverDomain.ZentaoProduct, 0)
110
		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
111
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112

aaronchen2k2k's avatar
aaronchen2k2k 已提交
113 114 115
	currIndex := 0
	for idx, item := range products {
		product := serverDomain.ZentaoProduct{Id: item.Id, Name: item.Name}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116

aaronchen2k2k's avatar
aaronchen2k2k 已提交
117
		if currProductId == product.Id {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
118
			currIndex = idx
aaronchen2k2k's avatar
aaronchen2k2k 已提交
119 120 121
		}
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
	currProduct = products[currIndex]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
	//products[currIndex].Checked = true
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124 125 126 127

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
128
func ListProduct(workspacePath string) (products []serverDomain.ZentaoProduct, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129
	config := configHelper.LoadByWorkspacePath(workspacePath)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
130 131 132
	return loadProduct(config)
}
func loadProduct(config commDomain.WorkspaceConf) (products []serverDomain.ZentaoProduct, err error) {
133
	if config.Url == "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
134
		err = errors.New(i118Utils.Sprintf("pls_config_workspace"))
135 136 137
		return
	}

138 139 140 141
	err = Login(config)
	if err != nil {
		return
	}
142

aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
	url := GenApiUrl("products", nil, config.Url)
144 145
	bytes, err := httpUtils.Get(url)
	if err != nil {
146
		err = ZentaoRequestErr(err.Error())
147 148 149
		return
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
150
	jsn, err := simplejson.NewJson(bytes)
151
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
152
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
153 154
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
155
	items, err := jsn.Get("products").Array()
156
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
157
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
158 159 160
		return
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
161
	products = []serverDomain.ZentaoProduct{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162 163 164 165 166 167 168
	for _, item := range items {
		productMap, _ := item.(map[string]interface{})

		id, _ := productMap["id"].(json.Number).Int64()
		name, _ := productMap["name"].(string)

		products = append(products, serverDomain.ZentaoProduct{Id: int(id), Name: name})
169 170 171 172 173
	}

	return
}

174
func ListCaseModule(productId uint, site model.Site) (modules []domain.NestedItem, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
175
	config := configHelper.LoadBySite(site)
176
	return LoadCaseModule(productId, config)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
177
}
178
func LoadCaseModule(productId uint, config commDomain.WorkspaceConf) (modules []domain.NestedItem, err error) {
179 180 181 182
	err = Login(config)
	if err != nil {
		return
	}
183

184 185 186 187 188 189 190 191 192 193 194 195 196 197
	arr, err := LoadCaseModuleArr(productId, config)
	if err != nil {
		return
	}

	modules = make([]domain.NestedItem, 0)
	for _, item := range arr {
		genModuleListData(item, "", &modules)
	}

	return
}

func LoadCaseModuleArr(productId uint, config commDomain.WorkspaceConf) (arr []interface{}, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
198 199 200
	err = Login(config)
	if err != nil {
		return
201 202
	}

203 204
	//uri := fmt.Sprintf("products/%d?fields=modules", productId) // this is product modules
	uri := fmt.Sprintf("modules?type=case&id=%d", productId)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
205
	url := GenApiUrl(uri, nil, config.Url)
206

207 208
	bytes, err := httpUtils.Get(url)
	if err != nil {
209
		err = ZentaoRequestErr(err.Error())
210 211 212
		return
	}

213 214
	jsn, err := simplejson.NewJson(bytes)
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
215
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
216 217 218
		return
	}

219
	arr, err = jsn.Get("modules").Array()
220
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
221
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
222 223
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
224

225 226 227
	return
}

228
func genModuleListData(interf interface{}, parentName string, modules *[]domain.NestedItem) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242
	mp := interf.(map[string]interface{})

	idNum := mp["id"].(json.Number)
	id, _ := idNum.Int64()
	name := path.Join("/", parentName, mp["name"].(string))
	*modules = append(*modules, domain.NestedItem{Id: int(id), Name: name})

	if mp["children"] == nil {
		return
	}

	children := mp["children"].([]interface{})
	for _, child := range children {
		childMap := child.(map[string]interface{})
243
		genModuleListData(childMap, name, modules)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
244 245 246
	}
}

247
func ListSuite(productId uint, site model.Site) (products []domain.NestedItem, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
248
	config := configHelper.LoadBySite(site)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
249 250
	return LoadSuite(productId, config)
}
251
func LoadSuite(productId uint, config commDomain.WorkspaceConf) (suites []domain.NestedItem, err error) {
252 253 254 255
	err = Login(config)
	if err != nil {
		return
	}
256

aaronchen2k2k's avatar
aaronchen2k2k 已提交
257 258
	uri := fmt.Sprintf("products/%d/testsuites", productId)
	url := GenApiUrl(uri, nil, config.Url)
259

260 261
	bytes, err := httpUtils.Get(url)
	if err != nil {
262
		err = ZentaoRequestErr(err.Error())
263 264 265
		return
	}

266 267
	jsn, err := simplejson.NewJson(bytes)
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
268
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
269 270 271 272 273
		return
	}

	arr, err := jsn.Get("testsuites").Array()
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
274
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
275 276
		return
	}
277

aaronchen2k2k's avatar
aaronchen2k2k 已提交
278
	suites, _ = GenPlatItems(arr)
279 280 281 282

	return
}

283
func ListTask(productId uint, site model.Site) (products []domain.NestedItem, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
284
	config := configHelper.LoadBySite(site)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
285 286
	return LoadTask(productId, config)
}
287
func LoadTask(productId uint, config commDomain.WorkspaceConf) (tasks []domain.NestedItem, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
288
	if config.Url == "" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
289
		err = errors.New(i118Utils.Sprintf("pls_config_workspace"))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
290 291 292
		return
	}

293 294 295 296
	err = Login(config)
	if err != nil {
		return
	}
297

aaronchen2k2k's avatar
aaronchen2k2k 已提交
298 299 300
	params := map[string]interface{}{
		"product": productId,
		"limit":   10000,
301
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
302
	url := GenApiUrl("testtasks", params, config.Url)
303
	bytes, err := httpUtils.Get(url)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
304
	if err != nil {
305
		err = ZentaoRequestErr(err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
306 307
		return
	}
308

309 310
	jsn, err := simplejson.NewJson(bytes)
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
311
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
312 313 314 315 316
		return
	}

	arr, err := jsn.Get("testtasks").Array()
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
317
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
318 319
		return
	}
320

aaronchen2k2k's avatar
aaronchen2k2k 已提交
321
	tasks, _ = GenPlatItems(arr)
322

aaronchen2k2k's avatar
aaronchen2k2k 已提交
323 324 325 326 327 328 329
	return
}

func GenPlatItems(arr []interface{}) (ret []domain.NestedItem, err error) {
	for _, iterf := range arr {
		temp := iterf.(map[string]interface{})
		id64, _ := temp["id"].(json.Number).Int64()
330

aaronchen2k2k's avatar
aaronchen2k2k 已提交
331 332
		item := domain.NestedItem{Id: int(id64), Name: temp["name"].(string)}
		ret = append(ret, item)
333 334 335 336
	}

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355

func FixSiteUlt(url string) (ret string) {
	regx := regexp.MustCompile(`(http|https):\/\/.+`)
	result := regx.FindStringSubmatch(url)
	if result == nil {
		return
	}

	regx = regexp.MustCompile(`[^:\/]\/`)
	result = regx.FindStringSubmatch(url)
	if result == nil { // without /
		ret = url
	} else {
		index := strings.LastIndex(url, "/")
		ret = url[:index+1]
	}

	return
}