diff --git a/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts b/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts index 933542fad..56039a605 100644 --- a/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts +++ b/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts @@ -6,7 +6,7 @@ export interface BucketWidgetParams { prefix?: string; region?: string; account_id?: string; - access_key_id_secret_name: string; - secret_access_key_secret_name: string; + access_key_id: string; + access_key: string; type?: 'file' | 'image'; } diff --git a/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts b/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts index 6229836dd..ac686ea10 100644 --- a/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts +++ b/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts @@ -81,12 +81,12 @@ export class GetS3FileUrlUseCase } const accessKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( - params.access_key_id_secret_name, + params.access_key_id, user.company.id, ); const secretKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( - params.secret_access_key_secret_name, + params.access_key, user.company.id, ); diff --git a/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts b/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts index a5de7e098..cf656ad1e 100644 --- a/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts +++ b/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts @@ -44,12 +44,12 @@ export class GetS3UploadUrlUseCase typeof widget.widget_params === 'string' ? JSON5.parse(widget.widget_params) : widget.widget_params; const accessKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( - params.access_key_id_secret_name, + params.access_key_id, user.company.id, ); const secretKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( - params.secret_access_key_secret_name, + params.access_key, user.company.id, ); diff --git a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts index 5239abd65..8d2919c41 100644 --- a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts +++ b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts @@ -1,11 +1,11 @@ import JSON5 from 'json5'; -import { BucketProviderEnum } from '../../s3-widget/application/data-structures/bucket-provider.enum.js'; import { EncryptionAlgorithmEnum } from '../../../enums/encryption-algorithm.enum.js'; import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { getPropertyValueByDescriptor } from '../../../helpers/get-property-value-by-descriptor.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; +import { BucketProviderEnum } from '../../s3-widget/application/data-structures/bucket-provider.enum.js'; import { ForeignKeyDSInfo } from '../../table/table-datastructures.js'; import { findTableFieldsUtil } from '../../table/utils/find-table-fields.util.js'; import { findTablesInConnectionUtil } from '../../table/utils/find-tables-in-connection.util.js'; @@ -103,11 +103,11 @@ export async function validateCreateWidgetsDs( if (!widget_params.bucket) { errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('bucket')); } - if (!widget_params.access_key_id_secret_name) { - errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('access_key_id_secret_name')); + if (!widget_params.access_key_id) { + errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('access_key_id')); } - if (!widget_params.secret_access_key_secret_name) { - errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('secret_access_key_secret_name')); + if (!widget_params.access_key) { + errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('access_key')); } if ( widget_params.provider && diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts index ae8c64588..a14e10b1d 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts @@ -91,8 +91,8 @@ async function setupS3WidgetTestEnvironment( bucket: 'test-bucket', prefix: 'uploads', region: 'us-east-1', - access_key_id_secret_name: 'test-aws-access-key', - secret_access_key_secret_name: 'test-aws-secret-key', + access_key_id: 'test-aws-access-key', + access_key: 'test-aws-secret-key', }); const widgetDto = { @@ -596,8 +596,8 @@ test.serial(`${currentTest} - widget creation succeeds with provider 'digitaloce provider: 'digitalocean', bucket: 'test-bucket', region: 'fra1', - access_key_id_secret_name: 'do-key', - secret_access_key_secret_name: 'do-secret', + access_key_id: 'do-key', + access_key: 'do-secret', }); const response = await request(app.getHttpServer()) @@ -628,8 +628,8 @@ test.serial(`${currentTest} - widget creation rejected with unsupported provider provider: 'not-a-real-provider', bucket: 'test-bucket', region: 'us-east-1', - access_key_id_secret_name: 'k', - secret_access_key_secret_name: 's', + access_key_id: 'k', + access_key: 's', }); const response = await request(app.getHttpServer()) @@ -660,8 +660,8 @@ test.serial(`${currentTest} - widget creation rejected when cloudflare-r2 missin provider: 'cloudflare-r2', bucket: 'test-bucket', region: 'auto', - access_key_id_secret_name: 'k', - secret_access_key_secret_name: 's', + access_key_id: 'k', + access_key: 's', }); const response = await request(app.getHttpServer()) @@ -693,8 +693,8 @@ test.serial(`${currentTest} - widget creation succeeds with cloudflare-r2 and ac bucket: 'test-bucket', region: 'auto', account_id: 'abc123def456', - access_key_id_secret_name: 'k', - secret_access_key_secret_name: 's', + access_key_id: 'k', + access_key: 's', }); const response = await request(app.getHttpServer()) @@ -718,13 +718,13 @@ test.serial(`${currentTest} - widget creation succeeds with cloudflare-r2 and ac t.is(response.status, 201); }); -test.serial(`${currentTest} - widget creation rejected when access_key_id_secret_name missing`, async (t) => { +test.serial(`${currentTest} - widget creation rejected when access_key_id missing`, async (t) => { const { token, connectionId, testTableName } = await createConnectionAndTableWithS3Field(); const widgetParams = JSON.stringify({ bucket: 'test-bucket', region: 'us-east-1', - secret_access_key_secret_name: 's', + access_key: 's', }); const response = await request(app.getHttpServer()) diff --git a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts index 6031713be..d1def24c9 100644 --- a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts +++ b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts @@ -281,8 +281,8 @@ export class DbTableWidgetsComponent implements OnInit { // region: Region for the bucket (default: us-east-1; for cloudflare-r2 use "auto") // account_id: Cloudflare account ID. Required when provider is "cloudflare-r2". // type: "file" (default) - accepts all file types, "image" - accepts only images -// access_key_id_secret_name: Unique identifier of the secret containing the Access Key ID -// secret_access_key_secret_name: Unique identifier of the secret containing the Secret Access Key +// access_key_id: Unique identifier of the secret containing the Access Key ID +// access_key: Unique identifier of the secret containing the Secret Access Key // // ⚠️ IMPORTANT: DO NOT INCLUDE BUCKET SECRETS DIRECTLY IN WIDGET SETTINGS! // Store your credentials as secrets in Rocketadmin and reference them here by their unique identifiers to ensure security and prevent exposure of sensitive information. @@ -293,8 +293,8 @@ export class DbTableWidgetsComponent implements OnInit { "prefix": "uploads/", "region": "us-east-1", "type": "file", - "access_key_id_secret_name": "bucket-access-key-id", - "secret_access_key_secret_name": "bucket-secret-access-key" + "access_key_id": "COMPANY-SECRET/bucket-access-key-id", + "access_key": "COMPANY-SECRET/bucket-access-key" } `, }; diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts index 34b146344..52f9cd4dd 100644 --- a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts @@ -22,8 +22,8 @@ describe('S3EditComponent', () => { bucket: 'test-bucket', prefix: 'uploads/', region: 'us-east-1', - access_key_id_secret_name: 'bucket-key', - secret_access_key_secret_name: 'bucket-secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', }, name: 'Document Upload', description: 'Upload documents to S3', @@ -37,8 +37,8 @@ describe('S3EditComponent', () => { bucket: 'test-bucket', prefix: 'uploads/', region: 'us-east-1', - access_key_id_secret_name: 'bucket-key', - secret_access_key_secret_name: 'bucket-secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', }) as any, name: 'Document Upload', description: 'Upload documents to S3', @@ -113,8 +113,8 @@ describe('S3EditComponent', () => { bucket: 'test-bucket', prefix: 'uploads/', region: 'us-east-1', - access_key_id_secret_name: 'bucket-key', - secret_access_key_secret_name: 'bucket-secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', }); }); diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts index 6e07b9461..8deba668c 100644 --- a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts @@ -20,8 +20,8 @@ interface BucketWidgetParams { prefix?: string; region?: string; account_id?: string; - access_key_id_secret_name: string; - secret_access_key_secret_name: string; + access_key_id: string; + access_key: string; type?: 'file' | 'image'; } diff --git a/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.spec.ts b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.spec.ts index 909dc13c0..c7f4e6470 100644 --- a/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.spec.ts +++ b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { S3RecordViewComponent } from './s3.component'; -import { S3Service } from 'src/app/services/s3.service'; import { ConnectionsService } from 'src/app/services/connections.service'; +import { S3Service } from 'src/app/services/s3.service'; import { TablesService } from 'src/app/services/tables.service'; +import { S3RecordViewComponent } from './s3.component'; describe('S3RecordViewComponent', () => { let component: S3RecordViewComponent; @@ -44,8 +44,8 @@ describe('S3RecordViewComponent', () => { widget_params: { bucket: 'my-bucket', type: 'file', - access_key_id_secret_name: 'key', - secret_access_key_secret_name: 'secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', }, }); component.ngOnInit(); @@ -58,8 +58,8 @@ describe('S3RecordViewComponent', () => { widget_params: { bucket: 'my-bucket', type: 'image', - access_key_id_secret_name: 'key', - secret_access_key_secret_name: 'secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', }, }); component.ngOnInit(); diff --git a/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.ts b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.ts index f2520e565..7b5a6e0c3 100644 --- a/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.ts +++ b/frontend/src/app/components/ui-components/record-view-fields/s3/s3.component.ts @@ -13,8 +13,8 @@ interface BucketWidgetParams { prefix?: string; region?: string; account_id?: string; - access_key_id_secret_name: string; - secret_access_key_secret_name: string; + access_key_id: string; + access_key: string; type?: 'file' | 'image'; } diff --git a/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.spec.ts b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.spec.ts index bb1a93dfe..d2007fffb 100644 --- a/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.spec.ts +++ b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.spec.ts @@ -1,9 +1,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { S3DisplayComponent } from './s3.component'; -import { S3Service } from 'src/app/services/s3.service'; import { ConnectionsService } from 'src/app/services/connections.service'; +import { S3Service } from 'src/app/services/s3.service'; import { TablesService } from 'src/app/services/tables.service'; import { vi } from 'vitest'; +import { S3DisplayComponent } from './s3.component'; describe('S3DisplayComponent', () => { let component: S3DisplayComponent; @@ -46,8 +46,8 @@ describe('S3DisplayComponent', () => { fixture.componentRef.setInput('widgetStructure', { widget_params: { bucket: 'my-bucket', - access_key_id_secret_name: 'key', - secret_access_key_secret_name: 'secret', + access_key_id: 'COMPANY-SECRET/bucket-access-key-id', + access_key: 'COMPANY-SECRET/bucket-access-key', type: 'image', }, }); diff --git a/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.ts b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.ts index 474735b6c..b945a2581 100644 --- a/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.ts +++ b/frontend/src/app/components/ui-components/table-display-fields/s3/s3.component.ts @@ -17,8 +17,8 @@ interface BucketWidgetParams { prefix?: string; region?: string; account_id?: string; - access_key_id_secret_name: string; - secret_access_key_secret_name: string; + access_key_id: string; + access_key: string; type?: 'file' | 'image'; } diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 33f96b990..e94129cf4 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -15,7 +15,7 @@ import { DynamicModule } from 'ng-dynamic-component'; import { SignalComponentIoModule } from 'ng-dynamic-component/signal-component-io'; import { provideCharts, withDefaultRegisterables } from 'ng2-charts'; import { CookieService } from 'ngx-cookie-service'; -import { MERMAID_OPTIONS, MarkdownModule, provideMarkdown } from 'ngx-markdown'; +import { MarkdownModule, MERMAID_OPTIONS, provideMarkdown } from 'ngx-markdown'; import { NgxStripeModule } from 'ngx-stripe'; import { AppComponent } from './app/app.component'; import { AppRoutingModule } from './app/app-routing.module';