// Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package api import ( "crypto/tls" "encoding/json" "fmt" "io" "net/http" "code.gitea.io/tea/modules/config" ) // Client provides methods for making raw API calls to Gitea type Client struct { login *config.Login httpClient *http.Client } // NewClient creates a new API client from a login func NewClient(login *config.Login) *Client { httpClient := &http.Client{} if login.Insecure { httpClient = &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }, } } return &Client{ login: login, httpClient: httpClient, } } // Get makes an authenticated GET request to the API func (c *Client) Get(path string, result interface{}) (*http.Response, error) { url := fmt.Sprintf("%s/api/v1%s", c.login.URL, path) req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } req.Header.Set("Authorization", "token "+c.login.Token) req.Header.Set("Accept", "application/json") resp, err := c.httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode >= 400 { body, _ := io.ReadAll(resp.Body) return resp, fmt.Errorf("API request failed with status %d: %s", resp.StatusCode, string(body)) } if result != nil { if err := json.NewDecoder(resp.Body).Decode(result); err != nil { return resp, fmt.Errorf("failed to decode response: %w", err) } } return resp, nil } // GetRaw makes an authenticated GET request and returns the raw response body func (c *Client) GetRaw(path string) ([]byte, error) { url := fmt.Sprintf("%s/api/v1%s", c.login.URL, path) req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } req.Header.Set("Authorization", "token "+c.login.Token) resp, err := c.httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } if resp.StatusCode >= 400 { return nil, fmt.Errorf("API request failed with status %d: %s", resp.StatusCode, string(body)) } return body, nil }