Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"bugly.go",
"dao.go",
"mail.go",
"mysql_bug_template.go",
"mysql_bugly.go",
"tapd.go",
],
importpath = "go-common/app/service/ep/footman/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/ep/footman/conf:go_default_library",
"//app/service/ep/footman/model:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/orm:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/sync/pipeline/fanout:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"//vendor/gopkg.in/gomail.v2:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,243 @@
package dao
import (
"context"
"fmt"
"io/ioutil"
"net/http"
"os/exec"
"runtime"
"strconv"
"strings"
"go-common/app/service/ep/footman/model"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_buglyOkCode = 200
_issueDetailCode = 100000
_issueDetailList = "/v2/lastCrashInfo/appId/%s/platformId/%s/issues/%s?offsetTop=56&fsn=6d0260aa-331f-48b9-8557-c2aaf6e0be90"
_issueList = "/v2/issueList?sortOrder=desc&sortField=uploadTime&rows=50&fsn=45cdb5aa-eb6f-4bda-9bba-ba0b264bfc93&appId=%s&platformId=%s&version=%s&start=%s&rows=%s&exceptionTypeList=%s"
_issueVersionList = "/v2/getSelector/appId/%s/platformId/%s?types=version&fsn=8b8782b5-053d-4f58-bc17-d5c43d7f5ece"
_issueExceptionList = "/v2/issueInfo/appId/%s/platformId/%s/issueId/%s/exceptionTypeList/Crash,Native,ExtensionCrash?fsn=114a8d02-586d-4fe4-8c23-79003fbe6882"
)
// BugVersion Bug Version .
func (d *Dao) BugVersion(c context.Context, projectID, platformID string) (ret []*model.BugVersion, err error) {
var (
req *http.Request
res *model.BugVersionResponse
cookie string
token string
hostStr string
)
hostStr = d.c.Bugly.Host + fmt.Sprintf(_issueVersionList, projectID, platformID)
if req, err = d.newRequest("GET", hostStr, nil); err != nil {
return
}
if cookie, token, err = d.cookieAndToken(); err != nil {
return
}
req.Header.Set("Cookie", cookie)
req.Header.Set("x-token", token)
req.Header.Set("content-type", "application/json;charset=utf-8")
req.Header.Set("x-csrf-token", "undefined")
if err = d.httpClient.Do(c, req, &res); err != nil {
log.Error("d.BugVersion url(%s) err(%v)", "BugVersion", err)
return
}
if res.Status != _buglyOkCode {
err = ecode.MartheBuglyErr
log.Error("Status url(%s) res(%v) err(%v)", "BugVersion", res, err)
log.Error("maybe need to update cookie and token")
return
}
ret = res.Ret.BugVersionList
return
}
// BuglyIssueAndRetry Bugly Issue And Retry.
func (d *Dao) BuglyIssueAndRetry(c context.Context, bugIssueRequest *model.BugIssueRequest) (ret *model.BugRet, err error) {
for i := 0; i < 3; i++ {
if ret, err = d.BuglyIssue(c, bugIssueRequest); err == nil {
break
}
}
return
}
// BuglyIssue Get Issue.
func (d *Dao) BuglyIssue(c context.Context, bugIssueRequest *model.BugIssueRequest) (ret *model.BugRet, err error) {
var (
req *http.Request
res *model.BugIssueResponse
cookie string
token string
hostStr string
)
hostStr = d.c.Bugly.Host + fmt.Sprintf(_issueList, bugIssueRequest.ProjectID, bugIssueRequest.PlatformID, bugIssueRequest.Version, strconv.Itoa(bugIssueRequest.StartNum), strconv.Itoa(bugIssueRequest.Rows), bugIssueRequest.ExceptionType)
if req, err = d.newRequest("GET", hostStr, nil); err != nil {
return
}
if cookie, token, err = d.cookieAndToken(); err != nil {
return
}
req.Header.Set("Cookie", cookie)
req.Header.Set("x-token", token)
req.Header.Set("content-type", "application/json;charset=utf-8")
req.Header.Set("x-csrf-token", "undefined")
if err = d.httpClient.Do(c, req, &res); err != nil {
log.Error("d.BuglyIssue url(%s) err(%v)", "BuglyIssue", err)
return
}
if res.Status != _buglyOkCode {
err = ecode.MartheBuglyErr
log.Error("Status url(%s) res(%v) err(%v)", "BuglyIssue", res, err)
log.Error("maybe need to update cookie and token")
return
}
ret = res.Ret
return
}
// BuglyIssueDetailAndRetry Bugly Issue Detail And Retry.
func (d *Dao) BuglyIssueDetailAndRetry(c context.Context, projectID, platformID, issueNo string) (bugIssueDetail *model.BugIssueDetail, err error) {
for i := 0; i < 3; i++ {
if bugIssueDetail, err = d.BuglyIssueDetail(c, projectID, platformID, issueNo); err == nil {
break
}
}
return
}
// BuglyIssueDetail Get Issue Detail.
func (d *Dao) BuglyIssueDetail(c context.Context, projectID, platformID, issueNo string) (bugIssueDetail *model.BugIssueDetail, err error) {
var (
req *http.Request
res *model.BugIssueDetailResponse
cookie string
token string
hostStr string
)
hostStr = d.c.Bugly.Host + fmt.Sprintf(_issueDetailList, projectID, platformID, issueNo)
if req, err = d.newRequest("GET", hostStr, nil); err != nil {
return
}
if cookie, token, err = d.cookieAndToken(); err != nil {
return
}
req.Header.Set("Cookie", cookie)
req.Header.Set("x-token", token)
req.Header.Set("content-type", "application/json;charset=utf-8")
req.Header.Set("x-csrf-token", "undefined")
if err = d.httpClient.Do(c, req, &res); err != nil {
log.Error("d.BuglyIssue url(%s) err(%v)", "BuglyIssue", err)
return
}
if res.Code != _issueDetailCode {
err = ecode.MartheBuglyErr
log.Error("Status url(%s) res(%v) err(%v)", "BuglyIssue", res, err)
return
}
bugIssueDetail = res.Data
return
}
// BuglyIssueExceptionList Bugly Issue Exception List.
func (d *Dao) BuglyIssueExceptionList(c context.Context, projectID, platformID, issueNo string) (bugIssueException *model.IssueException, err error) {
var (
req *http.Request
res *model.BugIssueExceptionListResponse
cookie string
token string
hostStr string
)
hostStr = d.c.Bugly.Host + fmt.Sprintf(_issueExceptionList, projectID, platformID, issueNo)
if req, err = d.newRequest("GET", hostStr, nil); err != nil {
return
}
if cookie, token, err = d.cookieAndToken(); err != nil {
return
}
req.Header.Set("Cookie", cookie)
req.Header.Set("x-token", token)
req.Header.Set("content-type", "application/json;charset=utf-8")
req.Header.Set("x-csrf-token", "undefined")
if err = d.httpClient.Do(c, req, &res); err != nil {
log.Error("d.BuglyIssueExceptionList url(%s) err(%v)", "BuglyIssueExceptionList", err)
return
}
if res.Status != _buglyOkCode {
err = ecode.MartheBuglyErr
log.Error("Status url(%s) res(%v) err(%v)", "BuglyIssueExceptionList", res, err)
return
}
if res.Ret != nil && len(res.Ret.IssueException) != 0 && res.Ret.IssueException[0].IssueID == issueNo {
bugIssueException = res.Ret.IssueException[0]
}
return
}
func (d *Dao) cookieAndToken() (cookie, token string, err error) {
var (
cookieByte []byte
tokenByte []byte
)
if cookieByte, err = ioutil.ReadFile(d.c.Bugly.Cookie); err != nil {
return
}
if tokenByte, err = ioutil.ReadFile(d.c.Bugly.Token); err != nil {
return
}
cookie = string(cookieByte)
token = string(tokenByte)
return
}
// UpdateToken Update Token.
func (d *Dao) UpdateToken() (err error) {
return d.updateCookieAndToken()
}
func (d *Dao) updateCookieAndToken() (err error) {
_, dir, _, _ := runtime.Caller(1)
currentPath := strings.Replace(dir, "bugly.go", "", -1)
cmd := exec.Command("python", "bugly.py")
cmd.Dir = currentPath
//err = cmd.Run()
return
}

