diff --git a/backend/knip.json b/backend/knip.json index 70ac82f3e..95f6e5355 100644 --- a/backend/knip.json +++ b/backend/knip.json @@ -1,9 +1,6 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "ignoreExportsUsedInFile": { - "interface": true, - "type": true - }, - "ignore": ["src/migrations/**", "src/shared/config/datasource.config.ts", "src/enums/widget-type.enum.ts"], + "ignoreExportsUsedInFile": true, + "ignore": ["src/migrations/**", "src/shared/config/datasource.config.ts"], "tags": ["-lintignore"] } diff --git a/backend/package.json b/backend/package.json index 1beb74503..0bd328e58 100644 --- a/backend/package.json +++ b/backend/package.json @@ -25,24 +25,24 @@ }, "dependencies": { "@amplitude/node": "1.10.2", - "@aws-sdk/client-bedrock-runtime": "^3.1037.0", + "@aws-sdk/client-dynamodb": "^3.1032.0", "@aws-sdk/client-s3": "^3.1037.0", "@aws-sdk/lib-dynamodb": "^3.1037.0", "@aws-sdk/s3-request-presigner": "^3.1037.0", "@cedar-policy/cedar-wasm": "^4.9.1", + "@clickhouse/client": "^1.18.2", + "@elastic/elasticsearch": "8.18.1", "@electric-sql/pglite": "^0.4.0", "@faker-js/faker": "^10.3.0", "@langchain/aws": "^1.3.3", "@langchain/core": "^1.1.33", "@nestjs/common": "11.1.17", - "@nestjs/config": "4.0.3", "@nestjs/core": "11.1.17", "@nestjs/platform-express": "11.1.17", "@nestjs/schedule": "^6.1.1", "@nestjs/swagger": "^11.2.6", "@nestjs/throttler": "^6.5.0", "@nestjs/typeorm": "^11.0.0", - "@nestjsx/crud": "4.6.2", "@rocketadmin/shared-code": "workspace:*", "@sentry/minimal": "^6.19.7", "@sentry/node": "10.44.0", @@ -56,37 +56,34 @@ "@zapier/secret-scrubber": "^1.1.6", "argon2": "0.44.0", "axios": "^1.15.0", - "base32-encode": "^2.0.0", "basic-auth": "2.0.1", "bcrypt": "6.0.0", "body-parser": "^2.2.2", + "cassandra-driver": "^4.8.0", "class-transformer": "0.5.1", "class-validator": "^0.15.1", "cookie-parser": "^1.4.7", - "crc": "^4.3.2", "crypto-js": "4.2.0", "csv": "^6.5.0", "dotenv": "17.3.1", "express": "5.2.1", - "fetch-blob": "^4.0.0", "helmet": "8.1.0", "i18n-iso-countries": "^7.14.0", "ip-range-check": "0.2.0", "json2csv": "^5.0.7", + "json5": "^2.2.3", "jsonwebtoken": "^9.0.3", "knex": "3.1.0", - "langchain": "^1.2.34", "lru-cache": "^11.2.7", + "mongodb": "^7.1.1", "nanoid": "5.1.7", "node-sql-parser": "^5.3.0", "nodemailer": "^8.0.4", "nunjucks": "^3.2.4", "otplib": "^12.0.1", "p-queue": "9.1.0", - "pg": "^8.20.0", "pg-connection-string": "^2.12.0", "qrcode": "^1.5.4", - "query-string": "^9.3.1", "reflect-metadata": "0.2.2", "rimraf": "6.1.3", "rxjs": "7.8.2", @@ -96,7 +93,8 @@ "typeorm-pglite": "^0.3.4", "uuid": "^13.0.0", "validator": "^13.15.26", - "winston": "3.19.0" + "winston": "3.19.0", + "zod": "^4.4.3" }, "devDependencies": { "@ava/typescript": "6.0.0", @@ -106,18 +104,16 @@ "@types/bcrypt": "^6.0.0", "@types/body-parser": "^1.19.6", "@types/cookie-parser": "^1.4.10", - "@types/cron": "^2.4.3", "@types/express": "^5.0.6", "@types/ibm_db": "^3.2.0", "@types/json2csv": "^5.0.7", "@types/node": "^24.10.1", - "@types/pg": "^8.18.0", - "@types/safe-regex": "^1.1.6", "@types/supertest": "^7.2.0", "@types/validator": "^13.15.10", "ava": "6.4.1", "knip": "^5.88.0", "nock": "^14.0.11", + "redis": "^5.12.1", "supertest": "^7.2.2", "ts-loader": "^9.5.4", "ts-node": "^10.9.2", diff --git a/backend/src/ai-core/index.ts b/backend/src/ai-core/index.ts deleted file mode 100644 index f6e9ba1ce..000000000 --- a/backend/src/ai-core/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './ai-core.module.js'; -export * from './interfaces/index.js'; -export * from './providers/index.js'; -export * from './services/index.js'; -export * from './tools/index.js'; -export * from './utils/index.js'; diff --git a/backend/src/ai-core/interfaces/index.ts b/backend/src/ai-core/interfaces/index.ts deleted file mode 100644 index e97324421..000000000 --- a/backend/src/ai-core/interfaces/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './ai-provider.interface.js'; -export * from './ai-service.interface.js'; diff --git a/backend/src/ai-core/providers/index.ts b/backend/src/ai-core/providers/index.ts deleted file mode 100644 index 079b54ddf..000000000 --- a/backend/src/ai-core/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './langchain-bedrock.provider.js'; diff --git a/backend/src/ai-core/services/index.ts b/backend/src/ai-core/services/index.ts deleted file mode 100644 index f616c0631..000000000 --- a/backend/src/ai-core/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ai-core.service.js'; diff --git a/backend/src/ai-core/tools/index.ts b/backend/src/ai-core/tools/index.ts deleted file mode 100644 index e0ddfbc73..000000000 --- a/backend/src/ai-core/tools/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './database-tools.js'; -export * from './prompts.js'; -export * from './query-validators.js'; diff --git a/backend/src/ai-core/utils/index.ts b/backend/src/ai-core/utils/index.ts deleted file mode 100644 index 1768a7c89..000000000 --- a/backend/src/ai-core/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './message-builder.js'; -export * from './toon-encoder.js'; diff --git a/backend/src/ai-core/utils/message-builder.ts b/backend/src/ai-core/utils/message-builder.ts index 24b9f4acd..ef848259b 100644 --- a/backend/src/ai-core/utils/message-builder.ts +++ b/backend/src/ai-core/utils/message-builder.ts @@ -63,5 +63,3 @@ export class MessageBuilder { return builder; } } - -export { HumanMessage, SystemMessage, AIMessage, ToolMessage, BaseMessage }; diff --git a/backend/src/app.controller.ts b/backend/src/app.controller.ts index 6fc620c66..38adc3d41 100644 --- a/backend/src/app.controller.ts +++ b/backend/src/app.controller.ts @@ -2,8 +2,8 @@ import { Controller, Get, Inject, UseInterceptors } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { UseCaseType } from './common/data-injection.tokens.js'; import { Timeout } from './decorators/timeout.decorator.js'; -import { InTransactionEnum } from './enums/index.js'; -import { SentryInterceptor } from './interceptors/index.js'; +import { InTransactionEnum } from './enums/in-transaction.enum.js'; +import { SentryInterceptor } from './interceptors/sentry.interceptor.js'; import { IGetHello } from './use-cases-app/use-cases-app.interface.js'; @UseInterceptors(SentryInterceptor) diff --git a/backend/src/authorization/auth.middleware.ts b/backend/src/authorization/auth.middleware.ts index a66afc854..2738631f1 100644 --- a/backend/src/authorization/auth.middleware.ts +++ b/backend/src/authorization/auth.middleware.ts @@ -16,7 +16,7 @@ import { JwtScopesEnum } from '../entities/user/enums/jwt-scopes.enum.js'; import { UserEntity } from '../entities/user/user.entity.js'; import { Messages } from '../exceptions/text/messages.js'; import { Constants } from '../helpers/constants/constants.js'; -import { isObjectEmpty } from '../helpers/index.js'; +import { isObjectEmpty } from '../helpers/is-object-empty.js'; import { IRequestWithCognitoInfo } from './cognito-decoded.interface.js'; @Injectable() diff --git a/backend/src/authorization/index.ts b/backend/src/authorization/index.ts deleted file mode 100644 index 8483d7b32..000000000 --- a/backend/src/authorization/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { AuthMiddleware } from './auth.middleware.js'; -export { BasicAuthMiddleware } from './basic-auth.middleware.js'; -export { IRequestWithCognitoInfo } from './cognito-decoded.interface.js'; diff --git a/backend/src/authorization/non-scoped-auth.middleware.ts b/backend/src/authorization/non-scoped-auth.middleware.ts index 29c50a588..ed74bba3f 100644 --- a/backend/src/authorization/non-scoped-auth.middleware.ts +++ b/backend/src/authorization/non-scoped-auth.middleware.ts @@ -13,7 +13,7 @@ import { Repository } from 'typeorm'; import { LogOutEntity } from '../entities/log-out/log-out.entity.js'; import { Messages } from '../exceptions/text/messages.js'; import { Constants } from '../helpers/constants/constants.js'; -import { isObjectEmpty } from '../helpers/index.js'; +import { isObjectEmpty } from '../helpers/is-object-empty.js'; import { IRequestWithCognitoInfo } from './cognito-decoded.interface.js'; @Injectable() diff --git a/backend/src/authorization/temporary-auth.middleware.ts b/backend/src/authorization/temporary-auth.middleware.ts index 4ec1cc621..3658ef626 100644 --- a/backend/src/authorization/temporary-auth.middleware.ts +++ b/backend/src/authorization/temporary-auth.middleware.ts @@ -14,7 +14,7 @@ import { LogOutEntity } from '../entities/log-out/log-out.entity.js'; import { UserEntity } from '../entities/user/user.entity.js'; import { Messages } from '../exceptions/text/messages.js'; import { Constants } from '../helpers/constants/constants.js'; -import { isObjectEmpty } from '../helpers/index.js'; +import { isObjectEmpty } from '../helpers/is-object-empty.js'; import { IRequestWithCognitoInfo } from './cognito-decoded.interface.js'; @Injectable() diff --git a/backend/src/common/abstract-use.case.ts b/backend/src/common/abstract-use.case.ts index 36ccb095a..b5bcaceec 100644 --- a/backend/src/common/abstract-use.case.ts +++ b/backend/src/common/abstract-use.case.ts @@ -1,5 +1,5 @@ import { Injectable, Scope } from '@nestjs/common'; -import { InTransactionEnum } from '../enums/index.js'; +import { InTransactionEnum } from '../enums/in-transaction.enum.js'; import { IDatabaseContext } from './database-context.interface.js'; @Injectable({ scope: Scope.REQUEST }) diff --git a/backend/src/decorators/body-email.decorator.ts b/backend/src/decorators/body-email.decorator.ts index da3c473d8..a6007e9b8 100644 --- a/backend/src/decorators/body-email.decorator.ts +++ b/backend/src/decorators/body-email.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { isObjectPropertyExists } from '../helpers/validators/is-object-property-exists-validator.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/decorators/body-uuid.decorator.ts b/backend/src/decorators/body-uuid.decorator.ts index e2c8e911c..86008fa7b 100644 --- a/backend/src/decorators/body-uuid.decorator.ts +++ b/backend/src/decorators/body-uuid.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { isObjectPropertyExists } from '../helpers/validators/is-object-property-exists-validator.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/decorators/gclid-decorator.ts b/backend/src/decorators/gclid-decorator.ts index 14e3beefd..78bfc829c 100644 --- a/backend/src/decorators/gclid-decorator.ts +++ b/backend/src/decorators/gclid-decorator.ts @@ -1,5 +1,5 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; export const GCLlId = createParamDecorator((_data: any, ctx: ExecutionContext): string => { const request: IRequestWithCognitoInfo = ctx.switchToHttp().getRequest(); diff --git a/backend/src/decorators/index.ts b/backend/src/decorators/index.ts deleted file mode 100644 index 015d9f23c..000000000 --- a/backend/src/decorators/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { BodyEmail } from './body-email.decorator.js'; -export { BodyUuid } from './body-uuid.decorator.js'; -export { GCLlId } from './gclid-decorator.js'; -export { MasterPassword } from './master-password.decorator.js'; -export { QueryTableName } from './query-table-name.decorator.js'; -export { QueryUuid } from './query-uuid.decorator.js'; -export { SlugUuid } from './slug-uuid.decorator.js'; -export { VerificationString } from './slug-verification.decorator.js'; -export { TIMEOUT_KEY, Timeout, TimeoutDefaults } from './timeout.decorator.js'; -export { UserId } from './user-id.decorator.js'; diff --git a/backend/src/decorators/master-password.decorator.ts b/backend/src/decorators/master-password.decorator.ts index 51d0ff0c3..162b2c0e7 100644 --- a/backend/src/decorators/master-password.decorator.ts +++ b/backend/src/decorators/master-password.decorator.ts @@ -1,5 +1,5 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; export const MasterPassword = createParamDecorator((_data: any, ctx: ExecutionContext): string => { const request: IRequestWithCognitoInfo = ctx.switchToHttp().getRequest(); diff --git a/backend/src/decorators/query-table-name.decorator.ts b/backend/src/decorators/query-table-name.decorator.ts index 642f45990..f52027ba4 100644 --- a/backend/src/decorators/query-table-name.decorator.ts +++ b/backend/src/decorators/query-table-name.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { isObjectPropertyExists } from '../helpers/validators/is-object-property-exists-validator.js'; diff --git a/backend/src/decorators/query-uuid.decorator.ts b/backend/src/decorators/query-uuid.decorator.ts index f49dc69d3..34229a609 100644 --- a/backend/src/decorators/query-uuid.decorator.ts +++ b/backend/src/decorators/query-uuid.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { isObjectPropertyExists } from '../helpers/validators/is-object-property-exists-validator.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/decorators/slug-uuid.decorator.ts b/backend/src/decorators/slug-uuid.decorator.ts index baebb2662..1eeff7eaa 100644 --- a/backend/src/decorators/slug-uuid.decorator.ts +++ b/backend/src/decorators/slug-uuid.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/decorators/slug-verification.decorator.ts b/backend/src/decorators/slug-verification.decorator.ts index ccb8146e8..93ecb559a 100644 --- a/backend/src/decorators/slug-verification.decorator.ts +++ b/backend/src/decorators/slug-verification.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/decorators/user-id.decorator.ts b/backend/src/decorators/user-id.decorator.ts index 76ad1b4a7..90a1d7478 100644 --- a/backend/src/decorators/user-id.decorator.ts +++ b/backend/src/decorators/user-id.decorator.ts @@ -1,5 +1,5 @@ import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { Messages } from '../exceptions/text/messages.js'; import { ValidationHelper } from '../helpers/validators/validation-helper.js'; diff --git a/backend/src/entities/ai/ai.service.ts b/backend/src/entities/ai/ai.service.ts index 36ecd8639..154d8fa90 100644 --- a/backend/src/entities/ai/ai.service.ts +++ b/backend/src/entities/ai/ai.service.ts @@ -1,5 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { AICoreService, AIProviderType, cleanAIJsonResponse } from '../../ai-core/index.js'; +import { AIProviderType } from '../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../ai-core/services/ai-core.service.js'; +import { cleanAIJsonResponse } from '../../ai-core/tools/query-validators.js'; import { QueryOrderingEnum } from '../../enums/query-ordering.enum.js'; import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; import { checkFieldAutoincrement } from '../../helpers/check-field-autoincrement.js'; diff --git a/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v7.use.case.ts b/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v7.use.case.ts index 3fd3935ff..e3ae9cd99 100644 --- a/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v7.use.case.ts +++ b/backend/src/entities/ai/use-cases/request-info-from-table-with-ai-v7.use.case.ts @@ -6,26 +6,20 @@ import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/inte import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; import Sentry from '@sentry/minimal'; import { Response } from 'express'; -import { - AICoreService, - AIProviderType, - AIToolCall, - AIToolDefinition, - createDatabaseQuerySystemPrompt, - createDatabaseTools, - encodeError, - encodeToToon, - isValidMongoDbCommand, - isValidSQLQuery, - MessageBuilder, - wrapQueryWithLimit, -} from '../../../ai-core/index.js'; +import { AIToolCall, AIToolDefinition } from '../../../ai-core/interfaces/ai-provider.interface.js'; +import { AIProviderType } from '../../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../../ai-core/services/ai-core.service.js'; +import { createDatabaseTools } from '../../../ai-core/tools/database-tools.js'; +import { createDatabaseQuerySystemPrompt } from '../../../ai-core/tools/prompts.js'; +import { isValidMongoDbCommand, isValidSQLQuery, wrapQueryWithLimit } from '../../../ai-core/tools/query-validators.js'; +import { MessageBuilder } from '../../../ai-core/utils/message-builder.js'; +import { encodeError, encodeToToon } from '../../../ai-core/utils/toon-encoder.js'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { slackPostMessage } from '../../../helpers/index.js'; import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { MessageRole } from '../ai-conversation-history/ai-chat-messages/message-role.enum.js'; import { UserAiChatEntity } from '../ai-conversation-history/user-ai-chat/user-ai-chat.entity.js'; diff --git a/backend/src/entities/amplitude/amplitude.service.ts b/backend/src/entities/amplitude/amplitude.service.ts index 1a52fe1cd..575c0b26f 100644 --- a/backend/src/entities/amplitude/amplitude.service.ts +++ b/backend/src/entities/amplitude/amplitude.service.ts @@ -2,7 +2,7 @@ import Amplitude from '@amplitude/node'; import { Injectable, OnModuleInit } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { AmplitudeEventTypeEnum } from '../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../enums/amplitude-event-type.enum.js'; import { UserEntity } from '../user/user.entity.js'; export interface AmplitudeLogOptions { diff --git a/backend/src/entities/cedar-authorization/cedar-authorization.controller.ts b/backend/src/entities/cedar-authorization/cedar-authorization.controller.ts index b27b93fb4..35ed12e48 100644 --- a/backend/src/entities/cedar-authorization/cedar-authorization.controller.ts +++ b/backend/src/entities/cedar-authorization/cedar-authorization.controller.ts @@ -10,12 +10,12 @@ import { UseInterceptors, } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; -import { SlugUuid } from '../../decorators/index.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; import { Messages } from '../../exceptions/text/messages.js'; import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { IComplexPermission } from '../permission/permission.interface.js'; import { CedarAuthorizationService } from './cedar-authorization.service.js'; import { SaveCedarPolicyDto } from './dto/save-cedar-policy.dto.js'; @@ -67,7 +67,9 @@ export class CedarAuthorizationController { return { valid: true }; } - @ApiOperation({ summary: 'Save a cedar policy for a group, generating classical permissions for backward compatibility' }) + @ApiOperation({ + summary: 'Save a cedar policy for a group, generating classical permissions for backward compatibility', + }) @ApiResponse({ status: 200, description: 'Cedar policy saved and classical permissions generated.', diff --git a/backend/src/entities/cedar-authorization/cedar-permissions.service.ts b/backend/src/entities/cedar-authorization/cedar-permissions.service.ts index 0a4abfe69..e24a66e9b 100644 --- a/backend/src/entities/cedar-authorization/cedar-permissions.service.ts +++ b/backend/src/entities/cedar-authorization/cedar-permissions.service.ts @@ -2,7 +2,7 @@ import * as cedarWasm from '@cedar-policy/cedar-wasm/nodejs'; import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { IGlobalDatabaseContext } from '../../common/application/global-database-context.interface.js'; import { BaseType } from '../../common/data-injection.tokens.js'; -import { AccessLevelEnum } from '../../enums/index.js'; +import { AccessLevelEnum } from '../../enums/access-level.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; import { Cacher } from '../../helpers/cache/cacher.js'; import { GroupEntity } from '../group/group.entity.js'; diff --git a/backend/src/entities/cedar-authorization/cedar-policy-generator.ts b/backend/src/entities/cedar-authorization/cedar-policy-generator.ts index 1d9095884..6e97123a8 100644 --- a/backend/src/entities/cedar-authorization/cedar-policy-generator.ts +++ b/backend/src/entities/cedar-authorization/cedar-policy-generator.ts @@ -1,4 +1,4 @@ -import { AccessLevelEnum } from '../../enums/index.js'; +import { AccessLevelEnum } from '../../enums/access-level.enum.js'; import { IComplexPermission } from '../permission/permission.interface.js'; export function generateCedarPolicyForGroup( @@ -10,9 +10,7 @@ export function generateCedarPolicyForGroup( const connectionRef = `RocketAdmin::Connection::"${connectionId}"`; if (isMain) { - policies.push( - `permit(\n principal,\n action,\n resource\n);`, - ); + policies.push(`permit(\n principal,\n action,\n resource\n);`); return policies.join('\n\n'); } diff --git a/backend/src/entities/cedar-authorization/cedar-policy-parser.ts b/backend/src/entities/cedar-authorization/cedar-policy-parser.ts index 64c6dcffa..d7c7e5a6a 100644 --- a/backend/src/entities/cedar-authorization/cedar-policy-parser.ts +++ b/backend/src/entities/cedar-authorization/cedar-policy-parser.ts @@ -1,4 +1,4 @@ -import { AccessLevelEnum } from '../../enums/index.js'; +import { AccessLevelEnum } from '../../enums/access-level.enum.js'; import { IComplexPermission, IDashboardPermissionData, @@ -292,10 +292,7 @@ function extractPanelId(resourceId: string | null, connectionId: string): string return resourceId; } -function getOrCreatePanelEntry( - map: Map, - panelId: string, -): IPanelPermissionData { +function getOrCreatePanelEntry(map: Map, panelId: string): IPanelPermissionData { let entry = map.get(panelId); if (!entry) { entry = { diff --git a/backend/src/entities/connection-properties/connection-properties.controller.ts b/backend/src/entities/connection-properties/connection-properties.controller.ts index 4b61c79c8..be91af89f 100644 --- a/backend/src/entities/connection-properties/connection-properties.controller.ts +++ b/backend/src/entities/connection-properties/connection-properties.controller.ts @@ -14,12 +14,15 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../guards/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { CreateConnectionPropertiesDs } from './application/data-structures/create-connection-properties.ds.js'; import { FoundConnectionPropertiesDs } from './application/data-structures/found-connection-properties.ds.js'; import { CreateConnectionPropertiesDto } from './dto/create-connection-properties.dto.js'; @@ -139,7 +142,9 @@ export class ConnectionPropertiesController { }) @UseGuards(ConnectionEditGuard) @Delete('/connection/properties/:connectionId') - async deleteConnectionProperties(@SlugUuid('connectionId') connectionId: string): Promise { + async deleteConnectionProperties( + @SlugUuid('connectionId') connectionId: string, + ): Promise { if (!connectionId) { throw new HttpException( { diff --git a/backend/src/entities/connection-properties/connection-properties.module.ts b/backend/src/entities/connection-properties/connection-properties.module.ts index 74bf566fb..97b4ad696 100644 --- a/backend/src/entities/connection-properties/connection-properties.module.ts +++ b/backend/src/entities/connection-properties/connection-properties.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; diff --git a/backend/src/entities/connection-properties/dto/index.ts b/backend/src/entities/connection-properties/dto/index.ts deleted file mode 100644 index 35f561fd4..000000000 --- a/backend/src/entities/connection-properties/dto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CreateConnectionPropertiesDto } from './create-connection-properties.dto.js'; diff --git a/backend/src/entities/connection-properties/use-cases/connection-properties-use.cases.interface.ts b/backend/src/entities/connection-properties/use-cases/connection-properties-use.cases.interface.ts index fc794758f..d44926874 100644 --- a/backend/src/entities/connection-properties/use-cases/connection-properties-use.cases.interface.ts +++ b/backend/src/entities/connection-properties/use-cases/connection-properties-use.cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { CreateConnectionPropertiesDs } from '../application/data-structures/create-connection-properties.ds.js'; import { FoundConnectionPropertiesDs } from '../application/data-structures/found-connection-properties.ds.js'; diff --git a/backend/src/entities/connection-properties/utils/validate-create-connection-properties-ds.ts b/backend/src/entities/connection-properties/utils/validate-create-connection-properties-ds.ts index 42c331f78..19070e2c0 100644 --- a/backend/src/entities/connection-properties/utils/validate-create-connection-properties-ds.ts +++ b/backend/src/entities/connection-properties/utils/validate-create-connection-properties-ds.ts @@ -2,7 +2,7 @@ import { HttpStatus } from '@nestjs/common'; import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { validateTableCategories } from '../../table-categories/utils/validate-table-categories.util.js'; import { CreateConnectionPropertiesDs } from '../application/data-structures/create-connection-properties.ds.js'; diff --git a/backend/src/entities/connection/application/data-structures/found-connections.ds.ts b/backend/src/entities/connection/application/data-structures/found-connections.ds.ts index f5440c426..289c5a927 100644 --- a/backend/src/entities/connection/application/data-structures/found-connections.ds.ts +++ b/backend/src/entities/connection/application/data-structures/found-connections.ds.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; -import { AccessLevelEnum } from '../../../../enums/index.js'; +import { AccessLevelEnum } from '../../../../enums/access-level.enum.js'; import { ConnectionPropertiesEntity } from '../../../connection-properties/connection-properties.entity.js'; import { FoundGroupDataWithUsersDs } from '../../../group/application/data-sctructures/found-user-groups.ds.js'; import { SimpleFoundUserInfoDs } from '../../../user/dto/found-user.dto.js'; diff --git a/backend/src/entities/connection/application/data-structures/found-one-connection.ds.ts b/backend/src/entities/connection/application/data-structures/found-one-connection.ds.ts index d2886e669..a572c58f6 100644 --- a/backend/src/entities/connection/application/data-structures/found-one-connection.ds.ts +++ b/backend/src/entities/connection/application/data-structures/found-one-connection.ds.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { AccessLevelEnum } from '../../../../enums/index.js'; +import { AccessLevelEnum } from '../../../../enums/access-level.enum.js'; import { FoundConnectionPropertiesDs } from '../../../connection-properties/application/data-structures/found-connection-properties.ds.js'; import { FoundAgentConnectionsDs, diff --git a/backend/src/entities/connection/application/data-structures/found-permissions-in-connection.ds.ts b/backend/src/entities/connection/application/data-structures/found-permissions-in-connection.ds.ts index af4acff48..eb87bad1a 100644 --- a/backend/src/entities/connection/application/data-structures/found-permissions-in-connection.ds.ts +++ b/backend/src/entities/connection/application/data-structures/found-permissions-in-connection.ds.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { AccessLevelEnum } from '../../../../enums/index.js'; +import { AccessLevelEnum } from '../../../../enums/access-level.enum.js'; export class FoundConnectionPermissionsDs { @ApiProperty() diff --git a/backend/src/entities/connection/connection.controller.ts b/backend/src/entities/connection/connection.controller.ts index 0aa97218c..f157661b8 100644 --- a/backend/src/entities/connection/connection.controller.ts +++ b/backend/src/entities/connection/connection.controller.ts @@ -16,14 +16,23 @@ import { isRedisConnectionUrl } from '@rocketadmin/shared-code/dist/src/data-acc import { TestConnectionResultDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/test-result-connection.ds.js'; import { IGlobalDatabaseContext } from '../../common/application/global-database-context.interface.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; -import { BodyUuid, GCLlId, MasterPassword, QueryUuid, SlugUuid, UserId } from '../../decorators/index.js'; +import { BodyUuid } from '../../decorators/body-uuid.decorator.js'; +import { GCLlId } from '../../decorators/gclid-decorator.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { QueryUuid } from '../../decorators/query-uuid.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { AmplitudeEventTypeEnum, InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { AmplitudeEventTypeEnum } from '../../enums/amplitude-event-type.enum.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; import { processExceptionMessage } from '../../exceptions/utils/process-exception-message.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../guards/index.js'; -import { isConnectionTypeAgent, slackPostMessage, toPrettyErrorsMsg } from '../../helpers/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; +import { isConnectionTypeAgent } from '../../helpers/is-connection-entity-agent.js'; +import { slackPostMessage } from '../../helpers/slack/slack-post-message.js'; +import { toPrettyErrorsMsg } from '../../helpers/to-pretty-errors-msg.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { SuccessResponse } from '../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { AmplitudeService } from '../amplitude/amplitude.service.js'; import { FoundGroupResponseDto } from '../group/dto/found-group-response.dto.js'; diff --git a/backend/src/entities/connection/connection.entity.ts b/backend/src/entities/connection/connection.entity.ts index 076edf8e6..5826c2485 100644 --- a/backend/src/entities/connection/connection.entity.ts +++ b/backend/src/entities/connection/connection.entity.ts @@ -14,7 +14,7 @@ import { Relation, } from 'typeorm'; import { Encryptor } from '../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../helpers/is-connection-entity-agent.js'; import { AgentEntity } from '../agent/agent.entity.js'; import { CompanyInfoEntity } from '../company-info/company-info.entity.js'; import { ConnectionPropertiesEntity } from '../connection-properties/connection-properties.entity.js'; diff --git a/backend/src/entities/connection/connection.module.ts b/backend/src/entities/connection/connection.module.ts index df04c18fc..b33619ab6 100644 --- a/backend/src/entities/connection/connection.module.ts +++ b/backend/src/entities/connection/connection.module.ts @@ -1,7 +1,7 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { AuthWithApiMiddleware } from '../../authorization/auth-with-api.middleware.js'; -import { AuthMiddleware } from '../../authorization/index.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { AgentModule } from '../agent/agent.module.js'; diff --git a/backend/src/entities/connection/repository/custom-connection-repository-extension.ts b/backend/src/entities/connection/repository/custom-connection-repository-extension.ts index b2f3917df..51fcc3eb6 100644 --- a/backend/src/entities/connection/repository/custom-connection-repository-extension.ts +++ b/backend/src/entities/connection/repository/custom-connection-repository-extension.ts @@ -2,7 +2,7 @@ import { Repository } from 'typeorm'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { UserEntity } from '../../user/user.entity.js'; import { ConnectionEntity } from '../connection.entity.js'; import { diff --git a/backend/src/entities/connection/use-cases/create-connection.use.case.ts b/backend/src/entities/connection/use-cases/create-connection.use.case.ts index efaeda560..04b47281c 100644 --- a/backend/src/entities/connection/use-cases/create-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/create-connection.use.case.ts @@ -4,17 +4,18 @@ import * as Sentry from '@sentry/node'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent, slackPostMessage } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; +import { generateCedarPolicyForGroup } from '../../cedar-authorization/cedar-policy-generator.js'; import { SharedJobsService } from '../../shared-jobs/shared-jobs.service.js'; import { UserRoleEnum } from '../../user/enums/user-role.enum.js'; import { UserEntity } from '../../user/user.entity.js'; import { CreateConnectionDs } from '../application/data-structures/create-connection.ds.js'; import { CreatedConnectionDTO } from '../application/dto/created-connection.dto.js'; import { ConnectionEntity } from '../connection.entity.js'; -import { generateCedarPolicyForGroup } from '../../cedar-authorization/cedar-policy-generator.js'; -import { AccessLevelEnum } from '../../../enums/index.js'; import { buildConnectionEntity } from '../utils/build-connection-entity.js'; import { buildCreatedConnectionDs } from '../utils/build-created-connection.ds.js'; import { processAWSConnection } from '../utils/process-aws-connection.util.js'; @@ -99,15 +100,11 @@ export class CreateConnectionUseCase savedConnection, connectionAuthor, ); - createdAdminGroup.cedarPolicy = generateCedarPolicyForGroup( - savedConnection.id, - true, - { - connection: { connectionId: savedConnection.id, accessLevel: AccessLevelEnum.edit }, - group: { groupId: createdAdminGroup.id, accessLevel: AccessLevelEnum.edit }, - tables: [], - }, - ); + createdAdminGroup.cedarPolicy = generateCedarPolicyForGroup(savedConnection.id, true, { + connection: { connectionId: savedConnection.id, accessLevel: AccessLevelEnum.edit }, + group: { groupId: createdAdminGroup.id, accessLevel: AccessLevelEnum.edit }, + tables: [], + }); await this._dbContext.groupRepository.saveNewOrUpdatedGroup(createdAdminGroup); delete createdAdminGroup.connection; await this._dbContext.userRepository.saveUserEntity(connectionAuthor); diff --git a/backend/src/entities/connection/use-cases/create-group-in-connection.use.case.ts b/backend/src/entities/connection/use-cases/create-group-in-connection.use.case.ts index 647066985..1e7f7be00 100644 --- a/backend/src/entities/connection/use-cases/create-group-in-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/create-group-in-connection.use.case.ts @@ -2,7 +2,7 @@ import { BadRequestException, Inject, Injectable, Scope } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AccessLevelEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Cacher } from '../../../helpers/cache/cacher.js'; import { generateCedarPolicyForGroup } from '../../cedar-authorization/cedar-policy-generator.js'; diff --git a/backend/src/entities/connection/use-cases/find-all-connections.use.case.ts b/backend/src/entities/connection/use-cases/find-all-connections.use.case.ts index fbcdc3b05..0f983a221 100644 --- a/backend/src/entities/connection/use-cases/find-all-connections.use.case.ts +++ b/backend/src/entities/connection/use-cases/find-all-connections.use.case.ts @@ -2,7 +2,8 @@ import { Inject, Injectable, InternalServerErrorException } from '@nestjs/common import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AccessLevelEnum, AmplitudeEventTypeEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { isSaaS } from '../../../helpers/app/is-saas.js'; import { Constants } from '../../../helpers/constants/constants.js'; diff --git a/backend/src/entities/connection/use-cases/find-one-connection.use.case.ts b/backend/src/entities/connection/use-cases/find-one-connection.use.case.ts index e9c65d9d9..196b8428f 100644 --- a/backend/src/entities/connection/use-cases/find-one-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/find-one-connection.use.case.ts @@ -3,7 +3,7 @@ import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AccessLevelEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; diff --git a/backend/src/entities/connection/use-cases/restore-connection-use.case.ts b/backend/src/entities/connection/use-cases/restore-connection-use.case.ts index a3a5afbb0..eea6d3251 100644 --- a/backend/src/entities/connection/use-cases/restore-connection-use.case.ts +++ b/backend/src/entities/connection/use-cases/restore-connection-use.case.ts @@ -4,7 +4,7 @@ import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { isConnectionEntityAgent } from '../../../helpers/index.js'; +import { isConnectionEntityAgent } from '../../../helpers/is-connection-entity-agent.js'; import { RestoredConnectionDs } from '../application/data-structures/restored-connection.ds.js'; import { UpdateConnectionDs } from '../application/data-structures/update-connection.ds.js'; import { buildCreatedConnectionDs } from '../utils/build-created-connection.ds.js'; diff --git a/backend/src/entities/connection/use-cases/test-connection.use.case.ts b/backend/src/entities/connection/use-cases/test-connection.use.case.ts index 0a95d7a76..c5c233385 100644 --- a/backend/src/entities/connection/use-cases/test-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/test-connection.use.case.ts @@ -11,7 +11,8 @@ import { BaseType } from '../../../common/data-injection.tokens.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { processExceptionMessage } from '../../../exceptions/utils/process-exception-message.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent, slackPostMessage } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; import { CreateConnectionDs } from '../application/data-structures/create-connection.ds.js'; import { TestConnectionResultDs } from '../application/data-structures/test-connection-result.ds.js'; import { UpdateConnectionDs } from '../application/data-structures/update-connection.ds.js'; diff --git a/backend/src/entities/connection/use-cases/update-connection.use.case.ts b/backend/src/entities/connection/use-cases/update-connection.use.case.ts index 5658dbcbe..4edc6b893 100644 --- a/backend/src/entities/connection/use-cases/update-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/update-connection.use.case.ts @@ -3,11 +3,11 @@ import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { UpdateConnectionDs } from '../application/data-structures/update-connection.ds.js'; import { CreatedConnectionDTO } from '../application/dto/created-connection.dto.js'; @@ -83,10 +83,7 @@ export class UpdateConnectionUseCase if (updatedConnection.master_hash) { const isMasterPwdValid = await Encryptor.verifyUserPassword(masterPwd, updatedConnection.master_hash); if (!isMasterPwdValid) { - throw new HttpException( - { message: Messages.MASTER_PASSWORD_INCORRECT }, - HttpStatus.BAD_REQUEST, - ); + throw new HttpException({ message: Messages.MASTER_PASSWORD_INCORRECT }, HttpStatus.BAD_REQUEST); } } updatedConnection = Encryptor.encryptConnectionCredentials(updatedConnection, masterPwd); diff --git a/backend/src/entities/connection/use-cases/use-cases.interfaces.ts b/backend/src/entities/connection/use-cases/use-cases.interfaces.ts index 5c48f7973..15332c227 100644 --- a/backend/src/entities/connection/use-cases/use-cases.interfaces.ts +++ b/backend/src/entities/connection/use-cases/use-cases.interfaces.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { SuccessResponse } from '../../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { FoundGroupResponseDto } from '../../group/dto/found-group-response.dto.js'; import { FindUserDs } from '../../user/application/data-structures/find-user.ds.js'; diff --git a/backend/src/entities/connection/utils/build-connection-entity.ts b/backend/src/entities/connection/utils/build-connection-entity.ts index 3e17b1850..5f53e8a1d 100644 --- a/backend/src/entities/connection/utils/build-connection-entity.ts +++ b/backend/src/entities/connection/utils/build-connection-entity.ts @@ -1,5 +1,5 @@ import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { UserEntity } from '../../user/user.entity.js'; import { CreateConnectionDs } from '../application/data-structures/create-connection.ds.js'; import { ConnectionEntity } from '../connection.entity.js'; diff --git a/backend/src/entities/connection/utils/decrypt-connection-credentials-async.ts b/backend/src/entities/connection/utils/decrypt-connection-credentials-async.ts index 106d7cca6..70393b147 100644 --- a/backend/src/entities/connection/utils/decrypt-connection-credentials-async.ts +++ b/backend/src/entities/connection/utils/decrypt-connection-credentials-async.ts @@ -1,6 +1,6 @@ import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { ConnectionEntity } from '../connection.entity.js'; export async function decryptConnectionCredentialsAsync(connection: ConnectionEntity): Promise { diff --git a/backend/src/entities/connection/utils/is-host-allowed.ts b/backend/src/entities/connection/utils/is-host-allowed.ts index be3d2bca5..811ad4668 100644 --- a/backend/src/entities/connection/utils/is-host-allowed.ts +++ b/backend/src/entities/connection/utils/is-host-allowed.ts @@ -5,7 +5,7 @@ import ipRangeCheck from 'ip-range-check'; import { Messages } from '../../../exceptions/text/messages.js'; import { isSaaS } from '../../../helpers/app/is-saas.js'; import { Constants } from '../../../helpers/constants/constants.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; export interface HostCheckData { type?: string; @@ -48,9 +48,6 @@ export async function isHostAllowed(connectionData: HostCheckData): Promise { - throw new HttpException( - { message: Messages.CANNOT_CREATE_CONNECTION_TO_THIS_HOST }, - HttpStatus.FORBIDDEN, - ); + throw new HttpException({ message: Messages.CANNOT_CREATE_CONNECTION_TO_THIS_HOST }, HttpStatus.FORBIDDEN); }); } diff --git a/backend/src/entities/connection/utils/update-connection-entity-for-restoration.ts b/backend/src/entities/connection/utils/update-connection-entity-for-restoration.ts index d899d4790..c6640ba64 100644 --- a/backend/src/entities/connection/utils/update-connection-entity-for-restoration.ts +++ b/backend/src/entities/connection/utils/update-connection-entity-for-restoration.ts @@ -1,5 +1,5 @@ import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { UpdateConnectionDs } from '../application/data-structures/update-connection.ds.js'; import { ConnectionEntity } from '../connection.entity.js'; diff --git a/backend/src/entities/connection/utils/validate-create-connection-data.ts b/backend/src/entities/connection/utils/validate-create-connection-data.ts index b32164371..a0e9cc10e 100644 --- a/backend/src/entities/connection/utils/validate-create-connection-data.ts +++ b/backend/src/entities/connection/utils/validate-create-connection-data.ts @@ -7,7 +7,8 @@ import { } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import validator from 'validator'; import { Messages } from '../../../exceptions/text/messages.js'; -import { isConnectionTypeAgent, toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { CreateConnectionDs } from '../application/data-structures/create-connection.ds.js'; import { UpdateConnectionDs } from '../application/data-structures/update-connection.ds.js'; import { isHostAllowed } from './is-host-allowed.js'; @@ -28,10 +29,7 @@ export async function validateCreateConnectionData( if (host && isRedisConnectionUrl(host)) { if (errors.length > 0) { - throw new HttpException( - { message: toPrettyErrorsMsg(errors) }, - HttpStatus.BAD_REQUEST, - ); + throw new HttpException({ message: toPrettyErrorsMsg(errors) }, HttpStatus.BAD_REQUEST); } return true; } diff --git a/backend/src/entities/convention/conversion.controller.ts b/backend/src/entities/convention/conversion.controller.ts index 15abfab30..09f87e348 100644 --- a/backend/src/entities/convention/conversion.controller.ts +++ b/backend/src/entities/convention/conversion.controller.ts @@ -3,8 +3,8 @@ import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; import { UseCaseType } from '../../common/data-injection.tokens.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { IGetConversions } from './use-cases/get-conversions-use-cases.interface.js'; @UseInterceptors(SentryInterceptor) diff --git a/backend/src/entities/convention/conversion.module.ts b/backend/src/entities/convention/conversion.module.ts index 010a5c270..3c2affcc7 100644 --- a/backend/src/entities/convention/conversion.module.ts +++ b/backend/src/entities/convention/conversion.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { BasicAuthMiddleware } from '../../authorization/index.js'; +import { BasicAuthMiddleware } from '../../authorization/basic-auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; diff --git a/backend/src/entities/convention/use-cases/get-conversions-use-cases.interface.ts b/backend/src/entities/convention/use-cases/get-conversions-use-cases.interface.ts index 316c50de6..b147a6694 100644 --- a/backend/src/entities/convention/use-cases/get-conversions-use-cases.interface.ts +++ b/backend/src/entities/convention/use-cases/get-conversions-use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; export interface IGetConversions { execute(inputData: undefined, inTransaction: InTransactionEnum): Promise; diff --git a/backend/src/entities/cron-jobs/cron-jobs.service.ts b/backend/src/entities/cron-jobs/cron-jobs.service.ts index 39d24eee8..c369097b8 100644 --- a/backend/src/entities/cron-jobs/cron-jobs.service.ts +++ b/backend/src/entities/cron-jobs/cron-jobs.service.ts @@ -2,12 +2,12 @@ import { Inject, Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { InjectRepository } from '@nestjs/typeorm'; import Sentry from '@sentry/minimal'; +import Mail from 'nodemailer/lib/mailer/index.js'; import { Repository } from 'typeorm'; import { UseCaseType } from '../../common/data-injection.tokens.js'; import { Constants } from '../../helpers/constants/constants.js'; -import { slackPostMessage } from '../../helpers/index.js'; +import { slackPostMessage } from '../../helpers/slack/slack-post-message.js'; import { ValidationHelper } from '../../helpers/validators/validation-helper.js'; -import Mail from 'nodemailer/lib/mailer/index.js'; import { EmailService, ICronMessagingResults } from '../email/email/email.service.js'; import { ICheckUsersActionsAndMailingUsers, diff --git a/backend/src/entities/custom-field/custom-field.controller.ts b/backend/src/entities/custom-field/custom-field.controller.ts index 8c3527916..c39c8b439 100644 --- a/backend/src/entities/custom-field/custom-field.controller.ts +++ b/backend/src/entities/custom-field/custom-field.controller.ts @@ -15,12 +15,17 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, QueryTableName, QueryUuid, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { QueryTableName } from '../../decorators/query-table-name.decorator.js'; +import { QueryUuid } from '../../decorators/query-uuid.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../guards/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { FoundTableSettingsDs } from '../table-settings/application/data-structures/found-table-settings.ds.js'; import { CreateCustomFieldsDs } from './application/data-structures/create-custom-fields.ds.js'; import { DeleteCustomFieldsDs } from './application/data-structures/delete-custom-fields.ds.js'; diff --git a/backend/src/entities/custom-field/custom-field.module.ts b/backend/src/entities/custom-field/custom-field.module.ts index 20598280d..55e2650db 100644 --- a/backend/src/entities/custom-field/custom-field.module.ts +++ b/backend/src/entities/custom-field/custom-field.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { AgentModule } from '../agent/agent.module.js'; diff --git a/backend/src/entities/custom-field/use-cases/custom-field-use-cases.interface.ts b/backend/src/entities/custom-field/use-cases/custom-field-use-cases.interface.ts index 74c64210b..f22caf895 100644 --- a/backend/src/entities/custom-field/use-cases/custom-field-use-cases.interface.ts +++ b/backend/src/entities/custom-field/use-cases/custom-field-use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { FoundTableSettingsDs } from '../../table-settings/application/data-structures/found-table-settings.ds.js'; import { CreateCustomFieldsDs } from '../application/data-structures/create-custom-fields.ds.js'; import { DeleteCustomFieldsDs } from '../application/data-structures/delete-custom-fields.ds.js'; diff --git a/backend/src/entities/custom-field/utils/validate-create-custom-field-dto.ts b/backend/src/entities/custom-field/utils/validate-create-custom-field-dto.ts index 531030f55..966216140 100644 --- a/backend/src/entities/custom-field/utils/validate-create-custom-field-dto.ts +++ b/backend/src/entities/custom-field/utils/validate-create-custom-field-dto.ts @@ -2,7 +2,8 @@ import { HttpStatus } from '@nestjs/common'; import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { getValuesBetweenCurlies, toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { getValuesBetweenCurlies } from '../../../helpers/operate-values-between-curlies.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { CreateFieldDto } from '../application/data-structures/create-custom-fields.ds.js'; diff --git a/backend/src/entities/demo-data/demo-data.service.ts b/backend/src/entities/demo-data/demo-data.service.ts index b3c546ec8..9638412f0 100644 --- a/backend/src/entities/demo-data/demo-data.service.ts +++ b/backend/src/entities/demo-data/demo-data.service.ts @@ -8,7 +8,8 @@ import { TableActionEventEnum } from '../../enums/table-action-event-enum.js'; import { TableActionTypeEnum } from '../../enums/table-action-type.enum.js'; import { isTest } from '../../helpers/app/is-test.js'; import { Constants } from '../../helpers/constants/constants.js'; -import { slackPostMessage } from '../../helpers/index.js'; +import { slackPostMessage } from '../../helpers/slack/slack-post-message.js'; +import { generateCedarPolicyForGroup } from '../cedar-authorization/cedar-policy-generator.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; import { CreateConnectionPropertiesDs } from '../connection-properties/application/data-structures/create-connection-properties.ds.js'; import { ConnectionPropertiesEntity } from '../connection-properties/connection-properties.entity.js'; @@ -27,7 +28,6 @@ import { TableSettingsEntity } from '../table-settings/common-table-settings/tab import { buildNewTableSettingsEntity } from '../table-settings/common-table-settings/utils/build-new-table-settings-entity.js'; import { buildConnectionEntitiesFromTestDtos } from '../user/utils/build-connection-entities-from-test-dtos.js'; import { buildDefaultAdminGroups } from '../user/utils/build-default-admin-groups.js'; -import { generateCedarPolicyForGroup } from '../cedar-authorization/cedar-policy-generator.js'; import { CreateTableWidgetDs } from '../widget/application/data-sctructures/create-table-widgets.ds.js'; import { buildNewTableWidgetEntity } from '../widget/utils/build-new-table-widget-entity.js'; diff --git a/backend/src/entities/group/application/data-sctructures/found-user-groups.ds.ts b/backend/src/entities/group/application/data-sctructures/found-user-groups.ds.ts index 5e94370d7..d94667f50 100644 --- a/backend/src/entities/group/application/data-sctructures/found-user-groups.ds.ts +++ b/backend/src/entities/group/application/data-sctructures/found-user-groups.ds.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { AccessLevelEnum } from '../../../../enums/index.js'; +import { AccessLevelEnum } from '../../../../enums/access-level.enum.js'; import { SimpleFoundUserInfoDs } from '../../../user/dto/found-user.dto.js'; export class FoundGroupDataInfoDs { diff --git a/backend/src/entities/group/group.controller.ts b/backend/src/entities/group/group.controller.ts index 61ed095cc..174fd4c10 100644 --- a/backend/src/entities/group/group.controller.ts +++ b/backend/src/entities/group/group.controller.ts @@ -13,13 +13,16 @@ import { } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { SlugUuid, UserId } from '../../decorators/index.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { AmplitudeEventTypeEnum, InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { AmplitudeEventTypeEnum } from '../../enums/amplitude-event-type.enum.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { GroupEditGuard, GroupReadGuard } from '../../guards/index.js'; +import { GroupEditGuard } from '../../guards/group-edit.guard.js'; +import { GroupReadGuard } from '../../guards/group-read.guard.js'; import { Cacher } from '../../helpers/cache/cacher.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { AmplitudeService } from '../amplitude/amplitude.service.js'; import { FoundUserInGroupDs } from '../user/application/data-structures/found-user-in-group.ds.js'; import { AddUserInGroupDs, AddUserInGroupWithSaaSDs } from './application/data-sctructures/add-user-in-group.ds.js'; diff --git a/backend/src/entities/group/group.module.ts b/backend/src/entities/group/group.module.ts index 63e092f8b..57254880c 100644 --- a/backend/src/entities/group/group.module.ts +++ b/backend/src/entities/group/group.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { AgentModule } from '../agent/agent.module.js'; @@ -20,13 +20,7 @@ import { UpdateGroupTitleUseCase } from './use-cases/update-group-title.use.case @Module({ imports: [ - TypeOrmModule.forFeature([ - ConnectionEntity, - GroupEntity, - UserEntity, - TableSettingsEntity, - LogOutEntity, - ]), + TypeOrmModule.forFeature([ConnectionEntity, GroupEntity, UserEntity, TableSettingsEntity, LogOutEntity]), UserModule, AgentModule, ], diff --git a/backend/src/entities/group/use-cases/find-all-user-groups.use.case.ts b/backend/src/entities/group/use-cases/find-all-user-groups.use.case.ts index 17c227220..e08d4abb3 100644 --- a/backend/src/entities/group/use-cases/find-all-user-groups.use.case.ts +++ b/backend/src/entities/group/use-cases/find-all-user-groups.use.case.ts @@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AccessLevelEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { FoundUserGroupsDs } from '../application/data-sctructures/found-user-groups.ds.js'; import { GroupEntity } from '../group.entity.js'; diff --git a/backend/src/entities/group/use-cases/use-cases.interfaces.ts b/backend/src/entities/group/use-cases/use-cases.interfaces.ts index 5f0974773..49361879e 100644 --- a/backend/src/entities/group/use-cases/use-cases.interfaces.ts +++ b/backend/src/entities/group/use-cases/use-cases.interfaces.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { FoundUserInGroupDs } from '../../user/application/data-structures/found-user-in-group.ds.js'; import { AddUserInGroupDs, AddUserInGroupWithSaaSDs } from '../application/data-sctructures/add-user-in-group.ds.js'; import { AddedUserInGroupDs } from '../application/data-sctructures/added-user-in-group.ds.js'; diff --git a/backend/src/entities/logging/winston-logger.ts b/backend/src/entities/logging/winston-logger.ts index e1eae90c8..f984cc528 100644 --- a/backend/src/entities/logging/winston-logger.ts +++ b/backend/src/entities/logging/winston-logger.ts @@ -1,6 +1,6 @@ import { Injectable, LoggerService } from '@nestjs/common'; import winston from 'winston'; -import { slackPostMessage } from '../../helpers/index.js'; +import { slackPostMessage } from '../../helpers/slack/slack-post-message.js'; import { LoggerTransports } from './logger-transports.config.js'; @Injectable() diff --git a/backend/src/entities/permission/application/data-structures/create-permissions.ds.ts b/backend/src/entities/permission/application/data-structures/create-permissions.ds.ts index 3e2046a0a..beced7e27 100644 --- a/backend/src/entities/permission/application/data-structures/create-permissions.ds.ts +++ b/backend/src/entities/permission/application/data-structures/create-permissions.ds.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsArray, IsBoolean, IsEnum, IsString, IsUUID, ValidateNested } from 'class-validator'; -import { AccessLevelEnum } from '../../../../enums/index.js'; +import { AccessLevelEnum } from '../../../../enums/access-level.enum.js'; export class CreatePermissionsDs { groupId: string; diff --git a/backend/src/entities/permission/permission.controller.ts b/backend/src/entities/permission/permission.controller.ts index 8fa285f97..d837bad33 100644 --- a/backend/src/entities/permission/permission.controller.ts +++ b/backend/src/entities/permission/permission.controller.ts @@ -11,12 +11,14 @@ import { } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { ConnectionEditGuard } from '../../guards/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { ComplexPermissionDs, CreatePermissionsDs } from './application/data-structures/create-permissions.ds.js'; import { ICreateOrUpdatePermissions } from './use-cases/permissions-use-cases.interface.js'; diff --git a/backend/src/entities/permission/permission.interface.ts b/backend/src/entities/permission/permission.interface.ts index 54334e638..642deee7f 100644 --- a/backend/src/entities/permission/permission.interface.ts +++ b/backend/src/entities/permission/permission.interface.ts @@ -1,4 +1,4 @@ -import { AccessLevelEnum } from '../../enums/index.js'; +import { AccessLevelEnum } from '../../enums/access-level.enum.js'; export interface IComplexPermission { connection: IConnectionPermissionData; diff --git a/backend/src/entities/permission/permission.module.ts b/backend/src/entities/permission/permission.module.ts index 15db6ef31..df516629c 100644 --- a/backend/src/entities/permission/permission.module.ts +++ b/backend/src/entities/permission/permission.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { AgentModule } from '../agent/agent.module.js'; @@ -48,10 +48,6 @@ import { CreateOrUpdatePermissionsUseCase } from './use-cases/create-or-update-p }) export class PermissionModule implements NestModule { public configure(consumer: MiddlewareConsumer): any { - consumer - .apply(AuthMiddleware) - .forRoutes( - { path: 'permissions/:slug', method: RequestMethod.PUT }, - ); + consumer.apply(AuthMiddleware).forRoutes({ path: 'permissions/:slug', method: RequestMethod.PUT }); } } diff --git a/backend/src/entities/permission/use-cases/permissions-use-cases.interface.ts b/backend/src/entities/permission/use-cases/permissions-use-cases.interface.ts index 7c48afff1..d0ebdbb0c 100644 --- a/backend/src/entities/permission/use-cases/permissions-use-cases.interface.ts +++ b/backend/src/entities/permission/use-cases/permissions-use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { CreatePermissionsDs, PermissionsDs } from '../application/data-structures/create-permissions.ds.js'; export interface ICreateOrUpdatePermissions { diff --git a/backend/src/entities/s3-widget/s3-widget.controller.ts b/backend/src/entities/s3-widget/s3-widget.controller.ts index 662f42c01..50a754593 100644 --- a/backend/src/entities/s3-widget/s3-widget.controller.ts +++ b/backend/src/entities/s3-widget/s3-widget.controller.ts @@ -13,12 +13,16 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, QueryTableName, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { QueryTableName } from '../../decorators/query-table-name.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../guards/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { S3FileUrlResponseDs, S3UploadUrlResponseDs } from './application/data-structures/s3-operation.ds.js'; import { IGetS3FileUrl, IGetS3UploadUrl } from './use-cases/s3-use-cases.interface.js'; diff --git a/backend/src/entities/s3-widget/s3-widget.module.ts b/backend/src/entities/s3-widget/s3-widget.module.ts index 1b3d0be3a..13627b995 100644 --- a/backend/src/entities/s3-widget/s3-widget.module.ts +++ b/backend/src/entities/s3-widget/s3-widget.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { LogOutEntity } from '../log-out/log-out.entity.js'; 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 e633ad59c..b2947fff5 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 @@ -6,10 +6,10 @@ import JSON5 from 'json5'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { S3FileUrlResponseDs, S3GetFileUrlDs } from '../application/data-structures/s3-operation.ds.js'; import { S3WidgetParams } from '../application/data-structures/s3-widget-params.ds.js'; import { S3HelperService } from '../s3-helper.service.js'; 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 228a25317..87024b8e8 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 @@ -4,7 +4,7 @@ import JSON5 from 'json5'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; import { S3GetUploadUrlDs, S3UploadUrlResponseDs } from '../application/data-structures/s3-operation.ds.js'; diff --git a/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts b/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts index 7a879c9ef..f9ef13688 100644 --- a/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts +++ b/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { S3FileUrlResponseDs, S3GetFileUrlDs, diff --git a/backend/src/entities/table-actions/table-action-rules-module/use-cases/activate-actions-in-rule.use.case.ts b/backend/src/entities/table-actions/table-action-rules-module/use-cases/activate-actions-in-rule.use.case.ts index 04f6d690c..e03ded93e 100644 --- a/backend/src/entities/table-actions/table-action-rules-module/use-cases/activate-actions-in-rule.use.case.ts +++ b/backend/src/entities/table-actions/table-action-rules-module/use-cases/activate-actions-in-rule.use.case.ts @@ -2,14 +2,14 @@ import { ForbiddenException, HttpException, HttpStatus, Inject, Injectable } fro import AbstractUseCase from '../../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../../common/data-injection.tokens.js'; -import { LogOperationTypeEnum } from '../../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../../enums/log-operation-type.enum.js'; import { OperationResultStatusEnum } from '../../../../enums/operation-result-status.enum.js'; import { Messages } from '../../../../exceptions/text/messages.js'; +import { CedarPermissionsService } from '../../../cedar-authorization/cedar-permissions.service.js'; import { TableLogsService } from '../../../table-logs/table-logs.service.js'; import { TableActionActivationService } from '../../table-actions-module/table-action-activation.service.js'; import { ActivateEventActionsDS } from '../application/data-structures/activate-rule-actions.ds.js'; import { ActivatedTableActionsDTO } from '../application/dto/activated-table-actions.dto.js'; -import { CedarPermissionsService } from '../../../cedar-authorization/cedar-permissions.service.js'; import { IActivateTableActionsInRule } from './action-rules-use-cases.interface.js'; @Injectable() @@ -46,12 +46,7 @@ export class ActivateActionsInEventUseCase ); } const tableName = foundActionsWithCustomEvents[0].action_rule.table_name; - const canUserReadTable = await this.cedarPermissions.checkTableRead( - userId, - connectionId, - tableName, - masterPwd, - ); + const canUserReadTable = await this.cedarPermissions.checkTableRead(userId, connectionId, tableName, masterPwd); if (!canUserReadTable) { throw new ForbiddenException(Messages.DONT_HAVE_PERMISSIONS); } diff --git a/backend/src/entities/table-actions/table-actions-module/dto/create-table-action.dto.ts b/backend/src/entities/table-actions/table-actions-module/dto/create-table-action.dto.ts index b5938073d..251c28654 100644 --- a/backend/src/entities/table-actions/table-actions-module/dto/create-table-action.dto.ts +++ b/backend/src/entities/table-actions/table-actions-module/dto/create-table-action.dto.ts @@ -1,7 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsArray, IsEmail, IsEnum, IsOptional, IsString } from 'class-validator'; -import { TableActionTypeEnum } from '../../../../enums/index.js'; import { TableActionMethodEnum } from '../../../../enums/table-action-method-enum.js'; +import { TableActionTypeEnum } from '../../../../enums/table-action-type.enum.js'; export class CreateTableActionDTO { @ApiProperty({ enum: TableActionTypeEnum }) diff --git a/backend/src/entities/table-actions/table-actions-module/table-action.module.ts b/backend/src/entities/table-actions/table-actions-module/table-action.module.ts index 60c392c7c..c35aeb7e6 100644 --- a/backend/src/entities/table-actions/table-actions-module/table-action.module.ts +++ b/backend/src/entities/table-actions/table-actions-module/table-action.module.ts @@ -1,6 +1,6 @@ import { Global, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../../authorization/index.js'; +import { AuthMiddleware } from '../../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../../common/application/global-database-context.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; import { LogOutEntity } from '../../log-out/log-out.entity.js'; diff --git a/backend/src/entities/table-filters/table-filters.controller.ts b/backend/src/entities/table-filters/table-filters.controller.ts index 0f937d527..159349fee 100644 --- a/backend/src/entities/table-filters/table-filters.controller.ts +++ b/backend/src/entities/table-filters/table-filters.controller.ts @@ -22,7 +22,7 @@ import { Messages } from '../../exceptions/text/messages.js'; import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; import { TableReadGuard } from '../../guards/table-read.guard.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { SuccessResponse } from '../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { CreateTableFilterDs } from './application/data-structures/create-table-filters.ds.js'; import { FindTableFilterByIdDs, FindTableFiltersDs } from './application/data-structures/find-table-filters.ds.js'; diff --git a/backend/src/entities/table-logs/application/data-structures/create-log-record.ds.ts b/backend/src/entities/table-logs/application/data-structures/create-log-record.ds.ts index 66bc62c88..9512e89f9 100644 --- a/backend/src/entities/table-logs/application/data-structures/create-log-record.ds.ts +++ b/backend/src/entities/table-logs/application/data-structures/create-log-record.ds.ts @@ -1,4 +1,5 @@ -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../../enums/operation-result-status.enum.js'; import { ConnectionEntity } from '../../../connection/connection.entity.js'; export class CreateLogRecordDs { diff --git a/backend/src/entities/table-logs/application/data-structures/created-log-record.ds.ts b/backend/src/entities/table-logs/application/data-structures/created-log-record.ds.ts index 52d88d338..e2136e349 100644 --- a/backend/src/entities/table-logs/application/data-structures/created-log-record.ds.ts +++ b/backend/src/entities/table-logs/application/data-structures/created-log-record.ds.ts @@ -1,4 +1,5 @@ -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../../enums/operation-result-status.enum.js'; export class CreatedLogRecordDs { connection_id: string; diff --git a/backend/src/entities/table-logs/application/data-structures/find-logs.ds.ts b/backend/src/entities/table-logs/application/data-structures/find-logs.ds.ts index e8fb2fd93..42d598c3b 100644 --- a/backend/src/entities/table-logs/application/data-structures/find-logs.ds.ts +++ b/backend/src/entities/table-logs/application/data-structures/find-logs.ds.ts @@ -1,4 +1,4 @@ -import { LogOperationTypeEnum } from '../../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../../enums/log-operation-type.enum.js'; export class FindLogsDs { connectionId: string; diff --git a/backend/src/entities/table-logs/application/data-structures/found-logs.ds.ts b/backend/src/entities/table-logs/application/data-structures/found-logs.ds.ts index c3a2056e9..29782493b 100644 --- a/backend/src/entities/table-logs/application/data-structures/found-logs.ds.ts +++ b/backend/src/entities/table-logs/application/data-structures/found-logs.ds.ts @@ -1,5 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../../enums/operation-result-status.enum.js'; import { PaginationDs } from '../../../table/application/data-structures/pagination.ds.js'; import { TableLogsEntity } from '../../table-logs.entity.js'; diff --git a/backend/src/entities/table-logs/repository/table-logs-repository.interface.ts b/backend/src/entities/table-logs/repository/table-logs-repository.interface.ts index f4a0e0d20..150d5da7d 100644 --- a/backend/src/entities/table-logs/repository/table-logs-repository.interface.ts +++ b/backend/src/entities/table-logs/repository/table-logs-repository.interface.ts @@ -1,5 +1,6 @@ import { ReadStream } from 'typeorm/platform/PlatformTools.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../enums/query-ordering.enum.js'; import { CreateLogRecordDs } from '../application/data-structures/create-log-record.ds.js'; import { CreatedLogRecordDs } from '../application/data-structures/created-log-record.ds.js'; import { FoundLogsEntities } from '../application/data-structures/found-logs.ds.js'; diff --git a/backend/src/entities/table-logs/table-logs.controller.ts b/backend/src/entities/table-logs/table-logs.controller.ts index 73f71f41c..7f7570d3a 100644 --- a/backend/src/entities/table-logs/table-logs.controller.ts +++ b/backend/src/entities/table-logs/table-logs.controller.ts @@ -12,11 +12,13 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { SlugUuid, UserId } from '../../decorators/index.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum, LogOperationTypeEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; +import { LogOperationTypeEnum } from '../../enums/log-operation-type.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { FindLogsDs } from './application/data-structures/find-logs.ds.js'; import { FoundLogsDs } from './application/data-structures/found-logs.ds.js'; import { IExportLogsAsCsv, IFindLogs } from './use-cases/use-cases.interface.js'; diff --git a/backend/src/entities/table-logs/table-logs.entity.ts b/backend/src/entities/table-logs/table-logs.entity.ts index 50f761f0d..9cfbfb699 100644 --- a/backend/src/entities/table-logs/table-logs.entity.ts +++ b/backend/src/entities/table-logs/table-logs.entity.ts @@ -10,7 +10,8 @@ import { PrimaryGeneratedColumn, Relation, } from 'typeorm'; -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../enums/index.js'; +import { LogOperationTypeEnum } from '../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../enums/operation-result-status.enum.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; @Entity('tableLogs') diff --git a/backend/src/entities/table-logs/table-logs.module.ts b/backend/src/entities/table-logs/table-logs.module.ts index 703cb3a28..54761f0ec 100644 --- a/backend/src/entities/table-logs/table-logs.module.ts +++ b/backend/src/entities/table-logs/table-logs.module.ts @@ -1,6 +1,6 @@ import { Global, MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { ConnectionPropertiesEntity } from '../connection-properties/connection-properties.entity.js'; diff --git a/backend/src/entities/table-logs/table-logs.service.ts b/backend/src/entities/table-logs/table-logs.service.ts index 8695c15e7..78a8d0425 100644 --- a/backend/src/entities/table-logs/table-logs.service.ts +++ b/backend/src/entities/table-logs/table-logs.service.ts @@ -3,7 +3,8 @@ import { InjectRepository } from '@nestjs/typeorm'; import { findSensitiveValues, scrub } from '@zapier/secret-scrubber'; import PQueue from 'p-queue'; import { Repository } from 'typeorm'; -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../enums/index.js'; +import { LogOperationTypeEnum } from '../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../enums/operation-result-status.enum.js'; import { Constants } from '../../helpers/constants/constants.js'; import { isObjectPropertyExists } from '../../helpers/validators/is-object-property-exists-validator.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; diff --git a/backend/src/entities/table-logs/use-cases/find-logs.use.case.ts b/backend/src/entities/table-logs/use-cases/find-logs.use.case.ts index 1f6137170..d24e3c51f 100644 --- a/backend/src/entities/table-logs/use-cases/find-logs.use.case.ts +++ b/backend/src/entities/table-logs/use-cases/find-logs.use.case.ts @@ -2,7 +2,8 @@ import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../enums/query-ordering.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { validateStringWithEnum } from '../../../helpers/validators/validate-string-with-enum.js'; diff --git a/backend/src/entities/table-logs/use-cases/use-cases.interface.ts b/backend/src/entities/table-logs/use-cases/use-cases.interface.ts index 04b46aabc..f68d20feb 100644 --- a/backend/src/entities/table-logs/use-cases/use-cases.interface.ts +++ b/backend/src/entities/table-logs/use-cases/use-cases.interface.ts @@ -1,5 +1,5 @@ import { StreamableFile } from '@nestjs/common'; -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { FindLogsDs } from '../application/data-structures/find-logs.ds.js'; import { FoundLogsDs } from '../application/data-structures/found-logs.ds.js'; diff --git a/backend/src/entities/table-schema/ai/run-schema-change-ai-loop.ts b/backend/src/entities/table-schema/ai/run-schema-change-ai-loop.ts index 6719f9243..7286985da 100644 --- a/backend/src/entities/table-schema/ai/run-schema-change-ai-loop.ts +++ b/backend/src/entities/table-schema/ai/run-schema-change-ai-loop.ts @@ -2,16 +2,11 @@ import { BaseMessage } from '@langchain/core/messages'; import { Logger } from '@nestjs/common'; import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object.interface.js'; import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; -import { - AICoreService, - AIProviderConfig, - AIProviderType, - AIToolCall, - AIToolDefinition, - encodeError, - encodeToToon, - MessageBuilder, -} from '../../../ai-core/index.js'; +import { AIProviderConfig, AIToolCall, AIToolDefinition } from '../../../ai-core/interfaces/ai-provider.interface.js'; +import { AIProviderType } from '../../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../../ai-core/services/ai-core.service.js'; +import { MessageBuilder } from '../../../ai-core/utils/message-builder.js'; +import { encodeError, encodeToToon } from '../../../ai-core/utils/toon-encoder.js'; import { isDynamoDbSchemaChangeType, isElasticsearchSchemaChangeType, diff --git a/backend/src/entities/table-schema/ai/schema-change-tools.ts b/backend/src/entities/table-schema/ai/schema-change-tools.ts index 0346f2c19..3dcd78015 100644 --- a/backend/src/entities/table-schema/ai/schema-change-tools.ts +++ b/backend/src/entities/table-schema/ai/schema-change-tools.ts @@ -1,4 +1,4 @@ -import { AIToolDefinition } from '../../../ai-core/index.js'; +import { AIToolDefinition } from '../../../ai-core/interfaces/ai-provider.interface.js'; import { SchemaChangeTypeEnum } from '../table-schema-change-enums.js'; export const PROPOSE_SCHEMA_CHANGE_TOOL_NAME = 'proposeSchemaChange'; diff --git a/backend/src/entities/table-schema/table-schema.controller.ts b/backend/src/entities/table-schema/table-schema.controller.ts index d5bfe4c3c..b768fb808 100644 --- a/backend/src/entities/table-schema/table-schema.controller.ts +++ b/backend/src/entities/table-schema/table-schema.controller.ts @@ -17,11 +17,9 @@ import { MasterPassword } from '../../decorators/master-password.decorator.js'; import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout, TimeoutDefaults } from '../../decorators/timeout.decorator.js'; import { UserId } from '../../decorators/user-id.decorator.js'; -import { - ConnectionEditGuard, - SchemaChangeBatchOwnershipGuard, - SchemaChangeOwnershipGuard, -} from '../../guards/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { SchemaChangeBatchOwnershipGuard } from '../../guards/schema-change-batch-ownership.guard.js'; +import { SchemaChangeOwnershipGuard } from '../../guards/schema-change-ownership.guard.js'; import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { ApproveBatchSchemaChangeDto } from './application/data-transfer-objects/approve-batch-schema-change.dto.js'; import { ApproveSchemaChangeDto } from './application/data-transfer-objects/approve-schema-change.dto.js'; diff --git a/backend/src/entities/table-schema/table-schema.module.ts b/backend/src/entities/table-schema/table-schema.module.ts index 7d6d889c8..21c14e894 100644 --- a/backend/src/entities/table-schema/table-schema.module.ts +++ b/backend/src/entities/table-schema/table-schema.module.ts @@ -3,7 +3,8 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; -import { SchemaChangeBatchOwnershipGuard, SchemaChangeOwnershipGuard } from '../../guards/index.js'; +import { SchemaChangeBatchOwnershipGuard } from '../../guards/schema-change-batch-ownership.guard.js'; +import { SchemaChangeOwnershipGuard } from '../../guards/schema-change-ownership.guard.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; import { LogOutEntity } from '../log-out/log-out.entity.js'; import { UserEntity } from '../user/user.entity.js'; diff --git a/backend/src/entities/table-schema/use-cases/generate-schema-change.use-case.ts b/backend/src/entities/table-schema/use-cases/generate-schema-change.use-case.ts index d1b697a5d..b8959cf1d 100644 --- a/backend/src/entities/table-schema/use-cases/generate-schema-change.use-case.ts +++ b/backend/src/entities/table-schema/use-cases/generate-schema-change.use-case.ts @@ -2,7 +2,9 @@ import { BadRequestException, Inject, Injectable, Logger, NotFoundException, Sco import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import crypto from 'crypto'; -import { AICoreService, AIProviderType, MessageBuilder } from '../../../ai-core/index.js'; +import { AIProviderType } from '../../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../../ai-core/services/ai-core.service.js'; +import { MessageBuilder } from '../../../ai-core/utils/message-builder.js'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; diff --git a/backend/src/entities/table-settings/common-table-settings/dto/index.ts b/backend/src/entities/table-settings/common-table-settings/dto/index.ts deleted file mode 100644 index 1a11b20fe..000000000 --- a/backend/src/entities/table-settings/common-table-settings/dto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CreateTableSettingsDto } from './create-table-settings.dto.js'; diff --git a/backend/src/entities/table-settings/common-table-settings/table-settings.controller.ts b/backend/src/entities/table-settings/common-table-settings/table-settings.controller.ts index 2e747f285..fc165a3d1 100644 --- a/backend/src/entities/table-settings/common-table-settings/table-settings.controller.ts +++ b/backend/src/entities/table-settings/common-table-settings/table-settings.controller.ts @@ -15,19 +15,23 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../../common/data-injection.tokens.js'; -import { MasterPassword, QueryTableName, QueryUuid, UserId } from '../../../decorators/index.js'; +import { MasterPassword } from '../../../decorators/master-password.decorator.js'; +import { QueryTableName } from '../../../decorators/query-table-name.decorator.js'; +import { QueryUuid } from '../../../decorators/query-uuid.decorator.js'; import { Timeout } from '../../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../../enums/index.js'; +import { UserId } from '../../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../../guards/index.js'; -import { toPrettyErrorsMsg } from '../../../helpers/index.js'; -import { SentryInterceptor } from '../../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../../guards/connection-read.guard.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; +import { SentryInterceptor } from '../../../interceptors/sentry.interceptor.js'; import { CustomFieldsEntity } from '../../custom-field/custom-fields.entity.js'; import { CreateTableSettingsDs } from '../application/data-structures/create-table-settings.ds.js'; import { DeleteTableSettingsDs } from '../application/data-structures/delete-table-settings.ds.js'; import { FindTableSettingsDs } from '../application/data-structures/find-table-settings.ds.js'; import { FoundTableSettingsDs } from '../application/data-structures/found-table-settings.ds.js'; -import { CreateTableSettingsDto } from './dto/index.js'; +import { CreateTableSettingsDto } from './dto/create-table-settings.dto.js'; import { ICreateTableSettings, IDeleteTableSettings, diff --git a/backend/src/entities/table-settings/common-table-settings/table-settings.module.ts b/backend/src/entities/table-settings/common-table-settings/table-settings.module.ts index 549aa0431..92019b8b6 100644 --- a/backend/src/entities/table-settings/common-table-settings/table-settings.module.ts +++ b/backend/src/entities/table-settings/common-table-settings/table-settings.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../../authorization/index.js'; +import { AuthMiddleware } from '../../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../../common/data-injection.tokens.js'; import { AgentModule } from '../../agent/agent.module.js'; diff --git a/backend/src/entities/table-settings/common-table-settings/use-cases/create-table-settings.use.case.ts b/backend/src/entities/table-settings/common-table-settings/use-cases/create-table-settings.use.case.ts index 91cdee2c9..72d0b6c7e 100644 --- a/backend/src/entities/table-settings/common-table-settings/use-cases/create-table-settings.use.case.ts +++ b/backend/src/entities/table-settings/common-table-settings/use-cases/create-table-settings.use.case.ts @@ -6,7 +6,7 @@ import { buildValidateTableSettingsDS } from '@rocketadmin/shared-code/dist/src/ import AbstractUseCase from '../../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../../common/data-injection.tokens.js'; -import { toPrettyErrorsMsg } from '../../../../helpers/index.js'; +import { toPrettyErrorsMsg } from '../../../../helpers/to-pretty-errors-msg.js'; import { CreateTableSettingsDs } from '../../application/data-structures/create-table-settings.ds.js'; import { FoundTableSettingsDs } from '../../application/data-structures/found-table-settings.ds.js'; import { buildFoundTableSettingsDs } from '../utils/build-found-table-settings-ds.js'; diff --git a/backend/src/entities/table-settings/common-table-settings/use-cases/update-table-settings.use.case.ts b/backend/src/entities/table-settings/common-table-settings/use-cases/update-table-settings.use.case.ts index 2c50d303d..4268789da 100644 --- a/backend/src/entities/table-settings/common-table-settings/use-cases/update-table-settings.use.case.ts +++ b/backend/src/entities/table-settings/common-table-settings/use-cases/update-table-settings.use.case.ts @@ -7,7 +7,7 @@ import AbstractUseCase from '../../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../../common/data-injection.tokens.js'; import { Messages } from '../../../../exceptions/text/messages.js'; -import { toPrettyErrorsMsg } from '../../../../helpers/index.js'; +import { toPrettyErrorsMsg } from '../../../../helpers/to-pretty-errors-msg.js'; import { CreateTableSettingsDs } from '../../application/data-structures/create-table-settings.ds.js'; import { FoundTableSettingsDs } from '../../application/data-structures/found-table-settings.ds.js'; import { buildFoundTableSettingsDs } from '../utils/build-found-table-settings-ds.js'; diff --git a/backend/src/entities/table-settings/common-table-settings/use-cases/use-cases.interface.ts b/backend/src/entities/table-settings/common-table-settings/use-cases/use-cases.interface.ts index 46c1c4e0d..a4b8e6b08 100644 --- a/backend/src/entities/table-settings/common-table-settings/use-cases/use-cases.interface.ts +++ b/backend/src/entities/table-settings/common-table-settings/use-cases/use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../../enums/index.js'; +import { InTransactionEnum } from '../../../../enums/in-transaction.enum.js'; import { CreateTableSettingsDs } from '../../application/data-structures/create-table-settings.ds.js'; import { DeleteTableSettingsDs } from '../../application/data-structures/delete-table-settings.ds.js'; import { FindTableSettingsDs } from '../../application/data-structures/find-table-settings.ds.js'; diff --git a/backend/src/entities/table/application/data-structures/found-table-rows.ds.ts b/backend/src/entities/table/application/data-structures/found-table-rows.ds.ts index 3dc2908e9..d9a249dde 100644 --- a/backend/src/entities/table/application/data-structures/found-table-rows.ds.ts +++ b/backend/src/entities/table/application/data-structures/found-table-rows.ds.ts @@ -2,7 +2,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { ForeignKeyDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/foreign-key.ds.js'; import { PrimaryKeyDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/primary-key.ds.js'; import { RowsPaginationDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/rows-pagination.ds.js'; -import { FilterCriteriaEnum, QueryOrderingEnum } from '../../../../enums/index.js'; +import { FilterCriteriaEnum } from '../../../../enums/filter-criteria.enum.js'; +import { QueryOrderingEnum } from '../../../../enums/query-ordering.enum.js'; import { TablePermissionDs } from '../../../permission/application/data-structures/create-permissions.ds.js'; import { FoundActionEventDTO } from '../../../table-actions/table-action-rules-module/application/dto/found-action-rules-with-actions-and-events.dto.js'; import { CreatedTableFilterRO } from '../../../table-filters/application/response-objects/created-table-filters.ro.js'; diff --git a/backend/src/entities/table/table-datastructures.ts b/backend/src/entities/table/table-datastructures.ts index 3b64971bf..a0b0600af 100644 --- a/backend/src/entities/table/table-datastructures.ts +++ b/backend/src/entities/table/table-datastructures.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { FilterCriteriaEnum } from '../../enums/index.js'; +import { FilterCriteriaEnum } from '../../enums/filter-criteria.enum.js'; import { TableAccessLevelsDs } from '../permission/application/data-structures/create-permissions.ds.js'; import { FoundActionEventDTO } from '../table-actions/table-action-rules-module/application/dto/found-action-rules-with-actions-and-events.dto.js'; import { TableWidgetRO } from '../widget/table-widget.interface.js'; diff --git a/backend/src/entities/table/table.controller.ts b/backend/src/entities/table/table.controller.ts index f12404adc..8b7d3bbca 100644 --- a/backend/src/entities/table/table.controller.ts +++ b/backend/src/entities/table/table.controller.ts @@ -19,19 +19,28 @@ import { } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiProperty, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { Throttle } from '@nestjs/throttler'; import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; import { IGlobalDatabaseContext } from '../../common/application/global-database-context.interface.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, QueryTableName, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { QueryTableName } from '../../decorators/query-table-name.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout, TimeoutDefaults } from '../../decorators/timeout.decorator.js'; -import { AmplitudeEventTypeEnum, InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { AmplitudeEventTypeEnum } from '../../enums/amplitude-event-type.enum.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { TableAddGuard, TableDeleteGuard, TableEditGuard, TableReadGuard } from '../../guards/index.js'; +import { TableAddGuard } from '../../guards/table-add.guard.js'; +import { TableDeleteGuard } from '../../guards/table-delete.guard.js'; +import { TableEditGuard } from '../../guards/table-edit.guard.js'; +import { TableReadGuard } from '../../guards/table-read.guard.js'; import { TablesReceiveGuard } from '../../guards/tables-receive.guard.js'; import { Constants } from '../../helpers/constants/constants.js'; -import { isConnectionTypeAgent, isObjectEmpty } from '../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../helpers/is-connection-entity-agent.js'; +import { isObjectEmpty } from '../../helpers/is-object-empty.js'; import { isObjectPropertyExists } from '../../helpers/validators/is-object-property-exists-validator.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { SuccessResponse } from '../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { AmplitudeService } from '../amplitude/amplitude.service.js'; import { AddRowInTableDs } from './application/data-structures/add-row-in-table.ds.js'; @@ -63,7 +72,6 @@ import { IImportCSVFinTable, IUpdateRowInTable, } from './use-cases/table-use-cases.interface.js'; -import { Throttle } from '@nestjs/throttler'; @UseInterceptors(SentryInterceptor) @Timeout() diff --git a/backend/src/entities/table/use-cases/add-row-in-table.use.case.ts b/backend/src/entities/table/use-cases/add-row-in-table.use.case.ts index 60a9d30a9..d0f645773 100644 --- a/backend/src/entities/table/use-cases/add-row-in-table.use.case.ts +++ b/backend/src/entities/table/use-cases/add-row-in-table.use.case.ts @@ -5,10 +5,13 @@ import { buildDAOsTableSettingsDs } from '@rocketadmin/shared-code/dist/src/help import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum, LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { TableActionEventEnum } from '../../../enums/table-action-event-enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { isObjectEmpty, toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { isObjectEmpty } from '../../../helpers/is-object-empty.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { isTestConnectionUtil } from '../../connection/utils/is-test-connection-util.js'; diff --git a/backend/src/entities/table/use-cases/delete-row-from-table.use.case.ts b/backend/src/entities/table/use-cases/delete-row-from-table.use.case.ts index 6ac00b794..a538e46fe 100644 --- a/backend/src/entities/table/use-cases/delete-row-from-table.use.case.ts +++ b/backend/src/entities/table/use-cases/delete-row-from-table.use.case.ts @@ -4,14 +4,15 @@ import { buildDAOsTableSettingsDs } from '@rocketadmin/shared-code/dist/src/help import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum, LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { TableActionEventEnum } from '../../../enums/table-action-event-enum.js'; import { DeleteRowException } from '../../../exceptions/custom-exceptions/delete-row-exception.js'; import { ExceptionOperations } from '../../../exceptions/custom-exceptions/exception-operation.js'; import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { compareArrayElements } from '../../../helpers/index.js'; -import { validateConnection, getUserEmailForAgent } from '../utils/validate-connection.util.js'; +import { compareArrayElements } from '../../../helpers/compare-array-elements.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { isTestConnectionUtil } from '../../connection/utils/is-test-connection-util.js'; import { TableActionActivationService } from '../../table-actions/table-actions-module/table-action-activation.service.js'; @@ -19,6 +20,7 @@ import { TableLogsService } from '../../table-logs/table-logs.service.js'; import { DeleteRowFromTableDs } from '../application/data-structures/delete-row-from-table.ds.js'; import { DeletedRowFromTableDs } from '../application/data-structures/deleted-row-from-table.ds.js'; import { convertHexDataInPrimaryKeyUtil } from '../utils/convert-hex-data-in-primary-key.util.js'; +import { getUserEmailForAgent, validateConnection } from '../utils/validate-connection.util.js'; import { IDeleteRowFromTable } from './table-use-cases.interface.js'; @Injectable() diff --git a/backend/src/entities/table/use-cases/delete-rows-from-table.use.case.ts b/backend/src/entities/table/use-cases/delete-rows-from-table.use.case.ts index 011f65978..13239deb0 100644 --- a/backend/src/entities/table/use-cases/delete-rows-from-table.use.case.ts +++ b/backend/src/entities/table/use-cases/delete-rows-from-table.use.case.ts @@ -4,16 +4,18 @@ import { buildDAOsTableSettingsDs } from '@rocketadmin/shared-code/dist/src/help import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum, LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { compareArrayElements } from '../../../helpers/index.js'; -import { validateConnection, getUserEmailForAgent } from '../utils/validate-connection.util.js'; +import { compareArrayElements } from '../../../helpers/compare-array-elements.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { isTestConnectionUtil } from '../../connection/utils/is-test-connection-util.js'; import { TableLogsService } from '../../table-logs/table-logs.service.js'; import { DeleteRowsFromTableDs } from '../application/data-structures/delete-row-from-table.ds.js'; import { convertHexDataInPrimaryKeyUtil } from '../utils/convert-hex-data-in-primary-key.util.js'; import { findObjectsWithProperties } from '../utils/find-objects-with-properties.js'; +import { getUserEmailForAgent, validateConnection } from '../utils/validate-connection.util.js'; import { IDeleteRowsFromTable } from './table-use-cases.interface.js'; type DeleteRowsFromTableResult = { diff --git a/backend/src/entities/table/use-cases/export-csv-from-table.use.case.ts b/backend/src/entities/table/use-cases/export-csv-from-table.use.case.ts index ed19689d7..56cd7f98d 100644 --- a/backend/src/entities/table/use-cases/export-csv-from-table.use.case.ts +++ b/backend/src/entities/table/use-cases/export-csv-from-table.use.case.ts @@ -5,19 +5,20 @@ import * as csv from 'csv'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { hexToBinary, isBinary } from '../../../helpers/binary-to-hex.js'; -import { slackPostMessage } from '../../../helpers/index.js'; import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; -import { validateConnection, getUserEmailForAgent } from '../utils/validate-connection.util.js'; import { isObjectEmpty } from '../../../helpers/is-object-empty.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; import { TableLogsService } from '../../table-logs/table-logs.service.js'; import { GetTableRowsDs } from '../application/data-structures/get-table-rows.ds.js'; import { FilteringFieldsDs } from '../table-datastructures.js'; import { findFilteringFieldsUtil, parseFilteringFieldsFromBodyData } from '../utils/find-filtering-fields.util.js'; import { findOrderingFieldUtil } from '../utils/find-ordering-field.util.js'; import { isHexString } from '../utils/is-hex-string.js'; +import { getUserEmailForAgent, validateConnection } from '../utils/validate-connection.util.js'; import { IExportCSVFromTable } from './table-use-cases.interface.js'; @Injectable() diff --git a/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts b/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts index d549d49cc..e77cc3f92 100644 --- a/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts +++ b/backend/src/entities/table/use-cases/find-tables-in-connection.use.case.ts @@ -6,21 +6,21 @@ import * as Sentry from '@sentry/node'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; import { ExceptionOperations } from '../../../exceptions/custom-exceptions/exception-operation.js'; import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { isConnectionTypeAgent } from '../../../helpers/index.js'; +import { isConnectionTypeAgent } from '../../../helpers/is-connection-entity-agent.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; +import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { isTestConnectionUtil } from '../../connection/utils/is-test-connection-util.js'; import { WinstonLogger } from '../../logging/winston-logger.js'; import { ITableAndViewPermissionData } from '../../permission/permission.interface.js'; import { FindTablesDs } from '../application/data-structures/find-tables.ds.js'; import { FoundTableDs } from '../application/data-structures/found-table.ds.js'; -import { saveTableInfoInDatabase } from '../utils/save-table-info-in-database-orchestrator.util.js'; import { addDisplayNamesForTables } from '../utils/add-display-names-for-tables.util.js'; -import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; +import { saveTableInfoInDatabase } from '../utils/save-table-info-in-database-orchestrator.util.js'; import { IFindTablesInConnection } from './table-use-cases.interface.js'; @Injectable() @@ -112,7 +112,11 @@ export class FindTablesInConnectionUseCase } } const tableNames = tables.map((t) => t.tableName); - const permissionsArr = await this.cedarPermissions.getUserPermissionsForAvailableTables(userId, connectionId, tableNames); + const permissionsArr = await this.cedarPermissions.getUserPermissionsForAvailableTables( + userId, + connectionId, + tableNames, + ); const tablesWithPermissions: Array = permissionsArr.map((perm) => ({ ...perm, isView: tables.find((t) => t.tableName === perm.tableName)?.isView || false, @@ -126,10 +130,7 @@ export class FindTablesInConnectionUseCase return !excludedTables.hidden_tables.includes(tableRO.table); }); } else { - const userConnectionEdit = await this.cedarPermissions.checkUserConnectionEdit( - userId, - connectionId, - ); + const userConnectionEdit = await this.cedarPermissions.checkUserConnectionEdit(userId, connectionId); if (!userConnectionEdit) { throw new HttpException( { diff --git a/backend/src/entities/table/use-cases/get-row-by-primary-key.use.case.ts b/backend/src/entities/table/use-cases/get-row-by-primary-key.use.case.ts index ee42297f2..0aca9faf4 100644 --- a/backend/src/entities/table/use-cases/get-row-by-primary-key.use.case.ts +++ b/backend/src/entities/table/use-cases/get-row-by-primary-key.use.case.ts @@ -10,7 +10,7 @@ import { BaseType } from '../../../common/data-injection.tokens.js'; import { ExceptionOperations } from '../../../exceptions/custom-exceptions/exception-operation.js'; import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { compareArrayElements } from '../../../helpers/index.js'; +import { compareArrayElements } from '../../../helpers/compare-array-elements.js'; import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { buildActionEventDto } from '../../table-actions/table-action-rules-module/utils/build-found-action-event-dto.util.js'; import { GetRowByPrimaryKeyDs } from '../application/data-structures/get-row-by-primary-key.ds.js'; diff --git a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts index 1d950d8e2..18e442a5f 100644 --- a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts +++ b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts @@ -13,13 +13,15 @@ import Sentry from '@sentry/minimal'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum, LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { ExceptionOperations } from '../../../exceptions/custom-exceptions/exception-operation.js'; import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { hexToBinary, isBinary } from '../../../helpers/binary-to-hex.js'; import { Constants } from '../../../helpers/constants/constants.js'; -import { isObjectEmpty } from '../../../helpers/index.js'; +import { isObjectEmpty } from '../../../helpers/is-object-empty.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { buildActionEventDto } from '../../table-actions/table-action-rules-module/utils/build-found-action-event-dto.util.js'; diff --git a/backend/src/entities/table/use-cases/table-use-cases.interface.ts b/backend/src/entities/table/use-cases/table-use-cases.interface.ts index 130336b58..55e387210 100644 --- a/backend/src/entities/table/use-cases/table-use-cases.interface.ts +++ b/backend/src/entities/table/use-cases/table-use-cases.interface.ts @@ -1,5 +1,5 @@ import { StreamableFile } from '@nestjs/common'; -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { SuccessResponse } from '../../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { AddRowInTableDs } from '../application/data-structures/add-row-in-table.ds.js'; import { diff --git a/backend/src/entities/table/use-cases/update-row-in-table.use.case.ts b/backend/src/entities/table/use-cases/update-row-in-table.use.case.ts index 15252a4e1..9490ac457 100644 --- a/backend/src/entities/table/use-cases/update-row-in-table.use.case.ts +++ b/backend/src/entities/table/use-cases/update-row-in-table.use.case.ts @@ -6,12 +6,16 @@ import { buildDAOsTableSettingsDs } from '@rocketadmin/shared-code/dist/src/help import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { AmplitudeEventTypeEnum, LogOperationTypeEnum, OperationResultStatusEnum } from '../../../enums/index.js'; +import { AmplitudeEventTypeEnum } from '../../../enums/amplitude-event-type.enum.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; import { TableActionEventEnum } from '../../../enums/table-action-event-enum.js'; import { ExceptionOperations } from '../../../exceptions/custom-exceptions/exception-operation.js'; import { UnknownSQLException } from '../../../exceptions/custom-exceptions/unknown-sql-exception.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { compareArrayElements, isObjectEmpty, toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { compareArrayElements } from '../../../helpers/compare-array-elements.js'; +import { isObjectEmpty } from '../../../helpers/is-object-empty.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { AmplitudeService } from '../../amplitude/amplitude.service.js'; import { CedarPermissionsService } from '../../cedar-authorization/cedar-permissions.service.js'; import { isTestConnectionUtil } from '../../connection/utils/is-test-connection-util.js'; diff --git a/backend/src/entities/table/utils/convert-hex-data-in-primary-key.util.ts b/backend/src/entities/table/utils/convert-hex-data-in-primary-key.util.ts index 76e3bf5fe..2160461ab 100644 --- a/backend/src/entities/table/utils/convert-hex-data-in-primary-key.util.ts +++ b/backend/src/entities/table/utils/convert-hex-data-in-primary-key.util.ts @@ -1,6 +1,5 @@ import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; -import { toBinaryBuffer } from '../../../helpers/binary-to-hex.js'; -import { isBinary } from '../../../helpers/index.js'; +import { isBinary, toBinaryBuffer } from '../../../helpers/binary-to-hex.js'; export function convertHexDataInPrimaryKeyUtil( primaryKey: Record, diff --git a/backend/src/entities/table/utils/convert-hex-data-in-row.util.ts b/backend/src/entities/table/utils/convert-hex-data-in-row.util.ts index efb5fb25b..b21b71f74 100644 --- a/backend/src/entities/table/utils/convert-hex-data-in-row.util.ts +++ b/backend/src/entities/table/utils/convert-hex-data-in-row.util.ts @@ -1,6 +1,5 @@ import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; -import { toBinaryBuffer } from '../../../helpers/binary-to-hex.js'; -import { isBinary } from '../../../helpers/index.js'; +import { isBinary, toBinaryBuffer } from '../../../helpers/binary-to-hex.js'; export function convertHexDataInRowUtil( row: Record, diff --git a/backend/src/entities/table/utils/extract-foreign-keys-from-widgets.util.ts b/backend/src/entities/table/utils/extract-foreign-keys-from-widgets.util.ts index 6ba2ce453..9517e842b 100644 --- a/backend/src/entities/table/utils/extract-foreign-keys-from-widgets.util.ts +++ b/backend/src/entities/table/utils/extract-foreign-keys-from-widgets.util.ts @@ -1,5 +1,5 @@ import JSON5 from 'json5'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { TableWidgetEntity } from '../../widget/table-widget.entity.js'; import { ForeignKeyDSInfo } from '../table-datastructures.js'; diff --git a/backend/src/entities/table/utils/find-filtering-fields.util.ts b/backend/src/entities/table/utils/find-filtering-fields.util.ts index eb8cede93..7ec415420 100644 --- a/backend/src/entities/table/utils/find-filtering-fields.util.ts +++ b/backend/src/entities/table/utils/find-filtering-fields.util.ts @@ -1,7 +1,7 @@ /* eslint-disable security/detect-object-injection */ import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; -import { FilterCriteriaEnum } from '../../../enums/index.js'; +import { FilterCriteriaEnum } from '../../../enums/filter-criteria.enum.js'; import { isObjectPropertyExists } from '../../../helpers/validators/is-object-property-exists-validator.js'; import { validateStringWithEnum } from '../../../helpers/validators/validate-string-with-enum.js'; import { FilteringFieldsDs } from '../application/data-structures/found-table-rows.ds.js'; diff --git a/backend/src/entities/table/utils/find-ordering-field.util.ts b/backend/src/entities/table/utils/find-ordering-field.util.ts index 775e6b22e..87732e754 100644 --- a/backend/src/entities/table/utils/find-ordering-field.util.ts +++ b/backend/src/entities/table/utils/find-ordering-field.util.ts @@ -1,6 +1,6 @@ import { HttpException, HttpStatus } from '@nestjs/common'; import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; -import { QueryOrderingEnum } from '../../../enums/index.js'; +import { QueryOrderingEnum } from '../../../enums/query-ordering.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { isObjectPropertyExists } from '../../../helpers/validators/is-object-property-exists-validator.js'; import { TableSettingsEntity } from '../../table-settings/common-table-settings/table-settings.entity.js'; diff --git a/backend/src/entities/table/utils/form-full-table-structure.ts b/backend/src/entities/table/utils/form-full-table-structure.ts index 808f9bdbf..79b19d1da 100644 --- a/backend/src/entities/table/utils/form-full-table-structure.ts +++ b/backend/src/entities/table/utils/form-full-table-structure.ts @@ -1,5 +1,5 @@ import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; -import { checkFieldAutoincrement } from '../../../helpers/index.js'; +import { checkFieldAutoincrement } from '../../../helpers/check-field-autoincrement.js'; import { TableSettingsEntity } from '../../table-settings/common-table-settings/table-settings.entity.js'; import { FullTableStructureDs } from '../application/data-structures/found-table-structure.ds.js'; diff --git a/backend/src/entities/table/utils/hash-passwords-in-row.util.ts b/backend/src/entities/table/utils/hash-passwords-in-row.util.ts index 92cb4c536..6679497de 100644 --- a/backend/src/entities/table/utils/hash-passwords-in-row.util.ts +++ b/backend/src/entities/table/utils/hash-passwords-in-row.util.ts @@ -1,5 +1,5 @@ import JSON5 from 'json5'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; import { TableWidgetEntity } from '../../widget/table-widget.entity.js'; diff --git a/backend/src/entities/table/utils/process-uuids-in-row-util.ts b/backend/src/entities/table/utils/process-uuids-in-row-util.ts index 0c212dcc9..cd32306b2 100644 --- a/backend/src/entities/table/utils/process-uuids-in-row-util.ts +++ b/backend/src/entities/table/utils/process-uuids-in-row-util.ts @@ -1,6 +1,6 @@ import JSON5 from 'json5'; import { stringify as uuidStringify } from 'uuid'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { TableWidgetEntity } from '../../widget/table-widget.entity.js'; export function processUuidsInRowUtil( diff --git a/backend/src/entities/table/utils/remove-password-from-row.util.ts b/backend/src/entities/table/utils/remove-password-from-row.util.ts index dca65b203..d958efd94 100644 --- a/backend/src/entities/table/utils/remove-password-from-row.util.ts +++ b/backend/src/entities/table/utils/remove-password-from-row.util.ts @@ -1,4 +1,4 @@ -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { TableWidgetEntity } from '../../widget/table-widget.entity.js'; diff --git a/backend/src/entities/user-access/repository/user-access.repository.interface.ts b/backend/src/entities/user-access/repository/user-access.repository.interface.ts index 4fdf6dc05..22764be99 100644 --- a/backend/src/entities/user-access/repository/user-access.repository.interface.ts +++ b/backend/src/entities/user-access/repository/user-access.repository.interface.ts @@ -1,4 +1,4 @@ -import { AccessLevelEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { ITablePermissionData } from '../../permission/permission.interface.js'; export interface IUserAccessRepository { diff --git a/backend/src/entities/user-actions/application/data-sctructures/create-user-action.ds.ts b/backend/src/entities/user-actions/application/data-sctructures/create-user-action.ds.ts index fe7040daa..b3ec4e239 100644 --- a/backend/src/entities/user-actions/application/data-sctructures/create-user-action.ds.ts +++ b/backend/src/entities/user-actions/application/data-sctructures/create-user-action.ds.ts @@ -1,4 +1,4 @@ -import { UserActionEnum } from '../../../../enums/index.js'; +import { UserActionEnum } from '../../../../enums/user-action.enum.js'; export class CreateUserActionDs { message: UserActionEnum; diff --git a/backend/src/entities/user-actions/dto/create-user-action.dto.ts b/backend/src/entities/user-actions/dto/create-user-action.dto.ts index 1859fdf21..99a5f39ea 100644 --- a/backend/src/entities/user-actions/dto/create-user-action.dto.ts +++ b/backend/src/entities/user-actions/dto/create-user-action.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsEnum, IsNotEmpty } from 'class-validator'; -import { UserActionEnum } from '../../../enums/index.js'; +import { UserActionEnum } from '../../../enums/user-action.enum.js'; export class CreateUserActionDto { @ApiProperty({ enum: UserActionEnum }) diff --git a/backend/src/entities/user-actions/repository/user-action-custom-repository-extension.ts b/backend/src/entities/user-actions/repository/user-action-custom-repository-extension.ts index 0abcfe523..f24f76881 100644 --- a/backend/src/entities/user-actions/repository/user-action-custom-repository-extension.ts +++ b/backend/src/entities/user-actions/repository/user-action-custom-repository-extension.ts @@ -1,4 +1,4 @@ -import { UserActionEnum } from '../../../enums/index.js'; +import { UserActionEnum } from '../../../enums/user-action.enum.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { UserActionEntity } from '../user-action.entity.js'; diff --git a/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts b/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts index 4384736bf..b5399d455 100644 --- a/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts +++ b/backend/src/entities/user-actions/use-cases/check-users-actions-and-mailing-users.use.case.ts @@ -3,9 +3,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import Sentry from '@sentry/minimal'; import PQueue from 'p-queue'; import { Repository } from 'typeorm'; -import { UserActionEnum } from '../../../enums/index.js'; +import { UserActionEnum } from '../../../enums/user-action.enum.js'; import { Constants } from '../../../helpers/constants/constants.js'; -import { getUniqArrayStrings } from '../../../helpers/index.js'; +import { getUniqArrayStrings } from '../../../helpers/get-uniq-array-strings.js'; import { UserEntity } from '../../user/user.entity.js'; import { UserActionEntity } from '../user-action.entity.js'; import { buildNewConnectionNotFinishedEmailSentAction } from '../utils/build-new-user-action-entity.js'; diff --git a/backend/src/entities/user-actions/use-cases/check-users-logs-and-update-actions.use.case.ts b/backend/src/entities/user-actions/use-cases/check-users-logs-and-update-actions.use.case.ts index 4dcc42b8a..adbda134e 100644 --- a/backend/src/entities/user-actions/use-cases/check-users-logs-and-update-actions.use.case.ts +++ b/backend/src/entities/user-actions/use-cases/check-users-logs-and-update-actions.use.case.ts @@ -1,7 +1,9 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { LogOperationTypeEnum, OperationResultStatusEnum, UserActionEnum } from '../../../enums/index.js'; +import { LogOperationTypeEnum } from '../../../enums/log-operation-type.enum.js'; +import { OperationResultStatusEnum } from '../../../enums/operation-result-status.enum.js'; +import { UserActionEnum } from '../../../enums/user-action.enum.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { TableLogsEntity } from '../../table-logs/table-logs.entity.js'; import { UserActionEntity } from '../user-action.entity.js'; diff --git a/backend/src/entities/user-actions/use-cases/use-cases-interfaces.ts b/backend/src/entities/user-actions/use-cases/use-cases-interfaces.ts index b97a2a505..ed3b3a0c4 100644 --- a/backend/src/entities/user-actions/use-cases/use-cases-interfaces.ts +++ b/backend/src/entities/user-actions/use-cases/use-cases-interfaces.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { CreateUserActionDs } from '../application/data-sctructures/create-user-action.ds.js'; import { CreatedUserActionDs } from '../application/data-sctructures/created-user-action.ds.js'; diff --git a/backend/src/entities/user-actions/user-action.controller.ts b/backend/src/entities/user-actions/user-action.controller.ts index 6c3e344df..da9c81577 100644 --- a/backend/src/entities/user-actions/user-action.controller.ts +++ b/backend/src/entities/user-actions/user-action.controller.ts @@ -1,10 +1,10 @@ import { Body, Controller, Inject, Injectable, Post, UseInterceptors } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { UserId } from '../../decorators/index.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { CreateUserActionDs } from './application/data-sctructures/create-user-action.ds.js'; import { CreateUserActionDto } from './dto/create-user-action.dto.js'; import { ICreateUserAction } from './use-cases/use-cases-interfaces.js'; diff --git a/backend/src/entities/user-actions/user-action.module.ts b/backend/src/entities/user-actions/user-action.module.ts index 421f7ddbb..90a7ed926 100644 --- a/backend/src/entities/user-actions/user-action.module.ts +++ b/backend/src/entities/user-actions/user-action.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { LogOutEntity } from '../log-out/log-out.entity.js'; diff --git a/backend/src/entities/user-actions/utils/build-new-user-action-entity.ts b/backend/src/entities/user-actions/utils/build-new-user-action-entity.ts index a228cda67..33df61f5b 100644 --- a/backend/src/entities/user-actions/utils/build-new-user-action-entity.ts +++ b/backend/src/entities/user-actions/utils/build-new-user-action-entity.ts @@ -1,4 +1,4 @@ -import { UserActionEnum } from '../../../enums/index.js'; +import { UserActionEnum } from '../../../enums/user-action.enum.js'; import { UserEntity } from '../../user/user.entity.js'; import { CreateUserActionDs } from '../application/data-sctructures/create-user-action.ds.js'; import { UserActionEntity } from '../user-action.entity.js'; diff --git a/backend/src/entities/user-sign-in-audit/dto/index.ts b/backend/src/entities/user-sign-in-audit/dto/index.ts deleted file mode 100644 index fdb0ec7ce..000000000 --- a/backend/src/entities/user-sign-in-audit/dto/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './create-sign-in-audit-record.ds.js'; -export * from './find-sign-in-audit-logs.ds.js'; -export * from './found-sign-in-audit-logs.ds.js'; -export * from './found-sign-in-audit-record.ds.js'; diff --git a/backend/src/entities/user-sign-in-audit/enums/index.ts b/backend/src/entities/user-sign-in-audit/enums/index.ts deleted file mode 100644 index 5a6b92461..000000000 --- a/backend/src/entities/user-sign-in-audit/enums/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './sign-in-method.enum.js'; -export * from './sign-in-status.enum.js'; diff --git a/backend/src/entities/user-sign-in-audit/sign-in-audit.controller.ts b/backend/src/entities/user-sign-in-audit/sign-in-audit.controller.ts index f9eed024d..c7a0653a0 100644 --- a/backend/src/entities/user-sign-in-audit/sign-in-audit.controller.ts +++ b/backend/src/entities/user-sign-in-audit/sign-in-audit.controller.ts @@ -1,10 +1,10 @@ import { Controller, Get, Inject, Injectable, Query, UseInterceptors } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { UserId } from '../../decorators/index.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { FindSignInAuditLogsDs } from './dto/find-sign-in-audit-logs.ds.js'; import { FoundSignInAuditLogsDs } from './dto/found-sign-in-audit-logs.ds.js'; import { SignInMethodEnum } from './enums/sign-in-method.enum.js'; diff --git a/backend/src/entities/user-sign-in-audit/sign-in-audit.module.ts b/backend/src/entities/user-sign-in-audit/sign-in-audit.module.ts index 2811689c6..c09fde1ec 100644 --- a/backend/src/entities/user-sign-in-audit/sign-in-audit.module.ts +++ b/backend/src/entities/user-sign-in-audit/sign-in-audit.module.ts @@ -1,6 +1,6 @@ import { Global, MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { LogOutEntity } from '../log-out/log-out.entity.js'; diff --git a/backend/src/entities/user-sign-in-audit/use-cases/find-sign-in-audit-logs.use.case.ts b/backend/src/entities/user-sign-in-audit/use-cases/find-sign-in-audit-logs.use.case.ts index 83460ebd0..922d45b45 100644 --- a/backend/src/entities/user-sign-in-audit/use-cases/find-sign-in-audit-logs.use.case.ts +++ b/backend/src/entities/user-sign-in-audit/use-cases/find-sign-in-audit-logs.use.case.ts @@ -2,7 +2,7 @@ import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { QueryOrderingEnum } from '../../../enums/index.js'; +import { QueryOrderingEnum } from '../../../enums/query-ordering.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; import { Constants } from '../../../helpers/constants/constants.js'; import { validateStringWithEnum } from '../../../helpers/validators/validate-string-with-enum.js'; diff --git a/backend/src/entities/user-sign-in-audit/use-cases/use-cases.interface.ts b/backend/src/entities/user-sign-in-audit/use-cases/use-cases.interface.ts index 2d162767f..e727a8373 100644 --- a/backend/src/entities/user-sign-in-audit/use-cases/use-cases.interface.ts +++ b/backend/src/entities/user-sign-in-audit/use-cases/use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { FindSignInAuditLogsDs } from '../dto/find-sign-in-audit-logs.ds.js'; import { FoundSignInAuditLogsDs } from '../dto/found-sign-in-audit-logs.ds.js'; diff --git a/backend/src/entities/user/use-cases/user-use-cases.interfaces.ts b/backend/src/entities/user/use-cases/user-use-cases.interfaces.ts index 9844e4d53..2e13f7ac5 100644 --- a/backend/src/entities/user/use-cases/user-use-cases.interfaces.ts +++ b/backend/src/entities/user/use-cases/user-use-cases.interfaces.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { SuccessResponse } from '../../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { ChangeUserEmailDs } from '../application/data-structures/change-user-email.ds.js'; import { ChangeUserNameDS } from '../application/data-structures/change-user-name.ds.js'; diff --git a/backend/src/entities/user/user.controller.ts b/backend/src/entities/user/user.controller.ts index 2d8cb700d..8d7cdf631 100644 --- a/backend/src/entities/user/user.controller.ts +++ b/backend/src/entities/user/user.controller.ts @@ -19,14 +19,17 @@ import { Throttle } from '@nestjs/throttler'; import { Request, Response } from 'express'; import isEmail from 'validator/lib/isEmail.js'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { BodyEmail, GCLlId, UserId, VerificationString } from '../../decorators/index.js'; +import { BodyEmail } from '../../decorators/body-email.decorator.js'; +import { GCLlId } from '../../decorators/gclid-decorator.js'; +import { VerificationString } from '../../decorators/slug-verification.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; import { isTest } from '../../helpers/app/is-test.js'; import { Constants } from '../../helpers/constants/constants.js'; -import { slackPostMessage } from '../../helpers/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { slackPostMessage } from '../../helpers/slack/slack-post-message.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { SuccessResponse } from '../../microservices/saas-microservice/data-structures/common-responce.ds.js'; import { ChangeUserEmailDs } from './application/data-structures/change-user-email.ds.js'; import { ChangeUserNameDS } from './application/data-structures/change-user-name.ds.js'; diff --git a/backend/src/entities/user/user.interface.ts b/backend/src/entities/user/user.interface.ts index f30f1a877..ae73a3efb 100644 --- a/backend/src/entities/user/user.interface.ts +++ b/backend/src/entities/user/user.interface.ts @@ -1,4 +1,4 @@ -import { SubscriptionLevelEnum } from '../../enums/index.js'; +import { SubscriptionLevelEnum } from '../../enums/subscription-level.enum.js'; export interface IUserInfo { id: string; diff --git a/backend/src/entities/user/user.module.ts b/backend/src/entities/user/user.module.ts index 7ecde9708..804697740 100644 --- a/backend/src/entities/user/user.module.ts +++ b/backend/src/entities/user/user.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { NonScopedAuthMiddleware } from '../../authorization/non-scoped-auth.middleware.js'; import { TemporaryAuthMiddleware } from '../../authorization/temporary-auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; diff --git a/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts b/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts index 58b63aab4..e210b7c9b 100644 --- a/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts +++ b/backend/src/entities/visualizations/panel-position/use-cases/generate-panel-position-with-ai.use.case.ts @@ -3,17 +3,13 @@ import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-acce import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object.interface.js'; import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; -import { - AICoreService, - AIProviderType, - AIToolCall, - AIToolDefinition, - cleanAIJsonResponse, - createDashboardGenerationTools, - encodeError, - encodeToToon, - MessageBuilder, -} from '../../../../ai-core/index.js'; +import { AIToolCall, AIToolDefinition } from '../../../../ai-core/interfaces/ai-provider.interface.js'; +import { AIProviderType } from '../../../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../../../ai-core/services/ai-core.service.js'; +import { createDashboardGenerationTools } from '../../../../ai-core/tools/database-tools.js'; +import { cleanAIJsonResponse } from '../../../../ai-core/tools/query-validators.js'; +import { MessageBuilder } from '../../../../ai-core/utils/message-builder.js'; +import { encodeError, encodeToToon } from '../../../../ai-core/utils/toon-encoder.js'; import AbstractUseCase from '../../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../../common/data-injection.tokens.js'; @@ -77,17 +73,8 @@ export class GeneratePanelPositionWithAiUseCase } public async implementation(inputData: GeneratePanelPositionWithAiDs): Promise { - const { - connectionId, - masterPassword, - userId, - chart_description, - name, - position_x, - position_y, - width, - height, - } = inputData; + const { connectionId, masterPassword, userId, chart_description, name, position_x, position_y, width, height } = + inputData; const foundConnection = await this._dbContext.connectionRepository.findAndDecryptConnection( connectionId, @@ -445,10 +432,7 @@ CRITICAL: Respond with the SQL query ONLY — no explanations, no comments, no m const startsWithSql = sqlPrefixes.some((prefix) => upperCleaned.startsWith(prefix)); if (!startsWithSql) { - const sqlPattern = new RegExp( - `^(${sqlPrefixes.join('|')})\\b`, - 'im', - ); + const sqlPattern = new RegExp(`^(${sqlPrefixes.join('|')})\\b`, 'im'); const match = cleaned.match(sqlPattern); if (match) { const sqlStart = cleaned.indexOf(match[0]); diff --git a/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts b/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts index a6d6483fe..777b4f44e 100644 --- a/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts +++ b/backend/src/entities/visualizations/panel-position/use-cases/generate-table-dashboard-with-ai.use.case.ts @@ -3,17 +3,13 @@ import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-acce import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object.interface.js'; import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; -import { - AICoreService, - AIProviderType, - AIToolCall, - AIToolDefinition, - cleanAIJsonResponse, - createDashboardGenerationTools, - encodeError, - encodeToToon, - MessageBuilder, -} from '../../../../ai-core/index.js'; +import { AIToolCall, AIToolDefinition } from '../../../../ai-core/interfaces/ai-provider.interface.js'; +import { AIProviderType } from '../../../../ai-core/interfaces/ai-service.interface.js'; +import { AICoreService } from '../../../../ai-core/services/ai-core.service.js'; +import { createDashboardGenerationTools } from '../../../../ai-core/tools/database-tools.js'; +import { cleanAIJsonResponse } from '../../../../ai-core/tools/query-validators.js'; +import { MessageBuilder } from '../../../../ai-core/utils/message-builder.js'; +import { encodeError, encodeToToon } from '../../../../ai-core/utils/toon-encoder.js'; import AbstractUseCase from '../../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../../common/data-injection.tokens.js'; @@ -509,10 +505,7 @@ CRITICAL: Respond with the SQL query ONLY — no explanations, no comments, no m const startsWithSql = sqlPrefixes.some((prefix) => upperCleaned.startsWith(prefix)); if (!startsWithSql) { - const sqlPattern = new RegExp( - `^(${sqlPrefixes.join('|')})\\b`, - 'im', - ); + const sqlPattern = new RegExp(`^(${sqlPrefixes.join('|')})\\b`, 'im'); const match = cleaned.match(sqlPattern); if (match) { const sqlStart = cleaned.indexOf(match[0]); diff --git a/backend/src/entities/visualizations/panel/utils/check-query-is-safe.util.ts b/backend/src/entities/visualizations/panel/utils/check-query-is-safe.util.ts index fb7c9d1bf..50157dc6f 100644 --- a/backend/src/entities/visualizations/panel/utils/check-query-is-safe.util.ts +++ b/backend/src/entities/visualizations/panel/utils/check-query-is-safe.util.ts @@ -1,6 +1,6 @@ import { BadRequestException } from '@nestjs/common'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; -import { slackPostMessage } from '../../../../helpers/index.js'; +import { slackPostMessage } from '../../../../helpers/slack/slack-post-message.js'; const FORBIDDEN_SQL_KEYWORDS = [ 'INSERT', diff --git a/backend/src/entities/widget/application/data-sctructures/create-table-widgets.ds.ts b/backend/src/entities/widget/application/data-sctructures/create-table-widgets.ds.ts index c9dd88f33..6cce0e889 100644 --- a/backend/src/entities/widget/application/data-sctructures/create-table-widgets.ds.ts +++ b/backend/src/entities/widget/application/data-sctructures/create-table-widgets.ds.ts @@ -1,4 +1,4 @@ -import { WidgetTypeEnum } from '../../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../../enums/widget-type.enum.js'; export class CreateTableWidgetsDs { connectionId: string; diff --git a/backend/src/entities/widget/application/data-sctructures/found-table-widgets.ds.ts b/backend/src/entities/widget/application/data-sctructures/found-table-widgets.ds.ts index 338624936..9974fc8b4 100644 --- a/backend/src/entities/widget/application/data-sctructures/found-table-widgets.ds.ts +++ b/backend/src/entities/widget/application/data-sctructures/found-table-widgets.ds.ts @@ -1,4 +1,4 @@ -import { WidgetTypeEnum } from '../../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../../enums/widget-type.enum.js'; export class FoundTableWidgetsDs { description?: string; diff --git a/backend/src/entities/widget/dto/create-table-widget.dto.ts b/backend/src/entities/widget/dto/create-table-widget.dto.ts index f88149bec..e2ba3dab2 100644 --- a/backend/src/entities/widget/dto/create-table-widget.dto.ts +++ b/backend/src/entities/widget/dto/create-table-widget.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsArray, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator'; -import { WidgetTypeEnum } from '../../../enums/index.js'; +import { WidgetTypeEnum } from '../../../enums/widget-type.enum.js'; export class CreateTableWidgetDto { @ApiProperty() diff --git a/backend/src/entities/widget/dto/index.ts b/backend/src/entities/widget/dto/index.ts deleted file mode 100644 index 0c556e2c5..000000000 --- a/backend/src/entities/widget/dto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CreateOrUpdateTableWidgetsDto, CreateTableWidgetDto } from './create-table-widget.dto.js'; diff --git a/backend/src/entities/widget/table-widget.controller.ts b/backend/src/entities/widget/table-widget.controller.ts index e9c274b13..c834850c7 100644 --- a/backend/src/entities/widget/table-widget.controller.ts +++ b/backend/src/entities/widget/table-widget.controller.ts @@ -13,16 +13,20 @@ import { import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword, QueryTableName, SlugUuid, UserId } from '../../decorators/index.js'; +import { MasterPassword } from '../../decorators/master-password.decorator.js'; +import { QueryTableName } from '../../decorators/query-table-name.decorator.js'; +import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; import { Timeout } from '../../decorators/timeout.decorator.js'; -import { InTransactionEnum } from '../../enums/index.js'; +import { UserId } from '../../decorators/user-id.decorator.js'; +import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; import { Messages } from '../../exceptions/text/messages.js'; -import { ConnectionEditGuard, ConnectionReadGuard } from '../../guards/index.js'; -import { SentryInterceptor } from '../../interceptors/index.js'; +import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; +import { ConnectionReadGuard } from '../../guards/connection-read.guard.js'; +import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; import { CreateTableWidgetsDs } from './application/data-sctructures/create-table-widgets.ds.js'; import { FindTableWidgetsDs } from './application/data-sctructures/find-table-widgets.ds.js'; import { FoundTableWidgetsDs } from './application/data-sctructures/found-table-widgets.ds.js'; -import { CreateOrUpdateTableWidgetsDto } from './dto/index.js'; +import { CreateOrUpdateTableWidgetsDto } from './dto/create-table-widget.dto.js'; import { TableWidgetRO } from './table-widget.interface.js'; import { ICreateUpdateDeleteTableWidgets, IFindTableWidgets } from './use-cases/table-widgets-use-cases.interface.js'; diff --git a/backend/src/entities/widget/table-widget.entity.ts b/backend/src/entities/widget/table-widget.entity.ts index bce6ed1f1..7d4db82c4 100644 --- a/backend/src/entities/widget/table-widget.entity.ts +++ b/backend/src/entities/widget/table-widget.entity.ts @@ -12,7 +12,7 @@ import { Relation, UpdateDateColumn, } from 'typeorm'; -import { WidgetTypeEnum } from '../../enums/index.js'; +import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; import { TableSettingsEntity } from '../table-settings/common-table-settings/table-settings.entity.js'; @Entity('table_widget') diff --git a/backend/src/entities/widget/table-widget.interface.ts b/backend/src/entities/widget/table-widget.interface.ts index e705b297d..40f5405cd 100644 --- a/backend/src/entities/widget/table-widget.interface.ts +++ b/backend/src/entities/widget/table-widget.interface.ts @@ -1,5 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; -import { EncryptionAlgorithmEnum, WidgetTypeEnum } from '../../enums/index.js'; +import { EncryptionAlgorithmEnum } from '../../enums/encryption-algorithm.enum.js'; +import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; export class TableWidgetRO { @ApiProperty() diff --git a/backend/src/entities/widget/table-widget.module.ts b/backend/src/entities/widget/table-widget.module.ts index bc66a786e..7b52b8428 100644 --- a/backend/src/entities/widget/table-widget.module.ts +++ b/backend/src/entities/widget/table-widget.module.ts @@ -1,6 +1,6 @@ import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/index.js'; +import { AuthMiddleware } from '../../authorization/auth.middleware.js'; import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; import { LogOutEntity } from '../log-out/log-out.entity.js'; diff --git a/backend/src/entities/widget/use-cases/create-update-delete-table-widgets.use.case.ts b/backend/src/entities/widget/use-cases/create-update-delete-table-widgets.use.case.ts index ebe57afc6..a70ea3416 100644 --- a/backend/src/entities/widget/use-cases/create-update-delete-table-widgets.use.case.ts +++ b/backend/src/entities/widget/use-cases/create-update-delete-table-widgets.use.case.ts @@ -3,7 +3,7 @@ import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; -import { toPrettyErrorsMsg } from '../../../helpers/index.js'; +import { toPrettyErrorsMsg } from '../../../helpers/to-pretty-errors-msg.js'; import { TableSettingsEntity } from '../../table-settings/common-table-settings/table-settings.entity.js'; import { buildEmptyTableSettingsWithEmptyWidgets } from '../../table-settings/common-table-settings/utils/build-empty-table-settings.js'; import { buildNewTableSettingsEntity } from '../../table-settings/common-table-settings/utils/build-new-table-settings-entity.js'; diff --git a/backend/src/entities/widget/use-cases/table-widgets-use-cases.interface.ts b/backend/src/entities/widget/use-cases/table-widgets-use-cases.interface.ts index 72521a269..845bc79d6 100644 --- a/backend/src/entities/widget/use-cases/table-widgets-use-cases.interface.ts +++ b/backend/src/entities/widget/use-cases/table-widgets-use-cases.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { CreateTableWidgetsDs } from '../application/data-sctructures/create-table-widgets.ds.js'; import { FindTableWidgetsDs } from '../application/data-sctructures/find-table-widgets.ds.js'; import { FoundTableWidgetsDs } from '../application/data-sctructures/found-table-widgets.ds.js'; 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 02777ecc7..13cd045f1 100644 --- a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts +++ b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts @@ -1,8 +1,9 @@ import JSON5 from 'json5'; -import { EncryptionAlgorithmEnum, WidgetTypeEnum } from '../../../enums/index.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/index.js'; +import { getPropertyValueByDescriptor } from '../../../helpers/get-property-value-by-descriptor.js'; import { ConnectionEntity } from '../../connection/connection.entity.js'; import { ForeignKeyDSInfo } from '../../table/table-datastructures.js'; import { findTableFieldsUtil } from '../../table/utils/find-table-fields.util.js'; diff --git a/backend/src/enums/index.ts b/backend/src/enums/index.ts deleted file mode 100644 index 8c7ba978b..000000000 --- a/backend/src/enums/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { AccessLevelEnum } from './access-level.enum.js'; -export { AmplitudeEventTypeEnum } from './amplitude-event-type.enum.js'; -export { DashboardWidgetTypeEnum } from './dashboard-widget-type.enum.js'; -export { EncryptionAlgorithmEnum } from './encryption-algorithm.enum.js'; -export { FilterCriteriaEnum } from './filter-criteria.enum.js'; -export { InTransactionEnum } from './in-transaction.enum.js'; -export { LogOperationTypeEnum } from './log-operation-type.enum.js'; -export { OperationResultStatusEnum } from './operation-result-status.enum.js'; -export { QueryOrderingEnum } from './query-ordering.enum.js'; -export { SubscriptionLevelEnum } from './subscription-level.enum.js'; -export { TableActionTypeEnum } from './table-action-type.enum.js'; -export { UserActionEnum } from './user-action.enum.js'; -export { WidgetTypeEnum } from './widget-type.enum.js'; diff --git a/backend/src/exceptions/text/messages.ts b/backend/src/exceptions/text/messages.ts index 3b98a7cf8..e37a4b86e 100644 --- a/backend/src/exceptions/text/messages.ts +++ b/backend/src/exceptions/text/messages.ts @@ -1,17 +1,15 @@ import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import { UserRoleEnum } from '../../entities/user/enums/user-role.enum.js'; -import { - EncryptionAlgorithmEnum, - LogOperationTypeEnum, - QueryOrderingEnum, - TableActionTypeEnum, - UserActionEnum, - WidgetTypeEnum, -} from '../../enums/index.js'; +import { EncryptionAlgorithmEnum } from '../../enums/encryption-algorithm.enum.js'; +import { LogOperationTypeEnum } from '../../enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../enums/query-ordering.enum.js'; import { TableActionEventEnum } from '../../enums/table-action-event-enum.js'; import { TableActionMethodEnum } from '../../enums/table-action-method-enum.js'; +import { TableActionTypeEnum } from '../../enums/table-action-type.enum.js'; +import { UserActionEnum } from '../../enums/user-action.enum.js'; +import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; import { enumToString } from '../../helpers/enum-to-string.js'; -import { toPrettyErrorsMsg } from '../../helpers/index.js'; +import { toPrettyErrorsMsg } from '../../helpers/to-pretty-errors-msg.js'; export const Messages = { API_KEY_SUSPENDED: 'API key is suspended', AI_REQUESTS_NOT_ALLOWED: 'AI requests are not allowed for this connection', diff --git a/backend/src/guards/connection-edit.guard.ts b/backend/src/guards/connection-edit.guard.ts index e9a55fdd6..d0d603e7e 100644 --- a/backend/src/guards/connection-edit.guard.ts +++ b/backend/src/guards/connection-edit.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class ConnectionEditGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/connection-read.guard.ts b/backend/src/guards/connection-read.guard.ts index f19cfa2a7..0fdf08b62 100644 --- a/backend/src/guards/connection-read.guard.ts +++ b/backend/src/guards/connection-read.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class ConnectionReadGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/dashboard-create.guard.ts b/backend/src/guards/dashboard-create.guard.ts index 99164484c..757e886bf 100644 --- a/backend/src/guards/dashboard-create.guard.ts +++ b/backend/src/guards/dashboard-create.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class DashboardCreateGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/dashboard-edit.guard.ts b/backend/src/guards/dashboard-edit.guard.ts index 19de8df02..045e87431 100644 --- a/backend/src/guards/dashboard-edit.guard.ts +++ b/backend/src/guards/dashboard-edit.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class DashboardEditGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/dashboard-read.guard.ts b/backend/src/guards/dashboard-read.guard.ts index a11af4df9..7afe33f3a 100644 --- a/backend/src/guards/dashboard-read.guard.ts +++ b/backend/src/guards/dashboard-read.guard.ts @@ -7,7 +7,7 @@ import { Injectable, } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { IGlobalDatabaseContext } from '../common/application/global-database-context.interface.js'; import { BaseType } from '../common/data-injection.tokens.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; diff --git a/backend/src/guards/group-edit.guard.ts b/backend/src/guards/group-edit.guard.ts index b66e549d5..3a3d93219 100644 --- a/backend/src/guards/group-edit.guard.ts +++ b/backend/src/guards/group-edit.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -14,9 +8,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class GroupEditGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/group-read.guard.ts b/backend/src/guards/group-read.guard.ts index a7dc2c6aa..1868b148b 100644 --- a/backend/src/guards/group-read.guard.ts +++ b/backend/src/guards/group-read.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -14,9 +8,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class GroupReadGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/index.ts b/backend/src/guards/index.ts deleted file mode 100644 index f83450d0a..000000000 --- a/backend/src/guards/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { ConnectionEditGuard } from './connection-edit.guard.js'; -export { ConnectionReadGuard } from './connection-read.guard.js'; -export { DashboardCreateGuard } from './dashboard-create.guard.js'; -export { DashboardEditGuard } from './dashboard-edit.guard.js'; -export { DashboardReadGuard } from './dashboard-read.guard.js'; -export { GroupEditGuard } from './group-edit.guard.js'; -export { GroupReadGuard } from './group-read.guard.js'; -export { SchemaChangeBatchOwnershipGuard } from './schema-change-batch-ownership.guard.js'; -export { SchemaChangeOwnershipGuard } from './schema-change-ownership.guard.js'; -export { TableAddGuard } from './table-add.guard.js'; -export { TableDeleteGuard } from './table-delete.guard.js'; -export { TableEditGuard } from './table-edit.guard.js'; -export { TableReadGuard } from './table-read.guard.js'; diff --git a/backend/src/guards/panel-edit.guard.ts b/backend/src/guards/panel-edit.guard.ts index 12fd43e53..bd6adc8ed 100644 --- a/backend/src/guards/panel-edit.guard.ts +++ b/backend/src/guards/panel-edit.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class PanelEditGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/panel-read.guard.ts b/backend/src/guards/panel-read.guard.ts index 5686b1a32..a7d37c262 100644 --- a/backend/src/guards/panel-read.guard.ts +++ b/backend/src/guards/panel-read.guard.ts @@ -7,7 +7,7 @@ import { Injectable, } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { IGlobalDatabaseContext } from '../common/application/global-database-context.interface.js'; import { BaseType } from '../common/data-injection.tokens.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; diff --git a/backend/src/guards/schema-change-batch-ownership.guard.ts b/backend/src/guards/schema-change-batch-ownership.guard.ts index 967a51353..be9ddd5d4 100644 --- a/backend/src/guards/schema-change-batch-ownership.guard.ts +++ b/backend/src/guards/schema-change-batch-ownership.guard.ts @@ -8,7 +8,7 @@ import { } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { TableSchemaChangeEntity } from '../entities/table-schema/table-schema-change.entity.js'; diff --git a/backend/src/guards/schema-change-ownership.guard.ts b/backend/src/guards/schema-change-ownership.guard.ts index 8a22f8b06..f4e9e3712 100644 --- a/backend/src/guards/schema-change-ownership.guard.ts +++ b/backend/src/guards/schema-change-ownership.guard.ts @@ -8,7 +8,7 @@ import { } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { TableSchemaChangeEntity } from '../entities/table-schema/table-schema-change.entity.js'; diff --git a/backend/src/guards/table-add.guard.ts b/backend/src/guards/table-add.guard.ts index 900c4262b..bdf10d568 100644 --- a/backend/src/guards/table-add.guard.ts +++ b/backend/src/guards/table-add.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class TableAddGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/table-delete.guard.ts b/backend/src/guards/table-delete.guard.ts index 30e47738e..acd33b45a 100644 --- a/backend/src/guards/table-delete.guard.ts +++ b/backend/src/guards/table-delete.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class TableDeleteGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/table-edit.guard.ts b/backend/src/guards/table-edit.guard.ts index 17ec08875..412fc917b 100644 --- a/backend/src/guards/table-edit.guard.ts +++ b/backend/src/guards/table-edit.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class TableEditGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/guards/table-read.guard.ts b/backend/src/guards/table-read.guard.ts index 1a72e0e31..5a68ae258 100644 --- a/backend/src/guards/table-read.guard.ts +++ b/backend/src/guards/table-read.guard.ts @@ -1,12 +1,6 @@ -import { - BadRequestException, - CanActivate, - ExecutionContext, - ForbiddenException, - Injectable, -} from '@nestjs/common'; +import { BadRequestException, CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { IRequestWithCognitoInfo } from '../authorization/index.js'; +import { IRequestWithCognitoInfo } from '../authorization/cognito-decoded.interface.js'; import { CedarAction } from '../entities/cedar-authorization/cedar-action-map.js'; import { CedarAuthorizationService } from '../entities/cedar-authorization/cedar-authorization.service.js'; import { Messages } from '../exceptions/text/messages.js'; @@ -15,9 +9,7 @@ import { validateUuidByRegex } from './utils/validate-uuid-by-regex.js'; @Injectable() export class TableReadGuard implements CanActivate { - constructor( - private readonly cedarAuthService: CedarAuthorizationService, - ) {} + constructor(private readonly cedarAuthService: CedarAuthorizationService) {} canActivate(context: ExecutionContext): boolean | Promise | Observable { return new Promise(async (resolve, reject) => { diff --git a/backend/src/helpers/constants/constants.ts b/backend/src/helpers/constants/constants.ts index 993201a0f..4f290689e 100644 --- a/backend/src/helpers/constants/constants.ts +++ b/backend/src/helpers/constants/constants.ts @@ -275,9 +275,6 @@ export const Constants = { case type.toLowerCase().includes('mongo'): connection = parseTestMongoDBConnectionString(connection_string) as CreateConnectionDto; break; - // case type.toLowerCase().includes('ibmdb2'): - // connection = parseTestIbmDB2ConnectionString(connection_string) as CreateConnectionDto; - // break; case type.toLowerCase().includes('dynamodb'): connection = parseTestDynamoDBConnectionString(connection_string) as CreateConnectionDto; break; diff --git a/backend/src/helpers/encryption/encryptor.ts b/backend/src/helpers/encryption/encryptor.ts index 8224d19ba..03d3341e7 100644 --- a/backend/src/helpers/encryption/encryptor.ts +++ b/backend/src/helpers/encryption/encryptor.ts @@ -4,7 +4,7 @@ import bcrypt from 'bcrypt'; import crypto, { createHmac, randomBytes, scrypt } from 'crypto'; import CryptoJS from 'crypto-js'; import { ConnectionEntity } from '../../entities/connection/connection.entity.js'; -import { EncryptionAlgorithmEnum } from '../../enums/index.js'; +import { EncryptionAlgorithmEnum } from '../../enums/encryption-algorithm.enum.js'; import { Constants } from '../constants/constants.js'; const ENCRYPTION_VERSION_PREFIX = '$v2:k1$'; diff --git a/backend/src/helpers/index.ts b/backend/src/helpers/index.ts deleted file mode 100644 index bfc9e4c1d..000000000 --- a/backend/src/helpers/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { binaryToHex, isBinary } from './binary-to-hex.js'; -export { checkFieldAutoincrement } from './check-field-autoincrement.js'; -export { compareArrayElements } from './compare-array-elements.js'; -export { getPropertyValueByDescriptor } from './get-property-value-by-descriptor.js'; -export { getUniqArrayStrings } from './get-uniq-array-strings.js'; -export { isConnectionEntityAgent, isConnectionTypeAgent } from './is-connection-entity-agent.js'; -export { isObjectEmpty } from './is-object-empty.js'; -export { getValuesBetweenCurlies, replaceTextInCurlies } from './operate-values-between-curlies.js'; -export { slackPostMessage } from './slack/slack-post-message.js'; -export { toPrettyErrorsMsg } from './to-pretty-errors-msg.js'; diff --git a/backend/src/helpers/parsers/string-connection-to-database-parsers.ts b/backend/src/helpers/parsers/string-connection-to-database-parsers.ts index 54a56f8e8..decf84a6c 100644 --- a/backend/src/helpers/parsers/string-connection-to-database-parsers.ts +++ b/backend/src/helpers/parsers/string-connection-to-database-parsers.ts @@ -121,30 +121,6 @@ export const parseTestMongoDBConnectionString = (connectionString: string): Part return config; }; -// db2://user:password@localhost:50000/mydatabase?schema=myschema&ssh=true&privateSSHKey=key&sshHost=sshHost&sshPort=22&sshUsername=sshUser&ssl=true&cert=cert -export const parseTestIbmDB2ConnectionString = (connectionString: string): Partial => { - const url = new URL(connectionString); - const config: Partial = {}; - config.host = url.hostname || null; - config.port = parseInt(url.port, 10) || 50000; - config.username = url.username || null; - config.password = url.password || null; - config.database = url.pathname.split('/')[1] || null; - const params = new URLSearchParams(url.search); - config.schema = params.get('schema') || undefined; - config.type = ConnectionTypesEnum.ibmdb2; - config.title = 'IBM DB2'; - config.isTestConnection = true; - config.ssh = params.get('ssh') === 'true'; - config.privateSSHKey = params.get('privateSSHKey') || undefined; - config.sshHost = params.get('sshHost') || undefined; - config.sshPort = parseInt(params.get('sshPort'), 10) || undefined; - config.sshUsername = params.get('sshUsername') || undefined; - config.ssl = params.get('ssl') === 'true'; - config.cert = params.get('cert') || undefined; - return config; -}; - // dynamodb://accessKeyId:secretAccessKey@localhost:8000/ export const parseTestDynamoDBConnectionString = (connectionString: string): Partial => { const modifiedConnectionString = connectionString.replace('dynamodb://', ''); diff --git a/backend/src/interceptors/index.ts b/backend/src/interceptors/index.ts deleted file mode 100644 index 162920a34..000000000 --- a/backend/src/interceptors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SentryInterceptor } from './sentry.interceptor.js'; -export { TimeoutInterceptor } from './timeout.interceptor.js'; diff --git a/backend/src/microservices/saas-microservice/use-cases/create-connection-for-hosted-db.use.case.ts b/backend/src/microservices/saas-microservice/use-cases/create-connection-for-hosted-db.use.case.ts index 0f9c7a462..f5c3f33f6 100644 --- a/backend/src/microservices/saas-microservice/use-cases/create-connection-for-hosted-db.use.case.ts +++ b/backend/src/microservices/saas-microservice/use-cases/create-connection-for-hosted-db.use.case.ts @@ -7,9 +7,9 @@ import { BaseType } from '../../../common/data-injection.tokens.js'; import { generateCedarPolicyForGroup } from '../../../entities/cedar-authorization/cedar-policy-generator.js'; import { ConnectionEntity } from '../../../entities/connection/connection.entity.js'; import { readSslCertificate } from '../../../entities/connection/ssl-certificate/read-certificate.js'; -import { AccessLevelEnum } from '../../../enums/index.js'; +import { AccessLevelEnum } from '../../../enums/access-level.enum.js'; import { Messages } from '../../../exceptions/text/messages.js'; -import { slackPostMessage } from '../../../helpers/index.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; import { CreatedConnectionResponse } from '../data-structures/common-responce.ds.js'; import { CreateConnectionForHostedDbDto } from '../data-structures/create-connecttion-for-selfhosted-db.dto.js'; import { ICreateConnectionForHostedDb } from './saas-use-cases.interface.js'; diff --git a/backend/src/microservices/saas-microservice/use-cases/suspend-users-over-limit.use.case.ts b/backend/src/microservices/saas-microservice/use-cases/suspend-users-over-limit.use.case.ts index 7d597cb0b..521ccb0d0 100644 --- a/backend/src/microservices/saas-microservice/use-cases/suspend-users-over-limit.use.case.ts +++ b/backend/src/microservices/saas-microservice/use-cases/suspend-users-over-limit.use.case.ts @@ -3,7 +3,7 @@ import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; import { Constants } from '../../../helpers/constants/constants.js'; -import { slackPostMessage } from '../../../helpers/index.js'; +import { slackPostMessage } from '../../../helpers/slack/slack-post-message.js'; import { ISuspendUsersOverLimit } from './saas-use-cases.interface.js'; @Injectable() diff --git a/backend/src/selfhosted-operations/application/use-cases/selfhosted-use-cases.interfaces.ts b/backend/src/selfhosted-operations/application/use-cases/selfhosted-use-cases.interfaces.ts index ce96c69af..2c9ec5d11 100644 --- a/backend/src/selfhosted-operations/application/use-cases/selfhosted-use-cases.interfaces.ts +++ b/backend/src/selfhosted-operations/application/use-cases/selfhosted-use-cases.interfaces.ts @@ -1,5 +1,5 @@ import { SimpleFoundUserInfoDs } from '../../../entities/user/dto/found-user.dto.js'; -import { InTransactionEnum } from '../../../enums/index.js'; +import { InTransactionEnum } from '../../../enums/in-transaction.enum.js'; import { CreateInitialUserDs } from '../data-structures/create-initial-user.ds.js'; import { IsConfiguredRo } from '../responce-objects/is-configured.ro.js'; diff --git a/backend/src/selfhosted-operations/selfhosted-operations.controller.ts b/backend/src/selfhosted-operations/selfhosted-operations.controller.ts index fb23a1f14..08c304f5f 100644 --- a/backend/src/selfhosted-operations/selfhosted-operations.controller.ts +++ b/backend/src/selfhosted-operations/selfhosted-operations.controller.ts @@ -2,8 +2,8 @@ import { Body, Controller, Get, HttpStatus, Inject, Post, UseInterceptors } from import { ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { UseCaseType } from '../common/data-injection.tokens.js'; import { SimpleFoundUserInfoDs } from '../entities/user/dto/found-user.dto.js'; -import { InTransactionEnum } from '../enums/index.js'; -import { SentryInterceptor } from '../interceptors/index.js'; +import { InTransactionEnum } from '../enums/in-transaction.enum.js'; +import { SentryInterceptor } from '../interceptors/sentry.interceptor.js'; import { CreateInitialUserDto } from './application/dto/create-initial-admin-user.dto.js'; import { IsConfiguredRo } from './application/responce-objects/is-configured.ro.js'; import { diff --git a/backend/src/use-cases-app/use-cases-app.interface.ts b/backend/src/use-cases-app/use-cases-app.interface.ts index 7da913572..d31528270 100644 --- a/backend/src/use-cases-app/use-cases-app.interface.ts +++ b/backend/src/use-cases-app/use-cases-app.interface.ts @@ -1,4 +1,4 @@ -import { InTransactionEnum } from '../enums/index.js'; +import { InTransactionEnum } from '../enums/in-transaction.enum.js'; export interface IGetHello { execute(inputData: undefined, inTransaction: InTransactionEnum): Promise; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts index 5afb37bd4..bb94086b0 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-ai-chat-e2e.test.ts @@ -7,7 +7,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; import { DataSource } from 'typeorm'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { BaseType } from '../../../src/common/data-injection.tokens.js'; import { AiChatMessageEntity } from '../../../src/entities/ai/ai-conversation-history/ai-chat-messages/ai-chat-message.entity.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-permissions-e2e.test.ts index c19c85a30..e8c9a4896 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-permissions-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; @@ -306,9 +306,7 @@ test.serial(`${currentTest} should return found rows for admin group user via Ce try { const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -334,9 +332,7 @@ test.serial(`${currentTest} should return added row for admin group user via Ced const created_at = new Date(); const updated_at = new Date(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -366,9 +362,7 @@ test.serial(`${currentTest} should return updated row for admin group user via C const created_at = new Date(); const updated_at = new Date(); const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, - ) + .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -391,9 +385,7 @@ test.serial(`${currentTest} should return delete result for admin group user via try { const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`, - ) + .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -422,9 +414,7 @@ test.serial( t.is(findAll.status, 200); const result = findAll.body.connections; - const targetConnection = result.find( - ({ connection }: any) => connection.id === testData.connections.firstId, - ); + const targetConnection = result.find(({ connection }: any) => connection.id === testData.connections.firstId); t.is(Object.hasOwn(targetConnection, 'connection'), true); t.is(Object.hasOwn(targetConnection, 'accessLevel'), true); t.is(targetConnection.accessLevel, AccessLevelEnum.readonly); @@ -437,28 +427,25 @@ test.serial( currentTest = 'GET /connection/one/:slug'; -test.serial( - `${currentTest} should return a found connection for readonly custom group user via Cedar`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - const result = findOneResponce.body.connection; - t.is(Object.hasOwn(result, 'host'), true); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return a found connection for readonly custom group user via Cedar`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + t.is(findOneResponce.status, 200); + const result = findOneResponce.body.connection; + t.is(Object.hasOwn(result, 'host'), true); + t.is(Object.hasOwn(result, 'createdAt'), true); + t.is(Object.hasOwn(result, 'updatedAt'), true); + t.is(Object.hasOwn(result, 'password'), false); + } catch (error) { + console.error(error); + throw error; + } +}); currentTest = 'PUT /connection'; @@ -530,25 +517,22 @@ test.serial( currentTest = 'GET /connection/tables/:slug'; -test.serial( - `${currentTest} should return tables for custom group user with table visibility via Cedar`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return tables for custom group user with table visibility via Cedar`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${testData.connections.firstId}`) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + } catch (error) { + console.error(error); + throw error; + } +}); currentTest = 'GET /table/rows/:slug'; @@ -558,9 +542,7 @@ test.serial( try { const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -587,9 +569,7 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -622,9 +602,7 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`, - ) + .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -651,9 +629,7 @@ test.serial( try { const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`, - ) + .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -767,9 +743,7 @@ test.serial( try { const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -796,9 +770,7 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -828,9 +800,7 @@ test.serial( const created_at = new Date(); const updated_at = new Date(); const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`, - ) + .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -857,9 +827,7 @@ test.serial( try { const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`, - ) + .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -881,9 +849,7 @@ test.serial( try { const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); const getTableRows = await request(app.getHttpServer()) - .get( - `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -906,9 +872,7 @@ test.serial( const randomName = faker.person.firstName(); const randomEmail = faker.internet.email(); const addRowInTable = await request(app.getHttpServer()) - .post( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, - ) + .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -937,9 +901,7 @@ test.serial( const randomName = faker.person.firstName(); const randomEmail = faker.internet.email(); const updateRowInTable = await request(app.getHttpServer()) - .put( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, - ) + .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) .send({ [testData.firstTableInfo.testTableColumnName]: randomName, [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, @@ -966,9 +928,7 @@ test.serial( try { const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); const deleteRowInTable = await request(app.getHttpServer()) - .delete( - `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`, - ) + .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=19`) .set('Cookie', testData.users.simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); @@ -983,402 +943,387 @@ test.serial( currentTest = 'PUT /connection'; -test.serial( - `${currentTest} should return 200 for connection:edit user updating connection via Cedar`, - async (t) => { - try { - const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${testData.connections.firstId}`) - .send(updateConnection) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateConnectionResponse.status, 200); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return 200 for connection:edit user updating connection via Cedar`, async (t) => { + try { + const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${testData.connections.firstId}`) + .send(updateConnection) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateConnectionResponse.status, 200); + } catch (error) { + console.error(error); + throw error; + } +}); currentTest = 'GET /connection/one/:slug'; -test.serial( - `${currentTest} should return 200 for connection:edit user reading connection via Cedar`, - async (t) => { - try { - const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - const result = findOneResponce.body.connection; - t.is(Object.hasOwn(result, 'host'), true); - } catch (error) { - console.error(error); - throw error; - } - }, -); +test.serial(`${currentTest} should return 200 for connection:edit user reading connection via Cedar`, async (t) => { + try { + const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set('Content-Type', 'application/json') + .set('Cookie', testData.users.simpleUserToken) + .set('Accept', 'application/json'); + t.is(findOneResponce.status, 200); + const result = findOneResponce.body.connection; + t.is(Object.hasOwn(result, 'host'), true); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** PERMISSION UPDATE CACHE INVALIDATION ****************************** -test.serial( - 'Upgrading table permissions takes effect under Cedar (cache invalidation)', - async (t) => { - try { - const connectionsId = { firstId: null, secondId: null, firstAdminGroupId: null }; - const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.registerUserAndReturnUserInfo(app), - ); - const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), - ); - const connectionAdminUserToken = connectionAdminUserInfo.token; - const simpleUserToken = simpleUserRegisterInfo.token; - - const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - const { createTestTable } = await import('../../utils/create-test-table.js'); - const firstTable = await createTestTable(newConnection); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createConnResp = await request(app.getHttpServer()) - .post('/connection') - .set('Cookie', connectionAdminUserToken) - .send(newConnection) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - connectionsId.firstId = JSON.parse(createConnResp.text).id; +test.serial('Upgrading table permissions takes effect under Cedar (cache invalidation)', async (t) => { + try { + const connectionsId = { firstId: null, secondId: null, firstAdminGroupId: null }; + const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.registerUserAndReturnUserInfo(app), + ); + const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), + ); + const connectionAdminUserToken = connectionAdminUserInfo.token; + const simpleUserToken = simpleUserRegisterInfo.token; + + const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); + const { createTestTable } = await import('../../utils/create-test-table.js'); + const firstTable = await createTestTable(newConnection); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResp = await request(app.getHttpServer()) - .post(`/connection/group/${connectionsId.firstId}`) - .set('Cookie', connectionAdminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const groupId = JSON.parse(createGroupResp.text).id; - - // Set permissions with add=false - const permissionsNoAdd = { - connection: { connectionId: connectionsId.firstId, accessLevel: AccessLevelEnum.none }, - group: { groupId, accessLevel: AccessLevelEnum.none }, - tables: [ - { - tableName: firstTable.testTableName, - accessLevel: { visibility: true, readonly: false, add: false, delete: false, edit: false }, - }, - ], - }; - - await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connectionsId.firstId}`) - .send({ permissions: permissionsNoAdd }) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const createConnResp = await request(app.getHttpServer()) + .post('/connection') + .set('Cookie', connectionAdminUserToken) + .send(newConnection) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + connectionsId.firstId = JSON.parse(createConnResp.text).id; - // Add user to group - await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', connectionAdminUserToken) - .send({ groupId, email: simpleUserRegisterInfo.email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const createGroupResp = await request(app.getHttpServer()) + .post(`/connection/group/${connectionsId.firstId}`) + .set('Cookie', connectionAdminUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const groupId = JSON.parse(createGroupResp.text).id; + + // Set permissions with add=false + const permissionsNoAdd = { + connection: { connectionId: connectionsId.firstId, accessLevel: AccessLevelEnum.none }, + group: { groupId, accessLevel: AccessLevelEnum.none }, + tables: [ + { + tableName: firstTable.testTableName, + accessLevel: { visibility: true, readonly: false, add: false, delete: false, edit: false }, + }, + ], + }; + + await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connectionsId.firstId}`) + .send({ permissions: permissionsNoAdd }) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // Verify user gets 403 on POST row - const addRowDenied = await request(app.getHttpServer()) - .post(`/table/row/${connectionsId.firstId}?tableName=${firstTable.testTableName}`) - .send({ - [firstTable.testTableColumnName]: faker.person.firstName(), - [firstTable.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowDenied.status, 403); - - // Upgrade permissions to add=true - const permissionsWithAdd = { - connection: { connectionId: connectionsId.firstId, accessLevel: AccessLevelEnum.none }, - group: { groupId, accessLevel: AccessLevelEnum.none }, - tables: [ - { - tableName: firstTable.testTableName, - accessLevel: { visibility: true, readonly: false, add: true, delete: false, edit: false }, - }, - ], - }; - - await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connectionsId.firstId}`) - .send({ permissions: permissionsWithAdd }) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Add user to group + await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', connectionAdminUserToken) + .send({ groupId, email: simpleUserRegisterInfo.email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // Verify user now gets 201 on POST row - const addRowAllowed = await request(app.getHttpServer()) - .post(`/table/row/${connectionsId.firstId}?tableName=${firstTable.testTableName}`) - .send({ - [firstTable.testTableColumnName]: faker.person.firstName(), - [firstTable.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowAllowed.status, 201); - } catch (error) { - console.error(error); - throw error; - } - }, -); + // Verify user gets 403 on POST row + const addRowDenied = await request(app.getHttpServer()) + .post(`/table/row/${connectionsId.firstId}?tableName=${firstTable.testTableName}`) + .send({ + [firstTable.testTableColumnName]: faker.person.firstName(), + [firstTable.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowDenied.status, 403); + + // Upgrade permissions to add=true + const permissionsWithAdd = { + connection: { connectionId: connectionsId.firstId, accessLevel: AccessLevelEnum.none }, + group: { groupId, accessLevel: AccessLevelEnum.none }, + tables: [ + { + tableName: firstTable.testTableName, + accessLevel: { visibility: true, readonly: false, add: true, delete: false, edit: false }, + }, + ], + }; + + await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connectionsId.firstId}`) + .send({ permissions: permissionsWithAdd }) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); -test.serial( - 'Downgrading connection permissions takes effect under Cedar (cache invalidation)', - async (t) => { - try { - const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.registerUserAndReturnUserInfo(app), - ); - const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), - ); - const connectionAdminUserToken = connectionAdminUserInfo.token; - const simpleUserToken = simpleUserRegisterInfo.token; - - const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createConnResp = await request(app.getHttpServer()) - .post('/connection') - .set('Cookie', connectionAdminUserToken) - .send(newConnection) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const connectionId = JSON.parse(createConnResp.text).id; + // Verify user now gets 201 on POST row + const addRowAllowed = await request(app.getHttpServer()) + .post(`/table/row/${connectionsId.firstId}?tableName=${firstTable.testTableName}`) + .send({ + [firstTable.testTableColumnName]: faker.person.firstName(), + [firstTable.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowAllowed.status, 201); + } catch (error) { + console.error(error); + throw error; + } +}); - const createGroupResp = await request(app.getHttpServer()) - .post(`/connection/group/${connectionId}`) - .set('Cookie', connectionAdminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const groupId = JSON.parse(createGroupResp.text).id; - - // Set permissions with connection:edit - const permissionsEdit = { - connection: { connectionId, accessLevel: AccessLevelEnum.edit }, - group: { groupId, accessLevel: AccessLevelEnum.none }, - tables: [], - }; - - await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connectionId}`) - .send({ permissions: permissionsEdit }) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); +test.serial('Downgrading connection permissions takes effect under Cedar (cache invalidation)', async (t) => { + try { + const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.registerUserAndReturnUserInfo(app), + ); + const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), + ); + const connectionAdminUserToken = connectionAdminUserInfo.token; + const simpleUserToken = simpleUserRegisterInfo.token; + + const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); + const newGroup1 = mockFactory.generateCreateGroupDto1(); - // Add user to group - await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', connectionAdminUserToken) - .send({ groupId, email: simpleUserRegisterInfo.email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const createConnResp = await request(app.getHttpServer()) + .post('/connection') + .set('Cookie', connectionAdminUserToken) + .send(newConnection) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const connectionId = JSON.parse(createConnResp.text).id; - // Verify user can PUT connection (200) - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateAllowed = await request(app.getHttpServer()) - .put(`/connection/${connectionId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateAllowed.status, 200); - - // Downgrade to readonly - const permissionsReadonly = { - connection: { connectionId, accessLevel: AccessLevelEnum.readonly }, - group: { groupId, accessLevel: AccessLevelEnum.none }, - tables: [], - }; - - await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connectionId}`) - .send({ permissions: permissionsReadonly }) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const createGroupResp = await request(app.getHttpServer()) + .post(`/connection/group/${connectionId}`) + .set('Cookie', connectionAdminUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + const groupId = JSON.parse(createGroupResp.text).id; + + // Set permissions with connection:edit + const permissionsEdit = { + connection: { connectionId, accessLevel: AccessLevelEnum.edit }, + group: { groupId, accessLevel: AccessLevelEnum.none }, + tables: [], + }; + + await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connectionId}`) + .send({ permissions: permissionsEdit }) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // Verify user gets 403 on PUT connection - const updateDenied = await request(app.getHttpServer()) - .put(`/connection/${connectionId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateDenied.status, 403); - t.is(JSON.parse(updateDenied.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + // Add user to group + await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', connectionAdminUserToken) + .send({ groupId, email: simpleUserRegisterInfo.email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + // Verify user can PUT connection (200) + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateAllowed = await request(app.getHttpServer()) + .put(`/connection/${connectionId}`) + .send(updateConnection) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateAllowed.status, 200); + + // Downgrade to readonly + const permissionsReadonly = { + connection: { connectionId, accessLevel: AccessLevelEnum.readonly }, + group: { groupId, accessLevel: AccessLevelEnum.none }, + tables: [], + }; + + await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connectionId}`) + .send({ permissions: permissionsReadonly }) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + + // Verify user gets 403 on PUT connection + const updateDenied = await request(app.getHttpServer()) + .put(`/connection/${connectionId}`) + .send(updateConnection) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateDenied.status, 403); + t.is(JSON.parse(updateDenied.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** GROUP CREATION FLOW WITH CEDAR ****************************** -test.serial( - 'Full group creation → permission assignment flow under Cedar', - async (t) => { - try { - const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.registerUserAndReturnUserInfo(app), - ); - const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then( - (m) => m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), - ); - const connectionAdminUserToken = connectionAdminUserInfo.token; - const simpleUserToken = simpleUserRegisterInfo.token; - - const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - const { createTestTable } = await import('../../utils/create-test-table.js'); - const firstTable = await createTestTable(newConnection); - - // 1. Create connection (admin group gets wildcard Cedar policy) - const createConnResp = await request(app.getHttpServer()) - .post('/connection') - .set('Cookie', connectionAdminUserToken) - .send(newConnection) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createConnResp.status, 201); - const connectionId = JSON.parse(createConnResp.text).id; - - // 2. Admin creates new group - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResp = await request(app.getHttpServer()) - .post(`/connection/group/${connectionId}`) - .set('Cookie', connectionAdminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createGroupResp.status, 201); - const groupId = JSON.parse(createGroupResp.text).id; +test.serial('Full group creation → permission assignment flow under Cedar', async (t) => { + try { + const connectionAdminUserInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.registerUserAndReturnUserInfo(app), + ); + const simpleUserRegisterInfo = await import('../../utils/register-user-and-return-user-info.js').then((m) => + m.inviteUserInCompanyAndAcceptInvitation(connectionAdminUserInfo.token, undefined, app, undefined), + ); + const connectionAdminUserToken = connectionAdminUserInfo.token; + const simpleUserToken = simpleUserRegisterInfo.token; + + const newConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); + const { createTestTable } = await import('../../utils/create-test-table.js'); + const firstTable = await createTestTable(newConnection); + + // 1. Create connection (admin group gets wildcard Cedar policy) + const createConnResp = await request(app.getHttpServer()) + .post('/connection') + .set('Cookie', connectionAdminUserToken) + .send(newConnection) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createConnResp.status, 201); + const connectionId = JSON.parse(createConnResp.text).id; - // 3. Verify admin can still access everything (new group's empty policy doesn't break combined set) - const adminGetRows = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(adminGetRows.status, 200); + // 2. Admin creates new group + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResp = await request(app.getHttpServer()) + .post(`/connection/group/${connectionId}`) + .set('Cookie', connectionAdminUserToken) + .send(newGroup1) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createGroupResp.status, 201); + const groupId = JSON.parse(createGroupResp.text).id; - // 4. Add user to new group (no permissions set yet) - await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', connectionAdminUserToken) - .send({ groupId, email: simpleUserRegisterInfo.email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // 3. Verify admin can still access everything (new group's empty policy doesn't break combined set) + const adminGetRows = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(adminGetRows.status, 200); - // 5. Verify user gets 403 on all operations (no permissions) - const userGetRows = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userGetRows.status, 403); + // 4. Add user to new group (no permissions set yet) + await request(app.getHttpServer()) + .put('/group/user') + .set('Cookie', connectionAdminUserToken) + .send({ groupId, email: simpleUserRegisterInfo.email }) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const userAddRow = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${firstTable.testTableName}`) - .send({ - [firstTable.testTableColumnName]: faker.person.firstName(), - [firstTable.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userAddRow.status, 403); + // 5. Verify user gets 403 on all operations (no permissions) + const userGetRows = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userGetRows.status, 403); - const userUpdateConn = await request(app.getHttpServer()) - .put(`/connection/${connectionId}`) - .send(mockFactory.generateUpdateConnectionDto()) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userUpdateConn.status, 403); - - // 6. Set permissions on the group - const permissions = { - connection: { connectionId, accessLevel: AccessLevelEnum.readonly }, - group: { groupId, accessLevel: AccessLevelEnum.none }, - tables: [ - { - tableName: firstTable.testTableName, - accessLevel: { visibility: true, readonly: false, add: true, delete: false, edit: false }, - }, - ], - }; - - await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connectionId}`) - .send({ permissions }) - .set('Cookie', connectionAdminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const userAddRow = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${firstTable.testTableName}`) + .send({ + [firstTable.testTableColumnName]: faker.person.firstName(), + [firstTable.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userAddRow.status, 403); - // 7. Verify user can now access resources per the new permissions - const userGetRowsAfter = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userGetRowsAfter.status, 200); + const userUpdateConn = await request(app.getHttpServer()) + .put(`/connection/${connectionId}`) + .send(mockFactory.generateUpdateConnectionDto()) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userUpdateConn.status, 403); + + // 6. Set permissions on the group + const permissions = { + connection: { connectionId, accessLevel: AccessLevelEnum.readonly }, + group: { groupId, accessLevel: AccessLevelEnum.none }, + tables: [ + { + tableName: firstTable.testTableName, + accessLevel: { visibility: true, readonly: false, add: true, delete: false, edit: false }, + }, + ], + }; + + await request(app.getHttpServer()) + .put(`/permissions/${groupId}?connectionId=${connectionId}`) + .send({ permissions }) + .set('Cookie', connectionAdminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const userAddRowAfter = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${firstTable.testTableName}`) - .send({ - [firstTable.testTableColumnName]: faker.person.firstName(), - [firstTable.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userAddRowAfter.status, 201); + // 7. Verify user can now access resources per the new permissions + const userGetRowsAfter = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${firstTable.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userGetRowsAfter.status, 200); - // connection:readonly means read works but edit fails - const userGetConn = await request(app.getHttpServer()) - .get(`/connection/one/${connectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userGetConn.status, 200); + const userAddRowAfter = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${firstTable.testTableName}`) + .send({ + [firstTable.testTableColumnName]: faker.person.firstName(), + [firstTable.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userAddRowAfter.status, 201); - const userUpdateConnAfter = await request(app.getHttpServer()) - .put(`/connection/${connectionId}`) - .send(mockFactory.generateUpdateConnectionDto()) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(userUpdateConnAfter.status, 403); - } catch (error) { - console.error(error); - throw error; - } - }, -); + // connection:readonly means read works but edit fails + const userGetConn = await request(app.getHttpServer()) + .get(`/connection/one/${connectionId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userGetConn.status, 200); + + const userUpdateConnAfter = await request(app.getHttpServer()) + .put(`/connection/${connectionId}`) + .send(mockFactory.generateUpdateConnectionDto()) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(userUpdateConnAfter.status, 403); + } catch (error) { + console.error(error); + throw error; + } +}); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-generator.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-generator.test.ts index 6e1a1dd8c..1a01f4fe0 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-generator.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-generator.test.ts @@ -1,7 +1,7 @@ import test from 'ava'; import { generateCedarPolicyForGroup } from '../../../src/entities/cedar-authorization/cedar-policy-generator.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; import { IComplexPermission } from '../../../src/entities/permission/permission.interface.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; const groupId = 'test-group-id'; const connectionId = 'test-connection-id'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-parser.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-parser.test.ts index 93a7e902c..3aa0ffff9 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-parser.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-parser.test.ts @@ -1,6 +1,6 @@ import test from 'ava'; import { parseCedarPolicyToClassicalPermissions } from '../../../src/entities/cedar-authorization/cedar-policy-parser.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; const groupId = 'test-group-id'; const connectionId = 'test-connection-id'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-save-policy-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-save-policy-e2e.test.ts index 38c4b4dbc..9e8b9bfa1 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-cedar-save-policy-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-cedar-save-policy-e2e.test.ts @@ -7,7 +7,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; @@ -192,116 +192,107 @@ test.serial( }, ); -test.serial( - `${currentTest} should enforce saved cedar policy - user without table:add cannot add rows`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - const testTableColumnName = testData.firstTableInfo.testTableColumnName; - - // Save cedar policy with only connection:read + table:read (no table:add) - const cedarPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); - - const savePolicyResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); +test.serial(`${currentTest} should enforce saved cedar policy - user without table:add cannot add rows`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + const testTableColumnName = testData.firstTableInfo.testTableColumnName; - t.is(savePolicyResponse.status, 201); + // Save cedar policy with only connection:read + table:read (no table:add) + const cedarPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); - // Verify user cannot add rows (no table:add permission) - const addRowResponse = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${tableName}`) - .send({ [testTableColumnName]: 'test_value' }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const savePolicyResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(addRowResponse.status, 403); - t.is(JSON.parse(addRowResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(savePolicyResponse.status, 201); -test.serial( - `${currentTest} should enforce saved cedar policy - user with table:add can add rows`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - const testTableColumnName = testData.firstTableInfo.testTableColumnName; + // Verify user cannot add rows (no table:add permission) + const addRowResponse = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${tableName}`) + .send({ [testTableColumnName]: 'test_value' }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - // Save cedar policy with connection:read + table:read + table:add - const cedarPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); + t.is(addRowResponse.status, 403); + t.is(JSON.parse(addRowResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); - const savePolicyResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); +test.serial(`${currentTest} should enforce saved cedar policy - user with table:add can add rows`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + const testTableColumnName = testData.firstTableInfo.testTableColumnName; + + // Save cedar policy with connection:read + table:read + table:add + const cedarPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); + + const savePolicyResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(savePolicyResponse.status, 201); + t.is(savePolicyResponse.status, 201); - // Verify user can add rows - const addRowResponse = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${tableName}`) - .send({ [testTableColumnName]: 'cedar_test_value' }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Verify user can add rows + const addRowResponse = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${tableName}`) + .send({ [testTableColumnName]: 'cedar_test_value' }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(addRowResponse.status, 201); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(addRowResponse.status, 201); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should reject request when user does not have connection edit access`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject request when user does not have connection edit access`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; - // Simple user does not have connection edit access - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Simple user does not have connection edit access + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial(`${currentTest} should reject empty cedar policy string`, async (t) => { try { @@ -343,58 +334,52 @@ test.serial(`${currentTest} should reject request without groupId`, async (t) => } }); -test.serial( - `${currentTest} should reject saving cedar policy on admin (isMain) group`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const connectionId = testData.connections.firstId; - const adminGroupId = testData.groups.firstAdminGroupId; +test.serial(`${currentTest} should reject saving cedar policy on admin (isMain) group`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const connectionId = testData.connections.firstId; + const adminGroupId = testData.groups.firstAdminGroupId; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId: adminGroupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId: adminGroupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.CANNOT_CHANGE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.CANNOT_CHANGE_ADMIN_GROUP); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should reject saving cedar policy when group does not belong to connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject saving cedar policy when group does not belong to connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; - // Group belongs to first connection, but we're sending to second connection - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${secondConnectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Group belongs to first connection, but we're sending to second connection + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${secondConnectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.GROUP_NOT_FROM_THIS_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.GROUP_NOT_FROM_THIS_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should save cedar policy with dashboard permissions and return correct classical permissions`, @@ -435,90 +420,84 @@ test.serial( }, ); -test.serial( - `${currentTest} should overwrite previous permissions when saving new cedar policy`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - - // First: save policy with full table access - const fullPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"connection:edit",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:edit",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:delete",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); - - const firstResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy: fullPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); +test.serial(`${currentTest} should overwrite previous permissions when saving new cedar policy`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + + // First: save policy with full table access + const fullPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"connection:edit",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:edit",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:delete",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); + + const firstResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy: fullPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(firstResponse.status, 201); - t.is(firstResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.edit); - t.is(firstResponse.body.classicalPermissions.tables[0].accessLevel.add, true); + t.is(firstResponse.status, 201); + t.is(firstResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.edit); + t.is(firstResponse.body.classicalPermissions.tables[0].accessLevel.add, true); - // Second: save policy with only read access (overwrite) - const readOnlyPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); + // Second: save policy with only read access (overwrite) + const readOnlyPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); - const secondResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy: readOnlyPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const secondResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy: readOnlyPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(secondResponse.status, 201); - t.is(secondResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.readonly); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.add, false); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.edit, false); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.delete, false); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(secondResponse.status, 201); + t.is(secondResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.readonly); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.add, false); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.edit, false); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.delete, false); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** CEDAR POLICY REFERENCE VALIDATION TESTS ****************************** -test.serial( - `${currentTest} should reject cedar policy that references a foreign connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject cedar policy that references a foreign connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; - // Policy references secondConnectionId as the resource - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; + // Policy references secondConnectionId as the resource + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should reject cedar policy that references a group from another connection as resource`, @@ -551,34 +530,31 @@ test.serial( }, ); -test.serial( - `${currentTest} should reject cedar policy that references a table from another connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const connectionId = testData.connections.firstId; - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; +test.serial(`${currentTest} should reject cedar policy that references a table from another connection`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const connectionId = testData.connections.firstId; + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; - // Policy references a table prefixed with the second connection ID - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${secondConnectionId}/${tableName}"\n);`; + // Policy references a table prefixed with the second connection ID + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${secondConnectionId}/${tableName}"\n);`; - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should reject cedar policy that references a dashboard from another connection`, diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts index 6582f45c7..087e4b198 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-connection-e2e.test.ts @@ -7,7 +7,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts index 15713e2ea..3557beec2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-custom-field-e2e.test.ts @@ -14,7 +14,7 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { Messages } from '../../../src/exceptions/text/messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { Encryptor } from '../../../src/helpers/encryption/encryptor.js'; -import { replaceTextInCurlies } from '../../../src/helpers/index.js'; +import { replaceTextInCurlies } from '../../../src/helpers/operate-values-between-curlies.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-ai-generate-table-dashboard-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-ai-generate-table-dashboard-e2e.test.ts index a7ce2086d..bffb6b486 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-ai-generate-table-dashboard-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-dashboard-ai-generate-table-dashboard-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; @@ -45,7 +45,7 @@ const MOCK_DASHBOARD_RESPONSE = JSON.stringify({ { name: 'Records by Name', description: 'Distribution of records by name', - query_text: "SELECT name as label, COUNT(*) as count FROM test_table GROUP BY name", + query_text: 'SELECT name as label, COUNT(*) as count FROM test_table GROUP BY name', panel_type: 'chart', chart_type: 'bar', panel_options: { @@ -200,7 +200,7 @@ test.serial(`${currentTest} should generate and persist a table dashboard with A .set('Accept', 'application/json'); const generateDashboardRO = JSON.parse(generateDashboard.text); - console.log('🚀 ~ generateDashboardRO:', generateDashboardRO) + console.log('🚀 ~ generateDashboardRO:', generateDashboardRO); t.is(generateDashboard.status, 201); t.deepEqual(generateDashboardRO, { success: true }); @@ -280,7 +280,7 @@ test.serial(`${currentTest} should use custom dashboard name when provided`, asy .set('masterpwd', 'ahalaimahalai') .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - console.log('🚀 ~ generateDashboard:', generateDashboard.text) + console.log('🚀 ~ generateDashboard:', generateDashboard.text); t.is(generateDashboard.status, 201); t.deepEqual(JSON.parse(generateDashboard.text), { success: true }); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts index fe34ebff4..510821057 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-group-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-many-connections-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-many-connections-e2e.test.ts index 60cae4b2c..8fc93af47 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-many-connections-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-many-connections-e2e.test.ts @@ -11,7 +11,7 @@ import { BaseType } from '../../../src/common/data-injection.tokens.js'; import { generateCedarPolicyForGroup } from '../../../src/entities/cedar-authorization/cedar-policy-generator.js'; import { ConnectionEntity } from '../../../src/entities/connection/connection.entity.js'; import { GroupEntity } from '../../../src/entities/group/group.entity.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts index 5d27b4c35..f44e060c7 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-permissions-e2e.test.ts @@ -11,7 +11,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts index abcd04052..3227cda57 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-cassandra.e2e.test.ts @@ -15,7 +15,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts index 1472003cc..3d47d9ee2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-ibmdb2-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts index 6591cf176..bb89d3bef 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mongodb-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts index 52ae68bc3..0c4d0f7b6 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts index ecce43a71..835ebc613 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mssql-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts index 89bd75ebb..bff98b9c2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-mysql-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts index 44f2450d2..bf4bd7387 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts index cea0f432b..70268325c 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-oracledb-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts index 2b8f489d0..a6adf83aa 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-encrypted-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts index cc9f9ba02..971f657cf 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-postgres-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts index a522fef6d..82dd2b9f7 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-redis-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-cassandra-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-cassandra-e2e.test.ts index 215307b62..0143d0420 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-cassandra-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-cassandra-e2e.test.ts @@ -7,7 +7,7 @@ import * as cassandra from 'cassandra-driver'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-clickhouse-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-clickhouse-e2e.test.ts index b74f1065c..3ed34c0f9 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-clickhouse-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-clickhouse-e2e.test.ts @@ -7,7 +7,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-dynamodb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-dynamodb-e2e.test.ts index d968fb7fb..1b1738881 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-dynamodb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-dynamodb-e2e.test.ts @@ -15,7 +15,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-elasticsearch-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-elasticsearch-e2e.test.ts index 435b38bad..bf4e5b672 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-elasticsearch-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-elasticsearch-e2e.test.ts @@ -7,7 +7,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-ibmdb2-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-ibmdb2-e2e.test.ts index 3b85c1aa0..55d5a9cbd 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-ibmdb2-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-ibmdb2-e2e.test.ts @@ -7,7 +7,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import ibmdb from 'ibm_db'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mongodb-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mongodb-e2e.test.ts index 64ec987f5..bca7a1505 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mongodb-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mongodb-e2e.test.ts @@ -7,7 +7,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import { MongoClient } from 'mongodb'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mssql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mssql-e2e.test.ts index 938ad7c59..de6db17ed 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mssql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mssql-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mysql-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mysql-e2e.test.ts index c386e7577..9c45ed16a 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mysql-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-mysql-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-oracle-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-oracle-e2e.test.ts index c51e476c7..c516b2b1c 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-oracle-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-oracle-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-postgres-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-postgres-e2e.test.ts index c8cce4372..efacfa08a 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-postgres-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-postgres-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-redis-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-redis-e2e.test.ts index 8ec63df00..a4a069ff8 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-redis-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-schema-redis-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts index 65eb1c636..90faf5de0 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-settings-e2e.test.ts @@ -8,7 +8,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts index bec751ce1..eb5653a8c 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts index bcf818c52..84feb0d30 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; @@ -687,65 +688,68 @@ test.serial(`${currentTest} should return permissions object for current group i } }); -test.serial(`${currentTest} should return permissions object for current group in current connection for current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set('Cookie', adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); - t.is(response.status, 200); - const result = JSON.parse(response.text); - console.log('🚀 ~ result:', result); + const groupId = getGroupsRO[0].group.id; - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); + const response = await request(app.getHttpServer()) + .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === secondTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, false); - t.is(tables[foundTableIndex].accessLevel.readonly, false); - t.is(tables[foundTableIndex].accessLevel.add, false); - t.is(tables[foundTableIndex].accessLevel.delete, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - } catch (e) { - console.error(e); - throw e; - } -}); + t.is(response.status, 200); + const result = JSON.parse(response.text); + console.log('🚀 ~ result:', result); + + t.is(Object.hasOwn(result, 'connection'), true); + t.is(Object.hasOwn(result, 'group'), true); + t.is(Object.hasOwn(result, 'tables'), true); + t.is(typeof result.connection, 'object'); + t.is(typeof result.group, 'object'); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, 'object'); + + const { tables } = result; + const foundTableIndex = tables.findIndex((table) => table.tableName === secondTableInfo.testTableName); + t.is(tables.length > 0, true); + t.is(typeof tables[0], 'object'); + t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); + t.is(tables[foundTableIndex].accessLevel.visibility, false); + t.is(tables[foundTableIndex].accessLevel.readonly, false); + t.is(tables[foundTableIndex].accessLevel.add, false); + t.is(tables[foundTableIndex].accessLevel.delete, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** GROUP CONTROLLER ******************************// diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts index 379ede015..03d52455d 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts index d273221a4..2424486c2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/ai-chat-e2e.test.ts b/backend/test/ava-tests/saas-tests/ai-chat-e2e.test.ts index dee66722b..cc299408c 100644 --- a/backend/test/ava-tests/saas-tests/ai-chat-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/ai-chat-e2e.test.ts @@ -7,7 +7,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; import { DataSource } from 'typeorm'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { BaseType } from '../../../src/common/data-injection.tokens.js'; import { AiChatMessageEntity } from '../../../src/entities/ai/ai-conversation-history/ai-chat-messages/ai-chat-message.entity.js'; diff --git a/backend/test/ava-tests/saas-tests/connection-e2e.test.ts b/backend/test/ava-tests/saas-tests/connection-e2e.test.ts index 9a90514bb..3fd9a756a 100644 --- a/backend/test/ava-tests/saas-tests/connection-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/connection-e2e.test.ts @@ -8,7 +8,7 @@ import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; diff --git a/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts b/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts index c235ad1ac..10d7275ae 100644 --- a/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/custom-field-e2e.test.ts @@ -13,7 +13,7 @@ import { ValidationException } from '../../../src/exceptions/custom-exceptions/v import { Messages } from '../../../src/exceptions/text/messages.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { Encryptor } from '../../../src/helpers/encryption/encryptor.js'; -import { replaceTextInCurlies } from '../../../src/helpers/index.js'; +import { replaceTextInCurlies } from '../../../src/helpers/operate-values-between-curlies.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; import { DatabaseService } from '../../../src/shared/database/database.service.js'; import { MockFactory } from '../../mock.factory.js'; diff --git a/backend/test/ava-tests/saas-tests/dashboard-ai-generate-table-dashboard-e2e.test.ts b/backend/test/ava-tests/saas-tests/dashboard-ai-generate-table-dashboard-e2e.test.ts index da0b15bc1..d04144c36 100644 --- a/backend/test/ava-tests/saas-tests/dashboard-ai-generate-table-dashboard-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/dashboard-ai-generate-table-dashboard-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; @@ -41,7 +41,7 @@ const MOCK_DASHBOARD_RESPONSE = JSON.stringify({ { name: 'Records by Name', description: 'Distribution of records by name', - query_text: "SELECT name as label, COUNT(*) as count FROM test_table GROUP BY name", + query_text: 'SELECT name as label, COUNT(*) as count FROM test_table GROUP BY name', panel_type: 'chart', chart_type: 'bar', panel_options: { @@ -71,9 +71,7 @@ const MOCK_DASHBOARD_RESPONSE_UNSAFE = JSON.stringify({ ], }); -const MOCK_TABLES_LIST = [ - { tableName: 'test_table', isView: false }, -]; +const MOCK_TABLES_LIST = [{ tableName: 'test_table', isView: false }]; const MOCK_TABLE_STRUCTURE = [ { column_name: 'id', data_type: 'integer', allow_null: false }, diff --git a/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts b/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts index d8d603af6..c810e7f34 100644 --- a/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/dashboard-ai-widget-e2e.test.ts @@ -6,7 +6,7 @@ import test from 'ava'; import { ValidationError } from 'class-validator'; import cookieParser from 'cookie-parser'; import request from 'supertest'; -import { AICoreService } from '../../../src/ai-core/index.js'; +import { AICoreService } from '../../../src/ai-core/services/ai-core.service.js'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { DashboardWidgetTypeEnum } from '../../../src/enums/dashboard-widget-type.enum.js'; @@ -60,9 +60,7 @@ const MOCK_AI_RESPONSE_UNSAFE_QUERY = JSON.stringify({ panel_type: 'table', }); -const MOCK_TABLES_LIST = [ - { tableName: 'test_table', isView: false }, -]; +const MOCK_TABLES_LIST = [{ tableName: 'test_table', isView: false }]; const MOCK_TABLE_STRUCTURE = [ { column_name: 'id', data_type: 'integer', allow_null: false }, @@ -354,4 +352,3 @@ test.serial(`${currentTest} should fail without chart_description`, async (t) => t.is(generateWidget.status, 400); }); - diff --git a/backend/test/ava-tests/saas-tests/group-e2e.test.ts b/backend/test/ava-tests/saas-tests/group-e2e.test.ts index 2a8c918f5..41f3f34c4 100644 --- a/backend/test/ava-tests/saas-tests/group-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/group-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/hosted-connection-e2e.test.ts b/backend/test/ava-tests/saas-tests/hosted-connection-e2e.test.ts index 4d1a9dc7a..38c41f040 100644 --- a/backend/test/ava-tests/saas-tests/hosted-connection-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/hosted-connection-e2e.test.ts @@ -8,7 +8,7 @@ import cookieParser from 'cookie-parser'; import jwt from 'jsonwebtoken'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; import { DatabaseModule } from '../../../src/shared/database/database.module.js'; diff --git a/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts index 8a23fce4b..cc71dff48 100644 --- a/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/permissions-e2e.test.ts @@ -11,7 +11,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/saas-cedar-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/saas-cedar-permissions-e2e.test.ts index f94cda3b3..14c48c5c3 100644 --- a/backend/test/ava-tests/saas-tests/saas-cedar-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/saas-cedar-permissions-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; @@ -20,11 +20,11 @@ import { DatabaseService } from '../../../src/shared/database/database.service.j import { MockFactory } from '../../mock.factory.js'; import { TestUtils } from '../../utils/test.utils.js'; import { - createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions, - createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection, - createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions, createConnectionAndInviteUserWithConnectionEditOnly, + createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection, createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions, + createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions, + createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions, } from '../../utils/user-with-different-permissions-utils.js'; let app: INestApplication; @@ -77,9 +77,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, firstTableInfo, @@ -97,9 +95,7 @@ test.serial( t.is(findAll.status, 200); const result = findAll.body.connections; - const targetConnection = result.find( - ({ connection }: any) => connection.id === connections.firstId, - ); + const targetConnection = result.find(({ connection }: any) => connection.id === connections.firstId); t.is(Object.hasOwn(targetConnection, 'connection'), true); t.is(Object.hasOwn(targetConnection, 'accessLevel'), true); t.is(targetConnection.accessLevel, AccessLevelEnum.readonly); @@ -146,9 +142,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, users: { simpleUserToken }, @@ -176,9 +170,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, users: { simpleUserToken }, @@ -207,9 +199,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, users: { simpleUserToken }, @@ -236,9 +226,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, users: { simpleUserToken }, @@ -311,9 +299,7 @@ test.serial(`${currentTest} should return all tables for readonly group user via t.is(getTablesInConnection.status, 200); const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.table === firstTableInfo.testTableName, - ); + const tableIndex = getTablesInConnectionRO.findIndex((table: any) => table.table === firstTableInfo.testTableName); t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); } catch (e) { console.error(e); @@ -352,45 +338,40 @@ test.serial(`${currentTest} should return found rows for readonly group user via currentTest = 'POST /table/row/:slug'; -test.serial( - `${currentTest} should return added row for user with add=true permission via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; +test.serial(`${currentTest} should return added row for user with add=true permission via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - } catch (e) { - console.error(e); - throw e; - } - }, -); + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 201); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + } catch (e) { + console.error(e); + throw e; + } +}); currentTest = 'PUT /table/row/:slug'; @@ -399,9 +380,7 @@ test.serial( async (t) => { try { const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, firstTableInfo, @@ -434,13 +413,139 @@ test.serial( currentTest = 'DELETE /table/row/:slug'; +test.serial(`${currentTest} should return delete result for user with delete=true permission via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; + + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } +}); + +//****************************** CUSTOM TABLE PERMISSIONS: add=false ****************************** + +currentTest = 'POST /table/row/:slug'; + +test.serial(`${currentTest} should throw exception when user with add=false tries to add row via Cedar`, async (t) => { + try { + const permissionNoAdd = { + visibility: true, + readonly: false, + add: false, + delete: false, + edit: false, + }; + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + permissionNoAdd, + ); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } +}); + +//****************************** CUSTOM TABLE PERMISSIONS: edit=true ****************************** + +currentTest = 'PUT /table/row/:slug'; + +test.serial(`${currentTest} should return updated row for user with edit=true permission via Cedar`, async (t) => { + try { + const permissionWithEdit = { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: true, + }; + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + permissionWithEdit, + ); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } +}); + +//****************************** CUSTOM TABLE PERMISSIONS: delete=false ****************************** + +currentTest = 'DELETE /table/row/:slug'; + test.serial( - `${currentTest} should return delete result for user with delete=true permission via Cedar`, + `${currentTest} should throw exception when user with delete=false tries to delete row via Cedar`, async (t) => { try { + const permissionNoDelete = { + visibility: true, + readonly: false, + add: true, + delete: false, + edit: false, + }; const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, + permissionNoDelete, ); const { connections, @@ -453,7 +558,8 @@ test.serial( .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(deleteRowInTable.status, 200); + t.is(deleteRowInTable.status, 403); + t.is(JSON.parse(deleteRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; @@ -461,16 +567,16 @@ test.serial( }, ); -//****************************** CUSTOM TABLE PERMISSIONS: add=false ****************************** +//****************************** CUSTOM TABLE PERMISSIONS: visibility=false ****************************** -currentTest = 'POST /table/row/:slug'; +currentTest = 'GET /table/rows/:slug'; test.serial( - `${currentTest} should throw exception when user with add=false tries to add row via Cedar`, + `${currentTest} should throw exception when user with visibility=false tries to read table rows via Cedar`, async (t) => { try { - const permissionNoAdd = { - visibility: true, + const permissionNoVisibility = { + visibility: false, readonly: false, add: false, delete: false, @@ -479,7 +585,7 @@ test.serial( const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, - permissionNoAdd, + permissionNoVisibility, ); const { connections, @@ -487,22 +593,13 @@ test.serial( users: { simpleUserToken }, } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(addRowInTable.status, 403); + t.is(getTableRows.status, 403); + t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; @@ -510,15 +607,59 @@ test.serial( }, ); -//****************************** CUSTOM TABLE PERMISSIONS: edit=true ****************************** +//****************************** CUSTOM TABLE PERMISSIONS: all=true (full table access) ****************************** + +currentTest = 'POST /table/row/:slug'; + +test.serial(`${currentTest} should return added row for user with all table permissions true via Cedar`, async (t) => { + try { + const permissionAll = { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: true, + }; + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + permissionAll, + ); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 201); + } catch (e) { + console.error(e); + throw e; + } +}); currentTest = 'PUT /table/row/:slug'; test.serial( - `${currentTest} should return updated row for user with edit=true permission via Cedar`, + `${currentTest} should return updated row for user with all table permissions true via Cedar`, async (t) => { try { - const permissionWithEdit = { + const permissionAll = { visibility: true, readonly: false, add: true, @@ -528,7 +669,7 @@ test.serial( const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, - permissionWithEdit, + permissionAll, ); const { connections, @@ -559,25 +700,23 @@ test.serial( }, ); -//****************************** CUSTOM TABLE PERMISSIONS: delete=false ****************************** - currentTest = 'DELETE /table/row/:slug'; test.serial( - `${currentTest} should throw exception when user with delete=false tries to delete row via Cedar`, + `${currentTest} should return delete result for user with all table permissions true via Cedar`, async (t) => { try { - const permissionNoDelete = { + const permissionAll = { visibility: true, readonly: false, add: true, - delete: false, - edit: false, + delete: true, + edit: true, }; const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, - permissionNoDelete, + permissionAll, ); const { connections, @@ -590,8 +729,7 @@ test.serial( .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(deleteRowInTable.status, 403); - t.is(JSON.parse(deleteRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 200); } catch (e) { console.error(e); throw e; @@ -599,15 +737,15 @@ test.serial( }, ); -//****************************** CUSTOM TABLE PERMISSIONS: visibility=false ****************************** +//****************************** CUSTOM TABLE PERMISSIONS: all=false (no table access) ****************************** currentTest = 'GET /table/rows/:slug'; test.serial( - `${currentTest} should throw exception when user with visibility=false tries to read table rows via Cedar`, + `${currentTest} should throw exception when user with all table permissions false tries to read rows via Cedar`, async (t) => { try { - const permissionNoVisibility = { + const permissionNone = { visibility: false, readonly: false, add: false, @@ -617,7 +755,7 @@ test.serial( const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, - permissionNoVisibility, + permissionNone, ); const { connections, @@ -639,25 +777,23 @@ test.serial( }, ); -//****************************** CUSTOM TABLE PERMISSIONS: all=true (full table access) ****************************** - currentTest = 'POST /table/row/:slug'; test.serial( - `${currentTest} should return added row for user with all table permissions true via Cedar`, + `${currentTest} should throw exception when user with all table permissions false tries to add row via Cedar`, async (t) => { try { - const permissionAll = { - visibility: true, + const permissionNone = { + visibility: false, readonly: false, - add: true, - delete: true, - edit: true, + add: false, + delete: false, + edit: false, }; const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( app, - permissionAll, + permissionNone, ); const { connections, @@ -680,7 +816,7 @@ test.serial( .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); + t.is(addRowInTable.status, 403); } catch (e) { console.error(e); throw e; @@ -691,186 +827,15 @@ test.serial( currentTest = 'PUT /table/row/:slug'; test.serial( - `${currentTest} should return updated row for user with all table permissions true via Cedar`, + `${currentTest} should throw exception when user with all table permissions false tries to update row via Cedar`, async (t) => { try { - const permissionAll = { - visibility: true, + const permissionNone = { + visibility: false, readonly: false, - add: true, - delete: true, - edit: true, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionAll, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'DELETE /table/row/:slug'; - -test.serial( - `${currentTest} should return delete result for user with all table permissions true via Cedar`, - async (t) => { - try { - const permissionAll = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: true, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionAll, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -//****************************** CUSTOM TABLE PERMISSIONS: all=false (no table access) ****************************** - -currentTest = 'GET /table/rows/:slug'; - -test.serial( - `${currentTest} should throw exception when user with all table permissions false tries to read rows via Cedar`, - async (t) => { - try { - const permissionNone = { - visibility: false, - readonly: false, - add: false, - delete: false, - edit: false, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionNone, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /table/row/:slug'; - -test.serial( - `${currentTest} should throw exception when user with all table permissions false tries to add row via Cedar`, - async (t) => { - try { - const permissionNone = { - visibility: false, - readonly: false, - add: false, - delete: false, - edit: false, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionNone, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /table/row/:slug'; - -test.serial( - `${currentTest} should throw exception when user with all table permissions false tries to update row via Cedar`, - async (t) => { - try { - const permissionNone = { - visibility: false, - readonly: false, - add: false, - delete: false, - edit: false, + add: false, + delete: false, + edit: false, }; const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( @@ -949,287 +914,166 @@ test.serial( currentTest = 'GET /table/rows/:slug'; -test.serial( - `${currentTest} should throw exception when connection id is fake via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - firstTableInfo, - users: { simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); +test.serial(`${currentTest} should throw exception when connection id is fake via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + firstTableInfo, + users: { simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${fakeId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRows.status, 403); + t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } +}); -test.serial( - `${currentTest} should throw exception when table name is fake via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - users: { simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); +test.serial(`${currentTest} should throw exception when table name is fake via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + connections, + users: { simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRows.status, 403); + t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } +}); currentTest = 'POST /table/row/:slug'; -test.serial( - `${currentTest} should throw exception when connection id is fake via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - firstTableInfo, - users: { simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 403); - t.is(JSON.parse(addRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); +test.serial(`${currentTest} should throw exception when connection id is fake via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + firstTableInfo, + users: { simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 403); + t.is(JSON.parse(addRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } +}); currentTest = 'PUT /table/row/:slug'; -test.serial( - `${currentTest} should throw exception when connection id is fake via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - firstTableInfo, - users: { simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(JSON.parse(updateRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); +test.serial(`${currentTest} should throw exception when connection id is fake via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + firstTableInfo, + users: { simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(JSON.parse(updateRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } +}); currentTest = 'DELETE /table/row/:slug'; -test.serial( - `${currentTest} should throw exception when connection id is fake via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - firstTableInfo, - users: { simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(JSON.parse(deleteRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } - }, -); +test.serial(`${currentTest} should throw exception when connection id is fake via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + firstTableInfo, + users: { simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(JSON.parse(deleteRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } +}); //****************************** DEEP PERMISSIONS: Cross-connection isolation ****************************** -currentTest = 'CROSS-CONNECTION ISOLATION'; - -test.serial( - `${currentTest} should deny access when user tries to read tables from a connection they are NOT in via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - secondTableInfo, - users: { simpleUserToken }, - } = testData; - - // User is only in first connection's group, NOT in second connection - // TablesReceiveGuard returns 400 CONNECTION_NOT_FOUND when user is not from connection - const getTablesInSecondConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInSecondConnection.status, 400); - t.is(JSON.parse(getTablesInSecondConnection.text).message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial( - `${currentTest} should deny row access on second connection even with valid table name via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - // Try to read rows from first connection's table name but using second connection's ID - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.secondId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial( - `${currentTest} should deny adding rows to second connection that user has no access to via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.secondId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: faker.person.firstName(), - [firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 403); - t.is(JSON.parse(addRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -//****************************** DEEP PERMISSIONS: Admin group (isMain=true) hierarchy ****************************** - -currentTest = 'ADMIN GROUP HIERARCHY'; +currentTest = 'CROSS-CONNECTION ISOLATION'; test.serial( - `${currentTest} admin group user should have full connection edit access via Cedar`, + `${currentTest} should deny access when user tries to read tables from a connection they are NOT in via Cedar`, async (t) => { try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, + secondTableInfo, users: { simpleUserToken }, } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') + // User is only in first connection's group, NOT in second connection + // TablesReceiveGuard returns 400 CONNECTION_NOT_FOUND when user is not from connection + const getTablesInSecondConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.secondId}`) .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(findAll.status, 200); - const result = findAll.body.connections; - const targetConnection = result.find(({ connection }: any) => connection.id === connections.firstId); - t.truthy(targetConnection); - t.is(targetConnection.accessLevel, AccessLevelEnum.edit); + t.is(getTablesInSecondConnection.status, 400); + t.is(JSON.parse(getTablesInSecondConnection.text).message, Messages.CONNECTION_NOT_FOUND); } catch (e) { console.error(e); throw e; @@ -1238,24 +1082,25 @@ test.serial( ); test.serial( - `${currentTest} admin group user should be able to create groups via Cedar`, + `${currentTest} should deny row access on second connection even with valid table name via Cedar`, async (t) => { try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, + firstTableInfo, users: { simpleUserToken }, } = testData; - const newGroup = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) + // Try to read rows from first connection's table name but using second connection's ID + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.secondId}?tableName=${firstTableInfo.testTableName}`) .set('Cookie', simpleUserToken) - .send(newGroup) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(createGroupResponse.status, 201); - t.truthy(JSON.parse(createGroupResponse.text).id); + t.is(getTableRows.status, 403); + t.is(JSON.parse(getTableRows.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; @@ -1264,41 +1109,19 @@ test.serial( ); test.serial( - `${currentTest} admin group user should have full table CRUD access via Cedar`, + `${currentTest} should deny adding rows to second connection that user has no access to via Cedar`, async (t) => { try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const { connections, firstTableInfo, users: { simpleUserToken }, } = testData; - // Read rows - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - - // Add row const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: faker.person.firstName(), - [firstTableInfo.testTableSecondColumnName]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - // Edit row - const updateRow = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) + .post(`/table/row/${connections.secondId}?tableName=${firstTableInfo.testTableName}`) .send({ [firstTableInfo.testTableColumnName]: faker.person.firstName(), [firstTableInfo.testTableSecondColumnName]: faker.internet.email(), @@ -1308,15 +1131,8 @@ test.serial( .set('Cookie', simpleUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(updateRow.status, 200); - - // Delete row - const deleteRow = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteRow.status, 200); + t.is(addRowInTable.status, 403); + t.is(JSON.parse(addRowInTable.text).message, Messages.DONT_HAVE_PERMISSIONS); } catch (e) { console.error(e); throw e; @@ -1324,6 +1140,115 @@ test.serial( }, ); +//****************************** DEEP PERMISSIONS: Admin group (isMain=true) hierarchy ****************************** + +currentTest = 'ADMIN GROUP HIERARCHY'; + +test.serial(`${currentTest} admin group user should have full connection edit access via Cedar`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const { + connections, + users: { simpleUserToken }, + } = testData; + + const findAll = await request(app.getHttpServer()) + .get('/connections') + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(findAll.status, 200); + const result = findAll.body.connections; + const targetConnection = result.find(({ connection }: any) => connection.id === connections.firstId); + t.truthy(targetConnection); + t.is(targetConnection.accessLevel, AccessLevelEnum.edit); + } catch (e) { + console.error(e); + throw e; + } +}); + +test.serial(`${currentTest} admin group user should be able to create groups via Cedar`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const { + connections, + users: { simpleUserToken }, + } = testData; + + const newGroup = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .send(newGroup) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createGroupResponse.status, 201); + t.truthy(JSON.parse(createGroupResponse.text).id); + } catch (e) { + console.error(e); + throw e; + } +}); + +test.serial(`${currentTest} admin group user should have full table CRUD access via Cedar`, async (t) => { + try { + const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; + + // Read rows + const getTableRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTableRows.status, 200); + + // Add row + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: faker.person.firstName(), + [firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(addRowInTable.status, 201); + + // Edit row + const updateRow = await request(app.getHttpServer()) + .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) + .send({ + [firstTableInfo.testTableColumnName]: faker.person.firstName(), + [firstTableInfo.testTableSecondColumnName]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(updateRow.status, 200); + + // Delete row + const deleteRow = await request(app.getHttpServer()) + .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(deleteRow.status, 200); + } catch (e) { + console.error(e); + throw e; + } +}); + test.serial( `${currentTest} admin group user should NOT have access to second connection they are NOT in via Cedar`, async (t) => { @@ -1461,30 +1386,27 @@ test.serial( }, ); -test.serial( - `${currentTest} user with connection:edit should be able to create groups via Cedar`, - async (t) => { - try { - const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); - const { - connections, - users: { simpleUserToken }, - } = testData; +test.serial(`${currentTest} user with connection:edit should be able to create groups via Cedar`, async (t) => { + try { + const testData = await createConnectionAndInviteUserWithConnectionEditOnly(app); + const { + connections, + users: { simpleUserToken }, + } = testData; - const newGroup = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createGroupResponse.status, 201); - } catch (e) { - console.error(e); - throw e; - } - }, -); + const newGroup = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .send(newGroup) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(createGroupResponse.status, 201); + } catch (e) { + console.error(e); + throw e; + } +}); test.serial( `${currentTest} user with connection:edit but no table perms should see empty table list via Cedar`, @@ -1548,36 +1470,31 @@ test.serial( }, ); -test.serial( - `${currentTest} readonly group user should see groups with readonly access level via Cedar`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - ); - const { - connections, - groups, - users: { simpleUserToken }, - } = testData; +test.serial(`${currentTest} readonly group user should see groups with readonly access level via Cedar`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const { + connections, + groups, + users: { simpleUserToken }, + } = testData; - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - const createdGroup = result.find((el: any) => el.group.id === groups.createdGroupId); - t.truthy(createdGroup); - t.is(createdGroup.accessLevel, AccessLevelEnum.readonly); - } catch (e) { - console.error(e); - throw e; - } - }, -); + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(response.status, 200); + const result = JSON.parse(response.text); + const createdGroup = result.find((el: any) => el.group.id === groups.createdGroupId); + t.truthy(createdGroup); + t.is(createdGroup.accessLevel, AccessLevelEnum.readonly); + } catch (e) { + console.error(e); + throw e; + } +}); //****************************** DEEP PERMISSIONS: Table permissions returned from API match Cedar policy ****************************** @@ -1628,44 +1545,41 @@ test.serial( }, ); -test.serial( - `${currentTest} table list should only show tables with visibility=true via Cedar`, - async (t) => { - try { - const permissionNoVisibility = { - visibility: false, - readonly: false, - add: false, - delete: false, - edit: false, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionNoVisibility, - ); - const { - connections, - firstTableInfo, - users: { simpleUserToken }, - } = testData; +test.serial(`${currentTest} table list should only show tables with visibility=true via Cedar`, async (t) => { + try { + const permissionNoVisibility = { + visibility: false, + readonly: false, + add: false, + delete: false, + edit: false, + }; + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + permissionNoVisibility, + ); + const { + connections, + firstTableInfo, + users: { simpleUserToken }, + } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const tables = JSON.parse(getTablesInConnection.text); - // The table with visibility=false should NOT appear in the list - const hiddenTable = tables.find((table: any) => table.table === firstTableInfo.testTableName); - t.is(hiddenTable, undefined); - } catch (e) { - console.error(e); - throw e; - } - }, -); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set('Cookie', simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); + t.is(getTablesInConnection.status, 200); + const tables = JSON.parse(getTablesInConnection.text); + // The table with visibility=false should NOT appear in the list + const hiddenTable = tables.find((table: any) => table.table === firstTableInfo.testTableName); + t.is(hiddenTable, undefined); + } catch (e) { + console.error(e); + throw e; + } +}); //****************************** DEEP PERMISSIONS: Per-action granularity ****************************** diff --git a/backend/test/ava-tests/saas-tests/saas-cedar-save-policy-e2e.test.ts b/backend/test/ava-tests/saas-tests/saas-cedar-save-policy-e2e.test.ts index 467094afa..062cdd116 100644 --- a/backend/test/ava-tests/saas-tests/saas-cedar-save-policy-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/saas-cedar-save-policy-e2e.test.ts @@ -7,7 +7,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; @@ -188,119 +188,110 @@ test.serial( }, ); -test.serial( - `${currentTest} should enforce saved cedar policy - user without table:add cannot add rows`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - const testTableColumnName = testData.firstTableInfo.testTableColumnName; +test.serial(`${currentTest} should enforce saved cedar policy - user without table:add cannot add rows`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + const testTableColumnName = testData.firstTableInfo.testTableColumnName; - // Save cedar policy with only connection:read + table:read (no table:add) - const cedarPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); + // Save cedar policy with only connection:read + table:read (no table:add) + const cedarPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); - const savePolicyResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const savePolicyResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(savePolicyResponse.status, 201); + t.is(savePolicyResponse.status, 201); - // Verify user cannot add rows (no table:add permission) - const addRowResponse = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${tableName}`) - .send({ [testTableColumnName]: 'test_value' }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Verify user cannot add rows (no table:add permission) + const addRowResponse = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${tableName}`) + .send({ [testTableColumnName]: 'test_value' }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(addRowResponse.status, 403); - t.is(JSON.parse(addRowResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(addRowResponse.status, 403); + t.is(JSON.parse(addRowResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should enforce saved cedar policy - user with table:add can add rows`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - const testTableColumnName = testData.firstTableInfo.testTableColumnName; +test.serial(`${currentTest} should enforce saved cedar policy - user with table:add can add rows`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + const testTableColumnName = testData.firstTableInfo.testTableColumnName; - // Save cedar policy with connection:read + table:read + table:add - const cedarPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); + // Save cedar policy with connection:read + table:read + table:add + const cedarPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); - const savePolicyResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const savePolicyResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(savePolicyResponse.status, 201); + t.is(savePolicyResponse.status, 201); - // Verify user can add rows - const addRowResponse = await request(app.getHttpServer()) - .post(`/table/row/${connectionId}?tableName=${tableName}`) - .send({ [testTableColumnName]: 'cedar_test_value' }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Verify user can add rows + const addRowResponse = await request(app.getHttpServer()) + .post(`/table/row/${connectionId}?tableName=${tableName}`) + .send({ [testTableColumnName]: 'cedar_test_value' }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(addRowResponse.status, 201); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(addRowResponse.status, 201); + } catch (error) { + console.error(error); + throw error; + } +}); -test.serial( - `${currentTest} should reject request when user does not have connection edit access`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject request when user does not have connection edit access`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`; - // Simple user has readonly access, not edit - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Simple user has readonly access, not edit + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.simpleUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial(`${currentTest} should reject empty cedar policy string`, async (t) => { try { @@ -345,33 +336,30 @@ test.serial(`${currentTest} should reject request without groupId`, async (t) => } }); -test.serial( - `${currentTest} should reject saving cedar policy when group does not belong to connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject saving cedar policy when group does not belong to connection`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; - // Group belongs to first connection, but we're sending to second connection - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${secondConnectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + // Group belongs to first connection, but we're sending to second connection + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${secondConnectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.GROUP_NOT_FROM_THIS_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.GROUP_NOT_FROM_THIS_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should save cedar policy with dashboard permissions and return correct classical permissions`, @@ -413,97 +401,93 @@ test.serial( }, ); -test.serial( - `${currentTest} should overwrite previous permissions when saving new cedar policy`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; - - // First: save policy with full table access - const fullPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"connection:edit",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:edit",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:delete",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); - - const firstResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy: fullPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); +test.serial(`${currentTest} should overwrite previous permissions when saving new cedar policy`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; + + // First: save policy with full table access + const fullPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"connection:edit",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:add",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:edit",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:delete",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); + + const firstResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy: fullPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(firstResponse.status, 201); - t.is(firstResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.edit); - t.is(firstResponse.body.classicalPermissions.tables[0].accessLevel.add, true); + t.is(firstResponse.status, 201); + t.is(firstResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.edit); + t.is(firstResponse.body.classicalPermissions.tables[0].accessLevel.add, true); - // Second: save policy with only read access (overwrite) - const readOnlyPolicy = [ - `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, - `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, - ].join('\n\n'); + // Second: save policy with only read access (overwrite) + const readOnlyPolicy = [ + `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${connectionId}"\n);`, + `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${connectionId}/${tableName}"\n);`, + ].join('\n\n'); - const secondResponse = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy: readOnlyPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const secondResponse = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy: readOnlyPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(secondResponse.status, 201); - t.is(secondResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.readonly); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.add, false); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.edit, false); - t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.delete, false); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(secondResponse.status, 201); + t.is(secondResponse.body.classicalPermissions.connection.accessLevel, AccessLevelEnum.readonly); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.add, false); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.edit, false); + t.is(secondResponse.body.classicalPermissions.tables[0].accessLevel.delete, false); + } catch (error) { + console.error(error); + throw error; + } +}); //****************************** CEDAR POLICY REFERENCE VALIDATION TESTS ****************************** -test.serial( - `${currentTest} should reject cedar policy that references a foreign connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; +test.serial(`${currentTest} should reject cedar policy that references a foreign connection`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; - // Policy references secondConnectionId as the resource - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; + // Policy references secondConnectionId as the resource + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"connection:read",\n resource == RocketAdmin::Connection::"${secondConnectionId}"\n);`; - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); test.serial( `${currentTest} should reject cedar policy that references a group from another connection as resource`, async (t) => { try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); const connectionId = testData.connections.firstId; const groupId = testData.groups.createdGroupId; const secondAdminGroupId = testData.groups.secondAdminGroupId; @@ -530,30 +514,28 @@ test.serial( }, ); -test.serial( - `${currentTest} should reject cedar policy that references a table from another connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const connectionId = testData.connections.firstId; - const secondConnectionId = testData.connections.secondId; - const groupId = testData.groups.createdGroupId; - const tableName = testData.firstTableInfo.testTableName; +test.serial(`${currentTest} should reject cedar policy that references a table from another connection`, async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); + const connectionId = testData.connections.firstId; + const secondConnectionId = testData.connections.secondId; + const groupId = testData.groups.createdGroupId; + const tableName = testData.firstTableInfo.testTableName; - const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${secondConnectionId}/${tableName}"\n);`; + const cedarPolicy = `permit(\n principal,\n action == RocketAdmin::Action::"table:read",\n resource == RocketAdmin::Table::"${secondConnectionId}/${tableName}"\n);`; - const response = await request(app.getHttpServer()) - .post(`/connection/cedar-policy/${connectionId}`) - .send({ cedarPolicy, groupId }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); + const response = await request(app.getHttpServer()) + .post(`/connection/cedar-policy/${connectionId}`) + .send({ cedarPolicy, groupId }) + .set('Cookie', testData.users.adminUserToken) + .set('Content-Type', 'application/json') + .set('Accept', 'application/json'); - t.is(response.status, 400); - t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); - } catch (error) { - console.error(error); - throw error; - } - }, -); + t.is(response.status, 400); + t.is(JSON.parse(response.text).message, Messages.CEDAR_POLICY_REFERENCES_FOREIGN_CONNECTION); + } catch (error) { + console.error(error); + throw error; + } +}); diff --git a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts index 1559b93f9..0bc0d135c 100644 --- a/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-cassandra-agent.e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts b/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts index caf5af118..b92d8f414 100644 --- a/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-cassandra.e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts index b8ad1e820..192830c5b 100644 --- a/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-clickhouse-agent-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts index 1dbf4c508..35d52274c 100644 --- a/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-clickhouse-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts index 9aa573e99..511af7602 100644 --- a/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-dynamodb-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts index 4a5584e61..fc73f25f9 100644 --- a/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-elasticsearch-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts b/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts index 4141721fe..2f112457f 100644 --- a/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts +++ b/backend/test/ava-tests/saas-tests/table-filters-e2e-test.ts @@ -11,7 +11,7 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Cacher } from '../../../src/helpers/cache/cacher.js'; diff --git a/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts index 5206df4e6..c93a538e3 100644 --- a/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-ibmdb2-agent-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts index 124e60553..ea1b955dd 100644 --- a/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-ibmdb2-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts index fe8a76fa6..07620d19e 100644 --- a/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mongodb-agent-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts index 65c979400..b94dfa65f 100644 --- a/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mongodb-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts index 11eac3fc0..ba7f8c7d3 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-agent-e2e.test.ts @@ -16,7 +16,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts index d88e1bd04..7966b39b8 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts index c6c44759a..32bc1452d 100644 --- a/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mssql-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts index 3b33b1d8e..265e65818 100644 --- a/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mysql-agent-e2e.test.ts @@ -16,7 +16,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts index 3342d6d99..666c031f6 100644 --- a/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-mysql-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts index 5bf63932f..65254b0e0 100644 --- a/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracle-agent-e2e.test.ts @@ -16,7 +16,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts index e675cfcc1..604f7f7ad 100644 --- a/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracledb-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts index e7c09c687..47befb169 100644 --- a/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-oracledb-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts index 79c95f216..f6e9a8376 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-agent-e2e.test.ts @@ -16,7 +16,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts index 8fe3bbdaa..1083cad16 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts @@ -14,7 +14,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts index 80a435455..83e377b95 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-encrypted-e2e.test.ts @@ -9,7 +9,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts index 9fd76d321..19574b5d4 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-schema-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts index 396d15220..ebeb37b10 100644 --- a/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-redis-agent-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts index bc77bfd1a..a8c3a7748 100644 --- a/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-redis-e2e.test.ts @@ -13,7 +13,8 @@ import request from 'supertest'; import { fileURLToPath } from 'url'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { LogOperationTypeEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { LogOperationTypeEnum } from '../../../src/enums/log-operation-type.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts index cb5d1da7e..d9a502635 100644 --- a/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-settings-e2e.test.ts @@ -8,7 +8,7 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/table-settings-personal-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-settings-personal-e2e.test.ts index c3c911d0b..79b4a0779 100644 --- a/backend/test/ava-tests/saas-tests/table-settings-personal-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-settings-personal-e2e.test.ts @@ -10,7 +10,7 @@ import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; import { CreatePersonalTableSettingsDto } from '../../../src/entities/table-settings/personal-table-settings/dto/create-personal-table-settings.dto.js'; import { FoundPersonalTableSettingsDto } from '../../../src/entities/table-settings/personal-table-settings/dto/found-personal-table-settings.dto.js'; -import { QueryOrderingEnum } from '../../../src/enums/index.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts index e622400dd..58803d7e1 100644 --- a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts index e6416a07b..20ae03f9a 100644 --- a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts index dc23c60a3..ccb1600c6 100644 --- a/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts index d4a39c1c7..986794d1f 100644 --- a/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts @@ -9,7 +9,8 @@ import cookieParser from 'cookie-parser'; import request from 'supertest'; import { ApplicationModule } from '../../../src/app.module.js'; import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; +import { AccessLevelEnum } from '../../../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../../../src/enums/query-ordering.enum.js'; import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; import { Messages } from '../../../src/exceptions/text/messages.js'; diff --git a/backend/test/mock.factory.ts b/backend/test/mock.factory.ts index b6a9b9d04..1f3a0a601 100644 --- a/backend/test/mock.factory.ts +++ b/backend/test/mock.factory.ts @@ -2,13 +2,15 @@ import { faker } from '@faker-js/faker'; import { ConnectionTypesEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js'; import json5 from 'json5'; import jwt from 'jsonwebtoken'; -import { IRequestWithCognitoInfo } from '../src/authorization/index.js'; +import { IRequestWithCognitoInfo } from '../src/authorization/cognito-decoded.interface.js'; import { CreateConnectionDto } from '../src/entities/connection/application/dto/create-connection.dto.js'; -import { CreateConnectionPropertiesDto } from '../src/entities/connection-properties/dto/index.js'; +import { CreateConnectionPropertiesDto } from '../src/entities/connection-properties/dto/create-connection-properties.dto.js'; import { CreateTableActionDTO } from '../src/entities/table-actions/table-actions-module/dto/create-table-action.dto.js'; import { TableActionEntity } from '../src/entities/table-actions/table-actions-module/table-action.entity.js'; -import { CreateTableWidgetDto } from '../src/entities/widget/dto/index.js'; -import { AccessLevelEnum, QueryOrderingEnum, WidgetTypeEnum } from '../src/enums/index.js'; +import { CreateTableWidgetDto } from '../src/entities/widget/dto/create-table-widget.dto.js'; +import { AccessLevelEnum } from '../src/enums/access-level.enum.js'; +import { QueryOrderingEnum } from '../src/enums/query-ordering.enum.js'; +import { WidgetTypeEnum } from '../src/enums/widget-type.enum.js'; import { TestConstants } from './mocks/test-constants.js'; class CreateGroupDto { diff --git a/backend/test/utils/compare-table-widgets-arrays.ts b/backend/test/utils/compare-table-widgets-arrays.ts index 1312e5819..58be24a00 100644 --- a/backend/test/utils/compare-table-widgets-arrays.ts +++ b/backend/test/utils/compare-table-widgets-arrays.ts @@ -1,5 +1,5 @@ import json5 from 'json5'; -import { CreateTableWidgetDto } from '../../src/entities/widget/dto/index.js'; +import { CreateTableWidgetDto } from '../../src/entities/widget/dto/create-table-widget.dto.js'; import { TableWidgetEntity } from '../../src/entities/widget/table-widget.entity.js'; export const compareTableWidgetsArrays = ( diff --git a/backend/test/utils/user-with-different-permissions-utils.ts b/backend/test/utils/user-with-different-permissions-utils.ts index 569a2e4b4..820911069 100644 --- a/backend/test/utils/user-with-different-permissions-utils.ts +++ b/backend/test/utils/user-with-different-permissions-utils.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { INestApplication } from '@nestjs/common'; import request from 'supertest'; -import { AccessLevelEnum } from '../../src/enums/index.js'; +import { AccessLevelEnum } from '../../src/enums/access-level.enum.js'; import { MockFactory } from '../mock.factory.js'; import { CreatedTableInfo, createTestTable } from './create-test-table.js'; import { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed7251fb2..04e6b532f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,9 +40,9 @@ importers: '@amplitude/node': specifier: 1.10.2 version: 1.10.2 - '@aws-sdk/client-bedrock-runtime': - specifier: ^3.1037.0 - version: 3.1037.0 + '@aws-sdk/client-dynamodb': + specifier: ^3.1032.0 + version: 3.1032.0 '@aws-sdk/client-s3': specifier: ^3.1037.0 version: 3.1037.0 @@ -55,6 +55,12 @@ importers: '@cedar-policy/cedar-wasm': specifier: ^4.9.1 version: 4.9.1 + '@clickhouse/client': + specifier: ^1.18.2 + version: 1.18.2 + '@elastic/elasticsearch': + specifier: 8.18.1 + version: 8.18.1 '@electric-sql/pglite': specifier: ^0.4.0 version: 0.4.4 @@ -63,16 +69,13 @@ importers: version: 10.4.0 '@langchain/aws': specifier: ^1.3.3 - version: 1.3.5(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)) + version: 1.3.5(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0)) '@langchain/core': specifier: ^1.1.33 - version: 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) + version: 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0) '@nestjs/common': specifier: 11.1.17 version: 11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/config': - specifier: 4.0.3 - version: 4.0.3(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) '@nestjs/core': specifier: '>=11.1.18' version: 11.1.19(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.17)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -90,10 +93,7 @@ importers: version: 6.5.0(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2) '@nestjs/typeorm': specifier: ^11.0.0 - version: 11.0.1(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3))) - '@nestjsx/crud': - specifier: 4.6.2 - version: 4.6.2(class-transformer@0.5.1)(class-validator@0.15.1) + version: 11.0.1(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mongodb@7.1.1(socks@2.8.7))(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3))) '@rocketadmin/shared-code': specifier: workspace:* version: link:../shared-code @@ -133,9 +133,6 @@ importers: axios: specifier: ^1.15.0 version: 1.15.1 - base32-encode: - specifier: ^2.0.0 - version: 2.0.0 basic-auth: specifier: 2.0.1 version: 2.0.1 @@ -145,6 +142,9 @@ importers: body-parser: specifier: ^2.2.2 version: 2.2.2 + cassandra-driver: + specifier: ^4.8.0 + version: 4.8.0 class-transformer: specifier: 0.5.1 version: 0.5.1 @@ -154,9 +154,6 @@ importers: cookie-parser: specifier: ^1.4.7 version: 1.4.7 - crc: - specifier: ^4.3.2 - version: 4.3.2(buffer@6.0.3) crypto-js: specifier: 4.2.0 version: 4.2.0 @@ -169,9 +166,6 @@ importers: express: specifier: 5.2.1 version: 5.2.1 - fetch-blob: - specifier: ^4.0.0 - version: 4.0.0 helmet: specifier: 8.1.0 version: 8.1.0 @@ -184,18 +178,21 @@ importers: json2csv: specifier: ^5.0.7 version: 5.0.7 + json5: + specifier: ^2.2.3 + version: 2.2.3 jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 knex: specifier: 3.1.0 version: 3.1.0(mysql2@3.22.1(@types/node@24.12.2))(pg@8.20.0)(tedious@19.2.1(@azure/core-client@1.10.1)) - langchain: - specifier: ^1.2.34 - version: 1.3.3(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) lru-cache: specifier: ^11.2.7 version: 11.3.5 + mongodb: + specifier: ^7.1.1 + version: 7.1.1(socks@2.8.7) nanoid: specifier: 5.1.7 version: 5.1.7 @@ -214,18 +211,12 @@ importers: p-queue: specifier: 9.1.0 version: 9.1.0 - pg: - specifier: ^8.20.0 - version: 8.20.0 pg-connection-string: specifier: ^2.12.0 version: 2.12.0 qrcode: specifier: ^1.5.4 version: 1.5.4 - query-string: - specifier: ^9.3.1 - version: 9.3.1 reflect-metadata: specifier: 0.2.2 version: 0.2.2 @@ -243,7 +234,7 @@ importers: version: 4.1.0 typeorm: specifier: 0.3.28 - version: 0.3.28(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)) + version: 0.3.28(mongodb@7.1.1(socks@2.8.7))(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)) typeorm-pglite: specifier: ^0.3.4 version: 0.3.4(@electric-sql/pglite@0.4.4) @@ -256,6 +247,9 @@ importers: winston: specifier: 3.19.0 version: 3.19.0 + zod: + specifier: ^4.4.3 + version: 4.4.3 devDependencies: '@ava/typescript': specifier: 6.0.0 @@ -278,9 +272,6 @@ importers: '@types/cookie-parser': specifier: ^1.4.10 version: 1.4.10(@types/express@5.0.6) - '@types/cron': - specifier: ^2.4.3 - version: 2.4.3 '@types/express': specifier: ^5.0.6 version: 5.0.6 @@ -293,12 +284,6 @@ importers: '@types/node': specifier: ^24.10.1 version: 24.12.2 - '@types/pg': - specifier: ^8.18.0 - version: 8.20.0 - '@types/safe-regex': - specifier: ^1.1.6 - version: 1.1.6 '@types/supertest': specifier: ^7.2.0 version: 7.2.0 @@ -314,6 +299,9 @@ importers: nock: specifier: ^14.0.11 version: 14.0.12 + redis: + specifier: ^5.12.1 + version: 5.12.1(@opentelemetry/api@1.9.1) supertest: specifier: ^7.2.2 version: 7.2.2 @@ -1370,43 +1358,6 @@ packages: resolution: {integrity: sha512-RJ41GQEMxr9ZEZNoIiPgW0+v9nAY6FEZGlk+MjBghr2GR8He50abLam0XCe1aqUJjuKbqt2lUD6M+6SZ+2NIJg==} engines: {node: '>=20'} - '@langchain/langgraph-checkpoint@1.0.1': - resolution: {integrity: sha512-HM0cJLRpIsSlWBQ/xuDC67l52SqZ62Bh2Y61DX+Xorqwoh5e1KxYvfCD7GnSTbWWhjBOutvnR0vPhu4orFkZfw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': ^1.0.1 - - '@langchain/langgraph-sdk@1.8.9': - resolution: {integrity: sha512-vpz90auS4iFTNy2X/CFexOEoeFSvaK+MyI7iSmzYs9gGcfzwRjWUJ4MWsuc5ZNRecLStwho0PExVXRgGOXtcRw==} - peerDependencies: - '@langchain/core': ^1.1.16 - react: ^18 || ^19 - react-dom: ^18 || ^19 - svelte: ^4.0.0 || ^5.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - '@langchain/core': - optional: true - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - vue: - optional: true - - '@langchain/langgraph@1.2.9': - resolution: {integrity: sha512-3c7BtGycHC2v9p6w/Hv8L7kEl1YnZYOQTDJtmAp3knk6JOedO7d2bYP3y0SRyhv5orUEGf/KGvx8ZsB/ideP7g==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': ^1.1.40 - zod: ^3.25.32 || ^4.2.0 - zod-to-json-schema: ^3.x - peerDependenciesMeta: - zod-to-json-schema: - optional: true - '@lukeed/csprng@1.1.0': resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -1458,12 +1409,6 @@ packages: class-validator: optional: true - '@nestjs/config@4.0.3': - resolution: {integrity: sha512-FQ3M3Ohqfl+nHAn5tp7++wUQw0f2nAk+SFKe8EpNRnIifPqvfJP6JQxPKtFLMOHbyer4X646prFG4zSRYEssQQ==} - peerDependencies: - '@nestjs/common': ^10.0.0 || ^11.0.0 - rxjs: ^7.1.0 - '@nestjs/core@11.1.19': resolution: {integrity: sha512-6nJkWa2efrYi+XlU686J9y5L7OvxpLVjT0T/sxRKE7Jvpffiihelup4WSvLvRhdHDjj/5SuoWEwqReXAaaeHmw==} engines: {node: '>= 20'} @@ -1558,18 +1503,6 @@ packages: rxjs: ^7.2.0 typeorm: ^0.3.0 || ^1.0.0-dev - '@nestjsx/crud-request@4.6.2': - resolution: {integrity: sha512-EqveTzR5JLMRBnxqJzo0mm7Ff05IzQ6dvfg1gj46q6nOwZ0hfXr0FBTChtciKtkZB/QOlWQ5B1scCap/QuNJWQ==} - - '@nestjsx/crud@4.6.2': - resolution: {integrity: sha512-WWzPI7X2saxJ2No5vO4+zaSRP4CABqSM4NGVAE1VjGQ1ApdjDxj3dFu08Y7YSa5kz+vmrVRwh++Vh+xd9MixUQ==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - - '@nestjsx/util@4.6.2': - resolution: {integrity: sha512-YG2gQvSm7p8zBFaW6MFM5r1Ihk4Vr189SB2OTr7fV7qcjPS+02v7xILw2dTz2emdmu0t0AgCL2RU1V0lY8Aa9w==} - '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -2407,10 +2340,6 @@ packages: '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cron@2.4.3': - resolution: {integrity: sha512-ViRBkoZD9Rk0hGeMdd2GHGaOaZuH9mDmwsE5/Zo53Ftwcvh7h9VJc8lIt2wdgEwS4EW5lbtTX6vlE0idCLPOyA==} - deprecated: This is a stub types definition. cron provides its own type definitions, so you do not need this installed. - '@types/crypto-js@4.2.2': resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} @@ -2507,9 +2436,6 @@ packages: '@types/readable-stream@4.0.23': resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} - '@types/safe-regex@1.1.6': - resolution: {integrity: sha512-CQ/uPB9fLOPKwDsrTeVbNIkwfUthTWOx0l6uIGwVFjZxv7e68pCW5gtTYFzdJi3EBJp8h8zYhJbTasAbX7gEMQ==} - '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} @@ -2806,10 +2732,6 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - base32-encode@2.0.0: - resolution: {integrity: sha512-mlmkfc2WqdDtMl/id4qm3A7RjW6jxcbAoMjdRmsPiwQP0ufD4oXItYMnPgVHe80lnAIy+1xwzhHE1s4FoIceSw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3201,15 +3123,6 @@ packages: resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} engines: {node: '>=10.0.0'} - crc@4.3.2: - resolution: {integrity: sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==} - engines: {node: '>=12'} - peerDependencies: - buffer: '>=6.0.3' - peerDependenciesMeta: - buffer: - optional: true - create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -3278,10 +3191,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decode-uri-component@0.4.1: - resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} - engines: {node: '>=14.16'} - dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -3290,10 +3199,6 @@ packages: babel-plugin-macros: optional: true - deepmerge@3.3.0: - resolution: {integrity: sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==} - engines: {node: '>=0.10.0'} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3346,18 +3251,10 @@ packages: dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - dotenv-expand@12.0.3: - resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} - engines: {node: '>=12'} - dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} - engines: {node: '>=12'} - dotenv@17.3.1: resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} engines: {node: '>=12'} @@ -3574,10 +3471,6 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - fetch-blob@4.0.0: - resolution: {integrity: sha512-nPmnhRmpNMjYWnp9EBMGs6z5lq9RXed5W1vuZcECrsDVQInM8AMQSooVb3X183Aole60adzjWbH9qlRFWzDDTA==} - engines: {node: '>=16.7'} - figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -3593,10 +3486,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-obj@5.1.0: - resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} - engines: {node: '>=14.16'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -3930,10 +3819,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-network-error@1.3.1: - resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} - engines: {node: '>=16'} - is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -4118,12 +4003,6 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - langchain@1.3.3: - resolution: {integrity: sha512-X6RgeeAmr6pve/s7EHPAx2CIyqyDWt//VBp9Sd8k2Bpr+p/NWFGAg+WoeknAbwUaDMWgSn2OLM8kGPdPQr+MRw==} - engines: {node: '>=20'} - peerDependencies: - '@langchain/core': ^1.1.40 - langsmith@0.5.20: resolution: {integrity: sha512-ULhLM8RswvQDXufLtNtvclHrWCBx8Cb5UPI6lAZC+8Dq59iHsVPz/3Ac9khWNm1VIvChRsuykixD/WrmzuuA3Q==} peerDependencies: @@ -4486,11 +4365,6 @@ packages: resolution: {integrity: sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==} engines: {node: ^18 || ^20 || >= 21} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -4636,10 +4510,6 @@ packages: resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} engines: {node: '>=20'} - p-retry@7.1.1: - resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} - engines: {node: '>=20'} - p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -4861,10 +4731,6 @@ packages: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} - query-string@9.3.1: - resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==} - engines: {node: '>=18'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5131,10 +4997,6 @@ packages: sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - split-on-first@3.0.0: - resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} - engines: {node: '>=12'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -5352,10 +5214,6 @@ packages: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} - to-data-view@2.0.0: - resolution: {integrity: sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5755,8 +5613,8 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: @@ -5989,43 +5847,43 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.1 - '@aws-sdk/credential-provider-node': 3.972.32 + '@aws-sdk/core': 3.974.5 + '@aws-sdk/credential-provider-node': 3.972.36 '@aws-sdk/dynamodb-codec': 3.973.1 '@aws-sdk/middleware-endpoint-discovery': 3.972.11 '@aws-sdk/middleware-host-header': 3.972.10 '@aws-sdk/middleware-logger': 3.972.10 '@aws-sdk/middleware-recursion-detection': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.31 - '@aws-sdk/region-config-resolver': 3.972.12 + '@aws-sdk/middleware-user-agent': 3.972.35 + '@aws-sdk/region-config-resolver': 3.972.13 '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 + '@aws-sdk/util-endpoints': 3.996.8 '@aws-sdk/util-user-agent-browser': 3.972.10 - '@aws-sdk/util-user-agent-node': 3.973.17 - '@smithy/config-resolver': 4.4.16 - '@smithy/core': 3.23.15 + '@aws-sdk/util-user-agent-node': 3.973.21 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.17 '@smithy/fetch-http-handler': 5.3.17 '@smithy/hash-node': 4.2.14 '@smithy/invalid-dependency': 4.2.14 '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.30 - '@smithy/middleware-retry': 4.5.3 - '@smithy/middleware-serde': 4.2.18 + '@smithy/middleware-endpoint': 4.4.32 + '@smithy/middleware-retry': 4.5.5 + '@smithy/middleware-serde': 4.2.20 '@smithy/middleware-stack': 4.2.14 '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.5.3 + '@smithy/node-http-handler': 4.6.1 '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.11 + '@smithy/smithy-client': 4.12.13 '@smithy/types': 4.14.1 '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.47 - '@smithy/util-defaults-mode-node': 4.2.52 - '@smithy/util-endpoints': 3.4.1 + '@smithy/util-defaults-mode-browser': 4.3.49 + '@smithy/util-defaults-mode-node': 4.2.54 + '@smithy/util-endpoints': 3.4.2 '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.2 + '@smithy/util-retry': 4.3.4 '@smithy/util-utf8': 4.2.2 '@smithy/util-waiter': 4.2.16 tslib: 2.8.1 @@ -6384,8 +6242,8 @@ snapshots: '@aws-sdk/dynamodb-codec@3.973.1': dependencies: - '@aws-sdk/core': 3.974.1 - '@smithy/core': 3.23.15 + '@aws-sdk/core': 3.974.5 + '@smithy/core': 3.23.17 '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 tslib: 2.8.1 @@ -7379,17 +7237,17 @@ snapshots: '@js-joda/core@5.7.0': {} - '@langchain/aws@1.3.5(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))': + '@langchain/aws@1.3.5(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0))': dependencies: '@aws-sdk/client-bedrock-agent-runtime': 3.1032.0 '@aws-sdk/client-bedrock-runtime': 3.1037.0 '@aws-sdk/client-kendra': 3.1032.0 '@aws-sdk/credential-provider-node': 3.972.32 - '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) + '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0) transitivePeerDependencies: - aws-crt - '@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)': + '@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0)': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 @@ -7397,11 +7255,11 @@ snapshots: camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.5.20(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) + langsmith: 0.5.20(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0) mustache: 4.2.0 p-queue: 6.6.2 uuid: 14.0.0 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -7409,34 +7267,6 @@ snapshots: - openai - ws - '@langchain/langgraph-checkpoint@1.0.1(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))': - dependencies: - '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) - uuid: 14.0.0 - - '@langchain/langgraph-sdk@1.8.9(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))': - dependencies: - '@types/json-schema': 7.0.15 - p-queue: 9.1.0 - p-retry: 7.1.1 - uuid: 14.0.0 - optionalDependencies: - '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) - - '@langchain/langgraph@1.2.9(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(zod@4.3.6)': - dependencies: - '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) - '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)) - '@langchain/langgraph-sdk': 1.8.9(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)) - '@standard-schema/spec': 1.1.0 - uuid: 14.0.0 - zod: 4.3.6 - transitivePeerDependencies: - - react - - react-dom - - svelte - - vue - '@lukeed/csprng@1.1.0': {} '@mapbox/node-pre-gyp@2.0.3(encoding@0.1.13)': @@ -7515,14 +7345,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/config@4.0.3(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) - dotenv: 17.2.3 - dotenv-expand: 12.0.3 - lodash: 4.18.1 - rxjs: 7.8.2 - '@nestjs/core@11.1.19(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.17)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -7603,28 +7425,13 @@ snapshots: '@nestjs/core': 11.1.19(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.17)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 - '@nestjs/typeorm@11.0.1(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)))': + '@nestjs/typeorm@11.0.1(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mongodb@7.1.1(socks@2.8.7))(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)))': dependencies: '@nestjs/common': 11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.19(@nestjs/common@11.1.17(class-transformer@0.5.1)(class-validator@0.15.1)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.17)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 rxjs: 7.8.2 - typeorm: 0.3.28(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)) - - '@nestjsx/crud-request@4.6.2': - dependencies: - '@nestjsx/util': 4.6.2 - qs: 6.15.1 - - '@nestjsx/crud@4.6.2(class-transformer@0.5.1)(class-validator@0.15.1)': - dependencies: - '@nestjsx/crud-request': 4.6.2 - '@nestjsx/util': 4.6.2 - class-transformer: 0.5.1 - class-validator: 0.15.1 - deepmerge: 3.3.0 - - '@nestjsx/util@4.6.2': {} + typeorm: 0.3.28(mongodb@7.1.1(socks@2.8.7))(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)) '@noble/hashes@1.8.0': {} @@ -8670,10 +8477,6 @@ snapshots: '@types/cookiejar@2.1.5': {} - '@types/cron@2.4.3': - dependencies: - cron: 4.4.0 - '@types/crypto-js@4.2.2': {} '@types/eslint-scope@3.7.7': @@ -8792,8 +8595,6 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@types/safe-regex@1.1.6': {} - '@types/send@1.2.1': dependencies: '@types/node': 24.12.2 @@ -9155,10 +8956,6 @@ snapshots: balanced-match@4.0.4: {} - base32-encode@2.0.0: - dependencies: - to-data-view: 2.0.0 - base64-js@1.5.1: {} baseline-browser-mapping@2.10.20: {} @@ -9562,10 +9359,6 @@ snapshots: nan: 2.26.2 optional: true - crc@4.3.2(buffer@6.0.3): - optionalDependencies: - buffer: 6.0.3 - create-hash@1.2.0: dependencies: cipher-base: 1.0.7 @@ -9627,12 +9420,8 @@ snapshots: decamelize@1.2.0: {} - decode-uri-component@0.4.1: {} - dedent@1.7.2: {} - deepmerge@3.3.0: {} - deepmerge@4.3.1: {} default-browser-id@5.0.1: {} @@ -9673,14 +9462,8 @@ snapshots: dijkstrajs@1.0.3: {} - dotenv-expand@12.0.3: - dependencies: - dotenv: 16.6.1 - dotenv@16.6.1: {} - dotenv@17.2.3: {} - dotenv@17.3.1: {} dunder-proto@1.0.1: @@ -9905,10 +9688,6 @@ snapshots: fecha@4.2.3: {} - fetch-blob@4.0.0: - dependencies: - node-domexception: 1.0.0 - figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -9928,8 +9707,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - filter-obj@5.1.0: {} - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -10278,8 +10055,6 @@ snapshots: is-interactive@2.0.0: {} - is-network-error@1.3.1: {} - is-node-process@1.2.0: {} is-number@7.0.0: {} @@ -10453,41 +10228,21 @@ snapshots: typescript: 5.9.3 unbash: 2.2.0 yaml: 2.8.3 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' kuler@2.0.0: {} - langchain@1.3.3(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0): - dependencies: - '@langchain/core': 1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) - '@langchain/langgraph': 1.2.9(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(zod@4.3.6) - '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@1.1.40(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)) - langsmith: 0.5.20(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0) - uuid: 14.0.0 - zod: 4.3.6 - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - openai - - react - - react-dom - - svelte - - vue - - ws - - zod-to-json-schema - - langsmith@0.5.20(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0): + langsmith@0.5.20(@opentelemetry/api@1.9.1)(@opentelemetry/sdk-trace-base@2.7.0(@opentelemetry/api@1.9.1))(openai@6.34.0(ws@8.20.0)(zod@4.4.3))(ws@8.20.0): dependencies: p-queue: 6.6.2 uuid: 14.0.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/sdk-trace-base': 2.7.0(@opentelemetry/api@1.9.1) - openai: 6.34.0(ws@8.20.0)(zod@4.3.6) + openai: 6.34.0(ws@8.20.0)(zod@4.4.3) ws: 8.20.0 libphonenumber-js@1.12.41: {} @@ -10801,8 +10556,6 @@ snapshots: node-addon-api@8.7.0: {} - node-domexception@1.0.0: {} - node-emoji@1.11.0: dependencies: lodash: 4.18.1 @@ -10892,10 +10645,10 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - openai@6.34.0(ws@8.20.0)(zod@4.3.6): + openai@6.34.0(ws@8.20.0)(zod@4.4.3): optionalDependencies: ws: 8.20.0 - zod: 4.3.6 + zod: 4.4.3 optional: true ora@5.4.1: @@ -10979,10 +10732,6 @@ snapshots: eventemitter3: 5.0.4 p-timeout: 7.0.1 - p-retry@7.1.1: - dependencies: - is-network-error: 1.3.1 - p-timeout@3.2.0: dependencies: p-finally: 1.0.0 @@ -11160,12 +10909,6 @@ snapshots: dependencies: side-channel: 1.1.0 - query-string@9.3.1: - dependencies: - decode-uri-component: 0.4.1 - filter-obj: 5.1.0 - split-on-first: 3.0.0 - queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -11472,8 +11215,6 @@ snapshots: dependencies: memory-pager: 1.5.0 - split-on-first@3.0.0: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -11707,8 +11448,6 @@ snapshots: safe-buffer: 5.2.1 typed-array-buffer: 1.0.3 - to-data-view@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -11805,7 +11544,7 @@ snapshots: dependencies: '@electric-sql/pglite': 0.4.4 - typeorm@0.3.28(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)): + typeorm@0.3.28(mongodb@7.1.1(socks@2.8.7))(mysql2@3.22.1(@types/node@24.12.2))(oracledb@6.10.0)(pg-query-stream@4.14.0(pg@8.20.0))(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ts-node@10.9.2(@types/node@24.12.2)(typescript@5.9.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 @@ -11823,6 +11562,7 @@ snapshots: uuid: 14.0.0 yargs: 17.7.2 optionalDependencies: + mongodb: 7.1.1(socks@2.8.7) mysql2: 3.22.1(@types/node@24.12.2) oracledb: 6.10.0 pg: 8.20.0 @@ -12094,4 +11834,4 @@ snapshots: yoctocolors@2.1.2: {} - zod@4.3.6: {} + zod@4.4.3: {}