diff --git a/nexus3/pkg/client/client.go b/nexus3/pkg/client/client.go index 6eb44d49..1e2511df 100644 --- a/nexus3/pkg/client/client.go +++ b/nexus3/pkg/client/client.go @@ -1,11 +1,11 @@ package client import ( + "context" "crypto/tls" "crypto/x509" "fmt" "io" - "io/ioutil" "net/http" "os" "time" @@ -91,8 +91,12 @@ func (c *Client) ContentTypeTextPlain() { } func (c *Client) NewRequest(method string, endpoint string, body io.Reader) (req *http.Request, err error) { + return c.NewRequestContext(context.Background(), method, endpoint, body) +} + +func (c *Client) NewRequestContext(ctx context.Context, method string, endpoint string, body io.Reader) (req *http.Request, err error) { url := fmt.Sprintf("%s/%s", c.config.URL, endpoint) - req, err = http.NewRequest(method, url, body) + req, err = http.NewRequestWithContext(ctx, method, url, body) if err != nil { return req, err } @@ -104,34 +108,77 @@ func (c *Client) NewRequest(method string, endpoint string, body io.Reader) (req return req, nil } -func (c *Client) execute(method string, endpoint string, payload io.Reader) ([]byte, *http.Response, error) { - req, err := c.NewRequest(method, endpoint, payload) - if err != nil { - return nil, nil, err - } - +func (c *Client) execute(req *http.Request) ([]byte, *http.Response, error) { resp, err := c.httpClient.Do(req) if err != nil { return nil, nil, err } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) return body, resp, err } func (c *Client) Get(endpoint string, payload io.Reader) ([]byte, *http.Response, error) { - return c.execute(http.MethodGet, endpoint, payload) + if req, err := c.NewRequest(http.MethodGet, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } } func (c *Client) Post(endpoint string, payload io.Reader) ([]byte, *http.Response, error) { - return c.execute(http.MethodPost, endpoint, payload) + if req, err := c.NewRequest(http.MethodPost, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } } func (c *Client) Put(endpoint string, payload io.Reader) ([]byte, *http.Response, error) { - return c.execute(http.MethodPut, endpoint, payload) + if req, err := c.NewRequest(http.MethodPut, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } } func (c *Client) Delete(endpoint string) ([]byte, *http.Response, error) { - return c.execute(http.MethodDelete, endpoint, nil) + if req, err := c.NewRequest(http.MethodDelete, endpoint, nil); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } +} + +func (c *Client) GetContext(ctx context.Context, endpoint string, payload io.Reader) ([]byte, *http.Response, error) { + if req, err := c.NewRequestContext(ctx, http.MethodGet, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } +} + +func (c *Client) PostContext(ctx context.Context, endpoint string, payload io.Reader) ([]byte, *http.Response, error) { + if req, err := c.NewRequestContext(ctx, http.MethodPost, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } +} + +func (c *Client) PutContext(ctx context.Context, endpoint string, payload io.Reader) ([]byte, *http.Response, error) { + if req, err := c.NewRequestContext(ctx, http.MethodPut, endpoint, payload); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } +} + +func (c *Client) DeleteContext(ctx context.Context, endpoint string) ([]byte, *http.Response, error) { + if req, err := c.NewRequestContext(ctx, http.MethodDelete, endpoint, nil); err != nil { + return nil, nil, err + } else { + return c.execute(req) + } } diff --git a/nexus3/pkg/repository/common/common.go b/nexus3/pkg/repository/common/common.go index a78cc058..c8815690 100644 --- a/nexus3/pkg/repository/common/common.go +++ b/nexus3/pkg/repository/common/common.go @@ -1,6 +1,7 @@ package common import ( + "context" "encoding/json" "fmt" "net/http" @@ -14,7 +15,11 @@ const ( ) func DeleteRepository(client *client.Client, id string) error { - body, resp, err := client.Delete(fmt.Sprintf("%s/%s", RepositoryAPIEndpoint, id)) + return DeleteRepositoryContext(context.Background(), client, id) +} + +func DeleteRepositoryContext(ctx context.Context, client *client.Client, id string) error { + body, resp, err := client.DeleteContext(ctx, fmt.Sprintf("%s/%s", RepositoryAPIEndpoint, id)) if err != nil { return err } diff --git a/nexus3/pkg/repository/common/service.go b/nexus3/pkg/repository/common/service.go index 38f8edea..21668a6d 100644 --- a/nexus3/pkg/repository/common/service.go +++ b/nexus3/pkg/repository/common/service.go @@ -1,6 +1,7 @@ package common import ( + "context" "encoding/json" "fmt" "net/http" @@ -22,11 +23,16 @@ func NewRepositoryService[R any](ep string, c *client.Client) *RepositoryService } func (s *RepositoryService[R]) Create(repo R) error { + return s.CreateContext(context.Background(), repo) +} + +func (s *RepositoryService[R]) CreateContext(ctx context.Context, repo R) error { + data, err := tools.JsonMarshalInterfaceToIOReader(repo) if err != nil { return err } - body, resp, err := s.client.Post(s.endpoint, data) + body, resp, err := s.client.PostContext(ctx, s.endpoint, data) if err != nil { return err } @@ -37,8 +43,12 @@ func (s *RepositoryService[R]) Create(repo R) error { } func (s *RepositoryService[R]) Get(id string) (*R, error) { + return s.GetContext(context.Background(), id) +} + +func (s *RepositoryService[R]) GetContext(ctx context.Context, id string) (*R, error) { repo := new(R) - body, resp, err := s.client.Get(fmt.Sprintf("%s/%s", s.endpoint, id), nil) + body, resp, err := s.client.GetContext(ctx, fmt.Sprintf("%s/%s", s.endpoint, id), nil) if err != nil { return nil, err } @@ -52,11 +62,15 @@ func (s *RepositoryService[R]) Get(id string) (*R, error) { } func (s *RepositoryService[R]) Update(id string, repo R) error { + return s.UpdateContext(context.Background(), id, repo) +} + +func (s *RepositoryService[R]) UpdateContext(ctx context.Context, id string, repo R) error { data, err := tools.JsonMarshalInterfaceToIOReader(repo) if err != nil { return err } - body, resp, err := s.client.Put(fmt.Sprintf("%s/%s", s.endpoint, id), data) + body, resp, err := s.client.PutContext(ctx, fmt.Sprintf("%s/%s", s.endpoint, id), data) if err != nil { return err } @@ -67,5 +81,9 @@ func (s *RepositoryService[R]) Update(id string, repo R) error { } func (s *RepositoryService[R]) Delete(id string) error { - return DeleteRepository(s.client, id) + return s.DeleteContext(context.Background(), id) +} + +func (s *RepositoryService[R]) DeleteContext(ctx context.Context, id string) error { + return DeleteRepositoryContext(ctx, s.client, id) }