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
	"errors"
	"fmt"
Z
zhaoke 已提交
7 8 9 10
	"path"
	"regexp"
	"strings"

11
	"github.com/bitly/go-simplejson"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
12
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
Z
zhaoke 已提交
13
	commDomain "github.com/easysoft/zentaoatf/internal/pkg/domain"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	configHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/config"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15 16
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
	"github.com/easysoft/zentaoatf/internal/server/modules/v1/model"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17 18 19 20
	"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"
21 22
)

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

	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 已提交
35
	commConsts.RequestType = requestType
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36 37
	commConsts.RequestFix, _ = json.Get("requestFix").String()

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
func Login(config commDomain.WorkspaceConf) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43 44 45 46 47 48 49
	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 {
50
		err = ZentaoLoginErr(err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
		return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52 53
	}

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

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

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

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

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

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

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

	return
}

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

	return
}

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

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

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

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

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

Z
zhaoke 已提交
123 124 125
	if len(products) == 0 {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
126
	currProduct = products[currIndex]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127
	//products[currIndex].Checked = true
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128 129 130 131

	return
}

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

142 143 144 145
	err = Login(config)
	if err != nil {
		return
	}
146

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

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
165
	products = []serverDomain.ZentaoProduct{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
166 167 168 169 170 171 172
	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})
173 174 175 176 177
	}

	return
}

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

188 189 190 191 192 193 194 195 196 197 198 199 200 201
	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 已提交
202 203 204
	err = Login(config)
	if err != nil {
		return
205 206
	}

207 208
	//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 已提交
209
	url := GenApiUrl(uri, nil, config.Url)
210

211 212
	bytes, err := httpUtils.Get(url)
	if err != nil {
213
		err = ZentaoRequestErr(err.Error())
214 215 216
		return
	}

217 218
	jsn, err := simplejson.NewJson(bytes)
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
219
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
220 221 222
		return
	}

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

229 230 231
	return
}

232
func genModuleListData(interf interface{}, parentName string, modules *[]domain.NestedItem) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
233 234 235 236 237 238 239 240 241 242 243 244 245 246
	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{})
247
		genModuleListData(childMap, name, modules)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
248 249 250
	}
}

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

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

264 265
	bytes, err := httpUtils.Get(url)
	if err != nil {
266
		err = ZentaoRequestErr(err.Error())
267 268 269
		return
	}

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

	arr, err := jsn.Get("testsuites").Array()
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
278
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
279 280
		return
	}
281

aaronchen2k2k's avatar
aaronchen2k2k 已提交
282
	suites, _ = GenPlatItems(arr)
283 284 285 286

	return
}

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

297 298 299 300
	err = Login(config)
	if err != nil {
		return
	}
301

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

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

	arr, err := jsn.Get("testtasks").Array()
	if err != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
321
		err = ZentaoRequestErr(url, commConsts.ResponseParseErr.Message)
322 323
		return
	}
324

aaronchen2k2k's avatar
aaronchen2k2k 已提交
325
	tasks, _ = GenPlatItems(arr)
326

aaronchen2k2k's avatar
aaronchen2k2k 已提交
327 328 329 330 331 332 333
	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()
334

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

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359

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
}