123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- package service
- import (
- "context"
- "encoding/json"
- "strconv"
- "strings"
- "time"
- "go-common/app/admin/ep/saga/model"
- "go-common/app/admin/ep/saga/service/utils"
- "go-common/library/log"
- "github.com/xanzy/go-gitlab"
- )
- // QueryProjectCommit query project commit info according to project id.
- func (s *Service) QueryProjectCommit(c context.Context, req *model.ProjectDataReq) (resp *model.ProjectDataResp, err error) {
- if resp, err = s.QueryProject(c, "commit", req); err != nil {
- return
- }
- return
- }
- // QueryTeamCommit query team commit info according to department and business
- func (s *Service) QueryTeamCommit(c context.Context, req *model.TeamDataRequest) (resp *model.TeamDataResp, err error) {
- if resp, err = s.QueryTeam(c, "commit", req); err != nil {
- return
- }
- return
- }
- // QueryCommit query commit info according to department、 business and time.
- func (s *Service) QueryCommit(c context.Context, req *model.CommitRequest) (resp *model.CommitResp, err error) {
- var (
- layout = "2006-01-02"
- projectInfo []*model.ProjectInfo
- reqProject = &model.ProjectInfoRequest{}
- ProjectCommit []*model.ProjectCommit
- respCommit *gitlab.Response
- since time.Time
- until time.Time
- commitNum int
- )
- if len(req.Department) <= 0 && len(req.Business) <= 0 {
- log.Warn("query department and business are empty!")
- return
- }
- reqProject.Department = req.Department
- reqProject.Business = req.Business
- reqProject.Username = req.Username
- if _, projectInfo, err = s.dao.QueryProjectInfo(false, reqProject); err != nil {
- return
- }
- if len(projectInfo) <= 0 {
- log.Warn("Found no project!")
- return
- }
- //since, err = time.Parse("2006-01-02 15:04:05", "2018-08-13 00:00:00")
- if since, err = time.ParseInLocation(layout, req.Since, time.Local); err != nil {
- return
- }
- if until, err = time.ParseInLocation(layout, req.Until, time.Local); err != nil {
- return
- }
- log.Info("query commit start!")
- for _, project := range projectInfo {
- if _, respCommit, err = s.gitlab.ListProjectCommit(project.ProjectID, 1, &since, &until); err != nil {
- return
- }
- //log.Info("query: %s, result: %+v", project.Name, respCommit)
- CommitPer := &model.ProjectCommit{
- ProjectID: project.ProjectID,
- Name: project.Name,
- CommitNum: respCommit.TotalItems,
- }
- ProjectCommit = append(ProjectCommit, CommitPer)
- commitNum = commitNum + respCommit.TotalItems
- }
- log.Info("query commit end!")
- resp = &model.CommitResp{
- Total: commitNum,
- ProjectCommit: ProjectCommit,
- }
- return
- }
- /*-------------------------------------- sync commit ----------------------------------------*/
- // SyncProjectCommit ...
- func (s *Service) SyncProjectCommit(projectID int) (result *model.SyncResult, err error) {
- var (
- //syncAllTime = conf.Conf.Property.SyncData.SyncAllTime
- syncAllTime = false
- commits []*gitlab.Commit
- resp *gitlab.Response
- since *time.Time
- until *time.Time
- projectInfo *model.ProjectInfo
- )
- result = &model.SyncResult{}
- if projectInfo, err = s.dao.ProjectInfoByID(projectID); err != nil {
- return
- }
- if !syncAllTime {
- since, until = utils.CalSyncTime()
- }
- log.Info("sync project(%d) commit time since: %v, until: %v", projectID, since, until)
- for page := 1; ; page++ {
- result.TotalPage++
- if commits, resp, err = s.gitlab.ListProjectCommit(projectID, page, since, until); err != nil {
- return
- }
- for _, commit := range commits {
- var (
- statsAdditions int
- statsDeletions int
- parentIDs string
- commitStatus string
- )
- if commit.Stats != nil {
- statsAdditions = commit.Stats.Additions
- statsDeletions = commit.Stats.Deletions
- }
- if commit.Status != nil {
- commitStatusByte, _ := json.Marshal(commit.Status)
- commitStatus = string(commitStatusByte)
- }
- parentIDsByte, _ := json.Marshal(commit.ParentIDs)
- parentIDs = string(parentIDsByte)
- commitDB := &model.StatisticsCommits{
- CommitID: commit.ID,
- ProjectID: projectID,
- ProjectName: projectInfo.Name,
- ShortID: commit.ShortID,
- Title: commit.Title,
- AuthorName: commit.AuthorName,
- AuthoredDate: commit.AuthoredDate,
- CommitterName: commit.CommitterName,
- CommittedDate: commit.CommittedDate,
- CreatedAt: commit.CreatedAt,
- Message: commit.Message,
- ParentIDs: parentIDs,
- StatsAdditions: statsAdditions,
- StatsDeletions: statsDeletions,
- Status: commitStatus,
- }
- if len(commitDB.Message) > model.MessageMaxLen {
- commitDB.Message = commitDB.Message[0 : model.MessageMaxLen-1]
- }
- if err = s.SaveDatabaseCommit(commitDB); err != nil {
- log.Error("Commit Save Database err: projectID(%d), commitID(%s)", projectID, commit.ID)
- err = nil
- errData := &model.FailData{
- ChildIDStr: commit.ID,
- }
- result.FailData = append(result.FailData, errData)
- continue
- }
- result.TotalNum++
- }
- if resp.NextPage == 0 {
- break
- }
- }
- return
- }
- // SaveDatabaseCommit ...
- func (s *Service) SaveDatabaseCommit(commitDB *model.StatisticsCommits) (err error) {
- var total int
- if total, err = s.dao.HasCommit(commitDB.ProjectID, commitDB.CommitID); err != nil {
- log.Error("SaveDatabaseCommit HasCommit(%+v)", err)
- return
- }
- // found only one, so update
- if total == 1 {
- if err = s.dao.UpdateCommit(commitDB.ProjectID, commitDB.CommitID, commitDB); err != nil {
- if strings.Contains(err.Error(), model.DatabaseErrorText) {
- commitDB.Title = strconv.QuoteToASCII(commitDB.Title)
- commitDB.Message = strconv.QuoteToASCII(commitDB.Message)
- commitDB.Title = utils.Unicode2Chinese(commitDB.Title)
- commitDB.Message = utils.Unicode2Chinese(commitDB.Message)
- }
- if err = s.dao.UpdateCommit(commitDB.ProjectID, commitDB.CommitID, commitDB); err != nil {
- log.Error("SaveDatabaseCommit UpdateCommit err(%+v)", err)
- return
- }
- }
- return
- } else if total > 1 {
- // found repeated row, this situation will not exist under normal
- log.Warn("SaveDatabaseCommit commit has more rows(%d)", total)
- return
- }
- // insert row now
- if err = s.dao.CreateCommit(commitDB); err != nil {
- if strings.Contains(err.Error(), model.DatabaseErrorText) {
- commitDB.Title = strconv.QuoteToASCII(commitDB.Title)
- commitDB.Message = strconv.QuoteToASCII(commitDB.Message)
- commitDB.Title = utils.Unicode2Chinese(commitDB.Title)
- commitDB.Message = utils.Unicode2Chinese(commitDB.Message)
- }
- if err = s.dao.CreateCommit(commitDB); err != nil {
- log.Error("SaveDatabaseCommit CreateCommit err(%+v)", err)
- return
- }
- }
- return
- }
|