View File

@@ -0,0 +1,90 @@
from browsermobproxy import Server
from selenium import webdriver
import time
import os
from selenium.webdriver.chrome.options import Options
# configuration
#browsermobPath = './browsermob-proxy-2.1.4/bin/browsermob-proxy'
browsermobPath = 'D:\\fyf\\tool\\browsermob-proxy-2.1.4\\bin\\browsermob-proxy'
username = '972360526'
password = '61241623FYFzwq'
tokenFile = os.getcwd()+'./token.conf'
cookiesFile = os.getcwd()+'./cookie.conf'
chromedriver = os.getcwd()+"./chromedriver.exe"
def writeResult(filePath, fileContext):
if os.path.exists(filePath):
os.remove(filePath)
f = open(filePath, 'w')
f.write(fileContext)
print(fileContext)
f.close()
return
def GetCookieAndToken():
server = Server(browsermobPath)
server.start()
proxy = server.create_proxy()
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver,chrome_options=chrome_options)
#driver = webdriver.PhantomJS(firefox_profile=profile,executable_path = geckodriverPah)
proxy.new_har("bugly", options={"captureHeaders":True})
driver.get("https://bugly.qq.com/v2/")
time.sleep(3)
driver.find_element_by_class_name("login_btn").click()
time.sleep(3)
driver.switch_to.frame("ptlogin_iframe")
time.sleep(3)
driver.find_element_by_id("switcher_plogin").click()
time.sleep(3)
driver.find_element_by_id("u").send_keys(username)
time.sleep(3)
driver.find_element_by_id("p").clear()
driver.find_element_by_id("p").send_keys(password)
time.sleep(3)
driver.find_element_by_id("login_button").click()
time.sleep(10)
driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/div/div/div/div[2]/table/tbody/tr/td[1]/div/div[1]/img').click()
time.sleep(3)
driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/div/div[1]/div[2]/ul[2]/li/a').click()
time.sleep(10)
strCookies = ""
strToken = ""
cookies = driver.get_cookies()
requestDict = proxy.har['log']['entries']
for index in range(len(requestDict)):
for k in requestDict[index]:
if k == "request" and requestDict[index][k]['url'].find('v2/issueList')>=0:
for inn in range(len(requestDict[index][k]['headers'])):
for ik in requestDict[index][k]['headers'][inn]:
if ik == 'name' and requestDict[index][k]['headers'][inn][ik]=='X-token':
strToken = requestDict[index][k]['headers'][inn]['value']
if ik == 'name' and requestDict[index][k]['headers'][inn][ik]=='Cookie' and requestDict[index][k]['headers'][inn]['value'].find('pt2gguin')>=0 and requestDict[index][k]['headers'][inn]['value'].find('bugly_session')>=0 and requestDict[index][k]['headers'][inn]['value'].find('referrer')>=0:
strCookies = requestDict[index][k]['headers'][inn]['value']
if strToken!="" and strCookies!="":
break;
writeResult(tokenFile,strToken)
writeResult(cookiesFile,strCookies)
server.stop()
if __name__ == '__main__':
GetCookieAndToken()

