123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- 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
- }
|