From b80914baa162983a64d1c9413dc666f416524cbd Mon Sep 17 00:00:00 2001 From: James Scott Date: Tue, 11 Mar 2025 19:12:10 +0000 Subject: [PATCH] Adjust openapi for SavedSearchResponse This change optionally returns bookmark status and role (if the user is authenticated) when looking at a single or list of saved searches. This data was already being returned by spanner but being discarded. This change modifies the adapter layer to read that data and return the bookmark status and role. --- .../httpserver/create_saved_search_test.go | 28 +++++++--- backend/pkg/httpserver/list_saved_searches.go | 42 ++++++++------- lib/gcpspanner/spanneradapters/backend.go | 45 +++++++++++++--- .../spanneradapters/backend_test.go | 6 +++ openapi/backend/openapi.yaml | 51 +++++++++---------- 5 files changed, 114 insertions(+), 58 deletions(-) diff --git a/backend/pkg/httpserver/create_saved_search_test.go b/backend/pkg/httpserver/create_saved_search_test.go index 5fbe5b1d..27d8cd81 100644 --- a/backend/pkg/httpserver/create_saved_search_test.go +++ b/backend/pkg/httpserver/create_saved_search_test.go @@ -257,8 +257,14 @@ func TestCreateSavedSearch(t *testing.T) { Name: "test name", Query: `name:"test"`, Description: nil, - CreatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), - UpdatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), + Permissions: &backend.UserSavedSearchPermissions{ + Role: valuePtr(backend.SavedSearchOwner), + }, + BookmarkStatus: &backend.UserSavedSearchBookmark{ + Status: backend.BookmarkActive, + }, + CreatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), + UpdatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), }, err: nil, }, @@ -274,7 +280,9 @@ func TestCreateSavedSearch(t *testing.T) { "id":"searchID1", "name":"test name", "query":"name:\"test\"", - "updated_at":"2000-01-01T00:00:00Z" + "updated_at":"2000-01-01T00:00:00Z", + "bookmark_status":{"status":"bookmark_active"}, + "permissions":{"role":"saved_search_owner"} }`, ), }, @@ -292,8 +300,14 @@ func TestCreateSavedSearch(t *testing.T) { Name: "test name", Query: `name:"test"`, Description: valuePtr("test description"), - CreatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), - UpdatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), + Permissions: &backend.UserSavedSearchPermissions{ + Role: valuePtr(backend.SavedSearchOwner), + }, + BookmarkStatus: &backend.UserSavedSearchBookmark{ + Status: backend.BookmarkActive, + }, + CreatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), + UpdatedAt: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC), }, err: nil, }, @@ -316,7 +330,9 @@ func TestCreateSavedSearch(t *testing.T) { "name":"test name", "description" : "test description", "query":"name:\"test\"", - "updated_at":"2000-01-01T00:00:00Z" + "updated_at":"2000-01-01T00:00:00Z", + "bookmark_status":{"status":"bookmark_active"}, + "permissions":{"role":"saved_search_owner"} }`, ), }, diff --git a/backend/pkg/httpserver/list_saved_searches.go b/backend/pkg/httpserver/list_saved_searches.go index 964caaf3..6468d225 100644 --- a/backend/pkg/httpserver/list_saved_searches.go +++ b/backend/pkg/httpserver/list_saved_searches.go @@ -26,28 +26,34 @@ func getSavedSearches() []backend.SavedSearchResponse { return []backend.SavedSearchResponse{ { - CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - Description: &test1Description, - Id: "1", - Name: "a query I subscribe to", - Query: "group:css", + CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + Description: &test1Description, + Id: "1", + Name: "a query I subscribe to", + Query: "group:css", + BookmarkStatus: nil, + Permissions: nil, }, { - CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - Description: nil, - Id: "2", - Name: "my personal query", - Query: "available_on:chrome AND group:css", + CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + Description: nil, + Id: "2", + Name: "my personal query", + Query: "available_on:chrome AND group:css", + BookmarkStatus: nil, + Permissions: nil, }, { - CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), - Description: nil, - Id: "3", - Name: "a new query", - Query: "available_on:chrome", + CreatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + UpdatedAt: time.Date(2024, time.September, 1, 1, 0, 0, 0, time.UTC), + Description: nil, + Id: "3", + Name: "a new query", + Query: "available_on:chrome", + BookmarkStatus: nil, + Permissions: nil, }, } } diff --git a/lib/gcpspanner/spanneradapters/backend.go b/lib/gcpspanner/spanneradapters/backend.go index 08408068..edb60556 100644 --- a/lib/gcpspanner/spanneradapters/backend.go +++ b/lib/gcpspanner/spanneradapters/backend.go @@ -391,15 +391,48 @@ func (s *Backend) CreateUserSavedSearch(ctx context.Context, userID string, } return &backend.SavedSearchResponse{ - Id: *output, - CreatedAt: createdSavedSearch.CreatedAt, - UpdatedAt: createdSavedSearch.UpdatedAt, - Name: createdSavedSearch.Name, - Query: createdSavedSearch.Query, - Description: createdSavedSearch.Description, + Id: *output, + CreatedAt: createdSavedSearch.CreatedAt, + UpdatedAt: createdSavedSearch.UpdatedAt, + Name: createdSavedSearch.Name, + Query: createdSavedSearch.Query, + Description: createdSavedSearch.Description, + BookmarkStatus: convertSavedSearchIsBookmarkedFromGCP(createdSavedSearch.IsBookmarked), + Permissions: convertSavedSearchRoleFromGCP(createdSavedSearch.Role), }, nil } +func convertSavedSearchIsBookmarkedFromGCP(isBookmarked *bool) *backend.UserSavedSearchBookmark { + if isBookmarked == nil { + return nil + } + + status := backend.BookmarkNone + if *isBookmarked { + status = backend.BookmarkActive + } + + return &backend.UserSavedSearchBookmark{ + Status: status, + } +} + +// Roles can be found in lib/gcpspanner/saved_search_user_roles.go. +func convertSavedSearchRoleFromGCP(role *string) *backend.UserSavedSearchPermissions { + if role == nil { + return nil + } + + switch gcpspanner.SavedSearchRole(*role) { + case gcpspanner.SavedSearchOwner: + return &backend.UserSavedSearchPermissions{ + Role: valuePtr(backend.SavedSearchOwner), + } + } + + return nil +} + func (s *Backend) DeleteUserSavedSearch(ctx context.Context, userID, savedSearchID string) error { err := s.client.DeleteUserSavedSearch(ctx, gcpspanner.DeleteUserSavedSearchRequest{ SavedSearchID: savedSearchID, diff --git a/lib/gcpspanner/spanneradapters/backend_test.go b/lib/gcpspanner/spanneradapters/backend_test.go index 5428def1..f83ac68c 100644 --- a/lib/gcpspanner/spanneradapters/backend_test.go +++ b/lib/gcpspanner/spanneradapters/backend_test.go @@ -1466,6 +1466,12 @@ func TestCreateUserSavedSearch(t *testing.T) { Name: "test search", Description: valuePtr("test description"), Query: "test query", + Permissions: &backend.UserSavedSearchPermissions{ + Role: valuePtr(backend.SavedSearchOwner), + }, + BookmarkStatus: &backend.UserSavedSearchBookmark{ + Status: backend.BookmarkActive, + }, }, expectedError: nil, }, diff --git a/openapi/backend/openapi.yaml b/openapi/backend/openapi.yaml index e533832a..5d3a26cc 100644 --- a/openapi/backend/openapi.yaml +++ b/openapi/backend/openapi.yaml @@ -568,28 +568,6 @@ paths: parameters: - $ref: '#/components/parameters/paginationTokenParam' - $ref: '#/components/parameters/paginationSizeParam' - - in: query - name: role - schema: - type: string - enum: - - owner - description: Filter by role (currently only 'owner' is supported). - - in: query - name: bookmark_status - schema: - type: string - enum: - - active - description: Filter by bookmark status (currently only 'active' is supported). - - in: query - name: sort - schema: - type: string - enum: - - search_updated_at_asc - - search_updated_at_desc - description: Sort order to apply to the results. security: - bearerAuth: responses: @@ -1264,22 +1242,39 @@ components: query: type: string minLength: 1 + UserSavedSearchBookmarkStatus: + type: string + description: | + The bookmark status for a saved search for a user. + enum: + - bookmark_none + - bookmark_active UserSavedSearchBookmark: type: object properties: status: - type: string - description: | - The bookmark status for a saved search for a user. - enum: - - none - - active + $ref: '#/components/schemas/UserSavedSearchBookmarkStatus' required: - status SavedSearchResponse: allOf: - $ref: '#/components/schemas/GenericUpdatableUniqueModel' - $ref: '#/components/schemas/SavedSearch' + - type: object + properties: + permissions: + $ref: '#/components/schemas/UserSavedSearchPermissions' + bookmark_status: + $ref: '#/components/schemas/UserSavedSearchBookmark' + UserSavedSearchRole: + type: string + enum: + - saved_search_owner + UserSavedSearchPermissions: + type: object + properties: + role: + $ref: '#/components/schemas/UserSavedSearchRole' UserSavedSearchPage: type: object properties: