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: