go-common/app/admin/ep/saga/service/commit.go
2019-04-22 18:49:16 +08:00

235 lines
6.5 KiB
Go

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
}