From cd0185470b78f59c84fd0ab124c07c4a73510e12 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sat, 4 Nov 2023 22:38:27 +0000 Subject: [PATCH 01/14] update auto-gen put file method request --- .../fern-workspace/generated/go/files_client.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/xata/internal/fern-workspace/generated/go/files_client.go b/xata/internal/fern-workspace/generated/go/files_client.go index 84de0df..1779891 100644 --- a/xata/internal/fern-workspace/generated/go/files_client.go +++ b/xata/internal/fern-workspace/generated/go/files_client.go @@ -18,8 +18,9 @@ type FilesClient interface { PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) error - PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*FileResponse, error) + PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, data []byte) (*FileResponse, error) DeleteFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*FileResponse, error) + SetContentTypeHeader(value string) } func NewFilesClient(opts ...core.ClientOption) FilesClient { @@ -34,6 +35,10 @@ func NewFilesClient(opts ...core.ClientOption) FilesClient { } } +func (f *filesClient) SetContentTypeHeader(value string) { + f.header.Set("content-type", value) +} + type filesClient struct { baseURL string httpClient core.HTTPClient @@ -311,7 +316,7 @@ func (f *filesClient) GetFile(ctx context.Context, dbBranchName DbBranchName, ta // The Table name // The Record name // The Column name -func (f *filesClient) PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*FileResponse, error) { +func (f *filesClient) PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, data []byte) (*FileResponse, error) { baseURL := "/" if f.baseURL != "" { baseURL = f.baseURL @@ -364,7 +369,7 @@ func (f *filesClient) PutFile(ctx context.Context, dbBranchName DbBranchName, ta f.httpClient, endpointURL, http.MethodPut, - nil, + data, &response, false, f.header, From 72c3bee31b0cbe05920a9610b379353298d2f566 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sat, 4 Nov 2023 22:38:48 +0000 Subject: [PATCH 02/14] add put file method --- .../integration-tests/files_client_test.go | 41 ++++++++---- xata/files_cilent.go | 27 +++++++- xata/files_cilent_test.go | 62 +++++++++++++++++++ 3 files changed, 117 insertions(+), 13 deletions(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index 820799d..02f8218 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -29,18 +29,6 @@ func Test_filesClient(t *testing.T) { } }) - filesCli, err := xata.NewFilesClient(xata.WithAPIKey(cfg.apiKey), - xata.WithBaseURL(fmt.Sprintf( - "https://%s.%s.xata.sh", - cfg.wsID, - cfg.region, - )), - xata.WithHTTPClient(retryablehttp.NewClient().StandardClient()), - ) - if err != nil { - t.Fatalf("unable to construct files cli: %v", err) - } - recordsCli, err := xata.NewRecordsClient( xata.WithAPIKey(cfg.apiKey), xata.WithBaseURL(fmt.Sprintf( @@ -62,6 +50,35 @@ func Test_filesClient(t *testing.T) { } assert.NotNil(t, record) + filesCli, err := xata.NewFilesClient(xata.WithAPIKey(cfg.apiKey), + xata.WithBaseURL(fmt.Sprintf( + "https://%s.%s.xata.sh", + cfg.wsID, + cfg.region, + )), + xata.WithHTTPClient(retryablehttp.NewClient().StandardClient()), + ) + if err != nil { + t.Fatalf("unable to construct files cli: %v", err) + } + + t.Run("put a file", func(t *testing.T) { + fileRes, err := filesCli.Put(ctx, xata.PutFileRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String(cfg.databaseName), + }, + TableName: cfg.tableName, + RecordId: record.Id, + ColumnName: fileColumn, + ContentType: xata.String("text/plain"), + Data: []byte(`new content`), + }) + assert.NoError(t, err) + assert.NotNil(t, fileRes.Attributes) + assert.Equal(t, "", fileRes.Name) + assert.Nil(t, fileRes.Id) + }) + t.Run("delete a file", func(t *testing.T) { delRes, err := filesCli.Delete(ctx, xata.DeleteFileRequest{ BranchRequestOptional: xata.BranchRequestOptional{ diff --git a/xata/files_cilent.go b/xata/files_cilent.go index b693eda..2713b07 100644 --- a/xata/files_cilent.go +++ b/xata/files_cilent.go @@ -13,7 +13,7 @@ type FilesClient interface { // PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) // DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) // GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) error - // PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*FileResponse, error) + Put(ctx context.Context, request PutFileRequest) (*xatagenworkspace.FileResponse, error) Delete(ctx context.Context, request DeleteFileRequest) (*xatagenworkspace.FileResponse, error) } @@ -57,6 +57,31 @@ func (f filesClient) Delete(ctx context.Context, request DeleteFileRequest) (*xa return f.generated.DeleteFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName) } +type PutFileRequest struct { + BranchRequestOptional + ContentType *string + TableName string + RecordId string + ColumnName string + Data []byte +} + +func (f filesClient) Put(ctx context.Context, request PutFileRequest) (*xatagenworkspace.FileResponse, error) { + dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) + if err != nil { + return nil, err + } + + contentType := "application/octet-stream" + if request.ContentType != nil && *request.ContentType != "" { + contentType = *request.ContentType + } + + f.generated.SetContentTypeHeader(contentType) + + return f.generated.PutFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.Data) +} + func NewFilesClient(opts ...ClientOption) (FilesClient, error) { cliOpts, dbCfg, err := consolidateClientOptionsForWorkspace(opts...) if err != nil { diff --git a/xata/files_cilent_test.go b/xata/files_cilent_test.go index 6a7d80a..22d952e 100644 --- a/xata/files_cilent_test.go +++ b/xata/files_cilent_test.go @@ -83,3 +83,65 @@ func Test_filesClient_Delete(t *testing.T) { }) } } + +func Test_filesClient_Put(t *testing.T) { + assert := assert.New(t) + + type tc struct { + name string + want *xatagenworkspace.FileResponse + statusCode int + apiErr *xatagencore.APIError + } + + tests := []tc{ + { + name: "should put a file successfully", + want: &xatagenworkspace.FileResponse{ + MediaType: "text/plain", + }, + statusCode: http.StatusOK, + }, + } + + for _, eTC := range errTestCasesWorkspace { + tests = append(tests, tc{ + name: eTC.name, + statusCode: eTC.statusCode, + apiErr: eTC.apiErr, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testSrv := testService(t, http.MethodPut, "/db", tt.statusCode, tt.apiErr != nil, tt.want) + + cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) + assert.NoError(err) + assert.NotNil(cli) + + got, err := cli.Put(context.TODO(), xata.PutFileRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String("my-db"), + }, + TableName: "my-table", + RecordId: "my-id", + ColumnName: "file-column", + Data: []byte(`hola`), + }) + + if tt.apiErr != nil { + errAPI := tt.apiErr.Unwrap() + if errAPI == nil { + t.Fatal("expected error but got nil") + } + assert.ErrorAs(err, &errAPI) + assert.Equal(err.Error(), tt.apiErr.Error()) + assert.Nil(got) + } else { + assert.Equal(tt.want.MediaType, got.MediaType) + assert.NoError(err) + } + }) + } +} From 4e597489f9da4852a355864f45da9ccffdbf4d2c Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sat, 4 Nov 2023 23:35:35 +0000 Subject: [PATCH 03/14] add new type to the auto-gen get file method --- .../fern-workspace/generated/go/files_client.go | 11 ++++++----- .../fern-workspace/generated/go/get_file_response.go | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 xata/internal/fern-workspace/generated/go/get_file_response.go diff --git a/xata/internal/fern-workspace/generated/go/files_client.go b/xata/internal/fern-workspace/generated/go/files_client.go index 1779891..8e63c8b 100644 --- a/xata/internal/fern-workspace/generated/go/files_client.go +++ b/xata/internal/fern-workspace/generated/go/files_client.go @@ -17,7 +17,7 @@ type FilesClient interface { GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) error PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) - GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) error + GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*GetFileResponse, error) PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, data []byte) (*FileResponse, error) DeleteFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*FileResponse, error) SetContentTypeHeader(value string) @@ -253,7 +253,7 @@ func (f *filesClient) DeleteFileItem(ctx context.Context, dbBranchName DbBranchN // The Table name // The Record name // The Column name -func (f *filesClient) GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) error { +func (f *filesClient) GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*GetFileResponse, error) { baseURL := "/" if f.baseURL != "" { baseURL = f.baseURL @@ -293,20 +293,21 @@ func (f *filesClient) GetFile(ctx context.Context, dbBranchName DbBranchName, ta return apiError } + response := &GetFileResponse{} if err := core.DoRequest( ctx, f.httpClient, endpointURL, http.MethodGet, nil, - nil, + response, false, f.header, errorDecoder, ); err != nil { - return err + return nil, err } - return nil + return response, nil } // Uploads the file content to the given file column diff --git a/xata/internal/fern-workspace/generated/go/get_file_response.go b/xata/internal/fern-workspace/generated/go/get_file_response.go new file mode 100644 index 0000000..91aa169 --- /dev/null +++ b/xata/internal/fern-workspace/generated/go/get_file_response.go @@ -0,0 +1,11 @@ +package api + +type GetFileResponse struct { + Content []byte +} + +func (r *GetFileResponse) Write(p []byte) (n int, err error) { + r.Content = append(r.Content, p...) + + return len(p), nil +} From ecb88f66b947b14bc637dc95198a236625c096e7 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sat, 4 Nov 2023 23:35:49 +0000 Subject: [PATCH 04/14] add get file method --- .../integration-tests/files_client_test.go | 13 ++++ .../integration-tests/records_client_test.go | 4 +- xata/files_cilent.go | 13 +++- xata/files_cilent_test.go | 61 +++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index 02f8218..1759841 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -62,6 +62,19 @@ func Test_filesClient(t *testing.T) { t.Fatalf("unable to construct files cli: %v", err) } + t.Run("get a file", func(t *testing.T) { + getFileRes, err := filesCli.Get(ctx, xata.GetFileRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String(cfg.databaseName), + }, + TableName: cfg.tableName, + RecordId: record.Id, + ColumnName: fileColumn, + }) + assert.NoError(t, err) + assert.Equal(t, fileContent, string(getFileRes.Content)) + }) + t.Run("put a file", func(t *testing.T) { fileRes, err := filesCli.Put(ctx, xata.PutFileRequest{ BranchRequestOptional: xata.BranchRequestOptional{ diff --git a/internal/integration-tests/records_client_test.go b/internal/integration-tests/records_client_test.go index 62e47d4..eac1103 100644 --- a/internal/integration-tests/records_client_test.go +++ b/internal/integration-tests/records_client_test.go @@ -2,6 +2,7 @@ package integrationtests import ( "context" + "encoding/base64" "fmt" "testing" "time" @@ -21,6 +22,7 @@ const ( integerColumn = "integer-column" floatColumn = "float-column" fileColumn = "file-column" + fileContent = "file content" jsonColumn = "json-column" vectorColumn = "vector-column" // it is important to set a vector dimension on the UI: 2 multipleColumn = "multiple-column" @@ -457,7 +459,7 @@ func generateInsertRecordRequest(databaseName, tableName string) xata.InsertReco floatColumn: xata.ValueFromDouble(10.3), fileColumn: xata.ValueFromInputFile(xata.InputFile{ Name: testFileName, - Base64Content: xata.String("ZmlsZSBjb250ZW50"), // file content + Base64Content: xata.String(base64.StdEncoding.EncodeToString([]byte(fileContent))), }), vectorColumn: xata.ValueFromDoubleList([]float64{10.3, 20.2}), multipleColumn: xata.ValueFromStringList([]string{"hello", "world"}), diff --git a/xata/files_cilent.go b/xata/files_cilent.go index 2713b07..e1cbfb6 100644 --- a/xata/files_cilent.go +++ b/xata/files_cilent.go @@ -12,7 +12,7 @@ type FilesClient interface { // GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) error // PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) // DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) - // GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) error + Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) Put(ctx context.Context, request PutFileRequest) (*xatagenworkspace.FileResponse, error) Delete(ctx context.Context, request DeleteFileRequest) (*xatagenworkspace.FileResponse, error) } @@ -82,6 +82,17 @@ func (f filesClient) Put(ctx context.Context, request PutFileRequest) (*xatagenw return f.generated.PutFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.Data) } +type GetFileRequest DeleteFileRequest + +func (f filesClient) Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) { + dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) + if err != nil { + return nil, err + } + + return f.generated.GetFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName) +} + func NewFilesClient(opts ...ClientOption) (FilesClient, error) { cliOpts, dbCfg, err := consolidateClientOptionsForWorkspace(opts...) if err != nil { diff --git a/xata/files_cilent_test.go b/xata/files_cilent_test.go index 22d952e..3817509 100644 --- a/xata/files_cilent_test.go +++ b/xata/files_cilent_test.go @@ -145,3 +145,64 @@ func Test_filesClient_Put(t *testing.T) { }) } } + +func Test_filesClient_Get(t *testing.T) { + assert := assert.New(t) + + type tc struct { + name string + want *xatagenworkspace.GetFileResponse + statusCode int + apiErr *xatagencore.APIError + } + + tests := []tc{ + { + name: "should get a file successfully", + want: &xatagenworkspace.GetFileResponse{ + Content: []byte(`hola`), + }, + statusCode: http.StatusOK, + }, + } + + for _, eTC := range errTestCasesWorkspace { + tests = append(tests, tc{ + name: eTC.name, + statusCode: eTC.statusCode, + apiErr: eTC.apiErr, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testSrv := testService(t, http.MethodGet, "/db", tt.statusCode, tt.apiErr != nil, tt.want) + + cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) + assert.NoError(err) + assert.NotNil(cli) + + got, err := cli.Get(context.TODO(), xata.GetFileRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String("my-db"), + }, + TableName: "my-table", + RecordId: "my-id", + ColumnName: "file-column", + }) + + if tt.apiErr != nil { + errAPI := tt.apiErr.Unwrap() + if errAPI == nil { + t.Fatal("expected error but got nil") + } + assert.ErrorAs(err, &errAPI) + assert.Equal(err.Error(), tt.apiErr.Error()) + assert.Nil(got) + } else { + assert.NotNil(got) + assert.NoError(err) + } + }) + } +} From 78213d6776508274608fa5b5c6f74186b8ef4d99 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 10:35:49 +0000 Subject: [PATCH 05/14] fix test --- .../integration-tests/files_client_test.go | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index 1759841..d070d63 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -44,12 +44,6 @@ func Test_filesClient(t *testing.T) { insertRecordRequest := generateInsertRecordRequest(cfg.databaseName, cfg.tableName) - record, err := recordsCli.Insert(ctx, insertRecordRequest) - if err != nil { - t.Fatal(err) - } - assert.NotNil(t, record) - filesCli, err := xata.NewFilesClient(xata.WithAPIKey(cfg.apiKey), xata.WithBaseURL(fmt.Sprintf( "https://%s.%s.xata.sh", @@ -63,6 +57,12 @@ func Test_filesClient(t *testing.T) { } t.Run("get a file", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + getFileRes, err := filesCli.Get(ctx, xata.GetFileRequest{ BranchRequestOptional: xata.BranchRequestOptional{ DatabaseName: xata.String(cfg.databaseName), @@ -76,6 +76,12 @@ func Test_filesClient(t *testing.T) { }) t.Run("put a file", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + fileRes, err := filesCli.Put(ctx, xata.PutFileRequest{ BranchRequestOptional: xata.BranchRequestOptional{ DatabaseName: xata.String(cfg.databaseName), @@ -93,6 +99,12 @@ func Test_filesClient(t *testing.T) { }) t.Run("delete a file", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + delRes, err := filesCli.Delete(ctx, xata.DeleteFileRequest{ BranchRequestOptional: xata.BranchRequestOptional{ DatabaseName: xata.String(cfg.databaseName), From d98c91f658b83877be6ef9a099cf20c0d38c09e1 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 10:36:16 +0000 Subject: [PATCH 06/14] add Make target for cleaning up dangling integration test workspaces --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 43fd1c4..9b0a20a 100644 --- a/Makefile +++ b/Makefile @@ -20,4 +20,8 @@ integration-test: download-openapi-specs: @echo "Downloading openapi specs" - @cd internal/docs && go run . && cd ../.. \ No newline at end of file + @cd internal/docs && go run . && cd ../.. + +clean-workspaces: + @echo "Cleaning integration test workspaces" + go test -v -run Test_cleanupIntegrationWorkspaces ./... \ No newline at end of file From d099980fc20f35d0939cafc6b803a8ce6b0acc62 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 11:39:10 +0000 Subject: [PATCH 07/14] update auto-gen code for get file item --- .../fern-workspace/generated/go/column_type.go | 2 +- .../fern-workspace/generated/go/files_client.go | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/xata/internal/fern-workspace/generated/go/column_type.go b/xata/internal/fern-workspace/generated/go/column_type.go index 86e4dec..5e55c64 100644 --- a/xata/internal/fern-workspace/generated/go/column_type.go +++ b/xata/internal/fern-workspace/generated/go/column_type.go @@ -56,7 +56,7 @@ func (c ColumnType) String() string { case ColumnTypeFile: return "file" case ColumnTypeFileMap: - return "fileMap" + return "file[]" case ColumnTypeJson: return "json" } diff --git a/xata/internal/fern-workspace/generated/go/files_client.go b/xata/internal/fern-workspace/generated/go/files_client.go index 8e63c8b..f9aa2d5 100644 --- a/xata/internal/fern-workspace/generated/go/files_client.go +++ b/xata/internal/fern-workspace/generated/go/files_client.go @@ -14,7 +14,7 @@ import ( ) type FilesClient interface { - GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) error + GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*GetFileResponse, error) PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*GetFileResponse, error) @@ -53,7 +53,7 @@ type filesClient struct { // The Record name // The Column name // The File Identifier -func (f *filesClient) GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) error { +func (f *filesClient) GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*GetFileResponse, error) { baseURL := "/" if f.baseURL != "" { baseURL = f.baseURL @@ -93,20 +93,21 @@ func (f *filesClient) GetFileItem(ctx context.Context, dbBranchName DbBranchName return apiError } + response := &GetFileResponse{} if err := core.DoRequest( ctx, f.httpClient, endpointURL, http.MethodGet, nil, - nil, + response, false, f.header, errorDecoder, ); err != nil { - return err + return nil, err } - return nil + return response, nil } // Uploads the file content to an array given the file ID From f7a9191ea49482f6ce49c797e32ff8330335fb68 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 11:39:29 +0000 Subject: [PATCH 08/14] add get file item method --- .../integration-tests/files_client_test.go | 20 ++++++ .../integration-tests/records_client_test.go | 37 +++++++---- internal/integration-tests/setup_test.go | 19 ++++++ xata/files_cilent.go | 26 +++++++- xata/files_cilent_test.go | 66 +++++++++++++++++-- 5 files changed, 146 insertions(+), 22 deletions(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index d070d63..afd65dc 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -116,4 +116,24 @@ func Test_filesClient(t *testing.T) { assert.NoError(t, err) assert.Equal(t, testFileName, delRes.Name) }) + + t.Run("get file item", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + + getItemRes, err := filesCli.GetItem(ctx, xata.GetFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String(cfg.databaseName), + }, + TableName: cfg.tableName, + RecordId: record.Id, + ColumnName: fileArrayColumn, + FileID: record.Data[fileArrayColumn].([]interface{})[0].(map[string]any)["id"].(string), + }) + assert.NoError(t, err) + assert.Equal(t, fileContent, string(getItemRes.Content)) + }) } diff --git a/internal/integration-tests/records_client_test.go b/internal/integration-tests/records_client_test.go index eac1103..bee4648 100644 --- a/internal/integration-tests/records_client_test.go +++ b/internal/integration-tests/records_client_test.go @@ -14,19 +14,20 @@ import ( ) const ( - stringColumn = "user-name" - boolColumn = "active" - textColumn = "text-column" - emailColumn = "email" - dateTimeColumn = "date-of-birth" - integerColumn = "integer-column" - floatColumn = "float-column" - fileColumn = "file-column" - fileContent = "file content" - jsonColumn = "json-column" - vectorColumn = "vector-column" // it is important to set a vector dimension on the UI: 2 - multipleColumn = "multiple-column" - testFileName = "file-name.txt" + stringColumn = "user-name" + boolColumn = "active" + textColumn = "text-column" + emailColumn = "email" + dateTimeColumn = "date-of-birth" + integerColumn = "integer-column" + floatColumn = "float-column" + fileColumn = "file-column" + fileArrayColumn = "fileArrayColumn" + fileContent = "file content" + jsonColumn = "json-column" + vectorColumn = "vector-column" // it is important to set a vector dimension on the UI: 2 + multipleColumn = "multiple-column" + testFileName = "file-name.txt" ) func Test_recordsClient_Insert_Get(t *testing.T) { @@ -75,7 +76,8 @@ func Test_recordsClient_Insert_Get(t *testing.T) { assert.Equal(t, insertRecordRequest.Body[textColumn].String, record.Data[textColumn]) assert.Equal(t, insertRecordRequest.Body[integerColumn].Double, record.Data[integerColumn]) assert.Equal(t, insertRecordRequest.Body[floatColumn].Double, record.Data[floatColumn]) - assert.Equal(t, insertRecordRequest.Body[fileColumn].InputFile.Name, record.Data[fileColumn].(map[string]interface{})["name"]) + assert.Equal(t, insertRecordRequest.Body[fileColumn].InputFile.Name, record.Data[fileColumn].(map[string]any)["name"]) + assert.Equal(t, *(insertRecordRequest.Body[fileArrayColumn].InputFileArray[0]).Name, record.Data[fileArrayColumn].([]interface{})[0].(map[string]any)["name"]) assert.ElementsMatch(t, insertRecordRequest.Body[vectorColumn].DoubleList, record.Data[vectorColumn]) assert.ElementsMatch(t, insertRecordRequest.Body[multipleColumn].StringList, record.Data[multipleColumn]) assert.Equal(t, insertRecordRequest.Body[jsonColumn].String, record.Data[jsonColumn]) @@ -445,6 +447,7 @@ func generateInsertRecordRequest(databaseName, tableName string) xata.InsertReco integerColumn, floatColumn, fileColumn, + fileArrayColumn, jsonColumn, vectorColumn, multipleColumn, @@ -461,6 +464,12 @@ func generateInsertRecordRequest(databaseName, tableName string) xata.InsertReco Name: testFileName, Base64Content: xata.String(base64.StdEncoding.EncodeToString([]byte(fileContent))), }), + fileArrayColumn: xata.ValueFromInputFileArray(xata.InputFileArray{ + { + Name: xata.String(testFileName), + Base64Content: xata.String(base64.StdEncoding.EncodeToString([]byte(fileContent))), + }, + }), vectorColumn: xata.ValueFromDoubleList([]float64{10.3, 20.2}), multipleColumn: xata.ValueFromStringList([]string{"hello", "world"}), jsonColumn: xata.ValueFromString(`{"key":"value"}`), diff --git a/internal/integration-tests/setup_test.go b/internal/integration-tests/setup_test.go index 95021f1..9b24971 100644 --- a/internal/integration-tests/setup_test.go +++ b/internal/integration-tests/setup_test.go @@ -249,6 +249,25 @@ func setupTableWithColumns(ctx context.Context, cfg *config) error { return err } + _, err = tableCli.AddColumn(ctx, xata.AddColumnRequest{ + TableRequest: xata.TableRequest{ + TableName: cfg.tableName, + DatabaseName: xata.String(cfg.databaseName), + }, + Column: &xata.Column{ + Name: fileArrayColumn, + Type: xata.ColumnTypeFileMap, + File: &xata.ColumnFile{ + DefaultPublicAccess: xata.Bool(true), + }, + NotNull: xata.Bool(false), + Unique: xata.Bool(false), + }, + }) + if err != nil { + return err + } + _, err = tableCli.AddColumn(ctx, xata.AddColumnRequest{ TableRequest: xata.TableRequest{ TableName: cfg.tableName, diff --git a/xata/files_cilent.go b/xata/files_cilent.go index e1cbfb6..d8203fe 100644 --- a/xata/files_cilent.go +++ b/xata/files_cilent.go @@ -9,7 +9,7 @@ import ( ) type FilesClient interface { - // GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) error + GetItem(ctx context.Context, request GetFileItemRequest) (*xatagenworkspace.GetFileResponse, error) // PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) // DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) @@ -82,7 +82,12 @@ func (f filesClient) Put(ctx context.Context, request PutFileRequest) (*xatagenw return f.generated.PutFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.Data) } -type GetFileRequest DeleteFileRequest +type GetFileRequest struct { + BranchRequestOptional + TableName string + RecordId string + ColumnName string +} func (f filesClient) Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) { dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) @@ -93,6 +98,23 @@ func (f filesClient) Get(ctx context.Context, request GetFileRequest) (*xatagenw return f.generated.GetFile(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName) } +type GetFileItemRequest struct { + BranchRequestOptional + TableName string + RecordId string + ColumnName string + FileID string +} + +func (f filesClient) GetItem(ctx context.Context, request GetFileItemRequest) (*xatagenworkspace.GetFileResponse, error) { + dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) + if err != nil { + return nil, err + } + + return f.generated.GetFileItem(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.FileID) +} + func NewFilesClient(opts ...ClientOption) (FilesClient, error) { cliOpts, dbCfg, err := consolidateClientOptionsForWorkspace(opts...) if err != nil { diff --git a/xata/files_cilent_test.go b/xata/files_cilent_test.go index 3817509..85f65a1 100644 --- a/xata/files_cilent_test.go +++ b/xata/files_cilent_test.go @@ -151,17 +151,13 @@ func Test_filesClient_Get(t *testing.T) { type tc struct { name string - want *xatagenworkspace.GetFileResponse statusCode int apiErr *xatagencore.APIError } tests := []tc{ { - name: "should get a file successfully", - want: &xatagenworkspace.GetFileResponse{ - Content: []byte(`hola`), - }, + name: "should get a file successfully", statusCode: http.StatusOK, }, } @@ -176,7 +172,7 @@ func Test_filesClient_Get(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - testSrv := testService(t, http.MethodGet, "/db", tt.statusCode, tt.apiErr != nil, tt.want) + testSrv := testService(t, http.MethodGet, "/db", tt.statusCode, tt.apiErr != nil, nil) cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) assert.NoError(err) @@ -206,3 +202,61 @@ func Test_filesClient_Get(t *testing.T) { }) } } + +func Test_filesClient_GetItem(t *testing.T) { + assert := assert.New(t) + + type tc struct { + name string + statusCode int + apiErr *xatagencore.APIError + } + + tests := []tc{ + { + name: "should get a file item successfully", + statusCode: http.StatusOK, + }, + } + + for _, eTC := range errTestCasesWorkspace { + tests = append(tests, tc{ + name: eTC.name, + statusCode: eTC.statusCode, + apiErr: eTC.apiErr, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testSrv := testService(t, http.MethodGet, "/db", tt.statusCode, tt.apiErr != nil, nil) + + cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) + assert.NoError(err) + assert.NotNil(cli) + + got, err := cli.GetItem(context.TODO(), xata.GetFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String("my-db"), + }, + TableName: "my-table", + RecordId: "my-id", + ColumnName: "file-column", + FileID: "some-id", + }) + + if tt.apiErr != nil { + errAPI := tt.apiErr.Unwrap() + if errAPI == nil { + t.Fatal("expected error but got nil") + } + assert.ErrorAs(err, &errAPI) + assert.Equal(err.Error(), tt.apiErr.Error()) + assert.Nil(got) + } else { + assert.NotNil(got) + assert.NoError(err) + } + }) + } +} From b706a75932c7adef4c455fd5c170d0d3ba8bb7db Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 11:46:45 +0000 Subject: [PATCH 09/14] run only unit tests with Make test --- Makefile | 6 +++--- internal/integration-tests/setup_test_test.go | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 9b0a20a..e29452f 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,11 @@ smoke-test: test: @echo "Running unit tests" - @go test -count=1 -cover -race ./... + @go test -count=1 -cover -race ./xata integration-test: @echo "Running integration test" - @go test -v --tags=integration -count=1 -cover -race ./internal/integration-tests + @go test -v -count=1 -cover -race ./internal/integration-tests download-openapi-specs: @echo "Downloading openapi specs" @@ -24,4 +24,4 @@ download-openapi-specs: clean-workspaces: @echo "Cleaning integration test workspaces" - go test -v -run Test_cleanupIntegrationWorkspaces ./... \ No newline at end of file + CLEAN_UP_INTEGRATION_WORKSPACES=true go test -v -run Test_cleanupIntegrationWorkspaces ./... \ No newline at end of file diff --git a/internal/integration-tests/setup_test_test.go b/internal/integration-tests/setup_test_test.go index 551d037..f551ab2 100644 --- a/internal/integration-tests/setup_test_test.go +++ b/internal/integration-tests/setup_test_test.go @@ -2,6 +2,7 @@ package integrationtests import ( "context" + "os" "testing" "github.com/stretchr/testify/assert" @@ -30,6 +31,9 @@ func Test_setup_cleanup(t *testing.T) { } func Test_cleanupIntegrationWorkspaces(t *testing.T) { + if _, found := os.LookupEnv("CLEAN_UP_INTEGRATION_WORKSPACES"); !found { + t.Skip("skipping integration workspaces cleanup") + } err := cleanAllWorkspaces() if err != nil { t.Fatal(err) From a69adbb9392dc3b7e332a1fcc27316ff4161f027 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 11:59:05 +0000 Subject: [PATCH 10/14] update auto-gen code for put file item --- xata/internal/fern-workspace/generated/go/files_client.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xata/internal/fern-workspace/generated/go/files_client.go b/xata/internal/fern-workspace/generated/go/files_client.go index f9aa2d5..d0a9f10 100644 --- a/xata/internal/fern-workspace/generated/go/files_client.go +++ b/xata/internal/fern-workspace/generated/go/files_client.go @@ -15,7 +15,7 @@ import ( type FilesClient interface { GetFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*GetFileResponse, error) - PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) + PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId, data []byte) (*FileResponse, error) DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) GetFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName) (*GetFileResponse, error) PutFile(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, data []byte) (*FileResponse, error) @@ -118,7 +118,7 @@ func (f *filesClient) GetFileItem(ctx context.Context, dbBranchName DbBranchName // The Record name // The Column name // The File Identifier -func (f *filesClient) PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) { +func (f *filesClient) PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId, data []byte) (*FileResponse, error) { baseURL := "/" if f.baseURL != "" { baseURL = f.baseURL @@ -171,7 +171,7 @@ func (f *filesClient) PutFileItem(ctx context.Context, dbBranchName DbBranchName f.httpClient, endpointURL, http.MethodPut, - nil, + data, &response, false, f.header, From e0d403bfca957bd2ba48326b0971ad62945d2ac4 Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 11:59:17 +0000 Subject: [PATCH 11/14] add put file item method --- .../integration-tests/files_client_test.go | 24 +++++++ xata/files_cilent.go | 28 ++++++++- xata/files_cilent_test.go | 63 +++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index afd65dc..aba41c6 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -136,4 +136,28 @@ func Test_filesClient(t *testing.T) { assert.NoError(t, err) assert.Equal(t, fileContent, string(getItemRes.Content)) }) + + t.Run("put a file item", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + + fileRes, err := filesCli.PutItem(ctx, xata.PutFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String(cfg.databaseName), + }, + TableName: cfg.tableName, + RecordId: record.Id, + ColumnName: fileArrayColumn, + FileID: record.Data[fileArrayColumn].([]interface{})[0].(map[string]any)["id"].(string), + ContentType: xata.String("text/plain"), + Data: []byte(`new content`), + }) + assert.NoError(t, err) + assert.NotNil(t, fileRes.Attributes) + assert.Equal(t, "", fileRes.Name) + assert.NotNil(t, fileRes.Id) + }) } diff --git a/xata/files_cilent.go b/xata/files_cilent.go index d8203fe..cc62b9f 100644 --- a/xata/files_cilent.go +++ b/xata/files_cilent.go @@ -10,7 +10,7 @@ import ( type FilesClient interface { GetItem(ctx context.Context, request GetFileItemRequest) (*xatagenworkspace.GetFileResponse, error) - // PutFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) + PutItem(ctx context.Context, request PutFileItemRequest) (*xatagenworkspace.FileResponse, error) // DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) Put(ctx context.Context, request PutFileRequest) (*xatagenworkspace.FileResponse, error) @@ -115,6 +115,32 @@ func (f filesClient) GetItem(ctx context.Context, request GetFileItemRequest) (* return f.generated.GetFileItem(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.FileID) } +type PutFileItemRequest struct { + BranchRequestOptional + ContentType *string + TableName string + RecordId string + ColumnName string + FileID string + Data []byte +} + +func (f filesClient) PutItem(ctx context.Context, request PutFileItemRequest) (*xatagenworkspace.FileResponse, error) { + dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) + if err != nil { + return nil, err + } + + contentType := "application/octet-stream" + if request.ContentType != nil && *request.ContentType != "" { + contentType = *request.ContentType + } + + f.generated.SetContentTypeHeader(contentType) + + return f.generated.PutFileItem(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.FileID, request.Data) +} + func NewFilesClient(opts ...ClientOption) (FilesClient, error) { cliOpts, dbCfg, err := consolidateClientOptionsForWorkspace(opts...) if err != nil { diff --git a/xata/files_cilent_test.go b/xata/files_cilent_test.go index 85f65a1..bd6f7dc 100644 --- a/xata/files_cilent_test.go +++ b/xata/files_cilent_test.go @@ -260,3 +260,66 @@ func Test_filesClient_GetItem(t *testing.T) { }) } } + +func Test_filesClient_PutItem(t *testing.T) { + assert := assert.New(t) + + type tc struct { + name string + want *xatagenworkspace.FileResponse + statusCode int + apiErr *xatagencore.APIError + } + + tests := []tc{ + { + name: "should put a file item successfully", + want: &xatagenworkspace.FileResponse{ + MediaType: "text/plain", + }, + statusCode: http.StatusOK, + }, + } + + for _, eTC := range errTestCasesWorkspace { + tests = append(tests, tc{ + name: eTC.name, + statusCode: eTC.statusCode, + apiErr: eTC.apiErr, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testSrv := testService(t, http.MethodPut, "/db", tt.statusCode, tt.apiErr != nil, tt.want) + + cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) + assert.NoError(err) + assert.NotNil(cli) + + got, err := cli.PutItem(context.TODO(), xata.PutFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String("my-db"), + }, + TableName: "my-table", + RecordId: "my-id", + ColumnName: "file-column", + FileID: "some-id", + Data: []byte(`hola`), + }) + + if tt.apiErr != nil { + errAPI := tt.apiErr.Unwrap() + if errAPI == nil { + t.Fatal("expected error but got nil") + } + assert.ErrorAs(err, &errAPI) + assert.Equal(err.Error(), tt.apiErr.Error()) + assert.Nil(got) + } else { + assert.Equal(tt.want.MediaType, got.MediaType) + assert.NoError(err) + } + }) + } +} From 63215ed1017414360c5d88835e9559eb956cdd8d Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 12:03:22 +0000 Subject: [PATCH 12/14] add delete file item method --- .../integration-tests/files_client_test.go | 20 ++++++ xata/files_cilent.go | 19 +++++- xata/files_cilent_test.go | 62 +++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index aba41c6..0946a75 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -160,4 +160,24 @@ func Test_filesClient(t *testing.T) { assert.Equal(t, "", fileRes.Name) assert.NotNil(t, fileRes.Id) }) + + t.Run("delete a file item", func(t *testing.T) { + record, err := recordsCli.Insert(ctx, insertRecordRequest) + if err != nil { + t.Fatal(err) + } + assert.NotNil(t, record) + + delRes, err := filesCli.DeleteItem(ctx, xata.DeleteFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String(cfg.databaseName), + }, + TableName: cfg.tableName, + RecordId: record.Id, + ColumnName: fileArrayColumn, + FileID: record.Data[fileArrayColumn].([]interface{})[0].(map[string]any)["id"].(string), + }) + assert.NoError(t, err) + assert.Equal(t, testFileName, delRes.Name) + }) } diff --git a/xata/files_cilent.go b/xata/files_cilent.go index cc62b9f..f2b64cc 100644 --- a/xata/files_cilent.go +++ b/xata/files_cilent.go @@ -11,7 +11,7 @@ import ( type FilesClient interface { GetItem(ctx context.Context, request GetFileItemRequest) (*xatagenworkspace.GetFileResponse, error) PutItem(ctx context.Context, request PutFileItemRequest) (*xatagenworkspace.FileResponse, error) - // DeleteFileItem(ctx context.Context, dbBranchName DbBranchName, tableName TableName, recordId RecordId, columnName ColumnName, fileId FileItemId) (*FileResponse, error) + DeleteItem(ctx context.Context, request DeleteFileItemRequest) (*xatagenworkspace.FileResponse, error) Get(ctx context.Context, request GetFileRequest) (*xatagenworkspace.GetFileResponse, error) Put(ctx context.Context, request PutFileRequest) (*xatagenworkspace.FileResponse, error) Delete(ctx context.Context, request DeleteFileRequest) (*xatagenworkspace.FileResponse, error) @@ -141,6 +141,23 @@ func (f filesClient) PutItem(ctx context.Context, request PutFileItemRequest) (* return f.generated.PutFileItem(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.FileID, request.Data) } +type DeleteFileItemRequest struct { + BranchRequestOptional + TableName string + RecordId string + ColumnName string + FileID string +} + +func (f filesClient) DeleteItem(ctx context.Context, request DeleteFileItemRequest) (*xatagenworkspace.FileResponse, error) { + dbBranchName, err := f.dbBranchName(request.BranchRequestOptional) + if err != nil { + return nil, err + } + + return f.generated.DeleteFileItem(ctx, dbBranchName, request.TableName, request.RecordId, request.ColumnName, request.FileID) +} + func NewFilesClient(opts ...ClientOption) (FilesClient, error) { cliOpts, dbCfg, err := consolidateClientOptionsForWorkspace(opts...) if err != nil { diff --git a/xata/files_cilent_test.go b/xata/files_cilent_test.go index bd6f7dc..0456cf9 100644 --- a/xata/files_cilent_test.go +++ b/xata/files_cilent_test.go @@ -323,3 +323,65 @@ func Test_filesClient_PutItem(t *testing.T) { }) } } + +func Test_filesClient_DeleteItem(t *testing.T) { + assert := assert.New(t) + + type tc struct { + name string + want *xatagenworkspace.FileResponse + statusCode int + apiErr *xatagencore.APIError + } + + tests := []tc{ + { + name: "should delete a file item successfully", + want: &xatagenworkspace.FileResponse{ + Name: "test-file.txt", + }, + statusCode: http.StatusOK, + }, + } + + for _, eTC := range errTestCasesWorkspace { + tests = append(tests, tc{ + name: eTC.name, + statusCode: eTC.statusCode, + apiErr: eTC.apiErr, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testSrv := testService(t, http.MethodDelete, "/db", tt.statusCode, tt.apiErr != nil, tt.want) + + cli, err := xata.NewFilesClient(xata.WithBaseURL(testSrv.URL), xata.WithAPIKey("test-key")) + assert.NoError(err) + assert.NotNil(cli) + + got, err := cli.DeleteItem(context.TODO(), xata.DeleteFileItemRequest{ + BranchRequestOptional: xata.BranchRequestOptional{ + DatabaseName: xata.String("my-db"), + }, + TableName: "my-table", + RecordId: "my-id", + ColumnName: "file-column", + FileID: "some-id", + }) + + if tt.apiErr != nil { + errAPI := tt.apiErr.Unwrap() + if errAPI == nil { + t.Fatal("expected error but got nil") + } + assert.ErrorAs(err, &errAPI) + assert.Equal(err.Error(), tt.apiErr.Error()) + assert.Nil(got) + } else { + assert.Equal(tt.want.Name, got.Name) + assert.NoError(err) + } + }) + } +} From 5defead639d093b6a1ff2f1cbccd5f7c3f578e1e Mon Sep 17 00:00:00 2001 From: omerdemirok Date: Sun, 5 Nov 2023 12:14:58 +0000 Subject: [PATCH 13/14] fix integration test --- Makefile | 2 +- internal/integration-tests/records_client_test.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e29452f..6dba5f1 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ test: integration-test: @echo "Running integration test" - @go test -v -count=1 -cover -race ./internal/integration-tests + @go test -count=1 -cover -race ./internal/integration-tests download-openapi-specs: @echo "Downloading openapi specs" diff --git a/internal/integration-tests/records_client_test.go b/internal/integration-tests/records_client_test.go index bee4648..63659a8 100644 --- a/internal/integration-tests/records_client_test.go +++ b/internal/integration-tests/records_client_test.go @@ -106,6 +106,8 @@ func Test_recordsClient_Insert_Get(t *testing.T) { // 400: {"errors":[{ //"status":400,"message":"column [file-column]: file upload not permitted in transaction"}, delete(insertRecordRequest.Body, fileColumn) + //"status":400,"message":"column [fileArrayColumn]: file entry [0]: file upload not permitted in transaction"} + delete(insertRecordRequest.Body, fileArrayColumn) records, err := recordsCli.BulkInsert(ctx, xata.BulkInsertRecordRequest{ RecordRequest: insertRecordRequest.RecordRequest, From 51075db9467528406ab2c22d6d919f3942536352 Mon Sep 17 00:00:00 2001 From: Omer Demirok Date: Mon, 6 Nov 2023 19:46:15 +0000 Subject: [PATCH 14/14] Update internal/integration-tests/files_client_test.go Co-authored-by: Philip Krauss <35487337+philkra@users.noreply.github.com> --- internal/integration-tests/files_client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/integration-tests/files_client_test.go b/internal/integration-tests/files_client_test.go index 0946a75..cff12c4 100644 --- a/internal/integration-tests/files_client_test.go +++ b/internal/integration-tests/files_client_test.go @@ -89,7 +89,7 @@ func Test_filesClient(t *testing.T) { TableName: cfg.tableName, RecordId: record.Id, ColumnName: fileColumn, - ContentType: xata.String("text/plain"), + ContentType: xata.String(""application/octet-stream""), Data: []byte(`new content`), }) assert.NoError(t, err)