View File

@@ -0,0 +1 @@
pgv_pvi=8114248704; eas_sid=a1j5J203m9A4x1j307E3b0u4A8; pgv_pvid=352985328; ptui_loginuin=972360526; pt2gguin=o0972360526; RK=keyEJkBQW6; ptcz=0f939604b4f1205249c5d28ea26750e9a6077b664d2a54865f6e81dac9e08c90; o_cookie=972360526; pac_uid=1_972360526; __v3_c_review_10643=9; __v3_c_last_10643=1532482927091; __v3_c_visitor=1524887184864119; tvfe_boss_uuid=5a38ed3d664c09a7; __v3_c_uactiveat_10643=1528422214233; LW_sid=X1W5L3o1q7o971s4E7o0F4k6S8; LW_uid=i1Q5A3H1A7D9P1Y4d7t0z4g7g0; _ga=GA1.2.1508917390.1532664512; btcu_id=ed70f24fdc9235e8bc045c4c55a836755b67a9efb455d; _gid=GA1.2.657757944.1534127484; _qpsvr_localtk=0.0342640573507188; pgv_si=s2024529920; ptisp=ctc; pgv_info=pgvReferrer=&ssid=s3519213288; bugly_session=eyJpdiI6IjZQOUVaWVlnQlwvc2pzckUzSnI0cEVnPT0iLCJ2YWx1ZSI6Ikl3d0hueHA1ZzJIZWJHVFFTcU8wa1BadURrSDlad2dXS21UZDdDZkJrXC9ZdWpcLzd0TWFzenYzeG5GbzczbG9pdUcwZ2lrYnI4Uzkyek41clBhbVBKYkE9PSIsIm1hYyI6ImVlMDFhYWQ4MDQxM2U2ZTM5MDMyYmZlNTY1NmM5YmUzMmRlYzE1MDhhOWI3YTViZWYwZGI3NmJlMWQyNGViOGYifQ%3D%3D; token-skey=6eb6b613-efab-a07d-abcb-771b70cad38f; token-lifeTime=1534225952; referrer=eyJpdiI6IjJDUTNGbWROa1M3dWZRekUrK21TWHc9PSIsInZhbHVlIjoibWhQc3M4UWRiOHV5ZU1nZTlUd0JDRnpxdUQxK25kRm8rWXdGNmdBSWhvakhOb21aUWgzZFJKbXVQZm1pK3BTa1NLMzVrczBBZ214NGFSaVZhQitGN000YmlPUFR3T20zSmlPbHVZcVJoUmhBK2RrbytCQUlOcDdKM2J1ZVNvYnI0WkJHUXpUckRCXC9jRFRUODkybzRFalhGXC9uWnU0YUZLaFV6M0FcL3BNN3BvPSIsIm1hYyI6IjEzZmFlMWM3M2Y4MDVmOTJhYzk3YzkzZmIzMWI1NTZkMzQ1Y2I5ZmYwYWY0YjUzMDRmZjQxMzk0MWQ1NjZmOGUifQ%3D%3D; _gat=1; uin=o0972360526; skey=@jikR9kwCF

View File

@@ -0,0 +1,98 @@
package dao
import (
"bytes"
"context"
"encoding/json"
"net/http"
"time"
"go-common/app/service/ep/footman/conf"
"go-common/library/cache/memcache"
"go-common/library/database/orm"
"go-common/library/log"
xhttp "go-common/library/net/http/blademaster"
"go-common/library/sync/pipeline/fanout"
"github.com/jinzhu/gorm"
"gopkg.in/gomail.v2"
)
// Dao dao
type Dao struct {
c *conf.Config
httpClient *xhttp.Client
email *gomail.Dialer
db *gorm.DB
cache *fanout.Fanout
mc *memcache.Pool
expire int32
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
//email: gomail.NewDialer(c.Mail.Host, c.Mail.Port, c.Mail.Username, c.Mail.Password),
httpClient: xhttp.NewClient(c.HTTPClient),
cache: fanout.New("mcCache", fanout.Worker(1), fanout.Buffer(1024)),
mc: memcache.NewPool(c.Memcache.Config),
expire: int32(time.Duration(c.Memcache.Expire) / time.Second),
}
if c.ORM != nil {
dao.db = orm.NewMySQL(c.ORM)
}
return
}
// Close close the resource.
func (d *Dao) Close() {
if d.db != nil {
d.db.Close()
}
if d.mc != nil {
d.mc.Close()
}
}
// Ping verify server is ok.
func (d *Dao) Ping(c context.Context) (err error) {
if d.db != nil {
if err = d.db.DB().Ping(); err != nil {
log.Info("dao.cloudDB.Ping() error(%v)", err)
}
}
return
}
func (d *Dao) newRequest(method, url string, v interface{}) (req *http.Request, err error) {
body := &bytes.Buffer{}
if method != http.MethodGet {
if err = json.NewEncoder(body).Encode(v); err != nil {
log.Error("json encode value(%s) err(%v) ", v, err)
return
}
}
if req, err = http.NewRequest(method, url, body); err != nil {
log.Error("http new request url(%s) err(%v)", url, err)
}
return
}
// cacheSave cache Save.
func (d *Dao) cacheSave(c context.Context, cacheItem *memcache.Item) {
var f = func(ctx context.Context) {
var (
conn = d.mc.Get(c)
err error
)
defer conn.Close()
if err = conn.Set(cacheItem); err != nil {
log.Error("Add Cache conn.Set(%s) error(%v)", cacheItem.Key, err)
}
}
if err := d.cache.Do(c, f); err != nil {
log.Error("ReleaseName cache save err(%v)", err)
}
}

View File

@@ -0,0 +1,15 @@
package dao
import (
"context"
"gopkg.in/gomail.v2"
)
// SendMail asynchronous send mail.
func (d *Dao) SendMail(message *gomail.Message) {
message.SetAddressHeader("From", d.email.Username, "footman")
d.cache.Do(context.TODO(), func(ctx context.Context) {
d.email.DialAndSend(message)
})
}

View File

@@ -0,0 +1,12 @@
package dao
import (
"go-common/app/service/ep/footman/model"
)
// FindBugTemplates Find Bug Templates.
func (d *Dao) FindBugTemplates(projectID string) (bugTemplate *model.BugTemplate, err error) {
bugTemplate = &model.BugTemplate{}
err = d.db.Where("project_id = ?", projectID).First(bugTemplate).Error
return
}

View File

@@ -0,0 +1,103 @@
package dao
import (
"fmt"
"go-common/app/service/ep/footman/model"
"go-common/library/ecode"
"go-common/library/log"
pkgerr "github.com/pkg/errors"
)
const (
_issueRecords = "issue_records"
_issueLastTimes = "issue_last_times"
)
// UpdateIssueRecord Update Issue Record.
func (d *Dao) UpdateIssueRecord(issueRecord *model.IssueRecord) (err error) {
err = d.db.Table(_issueRecords).Where("issue_no = ? and version = ?", issueRecord.IssueNo, issueRecord.Version).UpdateColumn(map[string]interface{}{
"last_time": issueRecord.LastTime,
"happen_times": issueRecord.HappenTimes,
"user_times": issueRecord.UserTimes,
}).Error
log.Info("update issue record: %s", issueRecord.IssueNo)
fmt.Print("update issue record: " + issueRecord.IssueNo)
return
}
// InsertIssueRecord Insert Issue Record.
func (d *Dao) InsertIssueRecord(issueRecord *model.IssueRecord) (err error) {
err = d.db.Table(_issueRecords).Create(issueRecord).Error
log.Info("insert issue record: %s", issueRecord.IssueNo)
fmt.Println("insert issue record: " + issueRecord.IssueNo)
return
}
// GetIssueLastTime Get Issue LastTime.
func (d *Dao) GetIssueLastTime(version string) (issueLastTime *model.IssueLastTime, err error) {
issueLastTime = &model.IssueLastTime{}
if err = d.db.Where("version = ?", version).First(issueLastTime).Error; err == ecode.NothingFound {
err = nil
}
return
}
// UpdateTaskStatus Update Task Status.
func (d *Dao) UpdateTaskStatus(issueLastTime *model.IssueLastTime) (err error) {
err = pkgerr.WithStack(d.db.Table(_issueLastTimes).Where("version=?", issueLastTime.Version).Update("task_status", issueLastTime.TaskStatus).Error)
return
}
// GetIssueRecord Get Issue Record.
func (d *Dao) GetIssueRecord(issueNo, version string) (issueRecord *model.IssueRecord, err error) {
issueRecord = &model.IssueRecord{}
if err = d.db.Where("issue_no = ? and version = ?", issueNo, version).First(issueRecord).Error; err == ecode.NothingFound {
err = nil
}
return
}
// GetIssueRecordNotInTapd Get Issue Record Not in tapd.
func (d *Dao) GetIssueRecordNotInTapd(issueFilterSQL string) (issueRecords []*model.IssueRecord, err error) {
if err = d.db.Raw(issueFilterSQL).Order("id asc").Find(&issueRecords).Error; err == ecode.NothingFound {
err = nil
}
return
}
// GetIssueRecordHasInTapd Get Issue Record in tapd.
func (d *Dao) GetIssueRecordHasInTapd(projectID string) (issueRecords []*model.IssueRecord, err error) {
if err = d.db.Table(_issueRecords).Where("project_id = ? and tapd_bug_id<>''", projectID).Find(&issueRecords).Error; err == ecode.NothingFound {
err = nil
}
return
}
// UpdateIssueRecordTapdBugID Update Issue Record Tapd Bug ID.
func (d *Dao) UpdateIssueRecordTapdBugID(id int64, tapdBugID string) (err error) {
return d.db.Table(_issueRecords).Where("id=?", id).Update("tapd_bug_id", tapdBugID).Error
}
// UpdateLastIssueTime Update Last Issue Time.
func (d *Dao) UpdateLastIssueTime(issueLastTime *model.IssueLastTime) (err error) {
return d.db.Table(_issueLastTimes).Where("version=?", issueLastTime.Version).Update("last_time", issueLastTime.LastTime).Error
}
// InsertIssueLastTime Insert Issue Last Time.
func (d *Dao) InsertIssueLastTime(issueLastTime *model.IssueLastTime) (err error) {
return d.db.Table(_issueLastTimes).Create(issueLastTime).Error
}
// UpdateLastIssue Update Last Issue.
func (d *Dao) UpdateLastIssue(issueLastTime *model.IssueLastTime) (err error) {
err = pkgerr.WithStack(d.db.Table(_issueLastTimes).Where("version=?", issueLastTime.Version).Update("last_issue", issueLastTime.LastIssue).Error)
return
}
// UpdateVersionRecord Update Version Record.
func (d *Dao) UpdateVersionRecord(issueLastTime *model.IssueLastTime) (err error) {
err = pkgerr.WithStack(d.db.Table(_issueLastTimes).Where("version=?", issueLastTime.Version).Updates(issueLastTime).Error)
return
}

View File

@@ -0,0 +1,407 @@
package dao
import (
"context"
"encoding/json"
"fmt"
"net/http"
"go-common/app/service/ep/footman/model"
"go-common/library/cache/memcache"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_userName = "bilibilinik"
_password = "0989D4F0-AF9D-949F-C950-E22A3F891NIK"
_startPN = 1
_successCode = 1
)
//Iteration fetch iterations
func (d *Dao) Iteration(iterationURL string) (res *model.IterationResponse, err error) {
var req *http.Request
res = &model.IterationResponse{}
if req, err = d.newTapdRequest(http.MethodGet, iterationURL, nil); err != nil {
return
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//Story fetch stories
func (d *Dao) Story(storyURL string) (res *model.StoryResponse, err error) {
var req *http.Request
res = &model.StoryResponse{}
if req, err = d.newTapdRequest(http.MethodGet, storyURL, nil); err != nil {
return nil, ecode.MartheTapdErr
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//Bug Bug
func (d *Dao) Bug(bugURL string) (res *model.BugResponse, err error) {
var req *http.Request
res = &model.BugResponse{}
if req, err = d.newTapdRequest(http.MethodGet, bugURL, nil); err != nil {
return nil, ecode.MartheTapdErr
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//BugPre Bug Pre
func (d *Dao) BugPre(workSpaceID, bugID string) (bug *model.Bug, err error) {
var (
req *http.Request
res = &model.BugSingleResponse{}
)
url := fmt.Sprintf(model.BugPreURL, workSpaceID, bugID)
if req, err = d.newTapdRequest(http.MethodGet, url, nil); err != nil {
err = ecode.MartheTapdErr
return
}
if err = d.httpClient.Do(context.TODO(), req, res); err != nil || res.Data == nil {
err = ecode.MartheTapdErr
return
}
bug = res.Data.Bug
return
}
//SpecStory fetch specific story
func (d *Dao) SpecStory(storyURL string) (res *model.SpecStoryResponse, err error) {
var req *http.Request
res = &model.SpecStoryResponse{}
if req, err = d.newTapdRequest(http.MethodGet, storyURL, nil); err != nil {
return
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//StoryChange fetch story changes
func (d *Dao) StoryChange(storyChangeURL string) (res *model.StoryChangeResponse, err error) {
var req *http.Request
res = &model.StoryChangeResponse{}
if req, err = d.newTapdRequest(http.MethodGet, storyChangeURL, nil); err != nil {
return
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//NameMap fetch story status name mapping
func (d *Dao) NameMap(nameMapURL string) (res *model.NameMapResponse, err error) {
var req *http.Request
res = &model.NameMapResponse{}
if req, err = d.newTapdRequest(http.MethodGet, nameMapURL, nil); err != nil {
return
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//Category fetch project category
func (d *Dao) Category(categoryURL string) (res *model.CategoryResponse, err error) {
var req *http.Request
res = &model.CategoryResponse{}
if req, err = d.newTapdRequest(http.MethodGet, categoryURL, nil); err != nil {
return
}
err = d.httpClient.Do(context.TODO(), req, res)
return
}
//AllIterations get all iterations by query url
func (d *Dao) AllIterations(ps int, iterationURL string) (res *model.IterationResponse, err error) {
var (
tempRes *model.IterationResponse
iterationPage = _startPN
tempPS = ps
currentTime int
)
url := fmt.Sprintf(iterationURL, iterationPage)
for tempPS == ps && currentTime < d.c.Tapd.RetryTime {
if tempRes, err = d.Iteration(url); err != nil || len(tempRes.Data) == 0 {
currentTime = currentTime + 1
err = nil
continue
}
if res == nil {
res = tempRes
} else if len(tempRes.Data) > 0 {
res.Data = append(res.Data, tempRes.Data...)
}
tempPS = len(tempRes.Data)
iterationPage++
url = fmt.Sprintf(iterationURL, iterationPage)
}
return
}
//AllStories get all stories by query url
func (d *Dao) AllStories(ps int, storyURL string) (res *model.StoryResponse, err error) {
var (
tempRes *model.StoryResponse
storyPage = _startPN
tempPS = ps
currentTime int
)
url := fmt.Sprintf(storyURL, storyPage)
for tempPS == ps && currentTime < d.c.Tapd.RetryTime {
if tempRes, err = d.Story(url); err != nil || len(tempRes.Data) == 0 {
currentTime = currentTime + 1
err = nil
continue
}
if res == nil {
res = tempRes
} else if len(tempRes.Data) > 0 {
res.Data = append(res.Data, tempRes.Data...)
}
tempPS = len(tempRes.Data)
storyPage++
url = fmt.Sprintf(storyURL, storyPage)
}
return
}
//AllStoryChanges get all story changes by query url
func (d *Dao) AllStoryChanges(ps int, storyChangeURL string) (res *model.StoryChangeResponse, err error) {
var (
tempRes *model.StoryChangeResponse
storyChangePage = _startPN
tempPS = ps
currentTime int
)
url := fmt.Sprintf(storyChangeURL, storyChangePage)
for tempPS == ps && currentTime < d.c.Tapd.RetryTime {
if tempRes, err = d.StoryChange(url); err != nil || len(tempRes.Data) == 0 {
currentTime = currentTime + 1
err = nil
continue
}
if res == nil {
res = tempRes
} else if len(tempRes.Data) > 0 {
res.Data = append(res.Data, tempRes.Data...)
}
tempPS = len(tempRes.Data)
storyChangePage++
url = fmt.Sprintf(storyChangeURL, storyChangePage)
}
return
}
//AllCategories get all categories of project
func (d *Dao) AllCategories(ps int, categoryURL string) (categoryMap map[string]string, err error) {
var (
tempRes, res *model.CategoryResponse
categoryPage = _startPN
tempPS = ps
currentTime int
)
url := fmt.Sprintf(categoryURL, categoryPage)
for tempPS == ps && currentTime < d.c.Tapd.RetryTime {
if tempRes, err = d.Category(url); err != nil {
currentTime = currentTime + 1
err = nil
continue
}
if res == nil {
res = tempRes
} else if len(tempRes.Data) > 0 {
res.Data = append(res.Data, tempRes.Data...)
}
tempPS = len(tempRes.Data)
categoryPage++
url = fmt.Sprintf(categoryURL, categoryPage)
}
categoryMap = make(map[string]string)
for _, category := range res.Data {
categoryMap[category.Category.ID] = category.Category.Name
}
return
}
//AllBugs All Bugs
func (d *Dao) AllBugs(ps int, bugURL string) (res *model.BugResponse, err error) {
var (
tempRes *model.BugResponse
bugPage = _startPN
tempPS = ps
currentTime int
)
url := fmt.Sprintf(bugURL, bugPage)
for tempPS == ps && currentTime < d.c.Tapd.RetryTime {
if tempRes, err = d.Bug(url); err != nil || len(tempRes.Data) == 0 {
currentTime = currentTime + 1
err = nil
continue
}
if res == nil {
res = tempRes
} else if len(tempRes.Data) > 0 {
res.Data = append(res.Data, tempRes.Data...)
}
tempPS = len(tempRes.Data)
bugPage++
url = fmt.Sprintf(bugURL, bugPage)
}
return
}
//CategoryPre Category Pre
func (d *Dao) CategoryPre(workSpaceID, releaseID string) (category *model.Category, err error) {
var (
req *http.Request
res = &model.CategoryPreResponse{}
)
releaseURL := fmt.Sprintf(model.CategoryPreURL, workSpaceID, releaseID)
if req, err = d.newTapdRequest(http.MethodGet, releaseURL, nil); err != nil {
err = ecode.MartheTapdErr
return
}
if err = d.httpClient.Do(context.TODO(), req, res); err != nil || res.Data == nil {
err = ecode.MartheTapdErr
return
}
category = res.Data.Category
return
}
// CategoryPreName Category PreName
func (d *Dao) CategoryPreName(workspaceID, categoryID string) (categoryPreName string, err error) {
var (
item *memcache.Item
conn = d.mc.Get(context.Background())
category *model.Category
)
defer conn.Close()
if item, err = conn.Get(workspaceID + categoryID); err == nil {
if err = json.Unmarshal(item.Value, &categoryPreName); err != nil {
log.Error("Json unmarshal err(%v)", err)
}
return
}
if category, err = d.CategoryPre(workspaceID, categoryID); err != nil {
return
}
categoryPreName = category.Name
item = &memcache.Item{Key: workspaceID + categoryID, Object: category.Name, Flags: memcache.FlagJSON, Expiration: d.expire}
d.cacheSave(context.Background(), item)
return
}
//Release Release
func (d *Dao) Release(workSpaceID, releaseID string) (release *model.Release, err error) {
var (
req *http.Request
res = &model.ReleaseResponse{}
)
releaseURL := fmt.Sprintf(model.ReleaseURL, workSpaceID, releaseID)
if req, err = d.newTapdRequest(http.MethodGet, releaseURL, nil); err != nil {
err = ecode.MartheTapdErr
return
}
if err = d.httpClient.Do(context.TODO(), req, res); err != nil || res.Data == nil {
err = ecode.MartheTapdErr
return
}
release = res.Data.Release
return
}
// ReleaseName ReleaseName
func (d *Dao) ReleaseName(workspaceID, releaseID string) (releaseName string, err error) {
var (
item *memcache.Item
conn = d.mc.Get(context.Background())
release *model.Release
)
defer conn.Close()
if item, err = conn.Get(workspaceID + releaseID); err == nil {
if err = json.Unmarshal(item.Value, &releaseName); err != nil {
log.Error("Json unmarshal err(%v)", err)
}
return
}
if release, err = d.Release(workspaceID, releaseID); err != nil {
return
}
releaseName = release.Name
item = &memcache.Item{Key: workspaceID + releaseID, Object: release.Name, Flags: memcache.FlagJSON, Expiration: d.expire}
d.cacheSave(context.Background(), item)
return
}
//newTapdRequest new tapd request
func (d *Dao) newTapdRequest(method, url string, v interface{}) (req *http.Request, err error) {
req, err = d.newRequest(method, url, v)
req.SetBasicAuth(_userName, _password)
return
}
// CreateBug Create Bug.
func (d *Dao) CreateBug(bug *model.Bug) (bugID string, err error) {
var (
req *http.Request
res = &model.BugSingleResponse{}
)
if req, err = d.newTapdRequest(http.MethodPost, model.CreateBugURL, bug); err != nil {
err = ecode.MartheTapdErr
return
}
if err = d.httpClient.Do(context.TODO(), req, res); err != nil {
err = ecode.MartheTapdErr
return
}
if res.Status != _successCode {
err = ecode.MartheTapdErr
return
}
bugID = res.Data.Bug.ID
return
}
// UpdateBug Update Bug.
func (d *Dao) UpdateBug(bug *model.UpdateBug) (err error) {
var (
req *http.Request
res = &model.BugSingleResponse{}
)
if req, err = d.newTapdRequest(http.MethodPost, model.CreateBugURL, bug); err != nil {
err = ecode.MartheTapdErr
return
}
if err = d.httpClient.Do(context.TODO(), req, res); err != nil {
err = ecode.MartheTapdErr
return
}
if res.Status != _successCode {
err = ecode.MartheTapdErr
}
return
}

View File

@@ -0,0 +1 @@
2106504811