Files
gitlab.nvim/cmd/app/mergeability_checks.go
2026-02-26 10:14:57 +01:00

84 lines
2.0 KiB
Go

package app
import (
"encoding/json"
"fmt"
"net/http"
gitlab "gitlab.com/gitlab-org/api/client-go"
)
type MergeabilityCheck struct {
Identifier string `json:"identifier"`
Status string `json:"status"`
}
type MergeabilityChecksResponse struct {
SuccessResponse
MergeabilityChecks []*MergeabilityCheck `json:"mergeability_checks"`
}
type mergeabilityChecksGraphQLResponse struct {
Data struct {
Project struct {
MergeRequest struct {
MergeabilityChecks []*MergeabilityCheck `json:"mergeabilityChecks"`
} `json:"mergeRequest"`
} `json:"project"`
} `json:"data"`
}
const mergeabilityChecksQuery = `
query GetMergeabilityChecks($projectPath: ID!, $iid: String!) {
project(fullPath: $projectPath) {
mergeRequest(iid: $iid) {
mergeabilityChecks {
identifier
status
}
}
}
}
`
type mergeabilityChecksService struct {
data
client gitlab.GraphQLInterface
}
func (a mergeabilityChecksService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
checks, err := a.fetchMergeabilityChecks()
if err != nil {
handleError(w, err, "Could not get mergeability checks", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
response := MergeabilityChecksResponse{
SuccessResponse: SuccessResponse{Message: "Mergeability checks retrieved"},
MergeabilityChecks: checks,
}
err = json.NewEncoder(w).Encode(response)
if err != nil {
handleError(w, err, "Could not encode response", http.StatusInternalServerError)
}
}
func (a mergeabilityChecksService) fetchMergeabilityChecks() ([]*MergeabilityCheck, error) {
var response mergeabilityChecksGraphQLResponse
_, err := a.client.Do(gitlab.GraphQLQuery{
Query: mergeabilityChecksQuery,
Variables: map[string]any{
"projectPath": a.gitInfo.ProjectPath(),
"iid": fmt.Sprintf("%d", a.projectInfo.MergeId),
},
}, &response)
if err != nil {
return nil, fmt.Errorf("failed to fetch mergeability checks: %w", err)
}
return response.Data.Project.MergeRequest.MergeabilityChecks, nil
}