func CreateDeploymentAndDeploymentCommits()

in backend/plugins/webhook/api/deployments.go [138:247]


func CreateDeploymentAndDeploymentCommits(connection *models.WebhookConnection, request *WebhookDeploymentReq, tx dal.Transaction, logger log.Logger) errors.Error {
	// validation
	if request == nil {
		return errors.BadInput.New("request body is nil")
	}
	if len(request.DeploymentCommits) == 0 {
		return errors.BadInput.New("deployment_commits is empty")
	}
	// set default values for optional fields
	deploymentId := request.Id
	scopeId := fmt.Sprintf("%s:%d", "webhook", connection.ID)
	if request.CreatedDate == nil {
		request.CreatedDate = request.StartedDate
	}
	if request.FinishedDate == nil {
		now := time.Now()
		request.FinishedDate = &now
	}
	if request.Result == "" {
		request.Result = devops.RESULT_SUCCESS
	}
	if request.Environment == "" {
		request.Environment = devops.PRODUCTION
	}
	duration := float64(request.FinishedDate.Sub(*request.StartedDate).Milliseconds() / 1e3)
	name := request.Name
	if name == "" {
		var commitShaList []string
		for _, commit := range request.DeploymentCommits {
			commitShaList = append(commitShaList, commit.CommitSha)
		}
		name = fmt.Sprintf(`deploy %s to %s`, strings.Join(commitShaList, ","), request.Environment)
	}
	createdDate := time.Now()
	if request.CreatedDate != nil {
		createdDate = *request.CreatedDate
	} else if request.StartedDate != nil {
		createdDate = *request.StartedDate
	}

	// prepare deploymentCommits and deployment records
	// queuedDuration := dateInfo.CalculateQueueDuration()
	deploymentCommits := make([]*devops.CicdDeploymentCommit, len(request.DeploymentCommits))
	for i, commit := range request.DeploymentCommits {
		if commit.Result == "" {
			commit.Result = devops.RESULT_SUCCESS
		}
		if commit.Status == "" {
			commit.Status = devops.STATUS_DONE
		}
		if commit.Name == "" {
			commit.Name = fmt.Sprintf(`deployment for %s`, commit.CommitSha)
		}
		if commit.CreatedDate == nil {
			commit.CreatedDate = &createdDate
		}
		if commit.StartedDate == nil {
			commit.StartedDate = request.StartedDate
		}
		if commit.FinishedDate == nil {
			commit.FinishedDate = request.FinishedDate
		}
		// create a deployment_commit record
		deploymentCommits[i] = &devops.CicdDeploymentCommit{
			DomainEntity: domainlayer.DomainEntity{
				Id: GenerateDeploymentCommitId(connection.ID, deploymentId, commit.RepoUrl, commit.CommitSha),
			},
			CicdDeploymentId: deploymentId,
			CicdScopeId:      scopeId,
			Result:           commit.Result,
			Status:           commit.Status,
			OriginalResult:   commit.Result,
			OriginalStatus:   commit.Status,
			TaskDatesInfo: devops.TaskDatesInfo{
				CreatedDate:  *commit.CreatedDate,
				StartedDate:  commit.StartedDate,
				FinishedDate: commit.FinishedDate,
			},
			DurationSec:         &duration,
			RepoId:              commit.RepoId,
			Name:                commit.Name,
			DisplayTitle:        commit.DisplayTitle,
			RepoUrl:             commit.RepoUrl,
			Environment:         request.Environment,
			OriginalEnvironment: request.Environment,
			RefName:             commit.RefName,
			CommitSha:           commit.CommitSha,
			CommitMsg:           commit.CommitMsg,
			//QueuedDurationSec: queuedDuration,
		}
	}

	if err := tx.CreateOrUpdate(deploymentCommits); err != nil {
		logger.Error(err, "failed to save deployment commits")
		return err
	}

	// create a deployment record
	deployment := deploymentCommits[0].ToDeploymentWithCustomDisplayTitle(request.DisplayTitle)
	deployment.Name = name
	deployment.CreatedDate = createdDate
	deployment.StartedDate = request.StartedDate
	deployment.FinishedDate = request.FinishedDate
	deployment.Result = request.Result
	if err := tx.CreateOrUpdate(deployment); err != nil {
		logger.Error(err, "failed to save deployment")
		return err
	}
	return nil
}