Compare commits

...
Author SHA1 Message Date
Sonarly Claude Code 86fea3aaf2 Slow POST /metadata: SELECT DISTINCT on fieldMetadata takes 1.4s, total 3.7s
https://sonarly.com/issue/3801?type=bug

The `POST /metadata` GraphQL endpoint takes 3.67s due to a `SELECT DISTINCT` query on `core.fieldMetadata` (1.37s) generated by NestJS-Query's `@CursorConnection` auto-resolver, plus ~2.3s of post-query GraphQL field resolution overhead.

Fix: ## Root Cause

`@CursorConnection('fields', () => FieldMetadataDTO)` on `ObjectMetadataDTO` causes NestJS-Query to auto-generate a resolver that executes:

```sql
SELECT DISTINCT "fields"."workspaceId", ... /* 26 columns, 4 JSONB */
FROM "core"."fieldMetadata" "fields"
WHERE "fields"."workspaceId" = $1
  AND "fields"."objectMetadataId" IN ($2, ..., $39)
LIMIT 1001
```

The `DISTINCT` deduplication across 4 JSONB columns takes 1,371ms. An optimized `fieldsList` ResolveField already exists — it uses a DataLoader backed by `WorkspaceManyOrAllFlatEntityMapsCacheService` (local 100ms TTL → Redis → provider recompute).

## Fix

### 1. Remove the slow `@CursorConnection` decorator

```typescript file=packages/twenty-server/src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto.ts
// REMOVED:
// @CursorConnection('fields', () => FieldMetadataDTO)
// Also removed: import { FieldMetadataDTO } from '...field-metadata.dto'
@CursorConnection('indexMetadatas', () => IndexMetadataDTO)
export class ObjectMetadataDTO { ... }
```

The `fieldsList` ResolveField (DataLoader path) remains as the correct, cache-backed way to fetch fields.

### 2. Update the internal REST API caller

```typescript file=packages/twenty-server/src/engine/api/rest/metadata/query-builder/utils/fetch-metadata-fields.utils.ts lines=70-76
const fieldsPart = selector?.fields
  ? `
  fieldsList {
    ${fieldsSelection}
  }
`
  : '';
```

### 3. Update the Zapier integration (3 files)

`requestDb.ts` — replace the cursor connection query with `fieldsList`:
```typescript
fieldsList {
  type name label description isNullable isActive defaultValue
}
```

`data.types.ts` — update `Node` type:
```typescript
export type Node = {
  nameSingular: string;
  namePlural: string;
  labelSingular: string;
  fieldsList: NodeField[];  // was: fields: { edges: { node: NodeField }[] }
};
// NodeField gains: isActive: boolean
```

`computeInputFields.ts` — preserve active-field-only filtering at the client level:
```typescript
for (const nodeField of node.fieldsList.filter((f) => f.isActive)) {
  // was: for (const field of node.fields.edges) { const nodeField = field.node;
```

## Impact

- Eliminates the 1,371ms `SELECT DISTINCT` query entirely.
- REST API response shape changes: `data.objects.edges[n].node.fields.edges[m].node` → `data.objects.edges[n].node.fieldsList[m]`. External REST consumers using the raw `/metadata/objects` endpoint with field selectors will need to update their response parsing.
- The top-level `fields(paging: ...)` GraphQL query (on `FieldMetadataDTO`) is a separate resolver and is **not** affected.
2026-03-06 08:01:07 +00:00
Sonarly Claude Code a20a64dd15 Unconditional full table scan on every findMany GraphQL query
https://sonarly.com/issue/3791?type=bug

Every paginated findMany GraphQL query unconditionally executes a `SELECT * FROM table WHERE deletedAt IS NULL` full table scan via the aggregate query builder, even when no aggregated fields are requested. This adds 1.4s of latency on large tables.

Fix: The fix adds a guard before calling `aggregateQueryBuilder.getRawOne()` to skip the expensive aggregate query when no aggregated fields were requested by the client.

**Root cause recap**: `ProcessAggregateHelper.addSelectedAggregatedFieldsQueriesToQueryBuilder` resets the SELECT clause with `queryBuilder.select([])`. If no aggregate fields are requested, nothing is re-added, leaving an empty SELECT. TypeORM resolves an empty SELECT to `SELECT *`, and `getRawOne()` does not add a `LIMIT 1`, resulting in a full table scan on every `findMany` call.

**The fix** (already applied at lines 194–199):

```typescript file=packages/twenty-server/src/engine/api/common/common-query-runners/common-find-many-query-runner.service.ts lines=194-199
const hasAggregatedFields =
  Object.keys(args.selectedFieldsResult.aggregate ?? {}).length > 0;

const parentObjectRecordsAggregatedValues = hasAggregatedFields
  ? await aggregateQueryBuilder.getRawOne()
  : undefined;
```

Before this fix, the code was:
```typescript
const parentObjectRecordsAggregatedValues =
  await aggregateQueryBuilder.getRawOne();
```

