235 lines
6.5 KiB
Go
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
|
|
}
|