From d9fafa62424e0e18a7a326260f6f60672eadc7cb Mon Sep 17 00:00:00 2001 From: Kerrie Martinez Date: Tue, 25 Jun 2024 14:38:10 -0700 Subject: [PATCH] adding getProject --- internal/dev_server/api/api.yaml | 2 ++ internal/dev_server/api/server.gen.go | 8 +++++++ internal/dev_server/api/server.go | 18 +++++++++++++-- internal/dev_server/db/sqlite.go | 32 +++++++++++++++++++++++++++ internal/dev_server/dev_server.go | 2 ++ internal/dev_server/model/store.go | 1 + 6 files changed, 61 insertions(+), 2 deletions(-) diff --git a/internal/dev_server/api/api.yaml b/internal/dev_server/api/api.yaml index c817d9b8..5089d56b 100644 --- a/internal/dev_server/api/api.yaml +++ b/internal/dev_server/api/api.yaml @@ -31,6 +31,8 @@ paths: responses: 200: $ref: '#/components/responses/Project' + 404: + description: No project found delete: summary: remove the specified project from the dev server diff --git a/internal/dev_server/api/server.gen.go b/internal/dev_server/api/server.gen.go index d7abc35e..a8b53725 100644 --- a/internal/dev_server/api/server.gen.go +++ b/internal/dev_server/api/server.gen.go @@ -448,6 +448,14 @@ func (response GetDevProjectsProjectKey200JSONResponse) VisitGetDevProjectsProje return json.NewEncoder(w).Encode(response) } +type GetDevProjectsProjectKey404Response struct { +} + +func (response GetDevProjectsProjectKey404Response) VisitGetDevProjectsProjectKeyResponse(w http.ResponseWriter) error { + w.WriteHeader(404) + return nil +} + type PostDevProjectsProjectKeyRequestObject struct { ProjectKey ProjectKey `json:"projectKey"` Body *PostDevProjectsProjectKeyJSONRequestBody diff --git a/internal/dev_server/api/server.go b/internal/dev_server/api/server.go index abbc61a6..2cd06606 100644 --- a/internal/dev_server/api/server.go +++ b/internal/dev_server/api/server.go @@ -31,8 +31,22 @@ func (s Server) DeleteDevProjectsProjectKey(ctx context.Context, request DeleteD } func (s Server) GetDevProjectsProjectKey(ctx context.Context, request GetDevProjectsProjectKeyRequestObject) (GetDevProjectsProjectKeyResponseObject, error) { - //TODO implement me - panic("implement me") + store := model.StoreFromContext(ctx) + project, err := store.GetDevProject(ctx, request.ProjectKey) + if err != nil { + return nil, err + } + if project == nil { + return GetDevProjectsProjectKey404Response{}, nil + } + + return GetDevProjectsProjectKey200JSONResponse{ + ProjectJSONResponse{ + LastSyncedFromSource: project.LastSyncTime.Unix(), + Context: project.Context, + SourceEnvironmentKey: project.SourceEnvironmentKey, + }, + }, nil } func (s Server) PostDevProjectsProjectKey(ctx context.Context, request PostDevProjectsProjectKeyRequestObject) (PostDevProjectsProjectKeyResponseObject, error) { diff --git a/internal/dev_server/db/sqlite.go b/internal/dev_server/db/sqlite.go index b343ce6e..fb5db5cf 100644 --- a/internal/dev_server/db/sqlite.go +++ b/internal/dev_server/db/sqlite.go @@ -3,6 +3,7 @@ package db import ( "context" "database/sql" + "encoding/json" "github.com/launchdarkly/ldcli/internal/dev_server/model" "github.com/pkg/errors" @@ -31,6 +32,37 @@ func (s Sqlite) GetDevProjects(ctx context.Context) ([]string, error) { return keys, nil } +func (s Sqlite) GetDevProject(ctx context.Context, key string) (*model.Project, error) { + var project model.Project + var contextData string + var flagStateData string + + row := s.database.QueryRowContext(ctx, ` + SELECT key, source_environment_key, context, last_sync_time, flag_state + FROM projects + WHERE key = ? + `, key) + + if err := row.Scan(&project.Key, &project.SourceEnvironmentKey, &contextData, &project.LastSyncTime, &flagStateData); err != nil { + if err == sql.ErrNoRows { + return nil, nil // No project found with the given key + } + return nil, err + } + + // Parse the context JSON string + if err := json.Unmarshal([]byte(contextData), &project.Context); err != nil { + return nil, errors.Wrap(err, "unable to unmarshal context data") + } + + // Parse the flag state JSON string + if err := json.Unmarshal([]byte(flagStateData), &project.FlagState); err != nil { + return nil, errors.Wrap(err, "unable to unmarshal flag state data") + } + + return &project, nil +} + func (s Sqlite) InsertProject(ctx context.Context, project model.Project) error { flagsStateJson, err := project.FlagState.MarshalJSON() if err != nil { diff --git a/internal/dev_server/dev_server.go b/internal/dev_server/dev_server.go index d5115e70..4c3a7a2a 100644 --- a/internal/dev_server/dev_server.go +++ b/internal/dev_server/dev_server.go @@ -2,6 +2,7 @@ package dev_server import ( "context" + "fmt" "log" "net/http" @@ -41,6 +42,7 @@ func (c LDClient) RunServer(ctx context.Context, accessToken, baseURI string) { r.Use(model.StoreMiddleware(sqlStore)) // TODO need a subrouter for relay endpoints handler := api.HandlerFromMux(apiServer, r) + fmt.Println("Server running on 0.0.0.0:8765") server := http.Server{ Addr: "0.0.0.0:8765", Handler: handler, diff --git a/internal/dev_server/model/store.go b/internal/dev_server/model/store.go index 6063e787..2a338e2e 100644 --- a/internal/dev_server/model/store.go +++ b/internal/dev_server/model/store.go @@ -13,6 +13,7 @@ const ctxKeyStore = ctxKey("model.Store") type Store interface { GetDevProjects(ctx context.Context) ([]string, error) + GetDevProject(ctx context.Context, projectKey string) (*Project, error) InsertProject(ctx context.Context, project Project) error }