Skip to content
Snippets Groups Projects
Select Git revision
  • 24d5a5c137cb7267bc93e2ecd6fd6e824bedb29d
  • main default protected
2 results

server_releases.go

Blame
  • Forked from flow3r / API
    Source project has a limited visibility.
    server_releases.go 2.42 KiB
    package main
    
    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"net/http"
    	"net/url"
    	"time"
    )
    
    type GLAssetLink struct {
    	ID      int64  `json:"id"`
    	Name    string `json:"name"`
    	TagName string `json:"tag_name"`
    	URL     string `json:"url"`
    }
    
    type GLRelease struct {
    	Name       string    `json:"name"`
    	TagName    string    `json:"tag_name"`
    	ReleasedAt time.Time `json:"released_at"`
    	Assets     struct {
    		Links []GLAssetLink `json:"links"`
    	} `json:"assets"`
    }
    
    func getReleases(ctx context.Context) ([]GLRelease, error) {
    	path := fmt.Sprintf("https://%s/api/v4/projects/%s/releases?order_by=created_at", flagGitlabHost, url.PathEscape(flagGitlabProject))
    	req, err := http.NewRequestWithContext(ctx, "GET", path, nil)
    	if err != nil {
    		return nil, fmt.Errorf("when building request: %w", err)
    	}
    	res, err := http.DefaultTransport.RoundTrip(req)
    	if err != nil {
    		return nil, fmt.Errorf("when performing request: %w", err)
    	}
    	defer res.Body.Close()
    
    	if res.StatusCode != 200 {
    		return nil, fmt.Errorf("invalid response code %d", res.StatusCode)
    	}
    
    	var releases []GLRelease
    	j := json.NewDecoder(res.Body)
    	err = j.Decode(&releases)
    	if err != nil {
    		return nil, fmt.Errorf("when performing request: %w", err)
    	}
    	return releases, nil
    }
    
    func (s *server) handleReleases(w http.ResponseWriter, r *http.Request) {
    	ctx := r.Context()
    	releases, err := s.getReleases(ctx)
    	if err != nil {
    		return
    	}
    
    	type partition struct {
    		Name   string `json:"name"`
    		URL    string `json:"url"`
    		Offset string `json:"offset"`
    	}
    
    	type release struct {
    		Name       string      `json:"name"`
    		Tag        string      `json:"tag"`
    		Partitions []partition `json:"partitions"`
    	}