in pkg/server/meta/youtrack.go [291:400]
func CreatePostUploadAttachmentsToIssue() http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
type Exceptions struct {
Exceptions []string `json:"exceptions"`
}
var exceptions Exceptions
body := request.Body
all, err := io.ReadAll(body)
if err != nil {
handleError(writer, "cannot read body", err, &exceptions.Exceptions)
_ = marshalAndWriteIssueResponse(writer, exceptions)
return
}
defer body.Close()
var params UploadAttachmentsToIssueRequest
if err = json.Unmarshal(all, ¶ms); err != nil {
handleError(writer, "cannot unmarshal parameters", err, &exceptions.Exceptions)
_ = marshalAndWriteIssueResponse(writer, exceptions)
return
}
errCh := make(chan error, 10)
builds := []int{params.TeamCityAttachmentInfo.CurrentBuildId}
if params.TeamCityAttachmentInfo.PreviousBuildId != nil {
builds = append(builds, *params.TeamCityAttachmentInfo.PreviousBuildId)
}
if params.ChartPng != nil {
err := youtrackClient.UploadAttachment(request.Context(), params.IssueId, *params.ChartPng, "dashboard.png")
if err != nil {
slog.Error("Failed to upload dashboard attachment to youtrack", "error", err)
errCh <- err
}
}
collector := getArtifactCollector(params.TestType)
if collector != nil {
var wg sync.WaitGroup
for index, buildId := range builds {
wg.Go(func() {
testArtifactPath := collector.getArtifactsPath(params)
children, err := teamCityClient.getArtifactChildren(request.Context(), buildId, testArtifactPath)
if err != nil {
slog.Error("Failed to get teamcity artifact children", "error", err)
errCh <- err
return
}
var filteredChildren []string
for _, str := range children {
if collector.checkArtifact(str) {
filteredChildren = append(filteredChildren, str)
}
}
var attachmentPostfix string
if index == 0 {
attachmentPostfix = "current"
} else {
attachmentPostfix = "before"
}
var childWg sync.WaitGroup
for _, str := range filteredChildren {
childWg.Go(func() {
artifact, err := teamCityClient.downloadArtifact(request.Context(), buildId, testArtifactPath+"/"+str)
if err != nil {
slog.Error("Failed to download artefacts form teamcity", "error", err)
errCh <- err
return
}
attachmentName := getAttachmentName(str, attachmentPostfix)
err = youtrackClient.UploadAttachment(request.Context(), params.IssueId, artifact, attachmentName)
if err != nil {
slog.Error("Failed to upload attachment to youtrack", "error", err)
errCh <- err
return
}
})
}
childWg.Wait()
})
}
wg.Wait()
}
close(errCh)
for err := range errCh {
if err != nil {
exceptions.Exceptions = append(exceptions.Exceptions, err.Error())
}
}
if len(exceptions.Exceptions) > 0 {
writer.WriteHeader(http.StatusInternalServerError)
_ = marshalAndWriteIssueResponse(writer, exceptions)
return
}
_ = marshalAndWriteIssueResponse(writer, exceptions)
}
}