When `hasAggregatedFields` is `false` (the common case when clients don't request `totalCount` or other aggregates), the aggregate query is skipped entirely, eliminating the full table scan. The result is `undefined`, which is correctly handled by all downstream consumers (`?.totalCount` optional chaining, `isDefined` checks).
2026-03-06 07:59:04 +00:00
Sonarly Claude Code 9ceb307bc0 DataSourceEntity query takes 2.9s due to core DB pool contention on schema cache miss
https://sonarly.com/issue/3786?type=bug

The `FindManyLaTickets` GraphQL query took 3.9s because a trivial metadata lookup (`core.dataSource`) consumed 2913ms during a GraphQL schema cache miss, likely due to connection pool contention on the core TypeORM datasource which uses default pool settings.

Fix: Two minimal changes targeting both identified root causes:

### Fix 1 — Eliminate double schema-build per pod restart (`middleware.service.ts`)

**Root cause**: When Redis is cold (pod restart / metadata version cache eviction), `hydrateGraphqlRequest` passes `undefined` as `metadataVersion` to the request. The patched Yoga library turns `undefined` into `'0'` for the schema cache key. Later, inside `createGraphQLSchema`, the factory falls back to `workspace.metadataVersion` (e.g. `313`), stores that in Redis, and the schema is cached under key `…-313-…`. The **second** request reads `313` from Redis, produces key `…-313-…` → **cache miss** again. This causes two full `createGraphQLSchema` executions per workspace per pod restart instead of one.

**Fix**: Fall back to `data.workspace?.metadataVersion` when Redis returns `undefined`, exactly matching the fallback in `WorkspaceSchemaFactory.createGraphQLSchema()`:

```typescript file=packages/twenty-server/src/engine/middlewares/middleware.service.ts
const cachedMetadataVersion = data.workspace
  ? await this.workspaceStorageCacheService.getMetadataVersion(data.workspace.id)
  : undefined;
// Fall back to the workspace entity's metadataVersion when Redis cache is
// cold (e.g. after a pod restart). This matches the fallback logic in
// WorkspaceSchemaFactory.createGraphQLSchema() so that the GraphQL-Yoga
// schema cache key is the same on the first and second request, preventing
// an unnecessary double schema-build cycle per pod restart.
const metadataVersion = cachedMetadataVersion ?? data.workspace?.metadataVersion;
bindDataToRequestObject(data, request, metadataVersion);
```

With this change the Yoga cache key on the first (cold) request uses the actual metadata version from the workspace entity rather than `'0'`, making it consistent with the key that will be used on all subsequent requests.

---

### Fix 2 — Make core DB pool size explicit and configurable (`core.datasource.ts`)

**Root cause**: The core TypeORM datasource had no explicit `max` pool setting, silently defaulting to `pg`'s built-in maximum of 10 connections. This pool is shared across all auth, metadata, and schema operations for every concurrent GraphQL request on the pod. With high concurrency the pool exhausts and even a trivially-indexed `SELECT` on `core.dataSource` waits ~2900ms for a connection.

**Fix**: Add an explicit `max` entry to the `extra` block, reading from the same `PG_POOL_MAX_CONNECTIONS` env var already used by workspace datasources (default `10`). This mirrors the workspace datasource pattern and lets operators tune it for their load:

```typescript file=packages/twenty-server/src/database/typeorm/core/core.datasource.ts
extra: {
  query_timeout: 15000,
  // Explicit pool ceiling so operators can tune it via PG_POOL_MAX_CONNECTIONS.
  // Mirrors the poolSize configuration used by the workspace datasource.
  max: parseInt(process.env.PG_POOL_MAX_CONNECTIONS ?? '10', 10),
},
```
2026-03-06 07:58:19 +00:00
Sonarly Claude Code 726969aa33 Slow POST /metadata: ViewEntity query with 6 LEFT JOINs takes 1.6s on cache miss
https://sonarly.com/issue/3775?type=bug

The `FindAllCoreViews` query generates a single SQL statement with 6 LEFT JOINs across 5 independent one-to-many relationships, creating a cartesian product explosion that takes 1618ms. Caching masks the issue for most requests, but cache misses cause ~2s page loads.

Fix: The `findByWorkspaceId` method in `view.service.ts` loaded 6 relations via TypeORM's default `join` strategy, which generates a **single SQL statement with 6 LEFT JOINs**. When 5 of those are independent one-to-many relationships (viewFields, viewFilters, viewSorts, viewGroups, viewFilterGroups), the result set explodes combinatorially — a view with 20 fields × 5 filters × 3 sorts × 5 groups × 2 filter groups yields 3,000 rows for a single view.

Two changes were made:

**1. Add `relationLoadStrategy: 'query'`** — instructs TypeORM to issue one `SELECT … WHERE viewId IN (…)` per relation instead of a single monolithic JOIN query. This avoids the cartesian product entirely. Available since TypeORM 0.3.12; the project uses 0.3.20.

**2. Remove the `'workspace'` relation** — the `workspace` ManyToOne (inherited from `WorkspaceRelatedEntity`) adds 30+ workspace columns to every row of the result set. It is not needed: `ViewDTO` only exposes `workspaceId` (a scalar column already on the view row), and no call site downstream uses `view.workspace`.

```typescript file=packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts lines=380-395
const views = await this.viewRepository.find({
  where: {
    workspaceId,
    deletedAt: IsNull(),
    ...(viewTypes && viewTypes.length > 0 && { type: In(viewTypes) }),
  },
  order: { position: 'ASC' },
  relations: [
    'viewFields',
    'viewFilters',
    'viewSorts',
    'viewGroups',
    'viewFilterGroups',
  ],
  relationLoadStrategy: 'query',
});
```

After the fix TypeORM will issue 6 lean, targeted queries (one per relation) rather than one 120-column cartesian-product query, reducing the expected cache-miss latency from ~1600ms to well under 100ms.
2026-03-06 07:51:43 +00:00
6 changed files with 631 additions and 26 deletions
+618
View File
@@ -0,0 +1,618 @@
[
{
"timestamp": 1772781738.142052,
"start_timestamp": 1772781738.142,
"exclusive_time": 0.052,
"op": "middleware.express",
"span_id": "fec9396f5609fd20",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "<anonymous>",
"origin": "auto.http.otel.express",
"data": {
"express.name": "<anonymous>",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "1985576209a18698"
},
{
"timestamp": 1772781738.142133,
"start_timestamp": 1772781738.142,
"exclusive_time": 0.133,
"op": "middleware.express",
"span_id": "eef5ff070f6d2acf",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "session",
"origin": "auto.http.otel.express",
"data": {
"express.name": "session",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "21d6f40cfb511982"
},
{
"timestamp": 1772781738.142262,
"start_timestamp": 1772781738.142,
"exclusive_time": 0.262,
"op": "middleware.express",
"span_id": "075f41509c84e088",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "jsonParser",
"origin": "auto.http.otel.express",
"data": {
"express.name": "jsonParser",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "c81e963dad9ebc6c"
},
{
"timestamp": 1772781738.143031,
"start_timestamp": 1772781738.143,
"exclusive_time": 0.031,
"op": "middleware.express",
"span_id": "fedd5f8bffce37d1",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "urlencodedParser",
"origin": "auto.http.otel.express",
"data": {
"express.name": "urlencodedParser",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "05184d48507d1fda"
},
{
"timestamp": 1772781738.143037,
"start_timestamp": 1772781738.143,
"exclusive_time": 0.037,
"op": "middleware.express",
"span_id": "4ce56c63d4ca8f6f",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "graphqlUploadExpressMiddleware",
"origin": "auto.http.otel.express",
"data": {
"express.name": "graphqlUploadExpressMiddleware",
"express.type": "middleware",
"http.route": "/metadata",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "0139f47bcfef11a0"
},
{
"timestamp": 1772781738.143035,
"start_timestamp": 1772781738.143,
"exclusive_time": 0.035,
"op": "middleware.express",
"span_id": "4afe30f8e48771bc",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "corsMiddleware",
"origin": "auto.http.otel.express",
"data": {
"express.name": "corsMiddleware",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "e6088cf8b370ed60"
},
{
"timestamp": 1772781738.143018,
"start_timestamp": 1772781738.143,
"exclusive_time": 0.018,
"op": "middleware.express",
"span_id": "b6f6f50a01f56a7a",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "jsonParser",
"origin": "auto.http.otel.express",
"data": {
"express.name": "jsonParser",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "c81e963dad9ebc6c"
},
{
"timestamp": 1772781738.143016,
"start_timestamp": 1772781738.143,
"exclusive_time": 0.016,
"op": "middleware.express",
"span_id": "b04d827dd8698ca1",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "urlencodedParser",
"origin": "auto.http.otel.express",
"data": {
"express.name": "urlencodedParser",
"express.type": "middleware",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "05184d48507d1fda"
},
{
"timestamp": 1772781738.148397,
"start_timestamp": 1772781738.143,
"exclusive_time": 2.535,
"op": "request_handler.express",
"span_id": "fb69f0d7fdf0b807",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "/metadata",
"origin": "auto.http.otel.express",
"data": {
"express.name": "/metadata",
"express.type": "request_handler",
"http.route": "/metadata",
"sentry.op": "request_handler.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"op": "request_handler.express",
"status": "ok",
"trace.status": "ok",
"name": "request_handler.express"
},
"hash": "f0fa4b47d47d39bf"
},
{
"timestamp": 1772781738.144984,
"start_timestamp": 1772781738.144,
"exclusive_time": 0.984,
"op": "db",
"span_id": "b35d30ad99620864",
"parent_span_id": "fb69f0d7fdf0b807",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "SELECT \"WorkspaceEntity\".\"id\" AS \"WorkspaceEntity_id\", \"WorkspaceEntity\".\"displayName\" AS \"WorkspaceEntity_displayName\", \"WorkspaceEntity\".\"logo\" AS \"WorkspaceEntity_logo\", \"WorkspaceEntity\".\"logoFileId\" AS \"WorkspaceEntity_logoFileId\", \"WorkspaceEntity\".\"inviteHash\" AS \"WorkspaceEntity_inviteHash\", \"WorkspaceEntity\".\"deletedAt\" AS \"WorkspaceEntity_deletedAt\", \"WorkspaceEntity\".\"createdAt\" AS \"WorkspaceEntity_createdAt\", \"WorkspaceEntity\".\"updatedAt\" AS \"WorkspaceEntity_updatedAt\", \"WorkspaceEntity\".\"allowImpersonation\" AS \"WorkspaceEntity_allowImpersonation\", \"WorkspaceEntity\".\"isPublicInviteLinkEnabled\" AS \"WorkspaceEntity_isPublicInviteLinkEnabled\", \"WorkspaceEntity\".\"trashRetentionDays\" AS \"WorkspaceEntity_trashRetentionDays\", \"WorkspaceEntity\".\"eventLogRetentionDays\" AS \"WorkspaceEntity_eventLogRetentionDays\", \"WorkspaceEntity\".\"activationStatus\" AS \"WorkspaceEntity_activationStatus\", \"WorkspaceEntity\".\"suspendedAt\" AS \"WorkspaceEntity_suspendedAt\", \"WorkspaceEntity\".\"metadataVersion\" AS \"WorkspaceEntity_metadataVersion\", \"WorkspaceEntity\".\"databaseUrl\" AS \"WorkspaceEntity_databaseUrl\", \"WorkspaceEntity\".\"databaseSchema\" AS \"WorkspaceEntity_databaseSchema\", \"WorkspaceEntity\".\"subdomain\" AS \"WorkspaceEntity_subdomain\", \"WorkspaceEntity\".\"customDomain\" AS \"WorkspaceEntity_customDomain\", \"WorkspaceEntity\".\"isGoogleAuthEnabled\" AS \"WorkspaceEntity_isGoogleAuthEnabled\", \"WorkspaceEntity\".\"isGoogleAuthBypassEnabled\" AS \"WorkspaceEntity_isGoogleAuthBypassEnabled\", \"WorkspaceEntity\".\"isTwoFactorAuthenticationEnforced\" AS \"WorkspaceEntity_isTwoFactorAuthenticationEnforced\", \"WorkspaceEntity\".\"isPasswordAuthEnabled\" AS \"WorkspaceEntity_isPasswordAuthEnabled\", \"WorkspaceEntity\".\"isPasswordAuthBypassEnabled\" AS \"WorkspaceEntity_isPasswordAuthBypassEnabled\", \"WorkspaceEntity\".\"isMicrosoftAuthEnabled\" AS \"WorkspaceEntity_isMicrosoftAuthEnabled\", \"WorkspaceEntity\".\"isMicrosoftAuthBypassEnabled\" AS \"WorkspaceEntity_isMicrosoftAuthBypassEnabled\", \"WorkspaceEntity\".\"isCustomDomainEnabled\" AS \"WorkspaceEntity_isCustomDomainEnabled\", \"WorkspaceEntity\".\"editableProfileFields\" AS \"WorkspaceEntity_editableProfileFields\", \"WorkspaceEntity\".\"defaultRoleId\" AS \"WorkspaceEntity_defaultRoleId\", \"WorkspaceEntity\".\"version\" AS \"WorkspaceEntity_version\", \"WorkspaceEntity\".\"fastModel\" AS \"WorkspaceEntity_fastModel\", \"WorkspaceEntity\".\"smartModel\" AS \"WorkspaceEntity_smartModel\", \"WorkspaceEntity\".\"aiAdditionalInstructions\" AS \"WorkspaceEntity_aiAdditionalInstructions\", \"WorkspaceEntity\".\"workspaceCustomApplicationId\" AS \"WorkspaceEntity_workspaceCustomApplicationId\", \"WorkspaceEntity\".\"routerModel\" AS \"WorkspaceEntity_routerModel\" FROM \"core\".\"workspace\" \"WorkspaceEntity\" WHERE ( ((\"WorkspaceEntity\".\"id\" = $1)) ) AND ( \"WorkspaceEntity\".\"deletedAt\" IS NULL ) LIMIT 1",
"origin": "auto.db.otel.postgres",
"data": {
"db.system": "postgresql",
"db.connection_string": "postgresql://rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com:5432/default",
"db.name": "default",
"db.statement": "[Filtered]",
"db.user": "postgres",
"net.peer.name": "rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com",
"net.peer.port": 5432,
"otel.kind": "CLIENT",
"sentry.op": "db",
"sentry.origin": "auto.db.otel.postgres"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"action": "SELECT",
"category": "db",
"description": "SELECT .. FROM workspace WorkspaceEntity WHERE (id = %s) AND (deletedAt IS NULL) LIMIT %s",
"domain": ",workspace,",
"group": "7ae6cffe655e522d",
"op": "db",
"status": "ok",
"system": "postgresql",
"trace.status": "ok",
"name": "Database operation"
},
"hash": "10003206e3a65547"
},
{
"timestamp": 1772781738.146878,
"start_timestamp": 1772781738.145,
"exclusive_time": 1.878,
"op": "db",
"span_id": "c68a47d95e1ff803",
"parent_span_id": "fb69f0d7fdf0b807",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "SELECT ApiKeyEntity.workspaceId AS ApiKeyEntity_workspaceId, ApiKeyEntity.id AS ApiKeyEntity_id,\n ApiKeyEntity.name AS ApiKeyEntity_name, ApiKeyEntity.expiresAt AS ApiKeyEntity_expiresAt,\n ApiKeyEntity.revokedAt AS ApiKeyEntity_revokedAt, ApiKeyEntity.createdAt AS ApiKeyEntity_createdAt,\n ApiKeyEntity.updatedAt AS ApiKeyEntity_updatedAt\nFROM core.apiKey ApiKeyEntity\nWHERE ((ApiKeyEntity.id = $1)\n AND (ApiKeyEntity.workspaceId = $2))\nLIMIT 1",
"origin": "auto.db.otel.postgres",
"data": {
"db.system": "postgresql",
"db.connection_string": "postgresql://rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com:5432/default",
"db.name": "default",
"db.statement": "[Filtered]",
"db.user": "postgres",
"net.peer.name": "rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com",
"net.peer.port": 5432,
"otel.kind": "CLIENT",
"sentry.op": "db",
"sentry.origin": "auto.db.otel.postgres"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"action": "SELECT",
"category": "db",
"description": "SELECT .. FROM apiKey ApiKeyEntity WHERE ((id = %s) AND (workspaceId = %s)) LIMIT %s",
"domain": ",apikey,",
"group": "42f44e9dae659539",
"op": "db",
"status": "ok",
"system": "postgresql",
"trace.status": "ok",
"name": "Database operation"
},
"hash": "da0f4085d4b70672"
},
{
"timestamp": 1772781738.148054,
"start_timestamp": 1772781738.148,
"exclusive_time": 0.054,
"op": "request_handler.express",
"span_id": "e69dc56d5bdfbda3",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "/metadata",
"origin": "auto.http.otel.express",
"data": {
"express.name": "/metadata",
"express.type": "request_handler",
"http.route": "/metadata",
"sentry.op": "request_handler.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"op": "request_handler.express",
"status": "ok",
"trace.status": "ok",
"name": "request_handler.express"
},
"hash": "f0fa4b47d47d39bf"
},
{
"timestamp": 1772781741.809261,
"start_timestamp": 1772781738.148,
"exclusive_time": 2285.148,
"op": "middleware.express",
"span_id": "775cc52065a01e79",
"parent_span_id": "dd1853cf21e97142",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "<anonymous>",
"origin": "auto.http.otel.express",
"data": {
"express.name": "<anonymous>",
"express.type": "middleware",
"http.route": "/metadata",
"sentry.op": "middleware.express",
"sentry.origin": "auto.http.otel.express"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"category": "middleware",
"op": "middleware.express",
"status": "ok",
"trace.status": "ok",
"name": "middleware.express"
},
"hash": "1985576209a18698"
},
{
"timestamp": 1772781738.156385,
"start_timestamp": 1772781738.151,
"exclusive_time": 5.385,
"op": "db",
"span_id": "75e445cd0fd0df19",
"parent_span_id": "775cc52065a01e79",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "SELECT \"ObjectMetadataEntity\".\"workspaceId\" AS \"ObjectMetadataEntity_workspaceId\", \"ObjectMetadataEntity\".\"universalIdentifier\" AS \"ObjectMetadataEntity_universalIdentifier\", \"ObjectMetadataEntity\".\"applicationId\" AS \"ObjectMetadataEntity_applicationId\", \"ObjectMetadataEntity\".\"id\" AS \"ObjectMetadataEntity_id\", \"ObjectMetadataEntity\".\"dataSourceId\" AS \"ObjectMetadataEntity_dataSourceId\", \"ObjectMetadataEntity\".\"nameSingular\" AS \"ObjectMetadataEntity_nameSingular\", \"ObjectMetadataEntity\".\"namePlural\" AS \"ObjectMetadataEntity_namePlural\", \"ObjectMetadataEntity\".\"labelSingular\" AS \"ObjectMetadataEntity_labelSingular\", \"ObjectMetadataEntity\".\"labelPlural\" AS \"ObjectMetadataEntity_labelPlural\", \"ObjectMetadataEntity\".\"description\" AS \"ObjectMetadataEntity_description\", \"ObjectMetadataEntity\".\"icon\" AS \"ObjectMetadataEntity_icon\", \"ObjectMetadataEntity\".\"standardOverrides\" AS \"ObjectMetadataEntity_standardOverrides\", \"ObjectMetadataEntity\".\"targetTableName\" AS \"ObjectMetadataEntity_targetTableName\", \"ObjectMetadataEntity\".\"isCustom\" AS \"ObjectMetadataEntity_isCustom\", \"ObjectMetadataEntity\".\"isRemote\" AS \"ObjectMetadataEntity_isRemote\", \"ObjectMetadataEntity\".\"isActive\" AS \"ObjectMetadataEntity_isActive\", \"ObjectMetadataEntity\".\"isSystem\" AS \"ObjectMetadataEntity_isSystem\", \"ObjectMetadataEntity\".\"isUIReadOnly\" AS \"ObjectMetadataEntity_isUIReadOnly\", \"ObjectMetadataEntity\".\"isAuditLogged\" AS \"ObjectMetadataEntity_isAuditLogged\", \"ObjectMetadataEntity\".\"isSearchable\" AS \"ObjectMetadataEntity_isSearchable\", \"ObjectMetadataEntity\".\"duplicateCriteria\" AS \"ObjectMetadataEntity_duplicateCriteria\", \"ObjectMetadataEntity\".\"shortcut\" AS \"ObjectMetadataEntity_shortcut\", \"ObjectMetadataEntity\".\"labelIdentifierFieldMetadataId\" AS \"ObjectMetadataEntity_labelIdentifierFieldMetadataId\", \"ObjectMetadataEntity\".\"imageIdentifierFieldMetadataId\" AS \"ObjectMetadataEntity_imageIdentifierFieldMetadataId\", \"ObjectMetadataEntity\".\"isLabelSyncedWithName\" AS \"ObjectMetadataEntity_isLabelSyncedWithName\", \"ObjectMetadataEntity\".\"createdAt\" AS \"ObjectMetadataEntity_createdAt\", \"ObjectMetadataEntity\".\"updatedAt\" AS \"ObjectMetadataEntity_updatedAt\" FROM \"core\".\"objectMetadata\" \"ObjectMetadataEntity\" WHERE (\"ObjectMetadataEntity\".\"workspaceId\" = $1) ORDER BY \"ObjectMetadataEntity\".\"id\" DESC LIMIT 1001",
"origin": "auto.db.otel.postgres",
"data": {
"db.system": "postgresql",
"db.connection_string": "postgresql://rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com:5432/default",
"db.name": "default",
"db.statement": "SELECT \"ObjectMetadataEntity\".\"workspaceId\" AS \"ObjectMetadataEntity_workspaceId\", \"ObjectMetadataEntity\".\"universalIdentifier\" AS \"ObjectMetadataEntity_universalIdentifier\", \"ObjectMetadataEntity\".\"applicationId\" AS \"ObjectMetadataEntity_applicationId\", \"ObjectMetadataEntity\".\"id\" AS \"ObjectMetadataEntity_id\", \"ObjectMetadataEntity\".\"dataSourceId\" AS \"ObjectMetadataEntity_dataSourceId\", \"ObjectMetadataEntity\".\"nameSingular\" AS \"ObjectMetadataEntity_nameSingular\", \"ObjectMetadataEntity\".\"namePlural\" AS \"ObjectMetadataEntity_namePlural\", \"ObjectMetadataEntity\".\"labelSingular\" AS \"ObjectMetadataEntity_labelSingular\", \"ObjectMetadataEntity\".\"labelPlural\" AS \"ObjectMetadataEntity_labelPlural\", \"ObjectMetadataEntity\".\"description\" AS \"ObjectMetadataEntity_description\", \"ObjectMetadataEntity\".\"icon\" AS \"ObjectMetadataEntity_icon\", \"ObjectMetadataEntity\".\"standardOverrides\" AS \"ObjectMetadataEntity_standardOverrides\", \"ObjectMetadataEntity\".\"targetTableName\" AS \"ObjectMetadataEntity_targetTableName\", \"ObjectMetadataEntity\".\"isCustom\" AS \"ObjectMetadataEntity_isCustom\", \"ObjectMetadataEntity\".\"isRemote\" AS \"ObjectMetadataEntity_isRemote\", \"ObjectMetadataEntity\".\"isActive\" AS \"ObjectMetadataEntity_isActive\", \"ObjectMetadataEntity\".\"isSystem\" AS \"ObjectMetadataEntity_isSystem\", \"ObjectMetadataEntity\".\"isUIReadOnly\" AS \"ObjectMetadataEntity_isUIReadOnly\", \"ObjectMetadataEntity\".\"isAuditLogged\" AS \"ObjectMetadataEntity_isAuditLogged\", \"ObjectMetadataEntity\".\"isSearchable\" AS \"ObjectMetadataEntity_isSearchable\", \"ObjectMetadataEntity\".\"duplicateCriteria\" AS \"ObjectMetadataEntity_duplicateCriteria\", \"ObjectMetadataEntity\".\"shortcut\" AS \"ObjectMetadataEntity_shortcut\", \"ObjectMetadataEntity\".\"labelIdentifierFieldMetadataId\" AS \"ObjectMetadataEntity_labelIdentifierFieldMetadataId\", \"ObjectMetadataEntity\".\"imageIdentifierFieldMetadataId\" AS \"ObjectMetadataEntity_imageIdentifierFieldMetadataId\", \"ObjectMetadataEntity\".\"isLabelSyncedWithName\" AS \"ObjectMetadataEntity_isLabelSyncedWithName\", \"ObjectMetadataEntity\".\"createdAt\" AS \"ObjectMetadataEntity_createdAt\", \"ObjectMetadataEntity\".\"updatedAt\" AS \"ObjectMetadataEntity_updatedAt\" FROM \"core\".\"objectMetadata\" \"ObjectMetadataEntity\" WHERE (\"ObjectMetadataEntity\".\"workspaceId\" = $1) ORDER BY \"ObjectMetadataEntity\".\"id\" DESC LIMIT 1001",
"db.user": "postgres",
"net.peer.name": "rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com",
"net.peer.port": 5432,
"otel.kind": "CLIENT",
"sentry.op": "db",
"sentry.origin": "auto.db.otel.postgres"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"action": "SELECT",
"category": "db",
"description": "SELECT .. FROM objectMetadata ObjectMetadataEntity WHERE (workspaceId = %s) ORDER BY id DESC LIMIT %s",
"domain": ",objectmetadata,",
"group": "730016dbd8c96230",
"op": "db",
"status": "ok",
"system": "postgresql",
"trace.status": "ok",
"name": "Database operation"
},
"hash": "5bbef08c2b59a914"
},
{
"timestamp": 1772781739.563728,
"start_timestamp": 1772781738.193,
"exclusive_time": 1370.728,
"op": "db",
"span_id": "31bd7c7a2acf8ec6",
"parent_span_id": "775cc52065a01e79",
"trace_id": "802cc6b04825cf9c2ffed7cfb10633ad",
"status": "ok",
"description": "SELECT DISTINCT \"fields\".\"workspaceId\" AS \"fields_workspaceId\", \"fields\".\"universalIdentifier\" AS \"fields_universalIdentifier\", \"fields\".\"applicationId\" AS \"fields_applicationId\", \"fields\".\"id\" AS \"fields_id\", \"fields\".\"objectMetadataId\" AS \"fields_objectMetadataId\", \"fields\".\"type\" AS \"fields_type\", \"fields\".\"name\" AS \"fields_name\", \"fields\".\"label\" AS \"fields_label\", \"fields\".\"defaultValue\" AS \"fields_defaultValue\", \"fields\".\"description\" AS \"fields_description\", \"fields\".\"icon\" AS \"fields_icon\", \"fields\".\"standardOverrides\" AS \"fields_standardOverrides\", \"fields\".\"options\" AS \"fields_options\", \"fields\".\"settings\" AS \"fields_settings\", \"fields\".\"isCustom\" AS \"fields_isCustom\", \"fields\".\"isActive\" AS \"fields_isActive\", \"fields\".\"isSystem\" AS \"fields_isSystem\", \"fields\".\"isUIReadOnly\" AS \"fields_isUIReadOnly\", \"fields\".\"isNullable\" AS \"fields_isNullable\", \"fields\".\"isUnique\" AS \"fields_isUnique\", \"fields\".\"isLabelSyncedWithName\" AS \"fields_isLabelSyncedWithName\", \"fields\".\"relationTargetFieldMetadataId\" AS \"fields_relationTargetFieldMetadataId\", \"fields\".\"relationTargetObjectMetadataId\" AS \"fields_relationTargetObjectMetadataId\", \"fields\".\"morphId\" AS \"fields_morphId\", \"fields\".\"createdAt\" AS \"fields_createdAt\", \"fields\".\"updatedAt\" AS \"fields_updatedAt\" FROM \"core\".\"fieldMetadata\" \"fields\" WHERE (\"fields\".\"workspaceId\" = $1) AND \"fields\".\"objectMetadataId\" IN ($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) LIMIT 1001",
"origin": "auto.db.otel.postgres",
"data": {
"db.system": "postgresql",
"db.connection_string": "postgresql://rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com:5432/default",
"db.name": "default",
"db.statement": "SELECT DISTINCT \"fields\".\"workspaceId\" AS \"fields_workspaceId\", \"fields\".\"universalIdentifier\" AS \"fields_universalIdentifier\", \"fields\".\"applicationId\" AS \"fields_applicationId\", \"fields\".\"id\" AS \"fields_id\", \"fields\".\"objectMetadataId\" AS \"fields_objectMetadataId\", \"fields\".\"type\" AS \"fields_type\", \"fields\".\"name\" AS \"fields_name\", \"fields\".\"label\" AS \"fields_label\", \"fields\".\"defaultValue\" AS \"fields_defaultValue\", \"fields\".\"description\" AS \"fields_description\", \"fields\".\"icon\" AS \"fields_icon\", \"fields\".\"standardOverrides\" AS \"fields_standardOverrides\", \"fields\".\"options\" AS \"fields_options\", \"fields\".\"settings\" AS \"fields_settings\", \"fields\".\"isCustom\" AS \"fields_isCustom\", \"fields\".\"isActive\" AS \"fields_isActive\", \"fields\".\"isSystem\" AS \"fields_isSystem\", \"fields\".\"isUIReadOnly\" AS \"fields_isUIReadOnly\", \"fields\".\"isNullable\" AS \"fields_isNullable\", \"fields\".\"isUnique\" AS \"fields_isUnique\", \"fields\".\"isLabelSyncedWithName\" AS \"fields_isLabelSyncedWithName\", \"fields\".\"relationTargetFieldMetadataId\" AS \"fields_relationTargetFieldMetadataId\", \"fields\".\"relationTargetObjectMetadataId\" AS \"fields_relationTargetObjectMetadataId\", \"fields\".\"morphId\" AS \"fields_morphId\", \"fields\".\"createdAt\" AS \"fields_createdAt\", \"fields\".\"updatedAt\" AS \"fields_updatedAt\" FROM \"core\".\"fieldMetadata\" \"fields\" WHERE (\"fields\".\"workspaceId\" = $1) AND \"fields\".\"objectMetadataId\" IN ($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39) LIMIT 1001",
"db.user": "postgres",
"net.peer.name": "rds-prod-eu.cluster-cr4iu4oi4q7b.eu-central-1.rds.amazonaws.com",
"net.peer.port": 5432,
"otel.kind": "CLIENT",
"sentry.op": "db",
"sentry.origin": "auto.db.otel.postgres"
},
"sentry_tags": {
"release": "v1.18.1",
"user": "ip:::ffff:10.101.174.243",
"user.ip": "::ffff:10.101.174.243",
"environment": "prod",
"transaction": "POST /metadata",
"transaction.method": "POST",
"transaction.op": "http.server",
"browser.name": "axios",
"sdk.name": "sentry.javascript.node",
"sdk.version": "10.27.0",
"platform": "node",
"os.name": "Alpine Linux",
"action": "SELECT",
"category": "db",
"description": "SELECT DISTINCT .. FROM fieldMetadata fields WHERE (workspaceId = %s) AND objectMetadataId IN (%s) LIMIT %s",
"domain": ",fieldmetadata,",
"group": "41e8530d27d29a38",
"op": "db",
"status": "ok",
"system": "postgresql",
"trace.status": "ok",
"name": "Database operation"
},
"hash": "814db404888c0473"
}
]
@@ -69,12 +69,8 @@ export const fetchMetadataFields = (
const fieldsPart = selector?.fields
? `
fields(paging: { first: 1000 }) {
edges {
node {
${fieldsSelection}
}
}
fieldsList {
${fieldsSelection}
}
`
: '';
@@ -10,7 +10,6 @@ import {
import { type WorkspaceEntityDuplicateCriteria } from 'src/engine/api/graphql/workspace-query-builder/types/workspace-entity-duplicate-criteria.type';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto';
import { IndexMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-metadata.dto';
import { ObjectStandardOverridesDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-standard-overrides.dto';
@@ -26,7 +25,6 @@ import { ObjectStandardOverridesDTO } from 'src/engine/metadata-modules/object-m
disableSort: true,
maxResultsSize: 1000,
})
@CursorConnection('fields', () => FieldMetadataDTO)
@CursorConnection('indexMetadatas', () => IndexMetadataDTO)
export class ObjectMetadataDTO {
@IDField(() => UUIDScalarType)
@@ -218,8 +218,7 @@ export const computeInputFields = (
isRequired = false,
): InputField[] => {
const result = [];
for (const field of node.fields.edges) {
const nodeField = field.node;
for (const nodeField of node.fieldsList.filter((f) => f.isActive)) {
switch (nodeField.type) {
case FieldMetadataType.FULL_NAME:
case FieldMetadataType.CURRENCY:
@@ -8,6 +8,7 @@ export type NodeField = {
label: string;
description: string | null;
isNullable: boolean;
isActive: boolean;
defaultValue: boolean | object | null;
list?: boolean;
placeholder?: string;
@@ -17,11 +18,7 @@ export type Node = {
nameSingular: string;
namePlural: string;
labelSingular: string;
fields: {
edges: {
node: NodeField;
}[];
};
fieldsList: NodeField[];
};
export type InputField = {
+8 -11
View File
@@ -13,17 +13,14 @@ export const requestSchema = async (
nameSingular
namePlural
labelSingular
fields(paging: {first: 1000}, filter: {isActive: {is:true}}) {
edges {
node {
type
name
label
description
isNullable
defaultValue
}
}
fieldsList {
type
name
label
description
isNullable
isActive
defaultValue
}
}
}