diff --git a/cyclops/handlers.go b/cyclops/handlers.go index 64fd9ca..54cecd1 100644 --- a/cyclops/handlers.go +++ b/cyclops/handlers.go @@ -655,6 +655,24 @@ func (server *ModCyclopsServer) handleUpdateProject(w http.ResponseWriter, req * return nil } +func (server *ModCyclopsServer) handleShowSetsInProject(w http.ResponseWriter, req *http.Request, caption string) error { + projectId := chi.URLParam(req, "projectId") + command := "show sets in project " + projectId + ";" + server.Log("command", command) + resp, err := server.sendToCCMS(caption+" "+projectId, command) + if err != nil { + return fmt.Errorf("could not fetch show-sets response: %w", err) + } + + result := readResults(resp)[0] + sets := make([]any, 0) + for val := range result.Data() { + sets = append(sets, val.Values()[0]) + } + setList := SetList{Sets: sets} + return server.respondWithJSON(w, setList, caption) +} + // ----------------------------------------------------------------------------- type FundList struct { diff --git a/cyclops/handlers_test.go b/cyclops/handlers_test.go index 02c1ccd..7599069 100644 --- a/cyclops/handlers_test.go +++ b/cyclops/handlers_test.go @@ -277,6 +277,29 @@ func TestHandleShowSets(t *testing.T) { } } +func TestHandleShowSetsInProject(t *testing.T) { + fake := &fakeCCMS{resp: listResponse("mike.object", "mike.endangered")} + server := newTestServer(fake) + + rr := httptest.NewRecorder() + err := server.handleShowSetsInProject(rr, jsonRequest("", map[string]string{"projectId": "mike"}), "show sets in project") + if err != nil { + t.Fatalf("handleShowSets returned error: %v", err) + } + + assertEqual(t, "command sent to CCMS", fake.lastCmd, "show sets in project mike;") + + var got SetList + err = json.Unmarshal(rr.Body.Bytes(), &got) + if err != nil { + t.Fatalf("could not decode response body %q: %v", rr.Body.String(), err) + } + want := SetList{Sets: []any{"mike.object", "mike.endangered"}} + if !reflect.DeepEqual(got, want) { + t.Errorf("translated response:\n got %+v\nwant %+v", got, want) + } +} + func TestHandleShowFunds(t *testing.T) { fake := &fakeCCMS{resp: listResponse("general", "endowment")} server := newTestServer(fake) diff --git a/cyclops/server.go b/cyclops/server.go index e0adbd1..5a1f83e 100644 --- a/cyclops/server.go +++ b/cyclops/server.go @@ -114,6 +114,9 @@ func MakeModCyclopsServer(logger *catlogger.Logger, ccmsClient CCMSClient, root r.Put("/cyclops/projects/{projectId}", func(w http.ResponseWriter, req *http.Request) { server.runWithErrorHandling(w, req, server.handleUpdateProject, "update project") }) + r.Get("/cyclops/projects/{projectId}/sets", func(w http.ResponseWriter, req *http.Request) { + server.runWithErrorHandling(w, req, server.handleShowSetsInProject, "show sets in project") + }) r.Get("/cyclops/funds", func(w http.ResponseWriter, req *http.Request) { server.runWithErrorHandling(w, req, server.handleShowFunds, "show funds") }) diff --git a/descriptors/ModuleDescriptor-template.json b/descriptors/ModuleDescriptor-template.json index 225e931..63d7b96 100644 --- a/descriptors/ModuleDescriptor-template.json +++ b/descriptors/ModuleDescriptor-template.json @@ -161,6 +161,15 @@ "cyclops.projects.put" ] }, + { + "methods": [ + "GET" + ], + "pathPattern": "/cyclops/projects/{id}/sets", + "permissionsRequired": [ + "cyclops.sets.read" + ] + }, { "methods": [ "GET" diff --git a/htdocs/index.html b/htdocs/index.html index 9d69a41..5e1386f 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -18,7 +18,7 @@ @@ -66,18 +66,19 @@ origins: [{ id: 'lehigh', name: 'LeHigh' }, { id: 'nyu', name: 'New York U.' }], destinations: [{ id: 'clockss', name: 'CLOCKSS' }], })">modify project "literature of North Korea" +