From 418f19f5ed157898ec1ddd5395aee46bbe0cf3c6 Mon Sep 17 00:00:00 2001 From: Mario Verbelen Date: Fri, 12 Jan 2024 17:52:34 +0100 Subject: [PATCH] Add handleListEndpoints --- cmd/cli/main.go | 18 +++++++++++ internal/api/server.go | 13 ++++---- internal/api/server_test.go | 54 ++++++++++++++++++++++++++++++++ internal/storage/memory_store.go | 12 +++++++ internal/storage/sql.go | 6 ++-- internal/storage/storage.go | 1 + 6 files changed, 94 insertions(+), 10 deletions(-) diff --git a/cmd/cli/main.go b/cmd/cli/main.go index e9d2e5e..183f1f4 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -25,6 +25,7 @@ Usage: raptor COMMAND Commands: endpoint Create a new endpoint + list List all endpoints publish Publish a deployment to an endpoint deploy Create a new deployment help Show usage @@ -72,6 +73,8 @@ func main() { command.handlePublish(args[1:]) case "endpoint": command.handleEndpoint(args[1:]) + case "list": + command.handleListEndpoints(args[1:]) case "deploy": command.handleDeploy(args[1:]) case "serve": @@ -153,6 +156,21 @@ func (c command) handleEndpoint(args []string) { fmt.Println(string(b)) } +func (c command) handleListEndpoints(args []string) { + flagSet := flag.NewFlagSet("lists", flag.ExitOnError) + _ = flagSet.Parse(args) + + endpoint, err := c.client.ListEndpoints() + if err != nil { + printErrorAndExit(err) + } + b, err := json.MarshalIndent(endpoint, "", " ") + if err != nil { + printErrorAndExit(err) + } + fmt.Println(string(b)) +} + func (c command) handleDeploy(args []string) { flagset := flag.NewFlagSet("deploy", flag.ExitOnError) diff --git a/internal/api/server.go b/internal/api/server.go index 9fbe54e..da2d1d1 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -178,13 +178,12 @@ func (s *Server) handleGetEndpoint(w http.ResponseWriter, r *http.Request) error return writeJSON(w, http.StatusOK, endpoint) } -func (s *Server) handleGetEndpoints(w http.ResponseWriter, r *http.Request) error { - return nil - // endpoints, err := s.store.GetEndpoints() - // if err != nil { - // return writeJSON(w, http.StatusNotFound, ErrorResponse(err)) - // } - // return writeJSON(w, http.StatusOK, endpoints) +func (s *Server) handleGetEndpoints(w http.ResponseWriter, _ *http.Request) error { + endpoints, err := s.store.GetEndpoints() + if err != nil { + return writeJSON(w, http.StatusNotFound, ErrorResponse(err)) + } + return writeJSON(w, http.StatusOK, endpoints) } // PublishParams holds all the necessary fields to publish a specific diff --git a/internal/api/server_test.go b/internal/api/server_test.go index 243c488..5b2ce3c 100644 --- a/internal/api/server_test.go +++ b/internal/api/server_test.go @@ -81,6 +81,24 @@ func TestGetEndpoint(t *testing.T) { require.Equal(t, *endpoint, other) } +func TestGetEndpoints(t *testing.T) { + s := createServer() + endpoints := seedEndpoints(t, s) + + req := httptest.NewRequest("GET", "/endpoint", nil) + resp := httptest.NewRecorder() + + s.router.ServeHTTP(resp, req) + + require.Equal(t, http.StatusOK, resp.Result().StatusCode) + + var others []*types.Endpoint + err := json.NewDecoder(resp.Body).Decode(&others) + require.Nil(t, err) + + require.True(t, endpointsExistsInEndpoints(endpoints, others)) +} + func TestCreateDeploy(t *testing.T) { s := createServer() endpoint := seedEndpoint(t, s) @@ -131,6 +149,42 @@ func seedEndpoint(t *testing.T, s *Server) *types.Endpoint { require.Nil(t, s.store.CreateEndpoint(e)) return e } +func seedEndpoints(t *testing.T, s *Server) []*types.Endpoint { + items := []map[string]string{ + {"FOO": "BAR"}, + {"Bar": "foo"}, + {"Yada": "Yada"}, + } + + endpoints := make([]*types.Endpoint, 0, len(items)) + for _, item := range items { + e := types.NewEndpoint("My endpoint", "go", item) + require.Nil(t, s.store.CreateEndpoint(e)) + endpoints = append(endpoints, e) + } + return endpoints +} + +func endpointsExistsInEndpoints(s1, s2 []*types.Endpoint) bool { + if len(s1) != len(s2) { + return false + } + + for _, item1 := range s1 { + found := false + for _, item2 := range s2 { + if item1.ID == item2.ID { + found = true + break + } + } + if !found { + return false + } + } + + return true +} func createServer() *Server { cache := storage.NewDefaultModCache() diff --git a/internal/storage/memory_store.go b/internal/storage/memory_store.go index 0c379fa..1bf3b3a 100644 --- a/internal/storage/memory_store.go +++ b/internal/storage/memory_store.go @@ -38,6 +38,18 @@ func (s *MemoryStore) GetEndpoint(id uuid.UUID) (*types.Endpoint, error) { return e, nil } +func (s *MemoryStore) GetEndpoints() ([]*types.Endpoint, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + endpoints := make([]*types.Endpoint, 0, len(s.endpoints)) + for _, endpoint := range s.endpoints { + endpoints = append(endpoints, endpoint) + } + + return endpoints, nil +} + func (s *MemoryStore) UpdateEndpoint(id uuid.UUID, params UpdateEndpointParams) error { endpoint, err := s.GetEndpoint(id) if err != nil { diff --git a/internal/storage/sql.go b/internal/storage/sql.go index 68bfa0f..c9b8740 100644 --- a/internal/storage/sql.go +++ b/internal/storage/sql.go @@ -64,20 +64,20 @@ func (s *SQLStore) GetEndpoint(id uuid.UUID) (*types.Endpoint, error) { return &endpoint, err } -func (s *SQLStore) GetEndpoints() ([]types.Endpoint, error) { +func (s *SQLStore) GetEndpoints() ([]*types.Endpoint, error) { rows, err := s.db.Query("SELECT * FROM endpoint") if err != nil { return nil, err } defer rows.Close() - var endpoints []types.Endpoint + var endpoints []*types.Endpoint for rows.Next() { var endpoint types.Endpoint if err := scanEndpoint(rows, &endpoint); err != nil { return nil, err } - endpoints = append(endpoints, endpoint) + endpoints = append(endpoints, &endpoint) } return endpoints, nil } diff --git a/internal/storage/storage.go b/internal/storage/storage.go index e48fc56..879fc1a 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -9,6 +9,7 @@ type Store interface { CreateEndpoint(*types.Endpoint) error UpdateEndpoint(uuid.UUID, UpdateEndpointParams) error GetEndpoint(uuid.UUID) (*types.Endpoint, error) + GetEndpoints() ([]*types.Endpoint, error) CreateDeployment(*types.Deployment) error GetDeployment(uuid.UUID) (*types.Deployment, error) }