From b86ada6d2b7642f557e6dd6d0f57bb3d0ca928f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20M?= Date: Fri, 17 Nov 2023 11:26:33 +0100 Subject: [PATCH] feat: rename tenant into workspace (#2553) * feat: rename tenant into workspace * fix: missing some files and reset not working * fix: wrong import * Use link in company seeds * Use link in company seeds --------- Co-authored-by: Charles Bochet --- .../server/basics/folder-architecture.mdx | 4 +- server/package.json | 2 +- server/src/app.module.ts | 12 +-- server/src/command.module.ts | 8 +- .../services/workspace.service.spec.ts | 4 +- .../workspace/services/workspace.service.ts | 8 +- server/src/core/workspace/workspace.module.ts | 4 +- ...mand.ts => data-seed-workspace.command.ts} | 28 +++---- .../commands/database-command.module.ts | 17 ++-- .../metadata/field-metadata/company.ts | 14 ++-- .../{tenant => workspace}/companies.ts | 0 .../{tenant => workspace}/people.ts | 0 .../{tenant => workspace}/view-fields.ts | 2 +- .../{tenant => workspace}/views.ts | 0 .../{tenant => workspace}/workspaceMember.ts | 0 .../1700140427984-setupMetadataTables.ts | 4 +- .../field-metadata/field-metadata.entity.ts | 2 +- .../field-metadata/field-metadata.module.ts | 8 +- .../field-metadata/field-metadata.service.ts | 16 ++-- ...rt-field-metadata-to-column-action.util.ts | 26 +++---- server/src/metadata/metadata.module.ts | 8 +- .../object-metadata/object-metadata.entity.ts | 2 +- .../object-metadata/object-metadata.module.ts | 8 +- .../object-metadata.service.ts | 18 ++--- .../relation-metadata.entity.ts | 2 +- .../relation-metadata.module.ts | 8 +- .../relation-metadata.service.ts | 18 ++--- .../migrations/1697618009-addCompanyTable.ts | 62 --------------- .../migrations/1697618011-addViewTable.ts | 32 -------- .../1697618015-addActivityTargetTable.ts | 32 -------- .../migrations/1697618017-addApiKeyTable.ts | 32 -------- .../migrations/1697618019-addCommentTable.ts | 32 -------- .../1697618023-addPipelineStepTable.ts | 32 -------- .../migrations/1697618024-addWebhookTable.ts | 27 ------- .../1697618027-addCompanyRelations.ts | 19 ----- .../1697618029-addPersonRelations.ts | 19 ----- .../tenant-migration/standard-migrations.ts | 54 ------------- .../tenant-migration.module.ts | 12 --- .../migrations/1697618009-addCompanyTable.ts | 72 +++++++++++++++++ .../migrations/1697618011-addViewTable.ts | 32 ++++++++ .../1697618012-addViewFieldTable.ts | 20 ++--- .../1697618013-addViewFilterTable.ts | 20 ++--- .../migrations/1697618014-addViewSortTable.ts | 16 ++-- .../1697618015-addActivityTargetTable.ts | 32 ++++++++ .../migrations/1697618016-addActivityTable.ts | 24 +++--- .../migrations/1697618017-addApiKeyTable.ts | 32 ++++++++ .../1697618018-addAttachmentTable.ts | 22 +++--- .../migrations/1697618019-addCommentTable.ts | 32 ++++++++ .../migrations/1697618020-addFavoriteTable.ts | 16 ++-- .../1697618021-addOpportunityTable.ts | 22 +++--- .../migrations/1697618022-addPersonTable.ts | 28 +++---- .../1697618023-addPipelineStepTable.ts | 32 ++++++++ .../migrations/1697618024-addWebhookTable.ts | 27 +++++++ .../1697618026-addWorspaceMemberTable.ts | 22 +++--- .../1697618027-addCompanyRelations.ts | 19 +++++ .../1697618028-addAttachmentRelations.ts | 16 ++-- .../1697618029-addPersonRelations.ts | 19 +++++ .../1697618030-addFavoriteRelations.ts | 14 ++-- .../1697618031-addOpportunityRelations.ts | 16 ++-- .../1697618032-addActivityTargetRelations.ts | 14 ++-- .../1697618033-addActivityRelations.ts | 12 +-- .../1697618034-addCommentRelations.ts | 12 +-- .../standard-migrations.ts | 54 +++++++++++++ .../workspace-migration.entity.ts} | 26 +++---- .../workspace-migration.module.ts | 12 +++ .../workspace-migration.service.ts} | 34 ++++---- .../tenant-manager-commands.module.ts | 12 --- .../standard-object-metadata.ts | 78 ------------------- .../standard-object-relation-metadata.ts | 15 ---- .../tenant-manager/tenant-manager.module.ts | 26 ------- .../commands/run-tenant-migrations.command.ts | 45 ----------- ...tenant-migration-runner-commands.module.ts | 12 --- .../tenant-migration-runner.module.ts | 13 ---- .../query-builder-options.interface.ts | 9 --- .../interfaces/resolvers-builder.interface.ts | 55 ------------- .../query-builder/query-builder.module.ts | 12 --- .../query-runner/query-runner.module.ts | 13 ---- .../factories/create-many-resolver.factory.ts | 32 -------- .../factories/create-one-resolver.factory.ts | 32 -------- .../factories/delete-one-resolver.factory.ts | 32 -------- .../factories/find-many-resolver.factory.ts | 32 -------- .../factories/find-one-resolver.factory.ts | 30 ------- .../factories/update-one-resolver.factory.ts | 32 -------- .../interfaces/record.interface.ts | 18 ----- .../resolver-builder-factory.interface.ts | 7 -- .../interfaces/resolvers-builder.interface.ts | 55 ------------- .../resolver-builder.module.ts | 14 ---- .../factories/mutation-type.factory.ts | 26 ------- .../factories/query-type.factory.ts | 26 ------- .../utils/object-contains-composite-field.ts | 11 --- server/src/tenant/tenant.module.ts | 23 ------ .../deduce-relation-direction.spec.ts | 4 +- .../utils/__tests__/get-resolver-name.spec.ts | 15 ++-- .../utils/deduce-relation-direction.util.ts | 2 +- .../utils/get-resolver-name.util.ts | 6 +- .../is-composite-field-metadata-type.util.ts | 0 .../workspace-datasource.module.ts} | 8 +- .../workspace-datasource.service.ts} | 2 +- .../sync-workspace-metadata.command.ts} | 14 ++-- .../workspace-manager-commands.module.ts | 12 +++ .../standard-objects-prefill-data/company.ts | 0 .../standard-objects-prefill-data/person.ts | 0 .../pipeline-step.ts | 0 .../standard-objects-prefill-data.ts | 8 +- .../standard-objects-prefill-data/view.ts | 0 .../standard-objects/activity-target.ts | 0 .../standard-objects/activity.ts | 0 .../standard-objects/api-key.ts | 0 .../standard-objects/attachment.ts | 0 .../standard-objects/comment.ts | 0 .../standard-objects/company.ts | 12 +-- .../standard-objects/favorite.ts | 0 .../standard-objects/opportunity.ts | 0 .../standard-objects/person.ts | 0 .../standard-objects/pipeline-step.ts | 0 .../standard-objects/relations/activity.ts | 0 .../standard-objects/relations/company.ts | 0 .../standard-objects/relations/person.ts | 0 .../relations/pipeline-step.ts | 0 .../standard-objects/relations/view.ts | 0 .../relations/workspace-member.ts | 0 .../standard-object-metadata.ts | 78 +++++++++++++++++++ .../standard-object-relation-metadata.ts | 15 ++++ .../standard-objects/view-field.ts | 0 .../standard-objects/view-filter.ts | 0 .../standard-objects/view-sort.ts | 0 .../standard-objects/view.ts | 0 .../standard-objects/webhook.ts | 0 .../standard-objects/workspace-member.ts | 0 .../workspace-manager.module.ts | 26 +++++++ .../workspace-manager.service.ts} | 32 ++++---- .../run-workspace-migrations.command.ts | 45 +++++++++++ ...kspace-migration-runner-commands.module.ts | 12 +++ .../utils/custom-table-default-column.util.ts | 0 .../workspace-migration-runner.module.ts | 13 ++++ .../workspace-migration-runner.service.ts} | 55 ++++++------- .../pg-graphql-query-builder.spec.ts | 0 .../factories/args-alias.factory.ts | 2 +- .../factories/args-string.factory.ts | 4 +- .../composite-field-alias.factory.ts | 8 +- .../factories/create-many-query.factory.ts | 10 +-- .../factories/delete-one-query.factory.ts | 6 +- .../factories/factories.ts | 2 +- .../factories/field-alias.factory.ts | 2 +- .../factories/fields-string.factory.ts | 4 +- .../factories/find-many-query.factory.ts | 11 ++- .../factories/find-one-query.factory.ts | 8 +- .../factories/update-one-query.factory.ts | 10 +-- .../interfaces/record.interface.ts | 3 + ...rkspace-query-builder-options.interface.ts | 9 +++ .../stringify-without-key-quote.spec.ts | 2 +- .../utils/get-field-arguments-by-key.util.ts | 0 .../utils/stringify-without-key-quote.util.ts | 0 .../workspace-query-builder.factory.ts} | 23 +++--- .../workspace-query-builder.module.ts | 12 +++ .../interfaces/pg-graphql.interface.ts | 2 +- .../query-runner-optionts.interface.ts | 4 +- .../utils/__tests__/parse-result.spec.ts | 2 +- .../utils/parse-result.util.ts | 0 .../workspace-query-runner.module.ts | 13 ++++ .../workspace-query-runner.service.ts} | 46 +++++------ .../factories/create-many-resolver.factory.ts | 36 +++++++++ .../factories/create-one-resolver.factory.ts | 36 +++++++++ .../factories/delete-one-resolver.factory.ts | 36 +++++++++ .../factories/factories.ts | 4 +- .../factories/find-many-resolver.factory.ts | 36 +++++++++ .../factories/find-one-resolver.factory.ts | 36 +++++++++ .../factories/update-one-resolver.factory.ts | 36 +++++++++ .../interfaces/pg-graphql.interface.ts | 2 +- ...pace-resolver-builder-factory.interface.ts | 7 ++ .../workspace-resolvers-builder.interface.ts | 59 ++++++++++++++ .../workspace-resolver-builder.module.ts | 14 ++++ .../workspace-resolver.factory.ts} | 26 +++---- .../factories/args.factory.ts | 10 +-- .../connection-type-definition.factory.ts | 8 +- .../factories/connection-type.factory.ts | 12 +-- .../factories/edge-type-definition.factory.ts | 8 +- .../factories/edge-type.factory.ts | 12 +-- .../extend-object-type-definition.factory.ts | 18 ++--- .../factories/factories.ts | 2 +- .../filter-type-definition.factory.ts | 12 +-- .../factories/filter-type.factory.ts | 10 +-- .../input-type-definition.factory.ts | 10 +-- .../factories/input-type.factory.ts | 10 +-- .../factories/mutation-type.factory.ts | 26 +++++++ .../object-type-definition.factory.ts | 10 +-- .../order-by-type-definition.factory.ts | 10 +-- .../factories/order-by-type.factory.ts | 10 +-- .../factories/orphaned-types.factory.ts | 2 +- .../factories/output-type.factory.ts | 10 +-- .../factories/query-type.factory.ts | 26 +++++++ .../factories/relation-type.factory.ts | 8 +- .../factories/root-type.factory.ts | 28 +++---- .../graphql-types/enum/index.ts | 0 .../enum/order-by-direction.enum-type.ts | 0 .../input/big-float-filter.input-type.ts | 0 .../input/big-int-filter.input-type.ts | 0 .../input/boolean-filter.input-type.ts | 0 .../input/date-filter.input-type.ts | 2 +- .../input/date-time-filter.input-type.ts | 2 +- .../input/float-filter.input-type.ts | 0 .../graphql-types/input/index.ts | 0 .../input/int-filter.input-type.ts | 0 .../input/string-filter.input-type.ts | 0 .../input/time-filter.input-type.ts | 2 +- .../input/uuid-filter.input-type.ts | 2 +- .../graphql-types/object/index.ts | 0 .../object/page-into.object-type.ts | 0 .../graphql-types/scalars/big-float.scalar.ts | 0 .../graphql-types/scalars/big-int.scalar.ts | 0 .../graphql-types/scalars/cursor.scalar.ts | 0 .../graphql-types/scalars/date-time.scalar.ts | 0 .../graphql-types/scalars/date.scalar.ts | 0 .../graphql-types/scalars/index.ts | 0 .../graphql-types/scalars/time.scalar.ts | 0 .../graphql-types/scalars/uuid.scalar.ts | 0 .../interfaces/field-metadata.interface.ts | 0 .../interfaces/object-metadata.interface.ts | 0 .../interfaces/param-metadata.interface.ts | 2 +- .../interfaces/relation-metadata.interface.ts | 0 ...kspace-build-schema-optionts.interface.ts} | 2 +- ...space-schema-builder-context.interface.ts} | 2 +- .../currency.object-definition.ts | 4 +- .../link.object-definition.ts | 4 +- .../services/type-mapper.service.ts | 6 +- .../storages/type-definitions.storage.ts | 4 +- .../type-definitions.generator.ts | 18 ++--- .../utils/__tests__/clean-entity-name.spec.ts | 2 +- .../__tests__/get-field-metadata-type.spec.ts | 2 +- .../utils/__tests__/get-resolver-args.spec.ts | 10 +-- .../utils/clean-entity-name.util.ts | 0 .../utils/get-field-metadata-type.util.ts | 0 .../utils/get-resolver-args.util.ts | 8 +- .../utils/object-contains-composite-field.ts | 11 +++ .../workspace-graphql-schema.factory.ts} | 16 ++-- .../workspace-schema-builder.module.ts} | 12 +-- .../workspace.factory.spec.ts} | 18 ++--- .../workspace.factory.ts} | 24 +++--- server/src/workspace/workspace.module.ts | 23 ++++++ 239 files changed, 1603 insertions(+), 1618 deletions(-) rename server/src/database/commands/{data-seed-tenant.command.ts => data-seed-workspace.command.ts} (61%) rename server/src/database/typeorm-seeds/{tenant => workspace}/companies.ts (100%) rename server/src/database/typeorm-seeds/{tenant => workspace}/people.ts (100%) rename server/src/database/typeorm-seeds/{tenant => workspace}/view-fields.ts (97%) rename server/src/database/typeorm-seeds/{tenant => workspace}/views.ts (100%) rename server/src/database/typeorm-seeds/{tenant => workspace}/workspaceMember.ts (100%) delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618009-addCompanyTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618011-addViewTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618015-addActivityTargetTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618017-addApiKeyTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618019-addCommentTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618023-addPipelineStepTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618024-addWebhookTable.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618027-addCompanyRelations.ts delete mode 100644 server/src/metadata/tenant-migration/migrations/1697618029-addPersonRelations.ts delete mode 100644 server/src/metadata/tenant-migration/standard-migrations.ts delete mode 100644 server/src/metadata/tenant-migration/tenant-migration.module.ts create mode 100644 server/src/metadata/workspace-migration/migrations/1697618009-addCompanyTable.ts create mode 100644 server/src/metadata/workspace-migration/migrations/1697618011-addViewTable.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618012-addViewFieldTable.ts (54%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618013-addViewFilterTable.ts (54%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618014-addViewSortTable.ts (53%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618015-addActivityTargetTable.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618016-addActivityTable.ts (53%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618017-addApiKeyTable.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618018-addAttachmentTable.ts (52%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618019-addCommentTable.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618020-addFavoriteTable.ts (50%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618021-addOpportunityTable.ts (53%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618022-addPersonTable.ts (53%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618023-addPipelineStepTable.ts create mode 100644 server/src/metadata/workspace-migration/migrations/1697618024-addWebhookTable.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618026-addWorspaceMemberTable.ts (53%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618027-addCompanyRelations.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618028-addAttachmentRelations.ts (57%) create mode 100644 server/src/metadata/workspace-migration/migrations/1697618029-addPersonRelations.ts rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618030-addFavoriteRelations.ts (55%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618031-addOpportunityRelations.ts (57%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618032-addActivityTargetRelations.ts (54%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618033-addActivityRelations.ts (52%) rename server/src/metadata/{tenant-migration => workspace-migration}/migrations/1697618034-addCommentRelations.ts (51%) create mode 100644 server/src/metadata/workspace-migration/standard-migrations.ts rename server/src/metadata/{tenant-migration/tenant-migration.entity.ts => workspace-migration/workspace-migration.entity.ts} (52%) create mode 100644 server/src/metadata/workspace-migration/workspace-migration.module.ts rename server/src/metadata/{tenant-migration/tenant-migration.service.ts => workspace-migration/workspace-migration.service.ts} (72%) delete mode 100644 server/src/tenant-manager/commands/tenant-manager-commands.module.ts delete mode 100644 server/src/tenant-manager/standard-objects/standard-object-metadata.ts delete mode 100644 server/src/tenant-manager/standard-objects/standard-object-relation-metadata.ts delete mode 100644 server/src/tenant-manager/tenant-manager.module.ts delete mode 100644 server/src/tenant-migration-runner/commands/run-tenant-migrations.command.ts delete mode 100644 server/src/tenant-migration-runner/commands/tenant-migration-runner-commands.module.ts delete mode 100644 server/src/tenant-migration-runner/tenant-migration-runner.module.ts delete mode 100644 server/src/tenant/query-builder/interfaces/query-builder-options.interface.ts delete mode 100644 server/src/tenant/query-builder/interfaces/resolvers-builder.interface.ts delete mode 100644 server/src/tenant/query-builder/query-builder.module.ts delete mode 100644 server/src/tenant/query-runner/query-runner.module.ts delete mode 100644 server/src/tenant/resolver-builder/factories/create-many-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/factories/create-one-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/factories/delete-one-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/factories/find-many-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/factories/find-one-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/factories/update-one-resolver.factory.ts delete mode 100644 server/src/tenant/resolver-builder/interfaces/record.interface.ts delete mode 100644 server/src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface.ts delete mode 100644 server/src/tenant/resolver-builder/interfaces/resolvers-builder.interface.ts delete mode 100644 server/src/tenant/resolver-builder/resolver-builder.module.ts delete mode 100644 server/src/tenant/schema-builder/factories/mutation-type.factory.ts delete mode 100644 server/src/tenant/schema-builder/factories/query-type.factory.ts delete mode 100644 server/src/tenant/schema-builder/utils/object-contains-composite-field.ts delete mode 100644 server/src/tenant/tenant.module.ts rename server/src/{tenant => workspace}/utils/__tests__/deduce-relation-direction.spec.ts (92%) rename server/src/{tenant => workspace}/utils/__tests__/get-resolver-name.spec.ts (57%) rename server/src/{tenant => workspace}/utils/deduce-relation-direction.util.ts (81%) rename server/src/{tenant => workspace}/utils/get-resolver-name.util.ts (72%) rename server/src/{tenant => workspace}/utils/is-composite-field-metadata-type.util.ts (100%) rename server/src/{tenant-datasource/tenant-datasource.module.ts => workspace/workspace-datasource/workspace-datasource.module.ts} (55%) rename server/src/{tenant-datasource/tenant-datasource.service.ts => workspace/workspace-datasource/workspace-datasource.service.ts} (98%) rename server/src/{tenant-manager/commands/sync-tenant-metadata.command.ts => workspace/workspace-manager/commands/sync-workspace-metadata.command.ts} (69%) create mode 100644 server/src/workspace/workspace-manager/commands/workspace-manager-commands.module.ts rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects-prefill-data/company.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects-prefill-data/person.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects-prefill-data/pipeline-step.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects-prefill-data/standard-objects-prefill-data.ts (67%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects-prefill-data/view.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/activity-target.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/activity.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/api-key.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/attachment.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/comment.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/company.ts (96%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/favorite.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/opportunity.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/person.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/pipeline-step.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/activity.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/company.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/person.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/pipeline-step.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/view.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/relations/workspace-member.ts (100%) create mode 100644 server/src/workspace/workspace-manager/standard-objects/standard-object-metadata.ts create mode 100644 server/src/workspace/workspace-manager/standard-objects/standard-object-relation-metadata.ts rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/view-field.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/view-filter.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/view-sort.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/view.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/webhook.ts (100%) rename server/src/{tenant-manager => workspace/workspace-manager}/standard-objects/workspace-member.ts (100%) create mode 100644 server/src/workspace/workspace-manager/workspace-manager.module.ts rename server/src/{tenant-manager/tenant-manager.service.ts => workspace/workspace-manager/workspace-manager.service.ts} (83%) create mode 100644 server/src/workspace/workspace-migration-runner/commands/run-workspace-migrations.command.ts create mode 100644 server/src/workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module.ts rename server/src/{tenant-migration-runner => workspace/workspace-migration-runner}/utils/custom-table-default-column.util.ts (100%) create mode 100644 server/src/workspace/workspace-migration-runner/workspace-migration-runner.module.ts rename server/src/{tenant-migration-runner/tenant-migration-runner.service.ts => workspace/workspace-migration-runner/workspace-migration-runner.service.ts} (75%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/__tests__/pg-graphql-query-builder.spec.ts (100%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/args-alias.factory.ts (94%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/args-string.factory.ts (85%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/composite-field-alias.factory.ts (89%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/create-many-query.factory.ts (68%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/delete-one-query.factory.ts (66%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/factories.ts (94%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/field-alias.factory.ts (86%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/fields-string.factory.ts (92%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/find-many-query.factory.ts (69%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/find-one-query.factory.ts (71%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/factories/update-one-query.factory.ts (67%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/interfaces/record.interface.ts (86%) create mode 100644 server/src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface.ts rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/utils/__tests__/stringify-without-key-quote.spec.ts (92%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/utils/get-field-arguments-by-key.util.ts (100%) rename server/src/{tenant/query-builder => workspace/workspace-query-builder}/utils/stringify-without-key-quote.util.ts (100%) rename server/src/{tenant/query-builder/query-builder.factory.ts => workspace/workspace-query-builder/workspace-query-builder.factory.ts} (72%) create mode 100644 server/src/workspace/workspace-query-builder/workspace-query-builder.module.ts rename server/src/{tenant/query-runner => workspace/workspace-query-runner}/interfaces/pg-graphql.interface.ts (72%) rename server/src/{tenant/query-runner => workspace/workspace-query-runner}/interfaces/query-runner-optionts.interface.ts (52%) rename server/src/{tenant/query-runner => workspace/workspace-query-runner}/utils/__tests__/parse-result.spec.ts (97%) rename server/src/{tenant/query-runner => workspace/workspace-query-runner}/utils/parse-result.util.ts (100%) create mode 100644 server/src/workspace/workspace-query-runner/workspace-query-runner.module.ts rename server/src/{tenant/query-runner/query-runner.service.ts => workspace/workspace-query-runner/workspace-query-runner.service.ts} (71%) create mode 100644 server/src/workspace/workspace-resolver-builder/factories/create-many-resolver.factory.ts create mode 100644 server/src/workspace/workspace-resolver-builder/factories/create-one-resolver.factory.ts create mode 100644 server/src/workspace/workspace-resolver-builder/factories/delete-one-resolver.factory.ts rename server/src/{tenant/resolver-builder => workspace/workspace-resolver-builder}/factories/factories.ts (89%) create mode 100644 server/src/workspace/workspace-resolver-builder/factories/find-many-resolver.factory.ts create mode 100644 server/src/workspace/workspace-resolver-builder/factories/find-one-resolver.factory.ts create mode 100644 server/src/workspace/workspace-resolver-builder/factories/update-one-resolver.factory.ts rename server/src/{tenant/resolver-builder => workspace/workspace-resolver-builder}/interfaces/pg-graphql.interface.ts (71%) create mode 100644 server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface.ts create mode 100644 server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts create mode 100644 server/src/workspace/workspace-resolver-builder/workspace-resolver-builder.module.ts rename server/src/{tenant/resolver-builder/resolver.factory.ts => workspace/workspace-resolver-builder/workspace-resolver.factory.ts} (78%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/args.factory.ts (81%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/connection-type-definition.factory.ts (84%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/connection-type.factory.ts (71%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/edge-type-definition.factory.ts (82%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/edge-type.factory.ts (70%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/extend-object-type-definition.factory.ts (84%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/factories.ts (97%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/filter-type-definition.factory.ts (80%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/filter-type.factory.ts (73%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/input-type-definition.factory.ts (80%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/input-type.factory.ts (74%) create mode 100644 server/src/workspace/workspace-schema-builder/factories/mutation-type.factory.ts rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/object-type-definition.factory.ts (79%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/order-by-type-definition.factory.ts (78%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/order-by-type.factory.ts (72%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/orphaned-types.factory.ts (83%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/output-type.factory.ts (74%) create mode 100644 server/src/workspace/workspace-schema-builder/factories/query-type.factory.ts rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/relation-type.factory.ts (79%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/factories/root-type.factory.ts (69%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/enum/index.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/enum/order-by-direction.enum-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/big-float-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/big-int-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/boolean-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/date-filter.input-type.ts (82%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/date-time-filter.input-type.ts (83%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/float-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/index.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/int-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/string-filter.input-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/time-filter.input-type.ts (82%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/input/uuid-filter.input-type.ts (75%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/object/index.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/object/page-into.object-type.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/big-float.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/big-int.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/cursor.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/date-time.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/date.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/index.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/time.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/graphql-types/scalars/uuid.scalar.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/interfaces/field-metadata.interface.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/interfaces/object-metadata.interface.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/interfaces/param-metadata.interface.ts (78%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/interfaces/relation-metadata.interface.ts (100%) rename server/src/{tenant/schema-builder/interfaces/build-schema-optionts.interface.ts => workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface.ts} (86%) rename server/src/{tenant/schema-builder/interfaces/schema-builder-context.interface.ts => workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface.ts} (78%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/object-definitions/currency.object-definition.ts (81%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/object-definitions/link.object-definition.ts (79%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/services/type-mapper.service.ts (94%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/storages/type-definitions.storage.ts (91%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/type-definitions.generator.ts (93%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/__tests__/clean-entity-name.spec.ts (87%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/__tests__/get-field-metadata-type.spec.ts (84%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/__tests__/get-resolver-args.spec.ts (75%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/clean-entity-name.util.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/get-field-metadata-type.util.ts (100%) rename server/src/{tenant/schema-builder => workspace/workspace-schema-builder}/utils/get-resolver-args.util.ts (80%) create mode 100644 server/src/workspace/workspace-schema-builder/utils/object-contains-composite-field.ts rename server/src/{tenant/schema-builder/graphql-schema.factory.ts => workspace/workspace-schema-builder/workspace-graphql-schema.factory.ts} (69%) rename server/src/{tenant/schema-builder/schema-builder.module.ts => workspace/workspace-schema-builder/workspace-schema-builder.module.ts} (64%) rename server/src/{tenant/tenant.service.spec.ts => workspace/workspace.factory.spec.ts} (58%) rename server/src/{tenant/tenant.service.ts => workspace/workspace.factory.ts} (63%) create mode 100644 server/src/workspace/workspace.module.ts diff --git a/docs/docs/contributor/server/basics/folder-architecture.mdx b/docs/docs/contributor/server/basics/folder-architecture.mdx index 32c5835371d..c4857b861a9 100644 --- a/docs/docs/contributor/server/basics/folder-architecture.mdx +++ b/docs/docs/contributor/server/basics/folder-architecture.mdx @@ -21,7 +21,7 @@ server └───health └───integrations └───metadata - └───tenant + └───workspace └───utils ``` @@ -51,7 +51,7 @@ Includes a publicly available REST API (healthz) that returns a JSON to confirm Defines custom objects and makes available a GraphQL API (graphql/metadata). -## Tenant +## Workspace Generates and serves custom GraphQL schema based on the metadata. diff --git a/server/package.json b/server/package.json index 703a33ba1b2..f36415e3d4d 100644 --- a/server/package.json +++ b/server/package.json @@ -33,7 +33,7 @@ "database:truncate": "npx ts-node ./scripts/truncate-db.ts", "database:migrate": "yarn typeorm:migrate && yarn prisma:migrate", "database:generate": "yarn prisma:generate", - "database:seed": "yarn prisma:seed && yarn build && yarn command tenant:seed", + "database:seed": "yarn prisma:seed && yarn build && yarn command workspace:seed", "database:reset": "yarn database:truncate && yarn database:init", "command": "node dist/src/command" }, diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 66f32356264..b39a5ab4d68 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -16,13 +16,13 @@ import { IntegrationsModule } from './integrations/integrations.module'; import { PrismaModule } from './database/prisma.module'; import { HealthModule } from './health/health.module'; import { AbilityModule } from './ability/ability.module'; -import { TenantModule } from './tenant/tenant.module'; +import { WorkspaceModule } from './workspace/workspace.module'; import { EnvironmentService } from './integrations/environment/environment.service'; import { JwtAuthStrategy, JwtPayload, } from './core/auth/strategies/jwt.auth.strategy'; -import { TenantService } from './tenant/tenant.service'; +import { WorkspaceFactory } from './workspace/workspace.factory'; import { ExceptionFilter } from './filters/exception.filter'; @Module({ @@ -73,15 +73,15 @@ import { ExceptionFilter } from './filters/exception.filter'; AppModule.moduleRef.registerRequestByContextId(request, contextId); // Get the SchemaGenerationService from the AppModule - const tenantService = await AppModule.moduleRef.resolve( - TenantService, + const workspaceFactory = await AppModule.moduleRef.resolve( + WorkspaceFactory, contextId, { strict: false, }, ); - return await tenantService.createTenantSchema(workspace.id); + return await workspaceFactory.createGraphQLSchema(workspace.id); } catch (error) { if (error instanceof JsonWebTokenError) { //mockedUserJWT @@ -109,7 +109,7 @@ import { ExceptionFilter } from './filters/exception.filter'; AbilityModule, IntegrationsModule, CoreModule, - TenantModule, + WorkspaceModule, ], providers: [ AppService, diff --git a/server/src/command.module.ts b/server/src/command.module.ts index f567b4c6e5f..6b64f214848 100644 --- a/server/src/command.module.ts +++ b/server/src/command.module.ts @@ -4,14 +4,14 @@ import { DatabaseCommandModule } from 'src/database/commands/database-command.mo import { AppModule } from './app.module'; -import { TenantManagerCommandsModule } from './tenant-manager/commands/tenant-manager-commands.module'; -import { TenantMigrationRunnerCommandsModule } from './tenant-migration-runner/commands/tenant-migration-runner-commands.module'; +import { WorkspaceManagerCommandsModule } from './workspace/workspace-manager/commands/workspace-manager-commands.module'; +import { WorkspaceMigrationRunnerCommandsModule } from './workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module'; @Module({ imports: [ AppModule, - TenantMigrationRunnerCommandsModule, - TenantManagerCommandsModule, + WorkspaceMigrationRunnerCommandsModule, + WorkspaceManagerCommandsModule, DatabaseCommandModule, ], }) diff --git a/server/src/core/workspace/services/workspace.service.spec.ts b/server/src/core/workspace/services/workspace.service.spec.ts index 6e3e9f80a7c..f782e8cbafa 100644 --- a/server/src/core/workspace/services/workspace.service.spec.ts +++ b/server/src/core/workspace/services/workspace.service.spec.ts @@ -7,7 +7,7 @@ import { PipelineStageService } from 'src/core/pipeline/services/pipeline-stage. import { PersonService } from 'src/core/person/person.service'; import { CompanyService } from 'src/core/company/company.service'; import { PipelineProgressService } from 'src/core/pipeline/services/pipeline-progress.service'; -import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service'; +import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service'; import { WorkspaceService } from './workspace.service'; @@ -43,7 +43,7 @@ describe('WorkspaceService', () => { useValue: {}, }, { - provide: TenantManagerService, + provide: WorkspaceManagerService, useValue: {}, }, ], diff --git a/server/src/core/workspace/services/workspace.service.ts b/server/src/core/workspace/services/workspace.service.ts index 075c2d96bdf..0cd817b4d8e 100644 --- a/server/src/core/workspace/services/workspace.service.ts +++ b/server/src/core/workspace/services/workspace.service.ts @@ -10,7 +10,7 @@ import { PipelineStageService } from 'src/core/pipeline/services/pipeline-stage. import { PipelineService } from 'src/core/pipeline/services/pipeline.service'; import { PrismaService } from 'src/database/prisma.service'; import { assert } from 'src/utils/assert'; -import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service'; +import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service'; @Injectable() export class WorkspaceService { @@ -21,7 +21,7 @@ export class WorkspaceService { private readonly personService: PersonService, private readonly pipelineStageService: PipelineStageService, private readonly pipelineProgressService: PipelineProgressService, - private readonly tenantManagerService: TenantManagerService, + private readonly workspaceManagerService: WorkspaceManagerService, ) {} // Find @@ -64,7 +64,7 @@ export class WorkspaceService { }); // Create workspace schema - await this.tenantManagerService.init(workspace.id); + await this.workspaceManagerService.init(workspace.id); // Create default companies const companies = await this.companyService.createDefaultCompanies({ @@ -161,7 +161,7 @@ export class WorkspaceService { this.delete({ where: { id: workspaceId } }), ]); - await this.tenantManagerService.delete(workspaceId); + await this.workspaceManagerService.delete(workspaceId); return workspace; } diff --git a/server/src/core/workspace/workspace.module.ts b/server/src/core/workspace/workspace.module.ts index 1bcbd1a90bc..16123a1e5f6 100644 --- a/server/src/core/workspace/workspace.module.ts +++ b/server/src/core/workspace/workspace.module.ts @@ -4,7 +4,7 @@ import { FileUploadService } from 'src/core/file/services/file-upload.service'; import { PipelineModule } from 'src/core/pipeline/pipeline.module'; import { CompanyModule } from 'src/core/company/company.module'; import { PersonModule } from 'src/core/person/person.module'; -import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module'; +import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module'; import { AbilityModule } from 'src/ability/ability.module'; import { PrismaModule } from 'src/database/prisma.module'; @@ -19,7 +19,7 @@ import { WorkspaceResolver } from './resolvers/workspace.resolver'; PipelineModule, CompanyModule, PersonModule, - TenantManagerModule, + WorkspaceManagerModule, PrismaModule, ], providers: [ diff --git a/server/src/database/commands/data-seed-tenant.command.ts b/server/src/database/commands/data-seed-workspace.command.ts similarity index 61% rename from server/src/database/commands/data-seed-tenant.command.ts rename to server/src/database/commands/data-seed-workspace.command.ts index c89e440dfaa..c7f501f3fd5 100644 --- a/server/src/database/commands/data-seed-tenant.command.ts +++ b/server/src/database/commands/data-seed-workspace.command.ts @@ -1,30 +1,30 @@ import { Command, CommandRunner } from 'nest-commander'; import { DataSourceService } from 'src/metadata/data-source/data-source.service'; -import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service'; -import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service'; -import { seedCompanies } from 'src/database/typeorm-seeds/tenant/companies'; -import { seedViewFields } from 'src/database/typeorm-seeds/tenant/view-fields'; -import { seedViews } from 'src/database/typeorm-seeds/tenant/views'; +import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service'; +import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service'; +import { seedCompanies } from 'src/database/typeorm-seeds/workspace/companies'; +import { seedViewFields } from 'src/database/typeorm-seeds/workspace/view-fields'; +import { seedViews } from 'src/database/typeorm-seeds/workspace/views'; import { TypeORMService } from 'src/database/typeorm/typeorm.service'; import { seedMetadataSchema } from 'src/database/typeorm-seeds/metadata'; -import { seedWorkspaceMember } from 'src/database/typeorm-seeds/tenant/workspaceMember'; -import { seedPeople } from 'src/database/typeorm-seeds/tenant/people'; +import { seedWorkspaceMember } from 'src/database/typeorm-seeds/workspace/workspaceMember'; +import { seedPeople } from 'src/database/typeorm-seeds/workspace/people'; // TODO: implement dry-run @Command({ - name: 'tenant:seed', + name: 'workspace:seed', description: - 'Seed tenant with initial data. This command is intended for development only.', + 'Seed workspace with initial data. This command is intended for development only.', }) -export class DataSeedTenantCommand extends CommandRunner { +export class DataSeedWorkspaceCommand extends CommandRunner { workspaceId = '20202020-1c25-4d02-bf25-6aeccf7ea419'; constructor( private readonly dataSourceService: DataSourceService, private readonly typeORMService: TypeORMService, - private readonly tenantMigrationService: TenantMigrationService, - private readonly migrationRunnerService: TenantMigrationRunnerService, + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, ) { super(); } @@ -46,10 +46,10 @@ export class DataSeedTenantCommand extends CommandRunner { try { await seedMetadataSchema(workspaceDataSource, 'metadata'); - await this.tenantMigrationService.insertStandardMigrations( + await this.workspaceMigrationService.insertStandardMigrations( this.workspaceId, ); - await this.migrationRunnerService.executeMigrationFromPendingMigrations( + await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( this.workspaceId, ); diff --git a/server/src/database/commands/database-command.module.ts b/server/src/database/commands/database-command.module.ts index 5057754ba37..7e70ddfa302 100644 --- a/server/src/database/commands/database-command.module.ts +++ b/server/src/database/commands/database-command.module.ts @@ -6,30 +6,29 @@ import { PipelineModule } from 'src/core/pipeline/pipeline.module'; import { CompanyModule } from 'src/core/company/company.module'; import { PersonModule } from 'src/core/person/person.module'; import { PrismaModule } from 'src/database/prisma.module'; -import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module'; +import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module'; import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; -import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module'; -import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module'; +import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; +import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module'; import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { WorkspaceModule } from 'src/core/workspace/workspace.module'; - -import { DataSeedTenantCommand } from './data-seed-tenant.command'; +import { DataSeedWorkspaceCommand } from 'src/database/commands/data-seed-workspace.command'; @Module({ imports: [ PipelineModule, CompanyModule, PersonModule, - TenantManagerModule, + WorkspaceManagerModule, PrismaModule, DataSourceModule, TypeORMModule, - TenantMigrationModule, - TenantMigrationRunnerModule, + WorkspaceMigrationModule, + WorkspaceMigrationRunnerModule, WorkspaceModule, ], providers: [ - DataSeedTenantCommand, + DataSeedWorkspaceCommand, DataCleanInactiveCommand, ConfirmationQuestion, ], diff --git a/server/src/database/typeorm-seeds/metadata/field-metadata/company.ts b/server/src/database/typeorm-seeds/metadata/field-metadata/company.ts index c77f97fbead..00eecfb15e2 100644 --- a/server/src/database/typeorm-seeds/metadata/field-metadata/company.ts +++ b/server/src/database/typeorm-seeds/metadata/field-metadata/company.ts @@ -192,11 +192,12 @@ export const seedCompanyFieldMetadata = async ( isCustom: false, workspaceId: SeedWorkspaceId, isActive: true, - type: FieldMetadataType.TEXT, - name: 'linkedinUrl', + type: FieldMetadataType.LINK, + name: 'linkedinLink', label: 'Linkedin', targetColumnMap: { - value: 'linkedinUrl', + label: 'linkedinLinkLabel', + url: 'linkedinLinkUrl', }, description: 'The company Linkedin account', icon: 'IconBrandLinkedin', @@ -210,11 +211,12 @@ export const seedCompanyFieldMetadata = async ( isCustom: false, workspaceId: SeedWorkspaceId, isActive: true, - type: FieldMetadataType.TEXT, - name: 'xUrl', + type: FieldMetadataType.LINK, + name: 'xLink', label: 'X', targetColumnMap: { - value: 'xUrl', + label: 'xLinkLabel', + url: 'xLinkUrl', }, description: 'The company Twitter/X account', icon: 'IconBrandX', diff --git a/server/src/database/typeorm-seeds/tenant/companies.ts b/server/src/database/typeorm-seeds/workspace/companies.ts similarity index 100% rename from server/src/database/typeorm-seeds/tenant/companies.ts rename to server/src/database/typeorm-seeds/workspace/companies.ts diff --git a/server/src/database/typeorm-seeds/tenant/people.ts b/server/src/database/typeorm-seeds/workspace/people.ts similarity index 100% rename from server/src/database/typeorm-seeds/tenant/people.ts rename to server/src/database/typeorm-seeds/workspace/people.ts diff --git a/server/src/database/typeorm-seeds/tenant/view-fields.ts b/server/src/database/typeorm-seeds/workspace/view-fields.ts similarity index 97% rename from server/src/database/typeorm-seeds/tenant/view-fields.ts rename to server/src/database/typeorm-seeds/workspace/view-fields.ts index 815977039bb..48943a33eab 100644 --- a/server/src/database/typeorm-seeds/tenant/view-fields.ts +++ b/server/src/database/typeorm-seeds/workspace/view-fields.ts @@ -1,6 +1,6 @@ import { DataSource } from 'typeorm'; -import { SeedViewIds } from 'src/database/typeorm-seeds/tenant/views'; +import { SeedViewIds } from 'src/database/typeorm-seeds/workspace/views'; import { SeedCompanyFieldMetadataIds } from 'src/database/typeorm-seeds/metadata/field-metadata/company'; const tableName = 'viewField'; diff --git a/server/src/database/typeorm-seeds/tenant/views.ts b/server/src/database/typeorm-seeds/workspace/views.ts similarity index 100% rename from server/src/database/typeorm-seeds/tenant/views.ts rename to server/src/database/typeorm-seeds/workspace/views.ts diff --git a/server/src/database/typeorm-seeds/tenant/workspaceMember.ts b/server/src/database/typeorm-seeds/workspace/workspaceMember.ts similarity index 100% rename from server/src/database/typeorm-seeds/tenant/workspaceMember.ts rename to server/src/database/typeorm-seeds/workspace/workspaceMember.ts diff --git a/server/src/database/typeorm/metadata/migrations/1700140427984-setupMetadataTables.ts b/server/src/database/typeorm/metadata/migrations/1700140427984-setupMetadataTables.ts index d873257d934..c1ab24296d0 100644 --- a/server/src/database/typeorm/metadata/migrations/1700140427984-setupMetadataTables.ts +++ b/server/src/database/typeorm/metadata/migrations/1700140427984-setupMetadataTables.ts @@ -20,7 +20,7 @@ export class SetupMetadataTables1700140427984 implements MigrationInterface { `CREATE TABLE "metadata"."dataSource" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "url" character varying, "schema" character varying, "type" "metadata"."dataSource_type_enum" NOT NULL DEFAULT 'postgres', "label" character varying, "isRemote" boolean NOT NULL DEFAULT false, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_6d01ae6c0f47baf4f8e37342268" PRIMARY KEY ("id"))`, ); await queryRunner.query( - `CREATE TABLE "metadata"."tenantMigration" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "migrations" jsonb, "name" character varying, "isCustom" boolean NOT NULL DEFAULT false, "appliedAt" TIMESTAMP, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_f9b06eb42494795f73acb5c2350" PRIMARY KEY ("id"))`, + `CREATE TABLE "metadata"."workspaceMigration" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "migrations" jsonb, "name" character varying, "isCustom" boolean NOT NULL DEFAULT false, "appliedAt" TIMESTAMP, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_f9b06eb42494795f73acb5c2350" PRIMARY KEY ("id"))`, ); await queryRunner.query( `ALTER TABLE "metadata"."relationMetadata" ADD CONSTRAINT "FK_f2a0acd3a548ee446a1a35df44d" FOREIGN KEY ("fromObjectMetadataId") REFERENCES "metadata"."objectMetadata"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`, @@ -61,7 +61,7 @@ export class SetupMetadataTables1700140427984 implements MigrationInterface { await queryRunner.query( `ALTER TABLE "metadata"."relationMetadata" DROP CONSTRAINT "FK_f2a0acd3a548ee446a1a35df44d"`, ); - await queryRunner.query(`DROP TABLE "metadata"."tenantMigration"`); + await queryRunner.query(`DROP TABLE "metadata"."workspaceMigration"`); await queryRunner.query(`DROP TABLE "metadata"."dataSource"`); await queryRunner.query(`DROP TYPE "metadata"."dataSource_type_enum"`); await queryRunner.query(`DROP TABLE "metadata"."objectMetadata"`); diff --git a/server/src/metadata/field-metadata/field-metadata.entity.ts b/server/src/metadata/field-metadata/field-metadata.entity.ts index efd0b0102bc..bfaf8a640b9 100644 --- a/server/src/metadata/field-metadata/field-metadata.entity.ts +++ b/server/src/metadata/field-metadata/field-metadata.entity.ts @@ -10,7 +10,7 @@ import { UpdateDateColumn, } from 'typeorm'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { FieldMetadataTargetColumnMap } from 'src/metadata/field-metadata/interfaces/field-metadata-target-column-map.interface'; import { FieldMetadataDefaultValue } from 'src/metadata/field-metadata/interfaces/field-metadata-default-value.interface'; diff --git a/server/src/metadata/field-metadata/field-metadata.module.ts b/server/src/metadata/field-metadata/field-metadata.module.ts index 0ca77546b6f..3835817744c 100644 --- a/server/src/metadata/field-metadata/field-metadata.module.ts +++ b/server/src/metadata/field-metadata/field-metadata.module.ts @@ -7,8 +7,8 @@ import { import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; import { SortDirection } from '@ptc-org/nestjs-query-core'; -import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module'; -import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module'; +import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module'; +import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; import { JwtAuthGuard } from 'src/guards/jwt.auth.guard'; @@ -24,8 +24,8 @@ import { UpdateFieldInput } from './dtos/update-field.input'; NestjsQueryGraphQLModule.forFeature({ imports: [ NestjsQueryTypeOrmModule.forFeature([FieldMetadataEntity], 'metadata'), - TenantMigrationModule, - TenantMigrationRunnerModule, + WorkspaceMigrationModule, + WorkspaceMigrationRunnerModule, ObjectMetadataModule, ], services: [FieldMetadataService], diff --git a/server/src/metadata/field-metadata/field-metadata.service.ts b/server/src/metadata/field-metadata/field-metadata.service.ts index 9431e321b20..f6e4cd8857c 100644 --- a/server/src/metadata/field-metadata/field-metadata.service.ts +++ b/server/src/metadata/field-metadata/field-metadata.service.ts @@ -10,12 +10,12 @@ import { Repository } from 'typeorm'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; import { DeleteOneOptions } from '@ptc-org/nestjs-query-core'; -import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service'; -import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service'; +import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service'; +import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service'; import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service'; import { FieldMetadataDTO } from 'src/metadata/field-metadata/dtos/field-metadata.dto'; import { CreateFieldInput } from 'src/metadata/field-metadata/dtos/create-field.input'; -import { TenantMigrationTableAction } from 'src/metadata/tenant-migration/tenant-migration.entity'; +import { WorkspaceMigrationTableAction } from 'src/metadata/workspace-migration/workspace-migration.entity'; import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util'; import { convertFieldMetadataToColumnActions } from 'src/metadata/field-metadata/utils/convert-field-metadata-to-column-action.util'; @@ -28,8 +28,8 @@ export class FieldMetadataService extends TypeOrmQueryService, private readonly objectMetadataService: ObjectMetadataService, - private readonly tenantMigrationService: TenantMigrationService, - private readonly migrationRunnerService: TenantMigrationRunnerService, + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, ) { super(fieldMetadataRepository); } @@ -90,18 +90,18 @@ export class FieldMetadataService extends TypeOrmQueryService, - private readonly tenantMigrationService: TenantMigrationService, - private readonly migrationRunnerService: TenantMigrationRunnerService, + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, ) { super(objectMetadataRepository); } @@ -61,7 +61,7 @@ export class ObjectMetadataService extends TypeOrmQueryService, private readonly objectMetadataService: ObjectMetadataService, private readonly fieldMetadataService: FieldMetadataService, - private readonly tenantMigrationService: TenantMigrationService, - private readonly migrationRunnerService: TenantMigrationRunnerService, + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, ) { super(relationMetadataRepository); } @@ -136,7 +136,7 @@ export class RelationMetadataService extends TypeOrmQueryService, + @InjectRepository(WorkspaceMigrationEntity, 'metadata') + private readonly workspaceMigrationRepository: Repository, ) {} /** @@ -24,7 +24,7 @@ export class TenantMigrationService { public async insertStandardMigrations(workspaceId: string): Promise { // TODO: we actually don't need to fetch all of them, to improve later so it scales well. const insertedStandardMigrations = - await this.tenantMigrationRepository.find({ + await this.workspaceMigrationRepository.find({ where: { workspaceId, isCustom: false }, }); @@ -47,7 +47,7 @@ export class TenantMigrationService { isCustom: false, })); - await this.tenantMigrationRepository.save( + await this.workspaceMigrationRepository.save( standardMigrationsThatNeedToBeInserted, ); } @@ -56,12 +56,12 @@ export class TenantMigrationService { * Get all pending migrations for a given workspaceId * * @param workspaceId: string - * @returns Promise + * @returns Promise */ public async getPendingMigrations( workspaceId: string, - ): Promise { - return await this.tenantMigrationRepository.find({ + ): Promise { + return await this.workspaceMigrationRepository.find({ order: { createdAt: 'ASC', name: 'ASC' }, where: { appliedAt: IsNull(), @@ -75,13 +75,13 @@ export class TenantMigrationService { * Should be called once the migration has been applied * * @param workspaceId: string - * @param migration: TenantMigration + * @param migration: WorkspaceMigration */ public async setAppliedAtForMigration( workspaceId: string, - migration: TenantMigrationEntity, + migration: WorkspaceMigrationEntity, ) { - await this.tenantMigrationRepository.save({ + await this.workspaceMigrationRepository.save({ id: migration.id, appliedAt: new Date(), }); @@ -95,9 +95,9 @@ export class TenantMigrationService { */ public async createCustomMigration( workspaceId: string, - migrations: TenantMigrationTableAction[], + migrations: WorkspaceMigrationTableAction[], ) { - await this.tenantMigrationRepository.save({ + await this.workspaceMigrationRepository.save({ migrations, workspaceId, isCustom: true, @@ -105,6 +105,6 @@ export class TenantMigrationService { } public async delete(workspaceId: string) { - await this.tenantMigrationRepository.delete({ workspaceId }); + await this.workspaceMigrationRepository.delete({ workspaceId }); } } diff --git a/server/src/tenant-manager/commands/tenant-manager-commands.module.ts b/server/src/tenant-manager/commands/tenant-manager-commands.module.ts deleted file mode 100644 index beadeae5882..00000000000 --- a/server/src/tenant-manager/commands/tenant-manager-commands.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module'; -import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; - -import { SyncTenantMetadataCommand } from './sync-tenant-metadata.command'; - -@Module({ - imports: [TenantManagerModule, DataSourceModule], - providers: [SyncTenantMetadataCommand], -}) -export class TenantManagerCommandsModule {} diff --git a/server/src/tenant-manager/standard-objects/standard-object-metadata.ts b/server/src/tenant-manager/standard-objects/standard-object-metadata.ts deleted file mode 100644 index 495af4891b5..00000000000 --- a/server/src/tenant-manager/standard-objects/standard-object-metadata.ts +++ /dev/null @@ -1,78 +0,0 @@ -import activityTargetMetadata from 'src/tenant-manager/standard-objects/activity-target'; -import activityMetadata from 'src/tenant-manager/standard-objects/activity'; -import apiKeyMetadata from 'src/tenant-manager/standard-objects/api-key'; -import attachmentMetadata from 'src/tenant-manager/standard-objects/attachment'; -import commentMetadata from 'src/tenant-manager/standard-objects/comment'; -import favoriteMetadata from 'src/tenant-manager/standard-objects/favorite'; -import opportunityMetadata from 'src/tenant-manager/standard-objects/opportunity'; -import personMetadata from 'src/tenant-manager/standard-objects/person'; -import viewMetadata from 'src/tenant-manager/standard-objects/view'; -import viewFieldMetadata from 'src/tenant-manager/standard-objects/view-field'; -import viewFilterMetadata from 'src/tenant-manager/standard-objects/view-filter'; -import viewSortMetadata from 'src/tenant-manager/standard-objects/view-sort'; -import webhookMetadata from 'src/tenant-manager/standard-objects/webhook'; -import pipelineStepMetadata from 'src/tenant-manager/standard-objects/pipeline-step'; -import companyMetadata from 'src/tenant-manager/standard-objects/company'; -import workspaceMemberMetadata from 'src/tenant-manager/standard-objects/workspace-member'; -import { - FieldMetadataEntity, - FieldMetadataType, -} from 'src/metadata/field-metadata/field-metadata.entity'; - -export const standardObjectsMetadata = { - activityTargetV2: activityTargetMetadata, - activityV2: activityMetadata, - apiKeyV2: apiKeyMetadata, - attachmentV2: attachmentMetadata, - commentV2: commentMetadata, - companyV2: companyMetadata, - favoriteV2: favoriteMetadata, - opportunityV2: opportunityMetadata, - personV2: personMetadata, - pipelineStepV2: pipelineStepMetadata, - viewFieldV2: viewFieldMetadata, - viewFilterV2: viewFilterMetadata, - viewSortV2: viewSortMetadata, - viewV2: viewMetadata, - webhookV2: webhookMetadata, - workspaceMemberV2: workspaceMemberMetadata, -}; - -export const basicFieldsMetadata: Partial[] = [ - { - name: 'id', - label: 'Id', - type: FieldMetadataType.UUID, - targetColumnMap: { - value: 'id', - }, - isNullable: true, - // isSystem: true, - isCustom: false, - isActive: true, - }, - { - name: 'createdAt', - label: 'Creation date', - type: FieldMetadataType.DATE, - targetColumnMap: { - value: 'createdAt', - }, - icon: 'IconCalendar', - isNullable: true, - isCustom: false, - isActive: true, - }, - { - name: 'updatedAt', - label: 'Update date', - type: FieldMetadataType.DATE, - targetColumnMap: { - value: 'updatedAt', - }, - icon: 'IconCalendar', - isNullable: true, - isCustom: false, - isActive: true, - }, -]; diff --git a/server/src/tenant-manager/standard-objects/standard-object-relation-metadata.ts b/server/src/tenant-manager/standard-objects/standard-object-relation-metadata.ts deleted file mode 100644 index c8c9ef9c488..00000000000 --- a/server/src/tenant-manager/standard-objects/standard-object-relation-metadata.ts +++ /dev/null @@ -1,15 +0,0 @@ -import activityRelationMetadata from 'src/tenant-manager/standard-objects/relations/activity'; -import companyRelationMetadata from 'src/tenant-manager/standard-objects/relations/company'; -import personRelationMetadata from 'src/tenant-manager/standard-objects/relations/person'; -import pipelineStepRelationMetadata from 'src/tenant-manager/standard-objects/relations/pipeline-step'; -import viewRelationMetadata from 'src/tenant-manager/standard-objects/relations/view'; -import workspaceMemberRelationMetadata from 'src/tenant-manager/standard-objects/relations/workspace-member'; - -export const standardObjectRelationMetadata = [ - ...activityRelationMetadata, - ...companyRelationMetadata, - ...personRelationMetadata, - ...pipelineStepRelationMetadata, - ...viewRelationMetadata, - ...workspaceMemberRelationMetadata, -]; diff --git a/server/src/tenant-manager/tenant-manager.module.ts b/server/src/tenant-manager/tenant-manager.module.ts deleted file mode 100644 index b56f22ab7db..00000000000 --- a/server/src/tenant-manager/tenant-manager.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; -import { FieldMetadataModule } from 'src/metadata/field-metadata/field-metadata.module'; -import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; -import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module'; -import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module'; -import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module'; -import { RelationMetadataModule } from 'src/metadata/relation-metadata/relation-metadata.module'; - -import { TenantManagerService } from './tenant-manager.service'; - -@Module({ - imports: [ - TenantDataSourceModule, - TenantMigrationModule, - TenantMigrationRunnerModule, - ObjectMetadataModule, - FieldMetadataModule, - DataSourceModule, - RelationMetadataModule, - ], - exports: [TenantManagerService], - providers: [TenantManagerService], -}) -export class TenantManagerModule {} diff --git a/server/src/tenant-migration-runner/commands/run-tenant-migrations.command.ts b/server/src/tenant-migration-runner/commands/run-tenant-migrations.command.ts deleted file mode 100644 index 89ec659caee..00000000000 --- a/server/src/tenant-migration-runner/commands/run-tenant-migrations.command.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Command, CommandRunner, Option } from 'nest-commander'; - -import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service'; -import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service'; - -// TODO: implement dry-run -interface RunTenantMigrationsOptions { - workspaceId: string; -} - -@Command({ - name: 'tenant:migrate', - description: 'Run tenant migrations', -}) -export class RunTenantMigrationsCommand extends CommandRunner { - constructor( - private readonly tenantMigrationService: TenantMigrationService, - private readonly tenantMigrationRunnerService: TenantMigrationRunnerService, - ) { - super(); - } - - async run( - _passedParam: string[], - options: RunTenantMigrationsOptions, - ): Promise { - // TODO: run in a dedicated job + run queries in a transaction. - await this.tenantMigrationService.insertStandardMigrations( - options.workspaceId, - ); - await this.tenantMigrationRunnerService.executeMigrationFromPendingMigrations( - options.workspaceId, - ); - } - - // TODO: workspaceId should be optional and we should run migrations for all workspaces - @Option({ - flags: '-w, --workspace-id [workspace_id]', - description: 'workspace id', - required: true, - }) - parseWorkspaceId(value: string): string { - return value; - } -} diff --git a/server/src/tenant-migration-runner/commands/tenant-migration-runner-commands.module.ts b/server/src/tenant-migration-runner/commands/tenant-migration-runner-commands.module.ts deleted file mode 100644 index dff01df6d37..00000000000 --- a/server/src/tenant-migration-runner/commands/tenant-migration-runner-commands.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module'; -import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module'; - -import { RunTenantMigrationsCommand } from './run-tenant-migrations.command'; - -@Module({ - imports: [TenantMigrationModule, TenantMigrationRunnerModule], - providers: [RunTenantMigrationsCommand], -}) -export class TenantMigrationRunnerCommandsModule {} diff --git a/server/src/tenant-migration-runner/tenant-migration-runner.module.ts b/server/src/tenant-migration-runner/tenant-migration-runner.module.ts deleted file mode 100644 index a96340cf387..00000000000 --- a/server/src/tenant-migration-runner/tenant-migration-runner.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module'; -import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module'; - -import { TenantMigrationRunnerService } from './tenant-migration-runner.service'; - -@Module({ - imports: [TenantDataSourceModule, TenantMigrationModule], - exports: [TenantMigrationRunnerService], - providers: [TenantMigrationRunnerService], -}) -export class TenantMigrationRunnerModule {} diff --git a/server/src/tenant/query-builder/interfaces/query-builder-options.interface.ts b/server/src/tenant/query-builder/interfaces/query-builder-options.interface.ts deleted file mode 100644 index 104e152de43..00000000000 --- a/server/src/tenant/query-builder/interfaces/query-builder-options.interface.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { GraphQLResolveInfo } from 'graphql'; - -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; - -export interface QueryBuilderOptions { - targetTableName: string; - info: GraphQLResolveInfo; - fieldMetadataCollection: FieldMetadataInterface[]; -} diff --git a/server/src/tenant/query-builder/interfaces/resolvers-builder.interface.ts b/server/src/tenant/query-builder/interfaces/resolvers-builder.interface.ts deleted file mode 100644 index 13de6ac5055..00000000000 --- a/server/src/tenant/query-builder/interfaces/resolvers-builder.interface.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { GraphQLFieldResolver } from 'graphql'; - -import { resolverBuilderMethodNames } from 'src/tenant/resolver-builder/factories/factories'; - -import { Record, RecordFilter, RecordOrderBy } from './record.interface'; - -export type Resolver = GraphQLFieldResolver; - -export interface FindManyResolverArgs< - Filter extends RecordFilter = RecordFilter, - OrderBy extends RecordOrderBy = RecordOrderBy, -> { - first?: number; - last?: number; - before?: string; - after?: string; - filter?: Filter; - orderBy?: OrderBy; -} - -export interface FindOneResolverArgs { - filter?: Filter; -} - -export interface CreateOneResolverArgs { - data: Data; -} - -export interface CreateManyResolverArgs { - data: Data[]; -} - -export interface UpdateOneResolverArgs { - id: string; - data: Data; -} - -export interface DeleteOneResolverArgs { - id: string; -} - -export type ResolverBuilderQueryMethodNames = - (typeof resolverBuilderMethodNames.queries)[number]; - -export type ResolverBuilderMutationMethodNames = - (typeof resolverBuilderMethodNames.mutations)[number]; - -export type ResolverBuilderMethodNames = - | ResolverBuilderQueryMethodNames - | ResolverBuilderMutationMethodNames; - -export interface ResolverBuilderMethods { - readonly queries: readonly ResolverBuilderQueryMethodNames[]; - readonly mutations: readonly ResolverBuilderMutationMethodNames[]; -} diff --git a/server/src/tenant/query-builder/query-builder.module.ts b/server/src/tenant/query-builder/query-builder.module.ts deleted file mode 100644 index 394bc59ac6a..00000000000 --- a/server/src/tenant/query-builder/query-builder.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { QueryBuilderFactory } from './query-builder.factory'; - -import { queryBuilderFactories } from './factories/factories'; - -@Module({ - imports: [], - providers: [...queryBuilderFactories, QueryBuilderFactory], - exports: [QueryBuilderFactory], -}) -export class QueryBuilderModule {} diff --git a/server/src/tenant/query-runner/query-runner.module.ts b/server/src/tenant/query-runner/query-runner.module.ts deleted file mode 100644 index e93d862cd6a..00000000000 --- a/server/src/tenant/query-runner/query-runner.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { QueryBuilderModule } from 'src/tenant/query-builder/query-builder.module'; -import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module'; - -import { QueryRunnerService } from './query-runner.service'; - -@Module({ - imports: [QueryBuilderModule, TenantDataSourceModule], - providers: [QueryRunnerService], - exports: [QueryRunnerService], -}) -export class QueryRunnerModule {} diff --git a/server/src/tenant/resolver-builder/factories/create-many-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/create-many-resolver.factory.ts deleted file mode 100644 index 07b10a021c0..00000000000 --- a/server/src/tenant/resolver-builder/factories/create-many-resolver.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - CreateManyResolverArgs, - Resolver, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class CreateManyResolverFactory - implements ResolverBuilderFactoryInterface -{ - public static methodName = 'createMany' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.createMany(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/factories/create-one-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/create-one-resolver.factory.ts deleted file mode 100644 index 12520c1080d..00000000000 --- a/server/src/tenant/resolver-builder/factories/create-one-resolver.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - CreateOneResolverArgs, - Resolver, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class CreateOneResolverFactory - implements ResolverBuilderFactoryInterface -{ - public static methodName = 'createOne' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.createOne(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/factories/delete-one-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/delete-one-resolver.factory.ts deleted file mode 100644 index fe455d9fcd2..00000000000 --- a/server/src/tenant/resolver-builder/factories/delete-one-resolver.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - DeleteOneResolverArgs, - Resolver, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class DeleteOneResolverFactory - implements ResolverBuilderFactoryInterface -{ - public static methodName = 'deleteOne' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.deleteOne(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/factories/find-many-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/find-many-resolver.factory.ts deleted file mode 100644 index 9acf36a49bf..00000000000 --- a/server/src/tenant/resolver-builder/factories/find-many-resolver.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - FindManyResolverArgs, - Resolver, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class FindManyResolverFactory - implements ResolverBuilderFactoryInterface -{ - public static methodName = 'findMany' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.findMany(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/factories/find-one-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/find-one-resolver.factory.ts deleted file mode 100644 index ea7975335a3..00000000000 --- a/server/src/tenant/resolver-builder/factories/find-one-resolver.factory.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - FindOneResolverArgs, - Resolver, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class FindOneResolverFactory implements ResolverBuilderFactoryInterface { - public static methodName = 'findOne' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.findOne(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/factories/update-one-resolver.factory.ts b/server/src/tenant/resolver-builder/factories/update-one-resolver.factory.ts deleted file mode 100644 index 6da05a30280..00000000000 --- a/server/src/tenant/resolver-builder/factories/update-one-resolver.factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { - Resolver, - UpdateOneResolverArgs, -} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; -import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface'; - -import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service'; - -@Injectable() -export class UpdateOneResolverFactory - implements ResolverBuilderFactoryInterface -{ - public static methodName = 'updateOne' as const; - - constructor(private readonly queryRunnerService: QueryRunnerService) {} - - create(context: SchemaBuilderContext): Resolver { - const internalContext = context; - - return (_source, args, context, info) => { - return this.queryRunnerService.updateOne(args, { - targetTableName: internalContext.targetTableName, - workspaceId: internalContext.workspaceId, - info, - fieldMetadataCollection: internalContext.fieldMetadataCollection, - }); - }; - } -} diff --git a/server/src/tenant/resolver-builder/interfaces/record.interface.ts b/server/src/tenant/resolver-builder/interfaces/record.interface.ts deleted file mode 100644 index 90a2568bb43..00000000000 --- a/server/src/tenant/resolver-builder/interfaces/record.interface.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface Record { - [key: string]: any; -} - -export type RecordFilter = { - [Property in keyof Record]: any; -}; - -export enum OrderByDirection { - AscNullsFirst = 'AscNullsFirst', - AscNullsLast = 'AscNullsLast', - DescNullsFirst = 'DescNullsFirst', - DescNullsLast = 'DescNullsLast', -} - -export type RecordOrderBy = { - [Property in keyof Record]: OrderByDirection; -}; diff --git a/server/src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface.ts b/server/src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface.ts deleted file mode 100644 index eaabfa121ae..00000000000 --- a/server/src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface'; - -import { Resolver } from './resolvers-builder.interface'; - -export interface ResolverBuilderFactoryInterface { - create(context: SchemaBuilderContext): Resolver; -} diff --git a/server/src/tenant/resolver-builder/interfaces/resolvers-builder.interface.ts b/server/src/tenant/resolver-builder/interfaces/resolvers-builder.interface.ts deleted file mode 100644 index 13de6ac5055..00000000000 --- a/server/src/tenant/resolver-builder/interfaces/resolvers-builder.interface.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { GraphQLFieldResolver } from 'graphql'; - -import { resolverBuilderMethodNames } from 'src/tenant/resolver-builder/factories/factories'; - -import { Record, RecordFilter, RecordOrderBy } from './record.interface'; - -export type Resolver = GraphQLFieldResolver; - -export interface FindManyResolverArgs< - Filter extends RecordFilter = RecordFilter, - OrderBy extends RecordOrderBy = RecordOrderBy, -> { - first?: number; - last?: number; - before?: string; - after?: string; - filter?: Filter; - orderBy?: OrderBy; -} - -export interface FindOneResolverArgs { - filter?: Filter; -} - -export interface CreateOneResolverArgs { - data: Data; -} - -export interface CreateManyResolverArgs { - data: Data[]; -} - -export interface UpdateOneResolverArgs { - id: string; - data: Data; -} - -export interface DeleteOneResolverArgs { - id: string; -} - -export type ResolverBuilderQueryMethodNames = - (typeof resolverBuilderMethodNames.queries)[number]; - -export type ResolverBuilderMutationMethodNames = - (typeof resolverBuilderMethodNames.mutations)[number]; - -export type ResolverBuilderMethodNames = - | ResolverBuilderQueryMethodNames - | ResolverBuilderMutationMethodNames; - -export interface ResolverBuilderMethods { - readonly queries: readonly ResolverBuilderQueryMethodNames[]; - readonly mutations: readonly ResolverBuilderMutationMethodNames[]; -} diff --git a/server/src/tenant/resolver-builder/resolver-builder.module.ts b/server/src/tenant/resolver-builder/resolver-builder.module.ts deleted file mode 100644 index a12b26a1631..00000000000 --- a/server/src/tenant/resolver-builder/resolver-builder.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { QueryRunnerModule } from 'src/tenant/query-runner/query-runner.module'; - -import { ResolverFactory } from './resolver.factory'; - -import { resolverBuilderFactories } from './factories/factories'; - -@Module({ - imports: [QueryRunnerModule], - providers: [...resolverBuilderFactories, ResolverFactory], - exports: [ResolverFactory], -}) -export class ResolverBuilderModule {} diff --git a/server/src/tenant/schema-builder/factories/mutation-type.factory.ts b/server/src/tenant/schema-builder/factories/mutation-type.factory.ts deleted file mode 100644 index a7d42b79f18..00000000000 --- a/server/src/tenant/schema-builder/factories/mutation-type.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { GraphQLObjectType } from 'graphql'; - -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ResolverBuilderMutationMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; - -import { ObjectTypeName, RootTypeFactory } from './root-type.factory'; - -@Injectable() -export class MutationTypeFactory { - constructor(private readonly rootTypeFactory: RootTypeFactory) {} - create( - objectMetadataCollection: ObjectMetadataInterface[], - resolverMethodNames: ResolverBuilderMutationMethodNames[], - options: BuildSchemaOptions, - ): GraphQLObjectType { - return this.rootTypeFactory.create( - objectMetadataCollection, - resolverMethodNames, - ObjectTypeName.Mutation, - options, - ); - } -} diff --git a/server/src/tenant/schema-builder/factories/query-type.factory.ts b/server/src/tenant/schema-builder/factories/query-type.factory.ts deleted file mode 100644 index 3dce50c7c38..00000000000 --- a/server/src/tenant/schema-builder/factories/query-type.factory.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { GraphQLObjectType } from 'graphql'; - -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ResolverBuilderQueryMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; - -import { ObjectTypeName, RootTypeFactory } from './root-type.factory'; - -@Injectable() -export class QueryTypeFactory { - constructor(private readonly rootTypeFactory: RootTypeFactory) {} - create( - objectMetadataCollection: ObjectMetadataInterface[], - resolverMethodNames: ResolverBuilderQueryMethodNames[], - options: BuildSchemaOptions, - ): GraphQLObjectType { - return this.rootTypeFactory.create( - objectMetadataCollection, - resolverMethodNames, - ObjectTypeName.Query, - options, - ); - } -} diff --git a/server/src/tenant/schema-builder/utils/object-contains-composite-field.ts b/server/src/tenant/schema-builder/utils/object-contains-composite-field.ts deleted file mode 100644 index 4d91e5a530d..00000000000 --- a/server/src/tenant/schema-builder/utils/object-contains-composite-field.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; - -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; - -export const objectContainsCompositeField = ( - objectMetadata: ObjectMetadataInterface, -): boolean => { - return objectMetadata.fields.some((field) => - isCompositeFieldMetadataType(field.type), - ); -}; diff --git a/server/src/tenant/tenant.module.ts b/server/src/tenant/tenant.module.ts deleted file mode 100644 index c14772261f6..00000000000 --- a/server/src/tenant/tenant.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { MetadataModule } from 'src/metadata/metadata.module'; -import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; -import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; - -import { TenantService } from './tenant.service'; - -import { SchemaBuilderModule } from './schema-builder/schema-builder.module'; -import { ResolverBuilderModule } from './resolver-builder/resolver-builder.module'; - -@Module({ - imports: [ - MetadataModule, - DataSourceModule, - ObjectMetadataModule, - SchemaBuilderModule, - ResolverBuilderModule, - ], - providers: [TenantService], - exports: [TenantService], -}) -export class TenantModule {} diff --git a/server/src/tenant/utils/__tests__/deduce-relation-direction.spec.ts b/server/src/workspace/utils/__tests__/deduce-relation-direction.spec.ts similarity index 92% rename from server/src/tenant/utils/__tests__/deduce-relation-direction.spec.ts rename to server/src/workspace/utils/__tests__/deduce-relation-direction.spec.ts index fabc1480fdf..84ac894b236 100644 --- a/server/src/tenant/utils/__tests__/deduce-relation-direction.spec.ts +++ b/server/src/workspace/utils/__tests__/deduce-relation-direction.spec.ts @@ -1,10 +1,10 @@ -import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface'; +import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface'; import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity'; import { deduceRelationDirection, RelationDirection, -} from 'src/tenant/utils/deduce-relation-direction.util'; +} from 'src/workspace/utils/deduce-relation-direction.util'; describe('deduceRelationDirection', () => { it('should return FROM when the current object Metadata ID matches fromObjectMetadataId', () => { diff --git a/server/src/tenant/utils/__tests__/get-resolver-name.spec.ts b/server/src/workspace/utils/__tests__/get-resolver-name.spec.ts similarity index 57% rename from server/src/tenant/utils/__tests__/get-resolver-name.spec.ts rename to server/src/workspace/utils/__tests__/get-resolver-name.spec.ts index 3f826a8dd39..2e9d4dbaccb 100644 --- a/server/src/tenant/utils/__tests__/get-resolver-name.spec.ts +++ b/server/src/workspace/utils/__tests__/get-resolver-name.spec.ts @@ -1,6 +1,6 @@ -import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { getResolverName } from 'src/tenant/utils/get-resolver-name.util'; +import { getResolverName } from 'src/workspace/utils/get-resolver-name.util'; describe('getResolverName', () => { const metadata = { @@ -16,15 +16,18 @@ describe('getResolverName', () => { ['updateOne', 'updateEntity'], ['deleteOne', 'deleteEntity'], ])('should return correct name for %s resolver', (type, expectedResult) => { - expect(getResolverName(metadata, type as ResolverBuilderMethodNames)).toBe( - expectedResult, - ); + expect( + getResolverName(metadata, type as WorkspaceResolverBuilderMethodNames), + ).toBe(expectedResult); }); it('should throw an error for an unknown resolver type', () => { const unknownType = 'unknownType'; expect(() => - getResolverName(metadata, unknownType as ResolverBuilderMethodNames), + getResolverName( + metadata, + unknownType as WorkspaceResolverBuilderMethodNames, + ), ).toThrow(`Unknown resolver type: ${unknownType}`); }); }); diff --git a/server/src/tenant/utils/deduce-relation-direction.util.ts b/server/src/workspace/utils/deduce-relation-direction.util.ts similarity index 81% rename from server/src/tenant/utils/deduce-relation-direction.util.ts rename to server/src/workspace/utils/deduce-relation-direction.util.ts index e94efe0c813..8ae831d41ed 100644 --- a/server/src/tenant/utils/deduce-relation-direction.util.ts +++ b/server/src/workspace/utils/deduce-relation-direction.util.ts @@ -1,4 +1,4 @@ -import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface'; +import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface'; export enum RelationDirection { FROM = 'from', diff --git a/server/src/tenant/utils/get-resolver-name.util.ts b/server/src/workspace/utils/get-resolver-name.util.ts similarity index 72% rename from server/src/tenant/utils/get-resolver-name.util.ts rename to server/src/workspace/utils/get-resolver-name.util.ts index b8a650b3625..f8f5a7a816c 100644 --- a/server/src/tenant/utils/get-resolver-name.util.ts +++ b/server/src/workspace/utils/get-resolver-name.util.ts @@ -1,12 +1,12 @@ -import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { camelCase } from 'src/utils/camel-case'; import { pascalCase } from 'src/utils/pascal-case'; export const getResolverName = ( objectMetadata: Pick, - type: ResolverBuilderMethodNames, + type: WorkspaceResolverBuilderMethodNames, ) => { switch (type) { case 'findMany': diff --git a/server/src/tenant/utils/is-composite-field-metadata-type.util.ts b/server/src/workspace/utils/is-composite-field-metadata-type.util.ts similarity index 100% rename from server/src/tenant/utils/is-composite-field-metadata-type.util.ts rename to server/src/workspace/utils/is-composite-field-metadata-type.util.ts diff --git a/server/src/tenant-datasource/tenant-datasource.module.ts b/server/src/workspace/workspace-datasource/workspace-datasource.module.ts similarity index 55% rename from server/src/tenant-datasource/tenant-datasource.module.ts rename to server/src/workspace/workspace-datasource/workspace-datasource.module.ts index 5b6fff111ad..9754aa2bac2 100644 --- a/server/src/tenant-datasource/tenant-datasource.module.ts +++ b/server/src/workspace/workspace-datasource/workspace-datasource.module.ts @@ -3,11 +3,11 @@ import { Module } from '@nestjs/common'; import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; -import { TenantDataSourceService } from './tenant-datasource.service'; +import { WorkspaceDataSourceService } from './workspace-datasource.service'; @Module({ imports: [DataSourceModule, TypeORMModule], - exports: [TenantDataSourceService], - providers: [TenantDataSourceService], + exports: [WorkspaceDataSourceService], + providers: [WorkspaceDataSourceService], }) -export class TenantDataSourceModule {} +export class WorkspaceDataSourceModule {} diff --git a/server/src/tenant-datasource/tenant-datasource.service.ts b/server/src/workspace/workspace-datasource/workspace-datasource.service.ts similarity index 98% rename from server/src/tenant-datasource/tenant-datasource.service.ts rename to server/src/workspace/workspace-datasource/workspace-datasource.service.ts index 6ba6e5e3319..09520be8cd0 100644 --- a/server/src/tenant-datasource/tenant-datasource.service.ts +++ b/server/src/workspace/workspace-datasource/workspace-datasource.service.ts @@ -6,7 +6,7 @@ import { DataSourceService } from 'src/metadata/data-source/data-source.service' import { TypeORMService } from 'src/database/typeorm/typeorm.service'; @Injectable() -export class TenantDataSourceService { +export class WorkspaceDataSourceService { constructor( private readonly dataSourceService: DataSourceService, private readonly typeormService: TypeORMService, diff --git a/server/src/tenant-manager/commands/sync-tenant-metadata.command.ts b/server/src/workspace/workspace-manager/commands/sync-workspace-metadata.command.ts similarity index 69% rename from server/src/tenant-manager/commands/sync-tenant-metadata.command.ts rename to server/src/workspace/workspace-manager/commands/sync-workspace-metadata.command.ts index e0bdcdf8db4..cfea77a472c 100644 --- a/server/src/tenant-manager/commands/sync-tenant-metadata.command.ts +++ b/server/src/workspace/workspace-manager/commands/sync-workspace-metadata.command.ts @@ -1,20 +1,20 @@ import { Command, CommandRunner, Option } from 'nest-commander'; import { DataSourceService } from 'src/metadata/data-source/data-source.service'; -import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service'; +import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service'; // TODO: implement dry-run -interface RunTenantMigrationsOptions { +interface RunWorkspaceMigrationsOptions { workspaceId: string; } @Command({ - name: 'tenant:sync-metadata', + name: 'workspace:sync-metadata', description: 'Sync metadata', }) -export class SyncTenantMetadataCommand extends CommandRunner { +export class SyncWorkspaceMetadataCommand extends CommandRunner { constructor( - private readonly tenantManagerService: TenantManagerService, + private readonly workspaceManagerService: WorkspaceManagerService, private readonly dataSourceService: DataSourceService, ) { super(); @@ -22,7 +22,7 @@ export class SyncTenantMetadataCommand extends CommandRunner { async run( _passedParam: string[], - options: RunTenantMigrationsOptions, + options: RunWorkspaceMigrationsOptions, ): Promise { // TODO: run in a dedicated job + run queries in a transaction. const dataSourceMetadata = @@ -31,7 +31,7 @@ export class SyncTenantMetadataCommand extends CommandRunner { ); // TODO: This solution could be improved, using a diff for example, we should not have to delete all metadata and recreate them. - await this.tenantManagerService.resetStandardObjectsAndFieldsMetadata( + await this.workspaceManagerService.resetStandardObjectsAndFieldsMetadata( dataSourceMetadata.id, options.workspaceId, ); diff --git a/server/src/workspace/workspace-manager/commands/workspace-manager-commands.module.ts b/server/src/workspace/workspace-manager/commands/workspace-manager-commands.module.ts new file mode 100644 index 00000000000..501462ad032 --- /dev/null +++ b/server/src/workspace/workspace-manager/commands/workspace-manager-commands.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module'; +import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; + +import { SyncWorkspaceMetadataCommand } from './sync-workspace-metadata.command'; + +@Module({ + imports: [WorkspaceManagerModule, DataSourceModule], + providers: [SyncWorkspaceMetadataCommand], +}) +export class WorkspaceManagerCommandsModule {} diff --git a/server/src/tenant-manager/standard-objects-prefill-data/company.ts b/server/src/workspace/workspace-manager/standard-objects-prefill-data/company.ts similarity index 100% rename from server/src/tenant-manager/standard-objects-prefill-data/company.ts rename to server/src/workspace/workspace-manager/standard-objects-prefill-data/company.ts diff --git a/server/src/tenant-manager/standard-objects-prefill-data/person.ts b/server/src/workspace/workspace-manager/standard-objects-prefill-data/person.ts similarity index 100% rename from server/src/tenant-manager/standard-objects-prefill-data/person.ts rename to server/src/workspace/workspace-manager/standard-objects-prefill-data/person.ts diff --git a/server/src/tenant-manager/standard-objects-prefill-data/pipeline-step.ts b/server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts similarity index 100% rename from server/src/tenant-manager/standard-objects-prefill-data/pipeline-step.ts rename to server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts diff --git a/server/src/tenant-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts b/server/src/workspace/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts similarity index 67% rename from server/src/tenant-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts rename to server/src/workspace/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts index e98737f6277..566be4e9a41 100644 --- a/server/src/tenant-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts +++ b/server/src/workspace/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts @@ -1,10 +1,10 @@ import { DataSource, EntityManager } from 'typeorm'; import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity'; -import { viewPrefillData } from 'src/tenant-manager/standard-objects-prefill-data/view'; -import { companyPrefillData } from 'src/tenant-manager/standard-objects-prefill-data/company'; -import { personPrefillData } from 'src/tenant-manager/standard-objects-prefill-data/person'; -import { pipelineStepPrefillData } from 'src/tenant-manager/standard-objects-prefill-data/pipeline-step'; +import { viewPrefillData } from 'src/workspace/workspace-manager/standard-objects-prefill-data/view'; +import { companyPrefillData } from 'src/workspace/workspace-manager/standard-objects-prefill-data/company'; +import { personPrefillData } from 'src/workspace/workspace-manager/standard-objects-prefill-data/person'; +import { pipelineStepPrefillData } from 'src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step'; export const standardObjectsPrefillData = async ( workspaceDataSource: DataSource, diff --git a/server/src/tenant-manager/standard-objects-prefill-data/view.ts b/server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts similarity index 100% rename from server/src/tenant-manager/standard-objects-prefill-data/view.ts rename to server/src/workspace/workspace-manager/standard-objects-prefill-data/view.ts diff --git a/server/src/tenant-manager/standard-objects/activity-target.ts b/server/src/workspace/workspace-manager/standard-objects/activity-target.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/activity-target.ts rename to server/src/workspace/workspace-manager/standard-objects/activity-target.ts diff --git a/server/src/tenant-manager/standard-objects/activity.ts b/server/src/workspace/workspace-manager/standard-objects/activity.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/activity.ts rename to server/src/workspace/workspace-manager/standard-objects/activity.ts diff --git a/server/src/tenant-manager/standard-objects/api-key.ts b/server/src/workspace/workspace-manager/standard-objects/api-key.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/api-key.ts rename to server/src/workspace/workspace-manager/standard-objects/api-key.ts diff --git a/server/src/tenant-manager/standard-objects/attachment.ts b/server/src/workspace/workspace-manager/standard-objects/attachment.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/attachment.ts rename to server/src/workspace/workspace-manager/standard-objects/attachment.ts diff --git a/server/src/tenant-manager/standard-objects/comment.ts b/server/src/workspace/workspace-manager/standard-objects/comment.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/comment.ts rename to server/src/workspace/workspace-manager/standard-objects/comment.ts diff --git a/server/src/tenant-manager/standard-objects/company.ts b/server/src/workspace/workspace-manager/standard-objects/company.ts similarity index 96% rename from server/src/tenant-manager/standard-objects/company.ts rename to server/src/workspace/workspace-manager/standard-objects/company.ts index b630378cccf..6fc3c74ba65 100644 --- a/server/src/tenant-manager/standard-objects/company.ts +++ b/server/src/workspace/workspace-manager/standard-objects/company.ts @@ -67,11 +67,11 @@ const companyMetadata = { { isCustom: false, isActive: true, - type: FieldMetadataType.TEXT, - name: 'linkedinUrl', + type: FieldMetadataType.LINK, + name: 'linkedinLink', label: 'Linkedin', targetColumnMap: { - value: 'linkedinUrl', + value: 'linkedinLink', }, description: 'The company Linkedin account', icon: 'IconBrandLinkedin', @@ -80,11 +80,11 @@ const companyMetadata = { { isCustom: false, isActive: true, - type: FieldMetadataType.TEXT, - name: 'xUrl', + type: FieldMetadataType.LINK, + name: 'xLink', label: 'X', targetColumnMap: { - value: 'xUrl', + value: 'xLink', }, description: 'The company Twitter/X account', icon: 'IconBrandX', diff --git a/server/src/tenant-manager/standard-objects/favorite.ts b/server/src/workspace/workspace-manager/standard-objects/favorite.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/favorite.ts rename to server/src/workspace/workspace-manager/standard-objects/favorite.ts diff --git a/server/src/tenant-manager/standard-objects/opportunity.ts b/server/src/workspace/workspace-manager/standard-objects/opportunity.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/opportunity.ts rename to server/src/workspace/workspace-manager/standard-objects/opportunity.ts diff --git a/server/src/tenant-manager/standard-objects/person.ts b/server/src/workspace/workspace-manager/standard-objects/person.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/person.ts rename to server/src/workspace/workspace-manager/standard-objects/person.ts diff --git a/server/src/tenant-manager/standard-objects/pipeline-step.ts b/server/src/workspace/workspace-manager/standard-objects/pipeline-step.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/pipeline-step.ts rename to server/src/workspace/workspace-manager/standard-objects/pipeline-step.ts diff --git a/server/src/tenant-manager/standard-objects/relations/activity.ts b/server/src/workspace/workspace-manager/standard-objects/relations/activity.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/activity.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/activity.ts diff --git a/server/src/tenant-manager/standard-objects/relations/company.ts b/server/src/workspace/workspace-manager/standard-objects/relations/company.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/company.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/company.ts diff --git a/server/src/tenant-manager/standard-objects/relations/person.ts b/server/src/workspace/workspace-manager/standard-objects/relations/person.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/person.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/person.ts diff --git a/server/src/tenant-manager/standard-objects/relations/pipeline-step.ts b/server/src/workspace/workspace-manager/standard-objects/relations/pipeline-step.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/pipeline-step.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/pipeline-step.ts diff --git a/server/src/tenant-manager/standard-objects/relations/view.ts b/server/src/workspace/workspace-manager/standard-objects/relations/view.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/view.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/view.ts diff --git a/server/src/tenant-manager/standard-objects/relations/workspace-member.ts b/server/src/workspace/workspace-manager/standard-objects/relations/workspace-member.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/relations/workspace-member.ts rename to server/src/workspace/workspace-manager/standard-objects/relations/workspace-member.ts diff --git a/server/src/workspace/workspace-manager/standard-objects/standard-object-metadata.ts b/server/src/workspace/workspace-manager/standard-objects/standard-object-metadata.ts new file mode 100644 index 00000000000..c2afb0d93ca --- /dev/null +++ b/server/src/workspace/workspace-manager/standard-objects/standard-object-metadata.ts @@ -0,0 +1,78 @@ +import activityTargetMetadata from 'src/workspace/workspace-manager/standard-objects/activity-target'; +import activityMetadata from 'src/workspace/workspace-manager/standard-objects/activity'; +import apiKeyMetadata from 'src/workspace/workspace-manager/standard-objects/api-key'; +import attachmentMetadata from 'src/workspace/workspace-manager/standard-objects/attachment'; +import commentMetadata from 'src/workspace/workspace-manager/standard-objects/comment'; +import favoriteMetadata from 'src/workspace/workspace-manager/standard-objects/favorite'; +import opportunityMetadata from 'src/workspace/workspace-manager/standard-objects/opportunity'; +import personMetadata from 'src/workspace/workspace-manager/standard-objects/person'; +import viewMetadata from 'src/workspace/workspace-manager/standard-objects/view'; +import viewFieldMetadata from 'src/workspace/workspace-manager/standard-objects/view-field'; +import viewFilterMetadata from 'src/workspace/workspace-manager/standard-objects/view-filter'; +import viewSortMetadata from 'src/workspace/workspace-manager/standard-objects/view-sort'; +import webhookMetadata from 'src/workspace/workspace-manager/standard-objects/webhook'; +import pipelineStepMetadata from 'src/workspace/workspace-manager/standard-objects/pipeline-step'; +import companyMetadata from 'src/workspace/workspace-manager/standard-objects/company'; +import workspaceMemberMetadata from 'src/workspace/workspace-manager/standard-objects/workspace-member'; +import { + FieldMetadataEntity, + FieldMetadataType, +} from 'src/metadata/field-metadata/field-metadata.entity'; + +export const standardObjectsMetadata = { + activityTargetV2: activityTargetMetadata, + activityV2: activityMetadata, + apiKeyV2: apiKeyMetadata, + attachmentV2: attachmentMetadata, + commentV2: commentMetadata, + companyV2: companyMetadata, + favoriteV2: favoriteMetadata, + opportunityV2: opportunityMetadata, + personV2: personMetadata, + pipelineStepV2: pipelineStepMetadata, + viewFieldV2: viewFieldMetadata, + viewFilterV2: viewFilterMetadata, + viewSortV2: viewSortMetadata, + viewV2: viewMetadata, + webhookV2: webhookMetadata, + workspaceMemberV2: workspaceMemberMetadata, +}; + +export const basicFieldsMetadata: Partial[] = [ + { + name: 'id', + label: 'Id', + type: FieldMetadataType.UUID, + targetColumnMap: { + value: 'id', + }, + isNullable: true, + // isSystem: true, + isCustom: false, + isActive: true, + }, + { + name: 'createdAt', + label: 'Creation date', + type: FieldMetadataType.DATE, + targetColumnMap: { + value: 'createdAt', + }, + icon: 'IconCalendar', + isNullable: true, + isCustom: false, + isActive: true, + }, + { + name: 'updatedAt', + label: 'Update date', + type: FieldMetadataType.DATE, + targetColumnMap: { + value: 'updatedAt', + }, + icon: 'IconCalendar', + isNullable: true, + isCustom: false, + isActive: true, + }, +]; diff --git a/server/src/workspace/workspace-manager/standard-objects/standard-object-relation-metadata.ts b/server/src/workspace/workspace-manager/standard-objects/standard-object-relation-metadata.ts new file mode 100644 index 00000000000..f77de6987d8 --- /dev/null +++ b/server/src/workspace/workspace-manager/standard-objects/standard-object-relation-metadata.ts @@ -0,0 +1,15 @@ +import activityRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/activity'; +import companyRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/company'; +import personRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/person'; +import pipelineStepRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/pipeline-step'; +import viewRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/view'; +import workspaceMemberRelationMetadata from 'src/workspace/workspace-manager/standard-objects/relations/workspace-member'; + +export const standardObjectRelationMetadata = [ + ...activityRelationMetadata, + ...companyRelationMetadata, + ...personRelationMetadata, + ...pipelineStepRelationMetadata, + ...viewRelationMetadata, + ...workspaceMemberRelationMetadata, +]; diff --git a/server/src/tenant-manager/standard-objects/view-field.ts b/server/src/workspace/workspace-manager/standard-objects/view-field.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/view-field.ts rename to server/src/workspace/workspace-manager/standard-objects/view-field.ts diff --git a/server/src/tenant-manager/standard-objects/view-filter.ts b/server/src/workspace/workspace-manager/standard-objects/view-filter.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/view-filter.ts rename to server/src/workspace/workspace-manager/standard-objects/view-filter.ts diff --git a/server/src/tenant-manager/standard-objects/view-sort.ts b/server/src/workspace/workspace-manager/standard-objects/view-sort.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/view-sort.ts rename to server/src/workspace/workspace-manager/standard-objects/view-sort.ts diff --git a/server/src/tenant-manager/standard-objects/view.ts b/server/src/workspace/workspace-manager/standard-objects/view.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/view.ts rename to server/src/workspace/workspace-manager/standard-objects/view.ts diff --git a/server/src/tenant-manager/standard-objects/webhook.ts b/server/src/workspace/workspace-manager/standard-objects/webhook.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/webhook.ts rename to server/src/workspace/workspace-manager/standard-objects/webhook.ts diff --git a/server/src/tenant-manager/standard-objects/workspace-member.ts b/server/src/workspace/workspace-manager/standard-objects/workspace-member.ts similarity index 100% rename from server/src/tenant-manager/standard-objects/workspace-member.ts rename to server/src/workspace/workspace-manager/standard-objects/workspace-member.ts diff --git a/server/src/workspace/workspace-manager/workspace-manager.module.ts b/server/src/workspace/workspace-manager/workspace-manager.module.ts new file mode 100644 index 00000000000..80c69ead8b4 --- /dev/null +++ b/server/src/workspace/workspace-manager/workspace-manager.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; + +import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; +import { FieldMetadataModule } from 'src/metadata/field-metadata/field-metadata.module'; +import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; +import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; +import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module'; +import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module'; +import { RelationMetadataModule } from 'src/metadata/relation-metadata/relation-metadata.module'; + +import { WorkspaceManagerService } from './workspace-manager.service'; + +@Module({ + imports: [ + WorkspaceDataSourceModule, + WorkspaceMigrationModule, + WorkspaceMigrationRunnerModule, + ObjectMetadataModule, + FieldMetadataModule, + DataSourceModule, + RelationMetadataModule, + ], + exports: [WorkspaceManagerService], + providers: [WorkspaceManagerService], +}) +export class WorkspaceManagerModule {} diff --git a/server/src/tenant-manager/tenant-manager.service.ts b/server/src/workspace/workspace-manager/workspace-manager.service.ts similarity index 83% rename from server/src/tenant-manager/tenant-manager.service.ts rename to server/src/workspace/workspace-manager/workspace-manager.service.ts index 0911dbef4d4..f0fd7bf4373 100644 --- a/server/src/tenant-manager/tenant-manager.service.ts +++ b/server/src/workspace/workspace-manager/workspace-manager.service.ts @@ -3,13 +3,13 @@ import { Injectable } from '@nestjs/common'; import { DataSourceService } from 'src/metadata/data-source/data-source.service'; import { FieldMetadataService } from 'src/metadata/field-metadata/field-metadata.service'; import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service'; -import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service'; -import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service'; -import { standardObjectsPrefillData } from 'src/tenant-manager/standard-objects-prefill-data/standard-objects-prefill-data'; -import { TenantDataSourceService } from 'src/tenant-datasource/tenant-datasource.service'; +import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service'; +import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service'; +import { standardObjectsPrefillData } from 'src/workspace/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data'; +import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; import { DataSourceEntity } from 'src/metadata/data-source/data-source.entity'; import { RelationMetadataService } from 'src/metadata/relation-metadata/relation-metadata.service'; -import { standardObjectRelationMetadata } from 'src/tenant-manager/standard-objects/standard-object-relation-metadata'; +import { standardObjectRelationMetadata } from 'src/workspace/workspace-manager/standard-objects/standard-object-relation-metadata'; import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity'; import { FieldMetadataEntity, @@ -22,11 +22,11 @@ import { } from './standard-objects/standard-object-metadata'; @Injectable() -export class TenantManagerService { +export class WorkspaceManagerService { constructor( - private readonly tenantDataSourceService: TenantDataSourceService, - private readonly tenantMigrationService: TenantMigrationService, - private readonly migrationRunnerService: TenantMigrationRunnerService, + private readonly workspaceDataSourceService: WorkspaceDataSourceService, + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, private readonly objectMetadataService: ObjectMetadataService, private readonly fieldMetadataService: FieldMetadataService, private readonly dataSourceService: DataSourceService, @@ -40,7 +40,9 @@ export class TenantManagerService { */ public async init(workspaceId: string): Promise { const schemaName = - await this.tenantDataSourceService.createWorkspaceDBSchema(workspaceId); + await this.workspaceDataSourceService.createWorkspaceDBSchema( + workspaceId, + ); const dataSourceMetadata = await this.dataSourceService.createDataSourceMetadata( @@ -48,9 +50,9 @@ export class TenantManagerService { schemaName, ); - await this.tenantMigrationService.insertStandardMigrations(workspaceId); + await this.workspaceMigrationService.insertStandardMigrations(workspaceId); - await this.migrationRunnerService.executeMigrationFromPendingMigrations( + await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( workspaceId, ); @@ -230,7 +232,7 @@ export class TenantManagerService { createdObjectMetadata: ObjectMetadataEntity[], ) { const workspaceDataSource = - await this.tenantDataSourceService.connectToWorkspaceDataSource( + await this.workspaceDataSourceService.connectToWorkspaceDataSource( workspaceId, ); @@ -255,9 +257,9 @@ export class TenantManagerService { // Delete data from metadata tables await this.fieldMetadataService.deleteFieldsMetadata(workspaceId); await this.objectMetadataService.deleteObjectsMetadata(workspaceId); - await this.tenantMigrationService.delete(workspaceId); + await this.workspaceMigrationService.delete(workspaceId); await this.dataSourceService.delete(workspaceId); // Delete schema - await this.tenantDataSourceService.deleteWorkspaceDBSchema(workspaceId); + await this.workspaceDataSourceService.deleteWorkspaceDBSchema(workspaceId); } } diff --git a/server/src/workspace/workspace-migration-runner/commands/run-workspace-migrations.command.ts b/server/src/workspace/workspace-migration-runner/commands/run-workspace-migrations.command.ts new file mode 100644 index 00000000000..8962c0c6185 --- /dev/null +++ b/server/src/workspace/workspace-migration-runner/commands/run-workspace-migrations.command.ts @@ -0,0 +1,45 @@ +import { Command, CommandRunner, Option } from 'nest-commander'; + +import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service'; +import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service'; + +// TODO: implement dry-run +interface RunWorkspaceMigrationsOptions { + workspaceId: string; +} + +@Command({ + name: 'workspace:migrate', + description: 'Run workspace migrations', +}) +export class RunWorkspaceMigrationsCommand extends CommandRunner { + constructor( + private readonly workspaceMigrationService: WorkspaceMigrationService, + private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, + ) { + super(); + } + + async run( + _passedParam: string[], + options: RunWorkspaceMigrationsOptions, + ): Promise { + // TODO: run in a dedicated job + run queries in a transaction. + await this.workspaceMigrationService.insertStandardMigrations( + options.workspaceId, + ); + await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( + options.workspaceId, + ); + } + + // TODO: workspaceId should be optional and we should run migrations for all workspaces + @Option({ + flags: '-w, --workspace-id [workspace_id]', + description: 'workspace id', + required: true, + }) + parseWorkspaceId(value: string): string { + return value; + } +} diff --git a/server/src/workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module.ts b/server/src/workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module.ts new file mode 100644 index 00000000000..f8db8958f16 --- /dev/null +++ b/server/src/workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; +import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module'; + +import { RunWorkspaceMigrationsCommand } from './run-workspace-migrations.command'; + +@Module({ + imports: [WorkspaceMigrationModule, WorkspaceMigrationRunnerModule], + providers: [RunWorkspaceMigrationsCommand], +}) +export class WorkspaceMigrationRunnerCommandsModule {} diff --git a/server/src/tenant-migration-runner/utils/custom-table-default-column.util.ts b/server/src/workspace/workspace-migration-runner/utils/custom-table-default-column.util.ts similarity index 100% rename from server/src/tenant-migration-runner/utils/custom-table-default-column.util.ts rename to server/src/workspace/workspace-migration-runner/utils/custom-table-default-column.util.ts diff --git a/server/src/workspace/workspace-migration-runner/workspace-migration-runner.module.ts b/server/src/workspace/workspace-migration-runner/workspace-migration-runner.module.ts new file mode 100644 index 00000000000..ac659ad96b5 --- /dev/null +++ b/server/src/workspace/workspace-migration-runner/workspace-migration-runner.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module'; +import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module'; + +import { WorkspaceMigrationRunnerService } from './workspace-migration-runner.service'; + +@Module({ + imports: [WorkspaceDataSourceModule, WorkspaceMigrationModule], + exports: [WorkspaceMigrationRunnerService], + providers: [WorkspaceMigrationRunnerService], +}) +export class WorkspaceMigrationRunnerModule {} diff --git a/server/src/tenant-migration-runner/tenant-migration-runner.service.ts b/server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts similarity index 75% rename from server/src/tenant-migration-runner/tenant-migration-runner.service.ts rename to server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts index 880f2bba4df..0982f6aea8c 100644 --- a/server/src/tenant-migration-runner/tenant-migration-runner.service.ts +++ b/server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts @@ -8,36 +8,36 @@ import { TableUnique, } from 'typeorm'; -import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service'; -import { TenantDataSourceService } from 'src/tenant-datasource/tenant-datasource.service'; +import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service'; +import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; import { - TenantMigrationTableAction, - TenantMigrationColumnAction, - TenantMigrationColumnActionType, - TenantMigrationColumnCreate, - TenantMigrationColumnRelation, -} from 'src/metadata/tenant-migration/tenant-migration.entity'; + WorkspaceMigrationTableAction, + WorkspaceMigrationColumnAction, + WorkspaceMigrationColumnActionType, + WorkspaceMigrationColumnCreate, + WorkspaceMigrationColumnRelation, +} from 'src/metadata/workspace-migration/workspace-migration.entity'; import { customTableDefaultColumns } from './utils/custom-table-default-column.util'; @Injectable() -export class TenantMigrationRunnerService { +export class WorkspaceMigrationRunnerService { constructor( - private readonly tenantDataSourceService: TenantDataSourceService, - private readonly tenantMigrationService: TenantMigrationService, + private readonly workspaceDataSourceService: WorkspaceDataSourceService, + private readonly workspaceMigrationService: WorkspaceMigrationService, ) {} /** * Executes pending migrations for a given workspace * * @param workspaceId string - * @returns Promise + * @returns Promise */ public async executeMigrationFromPendingMigrations( workspaceId: string, - ): Promise { + ): Promise { const workspaceDataSource = - await this.tenantDataSourceService.connectToWorkspaceDataSource( + await this.workspaceDataSourceService.connectToWorkspaceDataSource( workspaceId, ); @@ -46,19 +46,20 @@ export class TenantMigrationRunnerService { } const pendingMigrations = - await this.tenantMigrationService.getPendingMigrations(workspaceId); + await this.workspaceMigrationService.getPendingMigrations(workspaceId); if (pendingMigrations.length === 0) { return []; } - const flattenedPendingMigrations: TenantMigrationTableAction[] = + const flattenedPendingMigrations: WorkspaceMigrationTableAction[] = pendingMigrations.reduce((acc, pendingMigration) => { return [...acc, ...pendingMigration.migrations]; }, []); const queryRunner = workspaceDataSource?.createQueryRunner(); - const schemaName = this.tenantDataSourceService.getSchemaName(workspaceId); + const schemaName = + this.workspaceDataSourceService.getSchemaName(workspaceId); // Loop over each migration and create or update the table // TODO: Should be done in a transaction @@ -69,7 +70,7 @@ export class TenantMigrationRunnerService { // Update appliedAt date for each migration // TODO: Should be done after the migration is successful for (const pendingMigration of pendingMigrations) { - await this.tenantMigrationService.setAppliedAtForMigration( + await this.workspaceMigrationService.setAppliedAtForMigration( workspaceId, pendingMigration, ); @@ -85,12 +86,12 @@ export class TenantMigrationRunnerService { * * @param queryRunner QueryRunner * @param schemaName string - * @param tableMigration TenantMigrationTableChange + * @param tableMigration WorkspaceMigrationTableChange */ private async handleTableChanges( queryRunner: QueryRunner, schemaName: string, - tableMigration: TenantMigrationTableAction, + tableMigration: WorkspaceMigrationTableAction, ) { switch (tableMigration.action) { case 'create': @@ -139,14 +140,14 @@ export class TenantMigrationRunnerService { * @param queryRunner QueryRunner * @param schemaName string * @param tableName string - * @param columnMigrations TenantMigrationColumnAction[] + * @param columnMigrations WorkspaceMigrationColumnAction[] * @returns */ private async handleColumnChanges( queryRunner: QueryRunner, schemaName: string, tableName: string, - columnMigrations?: TenantMigrationColumnAction[], + columnMigrations?: WorkspaceMigrationColumnAction[], ) { if (!columnMigrations || columnMigrations.length === 0) { return; @@ -154,7 +155,7 @@ export class TenantMigrationRunnerService { for (const columnMigration of columnMigrations) { switch (columnMigration.action) { - case TenantMigrationColumnActionType.CREATE: + case WorkspaceMigrationColumnActionType.CREATE: await this.createColumn( queryRunner, schemaName, @@ -162,7 +163,7 @@ export class TenantMigrationRunnerService { columnMigration, ); break; - case TenantMigrationColumnActionType.RELATION: + case WorkspaceMigrationColumnActionType.RELATION: await this.createForeignKey( queryRunner, schemaName, @@ -182,13 +183,13 @@ export class TenantMigrationRunnerService { * @param queryRunner QueryRunner * @param schemaName string * @param tableName string - * @param migrationColumn TenantMigrationColumnAction + * @param migrationColumn WorkspaceMigrationColumnAction */ private async createColumn( queryRunner: QueryRunner, schemaName: string, tableName: string, - migrationColumn: TenantMigrationColumnCreate, + migrationColumn: WorkspaceMigrationColumnCreate, ) { const hasColumn = await queryRunner.hasColumn( `${schemaName}.${tableName}`, @@ -213,7 +214,7 @@ export class TenantMigrationRunnerService { queryRunner: QueryRunner, schemaName: string, tableName: string, - migrationColumn: TenantMigrationColumnRelation, + migrationColumn: WorkspaceMigrationColumnRelation, ) { await queryRunner.createForeignKey( `${schemaName}.${tableName}`, diff --git a/server/src/tenant/query-builder/__tests__/pg-graphql-query-builder.spec.ts b/server/src/workspace/workspace-query-builder/__tests__/pg-graphql-query-builder.spec.ts similarity index 100% rename from server/src/tenant/query-builder/__tests__/pg-graphql-query-builder.spec.ts rename to server/src/workspace/workspace-query-builder/__tests__/pg-graphql-query-builder.spec.ts diff --git a/server/src/tenant/query-builder/factories/args-alias.factory.ts b/server/src/workspace/workspace-query-builder/factories/args-alias.factory.ts similarity index 94% rename from server/src/tenant/query-builder/factories/args-alias.factory.ts rename to server/src/workspace/workspace-query-builder/factories/args-alias.factory.ts index a0826dc7270..5c3cf48213b 100644 --- a/server/src/tenant/query-builder/factories/args-alias.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/args-alias.factory.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; @Injectable() export class ArgsAliasFactory { diff --git a/server/src/tenant/query-builder/factories/args-string.factory.ts b/server/src/workspace/workspace-query-builder/factories/args-string.factory.ts similarity index 85% rename from server/src/tenant/query-builder/factories/args-string.factory.ts rename to server/src/workspace/workspace-query-builder/factories/args-string.factory.ts index f789ef3f90a..6aede09410c 100644 --- a/server/src/tenant/query-builder/factories/args-string.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/args-string.factory.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; -import { stringifyWithoutKeyQuote } from 'src/tenant/query-builder/utils/stringify-without-key-quote.util'; +import { stringifyWithoutKeyQuote } from 'src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util'; import { ArgsAliasFactory } from './args-alias.factory'; diff --git a/server/src/tenant/query-builder/factories/composite-field-alias.factory.ts b/server/src/workspace/workspace-query-builder/factories/composite-field-alias.factory.ts similarity index 89% rename from server/src/tenant/query-builder/factories/composite-field-alias.factory.ts rename to server/src/workspace/workspace-query-builder/factories/composite-field-alias.factory.ts index fd9484cb860..235b85e9e81 100644 --- a/server/src/tenant/query-builder/factories/composite-field-alias.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/composite-field-alias.factory.ts @@ -2,16 +2,16 @@ import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common'; import { GraphQLResolveInfo } from 'graphql'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity'; import { deduceRelationDirection, RelationDirection, -} from 'src/tenant/utils/deduce-relation-direction.util'; -import { getFieldArgumentsByKey } from 'src/tenant/query-builder/utils/get-field-arguments-by-key.util'; +} from 'src/workspace/utils/deduce-relation-direction.util'; +import { getFieldArgumentsByKey } from 'src/workspace/workspace-query-builder/utils/get-field-arguments-by-key.util'; import { FieldsStringFactory } from './fields-string.factory'; import { ArgsStringFactory } from './args-string.factory'; diff --git a/server/src/tenant/query-builder/factories/create-many-query.factory.ts b/server/src/workspace/workspace-query-builder/factories/create-many-query.factory.ts similarity index 68% rename from server/src/tenant/query-builder/factories/create-many-query.factory.ts rename to server/src/workspace/workspace-query-builder/factories/create-many-query.factory.ts index 140bed388f3..5ef332b55ae 100644 --- a/server/src/tenant/query-builder/factories/create-many-query.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/create-many-query.factory.ts @@ -2,11 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { v4 as uuidv4 } from 'uuid'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; -import { Record as IRecord } from 'src/tenant/query-builder/interfaces/record.interface'; -import { CreateManyResolverArgs } from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; +import { Record as IRecord } from 'src/workspace/workspace-query-builder/interfaces/record.interface'; +import { CreateManyResolverArgs } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { stringifyWithoutKeyQuote } from 'src/tenant/query-builder/utils/stringify-without-key-quote.util'; +import { stringifyWithoutKeyQuote } from 'src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util'; import { FieldsStringFactory } from './fields-string.factory'; import { ArgsAliasFactory } from './args-alias.factory'; @@ -22,7 +22,7 @@ export class CreateManyQueryFactory { create( args: CreateManyResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ) { const fieldsString = this.fieldsStringFactory.create( options.info, diff --git a/server/src/tenant/query-builder/factories/delete-one-query.factory.ts b/server/src/workspace/workspace-query-builder/factories/delete-one-query.factory.ts similarity index 66% rename from server/src/tenant/query-builder/factories/delete-one-query.factory.ts rename to server/src/workspace/workspace-query-builder/factories/delete-one-query.factory.ts index f95109257e0..799de88d994 100644 --- a/server/src/tenant/query-builder/factories/delete-one-query.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/delete-one-query.factory.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from '@nestjs/common'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; -import { DeleteOneResolverArgs } from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; +import { DeleteOneResolverArgs } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { FieldsStringFactory } from './fields-string.factory'; @@ -11,7 +11,7 @@ export class DeleteOneQueryFactory { constructor(private readonly fieldsStringFactory: FieldsStringFactory) {} - create(args: DeleteOneResolverArgs, options: QueryBuilderOptions) { + create(args: DeleteOneResolverArgs, options: WorkspaceQueryBuilderOptions) { const fieldsString = this.fieldsStringFactory.create( options.info, options.fieldMetadataCollection, diff --git a/server/src/tenant/query-builder/factories/factories.ts b/server/src/workspace/workspace-query-builder/factories/factories.ts similarity index 94% rename from server/src/tenant/query-builder/factories/factories.ts rename to server/src/workspace/workspace-query-builder/factories/factories.ts index 7db817b5dad..b1cae30dfea 100644 --- a/server/src/tenant/query-builder/factories/factories.ts +++ b/server/src/workspace/workspace-query-builder/factories/factories.ts @@ -9,7 +9,7 @@ import { FindManyQueryFactory } from './find-many-query.factory'; import { FindOneQueryFactory } from './find-one-query.factory'; import { UpdateOneQueryFactory } from './update-one-query.factory'; -export const queryBuilderFactories = [ +export const workspaceQueryBuilderFactories = [ ArgsAliasFactory, ArgsStringFactory, CompositeFieldAliasFactory, diff --git a/server/src/tenant/query-builder/factories/field-alias.factory.ts b/server/src/workspace/workspace-query-builder/factories/field-alias.factory.ts similarity index 86% rename from server/src/tenant/query-builder/factories/field-alias.factory.ts rename to server/src/workspace/workspace-query-builder/factories/field-alias.factory.ts index c5856b10ffe..ac387b4e2ac 100644 --- a/server/src/tenant/query-builder/factories/field-alias.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/field-alias.factory.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; @Injectable() export class FieldAliasFacotry { diff --git a/server/src/tenant/query-builder/factories/fields-string.factory.ts b/server/src/workspace/workspace-query-builder/factories/fields-string.factory.ts similarity index 92% rename from server/src/tenant/query-builder/factories/fields-string.factory.ts rename to server/src/workspace/workspace-query-builder/factories/fields-string.factory.ts index ae5b8013e70..ffe449301ea 100644 --- a/server/src/tenant/query-builder/factories/fields-string.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/fields-string.factory.ts @@ -4,9 +4,9 @@ import { GraphQLResolveInfo } from 'graphql'; import graphqlFields from 'graphql-fields'; import isEmpty from 'lodash.isempty'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { FieldAliasFacotry } from './field-alias.factory'; import { CompositeFieldAliasFactory } from './composite-field-alias.factory'; diff --git a/server/src/tenant/query-builder/factories/find-many-query.factory.ts b/server/src/workspace/workspace-query-builder/factories/find-many-query.factory.ts similarity index 69% rename from server/src/tenant/query-builder/factories/find-many-query.factory.ts rename to server/src/workspace/workspace-query-builder/factories/find-many-query.factory.ts index cf769deed40..8554a329c5c 100644 --- a/server/src/tenant/query-builder/factories/find-many-query.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/find-many-query.factory.ts @@ -1,11 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { RecordFilter, RecordOrderBy, -} from 'src/tenant/query-builder/interfaces/record.interface'; -import { FindManyResolverArgs } from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +} from 'src/workspace/workspace-query-builder/interfaces/record.interface'; +import { FindManyResolverArgs } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { ArgsStringFactory } from './args-string.factory'; import { FieldsStringFactory } from './fields-string.factory'; @@ -22,7 +22,10 @@ export class FindManyQueryFactory { create< Filter extends RecordFilter = RecordFilter, OrderBy extends RecordOrderBy = RecordOrderBy, - >(args: FindManyResolverArgs, options: QueryBuilderOptions) { + >( + args: FindManyResolverArgs, + options: WorkspaceQueryBuilderOptions, + ) { const fieldsString = this.fieldsStringFactory.create( options.info, options.fieldMetadataCollection, diff --git a/server/src/tenant/query-builder/factories/find-one-query.factory.ts b/server/src/workspace/workspace-query-builder/factories/find-one-query.factory.ts similarity index 71% rename from server/src/tenant/query-builder/factories/find-one-query.factory.ts rename to server/src/workspace/workspace-query-builder/factories/find-one-query.factory.ts index d6c41e1d64c..98f27fb0679 100644 --- a/server/src/tenant/query-builder/factories/find-one-query.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/find-one-query.factory.ts @@ -1,8 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; -import { RecordFilter } from 'src/tenant/query-builder/interfaces/record.interface'; -import { FindOneResolverArgs } from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; +import { RecordFilter } from 'src/workspace/workspace-query-builder/interfaces/record.interface'; +import { FindOneResolverArgs } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { ArgsStringFactory } from './args-string.factory'; import { FieldsStringFactory } from './fields-string.factory'; @@ -18,7 +18,7 @@ export class FindOneQueryFactory { create( args: FindOneResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ) { const fieldsString = this.fieldsStringFactory.create( options.info, diff --git a/server/src/tenant/query-builder/factories/update-one-query.factory.ts b/server/src/workspace/workspace-query-builder/factories/update-one-query.factory.ts similarity index 67% rename from server/src/tenant/query-builder/factories/update-one-query.factory.ts rename to server/src/workspace/workspace-query-builder/factories/update-one-query.factory.ts index 20e4af320f6..eb43812a956 100644 --- a/server/src/tenant/query-builder/factories/update-one-query.factory.ts +++ b/server/src/workspace/workspace-query-builder/factories/update-one-query.factory.ts @@ -1,10 +1,10 @@ import { Injectable, Logger } from '@nestjs/common'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; -import { Record as IRecord } from 'src/tenant/query-builder/interfaces/record.interface'; -import { UpdateOneResolverArgs } from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; +import { Record as IRecord } from 'src/workspace/workspace-query-builder/interfaces/record.interface'; +import { UpdateOneResolverArgs } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { stringifyWithoutKeyQuote } from 'src/tenant/query-builder/utils/stringify-without-key-quote.util'; +import { stringifyWithoutKeyQuote } from 'src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util'; import { FieldsStringFactory } from './fields-string.factory'; import { ArgsAliasFactory } from './args-alias.factory'; @@ -20,7 +20,7 @@ export class UpdateOneQueryFactory { create( args: UpdateOneResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ) { const fieldsString = this.fieldsStringFactory.create( options.info, diff --git a/server/src/tenant/query-builder/interfaces/record.interface.ts b/server/src/workspace/workspace-query-builder/interfaces/record.interface.ts similarity index 86% rename from server/src/tenant/query-builder/interfaces/record.interface.ts rename to server/src/workspace/workspace-query-builder/interfaces/record.interface.ts index 90a2568bb43..ac52140da82 100644 --- a/server/src/tenant/query-builder/interfaces/record.interface.ts +++ b/server/src/workspace/workspace-query-builder/interfaces/record.interface.ts @@ -1,5 +1,8 @@ export interface Record { + id: string; [key: string]: any; + createdAt: string; + updatedAt: string; } export type RecordFilter = { diff --git a/server/src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface.ts b/server/src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface.ts new file mode 100644 index 00000000000..319df6f3873 --- /dev/null +++ b/server/src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface.ts @@ -0,0 +1,9 @@ +import { GraphQLResolveInfo } from 'graphql'; + +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; + +export interface WorkspaceQueryBuilderOptions { + targetTableName: string; + info: GraphQLResolveInfo; + fieldMetadataCollection: FieldMetadataInterface[]; +} diff --git a/server/src/tenant/query-builder/utils/__tests__/stringify-without-key-quote.spec.ts b/server/src/workspace/workspace-query-builder/utils/__tests__/stringify-without-key-quote.spec.ts similarity index 92% rename from server/src/tenant/query-builder/utils/__tests__/stringify-without-key-quote.spec.ts rename to server/src/workspace/workspace-query-builder/utils/__tests__/stringify-without-key-quote.spec.ts index 5a09e37286d..56b10aaef33 100644 --- a/server/src/tenant/query-builder/utils/__tests__/stringify-without-key-quote.spec.ts +++ b/server/src/workspace/workspace-query-builder/utils/__tests__/stringify-without-key-quote.spec.ts @@ -1,4 +1,4 @@ -import { stringifyWithoutKeyQuote } from 'src/tenant/query-builder/utils/stringify-without-key-quote.util'; +import { stringifyWithoutKeyQuote } from 'src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util'; describe('stringifyWithoutKeyQuote', () => { test('should stringify object correctly without quotes around keys', () => { diff --git a/server/src/tenant/query-builder/utils/get-field-arguments-by-key.util.ts b/server/src/workspace/workspace-query-builder/utils/get-field-arguments-by-key.util.ts similarity index 100% rename from server/src/tenant/query-builder/utils/get-field-arguments-by-key.util.ts rename to server/src/workspace/workspace-query-builder/utils/get-field-arguments-by-key.util.ts diff --git a/server/src/tenant/query-builder/utils/stringify-without-key-quote.util.ts b/server/src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util.ts similarity index 100% rename from server/src/tenant/query-builder/utils/stringify-without-key-quote.util.ts rename to server/src/workspace/workspace-query-builder/utils/stringify-without-key-quote.util.ts diff --git a/server/src/tenant/query-builder/query-builder.factory.ts b/server/src/workspace/workspace-query-builder/workspace-query-builder.factory.ts similarity index 72% rename from server/src/tenant/query-builder/query-builder.factory.ts rename to server/src/workspace/workspace-query-builder/workspace-query-builder.factory.ts index dc6e051cd9e..74c43bf48b0 100644 --- a/server/src/tenant/query-builder/query-builder.factory.ts +++ b/server/src/workspace/workspace-query-builder/workspace-query-builder.factory.ts @@ -1,18 +1,18 @@ import { Injectable, Logger } from '@nestjs/common'; -import { QueryBuilderOptions } from 'src/tenant/query-builder/interfaces/query-builder-options.interface'; +import { WorkspaceQueryBuilderOptions } from 'src/workspace/workspace-query-builder/interfaces/workspace-query-builder-options.interface'; import { Record as IRecord, RecordFilter, RecordOrderBy, -} from 'src/tenant/query-builder/interfaces/record.interface'; +} from 'src/workspace/workspace-query-builder/interfaces/record.interface'; import { FindManyResolverArgs, FindOneResolverArgs, CreateManyResolverArgs, UpdateOneResolverArgs, DeleteOneResolverArgs, -} from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { FindManyQueryFactory } from './factories/find-many-query.factory'; import { FindOneQueryFactory } from './factories/find-one-query.factory'; @@ -21,8 +21,8 @@ import { UpdateOneQueryFactory } from './factories/update-one-query.factory'; import { DeleteOneQueryFactory } from './factories/delete-one-query.factory'; @Injectable() -export class QueryBuilderFactory { - private readonly logger = new Logger(QueryBuilderFactory.name); +export class WorkspaceQueryBuilderFactory { + private readonly logger = new Logger(WorkspaceQueryBuilderFactory.name); constructor( private readonly findManyQueryFactory: FindManyQueryFactory, @@ -37,33 +37,36 @@ export class QueryBuilderFactory { OrderBy extends RecordOrderBy = RecordOrderBy, >( args: FindManyResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ): string { return this.findManyQueryFactory.create(args, options); } findOne( args: FindOneResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ): string { return this.findOneQueryFactory.create(args, options); } createMany( args: CreateManyResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ): string { return this.createManyQueryFactory.create(args, options); } updateOne( initialArgs: UpdateOneResolverArgs, - options: QueryBuilderOptions, + options: WorkspaceQueryBuilderOptions, ): string { return this.updateOneQueryFactory.create(initialArgs, options); } - deleteOne(args: DeleteOneResolverArgs, options: QueryBuilderOptions): string { + deleteOne( + args: DeleteOneResolverArgs, + options: WorkspaceQueryBuilderOptions, + ): string { return this.deleteOneQueryFactory.create(args, options); } } diff --git a/server/src/workspace/workspace-query-builder/workspace-query-builder.module.ts b/server/src/workspace/workspace-query-builder/workspace-query-builder.module.ts new file mode 100644 index 00000000000..5edb493735e --- /dev/null +++ b/server/src/workspace/workspace-query-builder/workspace-query-builder.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceQueryBuilderFactory } from './workspace-query-builder.factory'; + +import { workspaceQueryBuilderFactories } from './factories/factories'; + +@Module({ + imports: [], + providers: [...workspaceQueryBuilderFactories, WorkspaceQueryBuilderFactory], + exports: [WorkspaceQueryBuilderFactory], +}) +export class WorkspaceQueryBuilderModule {} diff --git a/server/src/tenant/query-runner/interfaces/pg-graphql.interface.ts b/server/src/workspace/workspace-query-runner/interfaces/pg-graphql.interface.ts similarity index 72% rename from server/src/tenant/query-runner/interfaces/pg-graphql.interface.ts rename to server/src/workspace/workspace-query-runner/interfaces/pg-graphql.interface.ts index d69637ca261..b0bb89aa5b3 100644 --- a/server/src/tenant/query-runner/interfaces/pg-graphql.interface.ts +++ b/server/src/workspace/workspace-query-runner/interfaces/pg-graphql.interface.ts @@ -1,4 +1,4 @@ -import { Record as IRecord } from 'src/tenant/query-builder/interfaces/record.interface'; +import { Record as IRecord } from 'src/workspace/workspace-query-builder/interfaces/record.interface'; export interface PGGraphQLResponse { resolve: { diff --git a/server/src/tenant/query-runner/interfaces/query-runner-optionts.interface.ts b/server/src/workspace/workspace-query-runner/interfaces/query-runner-optionts.interface.ts similarity index 52% rename from server/src/tenant/query-runner/interfaces/query-runner-optionts.interface.ts rename to server/src/workspace/workspace-query-runner/interfaces/query-runner-optionts.interface.ts index 643f3a3d75e..f138a711ed5 100644 --- a/server/src/tenant/query-runner/interfaces/query-runner-optionts.interface.ts +++ b/server/src/workspace/workspace-query-runner/interfaces/query-runner-optionts.interface.ts @@ -1,8 +1,8 @@ import { GraphQLResolveInfo } from 'graphql'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; -export interface QueryRunnerOptions { +export interface WorkspaceQueryRunnerOptions { targetTableName: string; workspaceId: string; info: GraphQLResolveInfo; diff --git a/server/src/tenant/query-runner/utils/__tests__/parse-result.spec.ts b/server/src/workspace/workspace-query-runner/utils/__tests__/parse-result.spec.ts similarity index 97% rename from server/src/tenant/query-runner/utils/__tests__/parse-result.spec.ts rename to server/src/workspace/workspace-query-runner/utils/__tests__/parse-result.spec.ts index 70c0845dd63..2e5c67f5cea 100644 --- a/server/src/tenant/query-runner/utils/__tests__/parse-result.spec.ts +++ b/server/src/workspace/workspace-query-runner/utils/__tests__/parse-result.spec.ts @@ -2,7 +2,7 @@ import { isSpecialKey, handleSpecialKey, parseResult, -} from 'src/tenant/query-runner/utils/parse-result.util'; +} from 'src/workspace/workspace-query-runner/utils/parse-result.util'; describe('isSpecialKey', () => { test('should return true if the key starts with "___"', () => { diff --git a/server/src/tenant/query-runner/utils/parse-result.util.ts b/server/src/workspace/workspace-query-runner/utils/parse-result.util.ts similarity index 100% rename from server/src/tenant/query-runner/utils/parse-result.util.ts rename to server/src/workspace/workspace-query-runner/utils/parse-result.util.ts diff --git a/server/src/workspace/workspace-query-runner/workspace-query-runner.module.ts b/server/src/workspace/workspace-query-runner/workspace-query-runner.module.ts new file mode 100644 index 00000000000..a2340ea3906 --- /dev/null +++ b/server/src/workspace/workspace-query-runner/workspace-query-runner.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceQueryBuilderModule } from 'src/workspace/workspace-query-builder/workspace-query-builder.module'; +import { WorkspaceDataSourceModule } from 'src/workspace/workspace-datasource/workspace-datasource.module'; + +import { WorkspaceQueryRunnerService } from './workspace-query-runner.service'; + +@Module({ + imports: [WorkspaceQueryBuilderModule, WorkspaceDataSourceModule], + providers: [WorkspaceQueryRunnerService], + exports: [WorkspaceQueryRunnerService], +}) +export class WorkspaceQueryRunnerModule {} diff --git a/server/src/tenant/query-runner/query-runner.service.ts b/server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts similarity index 71% rename from server/src/tenant/query-runner/query-runner.service.ts rename to server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts index aeba1ca9fc6..e543951e1c0 100644 --- a/server/src/tenant/query-runner/query-runner.service.ts +++ b/server/src/workspace/workspace-query-runner/workspace-query-runner.service.ts @@ -5,7 +5,7 @@ import { Record as IRecord, RecordFilter, RecordOrderBy, -} from 'src/tenant/query-builder/interfaces/record.interface'; +} from 'src/workspace/workspace-query-builder/interfaces/record.interface'; import { CreateManyResolverArgs, CreateOneResolverArgs, @@ -13,25 +13,25 @@ import { FindManyResolverArgs, FindOneResolverArgs, UpdateOneResolverArgs, -} from 'src/tenant/query-builder/interfaces/resolvers-builder.interface'; +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { QueryBuilderFactory } from 'src/tenant/query-builder/query-builder.factory'; -import { parseResult } from 'src/tenant/query-runner/utils/parse-result.util'; -import { TenantDataSourceService } from 'src/tenant-datasource/tenant-datasource.service'; +import { WorkspaceQueryBuilderFactory } from 'src/workspace/workspace-query-builder/workspace-query-builder.factory'; +import { parseResult } from 'src/workspace/workspace-query-runner/utils/parse-result.util'; +import { WorkspaceDataSourceService } from 'src/workspace/workspace-datasource/workspace-datasource.service'; -import { QueryRunnerOptions } from './interfaces/query-runner-optionts.interface'; +import { WorkspaceQueryRunnerOptions } from './interfaces/query-runner-optionts.interface'; import { PGGraphQLMutation, PGGraphQLResult, } from './interfaces/pg-graphql.interface'; @Injectable() -export class QueryRunnerService { - private readonly logger = new Logger(QueryRunnerService.name); +export class WorkspaceQueryRunnerService { + private readonly logger = new Logger(WorkspaceQueryRunnerService.name); constructor( - private readonly queryBuilderFactory: QueryBuilderFactory, - private readonly tenantDataSourceService: TenantDataSourceService, + private readonly workspaceQueryBuilderFactory: WorkspaceQueryBuilderFactory, + private readonly workspaceDataSourceService: WorkspaceDataSourceService, ) {} async findMany< @@ -40,10 +40,10 @@ export class QueryRunnerService { OrderBy extends RecordOrderBy = RecordOrderBy, >( args: FindManyResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise | undefined> { const { workspaceId, targetTableName } = options; - const query = this.queryBuilderFactory.findMany(args, options); + const query = this.workspaceQueryBuilderFactory.findMany(args, options); const result = await this.execute(query, workspaceId); return this.parseResult>(result, targetTableName, ''); @@ -54,13 +54,13 @@ export class QueryRunnerService { Filter extends RecordFilter = RecordFilter, >( args: FindOneResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise { if (!args.filter || Object.keys(args.filter).length === 0) { throw new BadRequestException('Missing filter argument'); } const { workspaceId, targetTableName } = options; - const query = this.queryBuilderFactory.findOne(args, options); + const query = this.workspaceQueryBuilderFactory.findOne(args, options); const result = await this.execute(query, workspaceId); const parsedResult = this.parseResult>( result, @@ -73,10 +73,10 @@ export class QueryRunnerService { async createMany( args: CreateManyResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise { const { workspaceId, targetTableName } = options; - const query = this.queryBuilderFactory.createMany(args, options); + const query = this.workspaceQueryBuilderFactory.createMany(args, options); const result = await this.execute(query, workspaceId); return this.parseResult>( @@ -88,7 +88,7 @@ export class QueryRunnerService { async createOne( args: CreateOneResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise { const records = await this.createMany({ data: [args.data] }, options); @@ -97,7 +97,7 @@ export class QueryRunnerService { async updateOne( args: UpdateOneResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise { const { workspaceId, targetTableName } = options; @@ -105,7 +105,7 @@ export class QueryRunnerService { workspaceId, targetTableName, }); - const query = this.queryBuilderFactory.updateOne(args, options); + const query = this.workspaceQueryBuilderFactory.updateOne(args, options); console.log({ query }); @@ -122,10 +122,10 @@ export class QueryRunnerService { async deleteOne( args: DeleteOneResolverArgs, - options: QueryRunnerOptions, + options: WorkspaceQueryRunnerOptions, ): Promise { const { workspaceId, targetTableName } = options; - const query = this.queryBuilderFactory.deleteOne(args, options); + const query = this.workspaceQueryBuilderFactory.deleteOne(args, options); const result = await this.execute(query, workspaceId); return this.parseResult>( @@ -140,12 +140,12 @@ export class QueryRunnerService { workspaceId: string, ): Promise { const workspaceDataSource = - await this.tenantDataSourceService.connectToWorkspaceDataSource( + await this.workspaceDataSourceService.connectToWorkspaceDataSource( workspaceId, ); await workspaceDataSource?.query(` - SET search_path TO ${this.tenantDataSourceService.getSchemaName( + SET search_path TO ${this.workspaceDataSourceService.getSchemaName( workspaceId, )}; `); diff --git a/server/src/workspace/workspace-resolver-builder/factories/create-many-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/create-many-resolver.factory.ts new file mode 100644 index 00000000000..66bd291a068 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/create-many-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateManyResolverArgs, + Resolver, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class CreateManyResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'createMany' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.createMany(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/workspace/workspace-resolver-builder/factories/create-one-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/create-one-resolver.factory.ts new file mode 100644 index 00000000000..7b1e2ce974d --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/create-one-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateOneResolverArgs, + Resolver, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class CreateOneResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'createOne' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.createOne(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/workspace/workspace-resolver-builder/factories/delete-one-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/delete-one-resolver.factory.ts new file mode 100644 index 00000000000..052bb1044b8 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/delete-one-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + DeleteOneResolverArgs, + Resolver, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class DeleteOneResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'deleteOne' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.deleteOne(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/tenant/resolver-builder/factories/factories.ts b/server/src/workspace/workspace-resolver-builder/factories/factories.ts similarity index 89% rename from server/src/tenant/resolver-builder/factories/factories.ts rename to server/src/workspace/workspace-resolver-builder/factories/factories.ts index 7b1d2d40ba2..ec02b489293 100644 --- a/server/src/tenant/resolver-builder/factories/factories.ts +++ b/server/src/workspace/workspace-resolver-builder/factories/factories.ts @@ -5,7 +5,7 @@ import { CreateOneResolverFactory } from './create-one-resolver.factory'; import { UpdateOneResolverFactory } from './update-one-resolver.factory'; import { DeleteOneResolverFactory } from './delete-one-resolver.factory'; -export const resolverBuilderFactories = [ +export const workspaceResolverBuilderFactories = [ FindManyResolverFactory, FindOneResolverFactory, CreateManyResolverFactory, @@ -14,7 +14,7 @@ export const resolverBuilderFactories = [ DeleteOneResolverFactory, ]; -export const resolverBuilderMethodNames = { +export const workspaceResolverBuilderMethodNames = { queries: [ FindManyResolverFactory.methodName, FindOneResolverFactory.methodName, diff --git a/server/src/workspace/workspace-resolver-builder/factories/find-many-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/find-many-resolver.factory.ts new file mode 100644 index 00000000000..4ffa9997106 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/find-many-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + FindManyResolverArgs, + Resolver, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class FindManyResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'findMany' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.findMany(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/workspace/workspace-resolver-builder/factories/find-one-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/find-one-resolver.factory.ts new file mode 100644 index 00000000000..c97182817f8 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/find-one-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + FindOneResolverArgs, + Resolver, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class FindOneResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'findOne' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.findOne(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/workspace/workspace-resolver-builder/factories/update-one-resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/factories/update-one-resolver.factory.ts new file mode 100644 index 00000000000..72a6abd9246 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/factories/update-one-resolver.factory.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; + +import { + Resolver, + UpdateOneResolverArgs, +} from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface'; + +import { WorkspaceQueryRunnerService } from 'src/workspace/workspace-query-runner/workspace-query-runner.service'; + +@Injectable() +export class UpdateOneResolverFactory + implements WorkspaceResolverBuilderFactoryInterface +{ + public static methodName = 'updateOne' as const; + + constructor( + private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService, + ) {} + + create( + context: WorkspaceSchemaBuilderContext, + ): Resolver { + const internalContext = context; + + return (_source, args, context, info) => { + return this.workspaceQueryRunnerService.updateOne(args, { + targetTableName: internalContext.targetTableName, + workspaceId: internalContext.workspaceId, + info, + fieldMetadataCollection: internalContext.fieldMetadataCollection, + }); + }; + } +} diff --git a/server/src/tenant/resolver-builder/interfaces/pg-graphql.interface.ts b/server/src/workspace/workspace-resolver-builder/interfaces/pg-graphql.interface.ts similarity index 71% rename from server/src/tenant/resolver-builder/interfaces/pg-graphql.interface.ts rename to server/src/workspace/workspace-resolver-builder/interfaces/pg-graphql.interface.ts index 464f1f890af..4bca0075e2e 100644 --- a/server/src/tenant/resolver-builder/interfaces/pg-graphql.interface.ts +++ b/server/src/workspace/workspace-resolver-builder/interfaces/pg-graphql.interface.ts @@ -1,4 +1,4 @@ -import { Record as IRecord } from './record.interface'; +import { Record as IRecord } from 'src/workspace/workspace-query-builder/interfaces/record.interface'; export interface PGGraphQLResponse { resolve: { diff --git a/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface.ts b/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface.ts new file mode 100644 index 00000000000..d1c88003993 --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface.ts @@ -0,0 +1,7 @@ +import { WorkspaceSchemaBuilderContext } from 'src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface'; + +import { Resolver } from './workspace-resolvers-builder.interface'; + +export interface WorkspaceResolverBuilderFactoryInterface { + create(context: WorkspaceSchemaBuilderContext): Resolver; +} diff --git a/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts b/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts new file mode 100644 index 00000000000..5b13f96cfaf --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface.ts @@ -0,0 +1,59 @@ +import { GraphQLFieldResolver } from 'graphql'; + +import { + Record, + RecordFilter, + RecordOrderBy, +} from 'src/workspace/workspace-query-builder/interfaces/record.interface'; + +import { workspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/factories/factories'; + +export type Resolver = GraphQLFieldResolver; + +export interface FindManyResolverArgs< + Filter extends RecordFilter = RecordFilter, + OrderBy extends RecordOrderBy = RecordOrderBy, +> { + first?: number; + last?: number; + before?: string; + after?: string; + filter?: Filter; + orderBy?: OrderBy; +} + +export interface FindOneResolverArgs { + filter?: Filter; +} + +export interface CreateOneResolverArgs { + data: Data; +} + +export interface CreateManyResolverArgs { + data: Data[]; +} + +export interface UpdateOneResolverArgs { + id: string; + data: Data; +} + +export interface DeleteOneResolverArgs { + id: string; +} + +export type WorkspaceResolverBuilderQueryMethodNames = + (typeof workspaceResolverBuilderMethodNames.queries)[number]; + +export type WorkspaceResolverBuilderMutationMethodNames = + (typeof workspaceResolverBuilderMethodNames.mutations)[number]; + +export type WorkspaceResolverBuilderMethodNames = + | WorkspaceResolverBuilderQueryMethodNames + | WorkspaceResolverBuilderMutationMethodNames; + +export interface WorkspaceResolverBuilderMethods { + readonly queries: readonly WorkspaceResolverBuilderQueryMethodNames[]; + readonly mutations: readonly WorkspaceResolverBuilderMutationMethodNames[]; +} diff --git a/server/src/workspace/workspace-resolver-builder/workspace-resolver-builder.module.ts b/server/src/workspace/workspace-resolver-builder/workspace-resolver-builder.module.ts new file mode 100644 index 00000000000..390f35a5fbd --- /dev/null +++ b/server/src/workspace/workspace-resolver-builder/workspace-resolver-builder.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; + +import { WorkspaceQueryRunnerModule } from 'src/workspace/workspace-query-runner/workspace-query-runner.module'; + +import { WorkspaceResolverFactory } from './workspace-resolver.factory'; + +import { workspaceResolverBuilderFactories } from './factories/factories'; + +@Module({ + imports: [WorkspaceQueryRunnerModule], + providers: [...workspaceResolverBuilderFactories, WorkspaceResolverFactory], + exports: [WorkspaceResolverFactory], +}) +export class WorkspaceResolverBuilderModule {} diff --git a/server/src/tenant/resolver-builder/resolver.factory.ts b/server/src/workspace/workspace-resolver-builder/workspace-resolver.factory.ts similarity index 78% rename from server/src/tenant/resolver-builder/resolver.factory.ts rename to server/src/workspace/workspace-resolver-builder/workspace-resolver.factory.ts index 6d9cb2faad6..826e4e63d8c 100644 --- a/server/src/tenant/resolver-builder/resolver.factory.ts +++ b/server/src/workspace/workspace-resolver-builder/workspace-resolver.factory.ts @@ -2,9 +2,9 @@ import { Injectable, Logger } from '@nestjs/common'; import { IResolvers } from '@graphql-tools/utils'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; -import { getResolverName } from 'src/tenant/utils/get-resolver-name.util'; +import { getResolverName } from 'src/workspace/utils/get-resolver-name.util'; import { FindManyResolverFactory } from './factories/find-many-resolver.factory'; import { FindOneResolverFactory } from './factories/find-one-resolver.factory'; @@ -13,14 +13,14 @@ import { CreateOneResolverFactory } from './factories/create-one-resolver.factor import { UpdateOneResolverFactory } from './factories/update-one-resolver.factory'; import { DeleteOneResolverFactory } from './factories/delete-one-resolver.factory'; import { - ResolverBuilderMethodNames, - ResolverBuilderMethods, -} from './interfaces/resolvers-builder.interface'; -import { ResolverBuilderFactoryInterface } from './interfaces/resolver-builder-factory.interface'; + WorkspaceResolverBuilderMethodNames, + WorkspaceResolverBuilderMethods, +} from './interfaces/workspace-resolvers-builder.interface'; +import { WorkspaceResolverBuilderFactoryInterface } from './interfaces/workspace-resolver-builder-factory.interface'; @Injectable() -export class ResolverFactory { - private readonly logger = new Logger(ResolverFactory.name); +export class WorkspaceResolverFactory { + private readonly logger = new Logger(WorkspaceResolverFactory.name); constructor( private readonly findManyResolverFactory: FindManyResolverFactory, @@ -34,11 +34,11 @@ export class ResolverFactory { async create( workspaceId: string, objectMetadataCollection: ObjectMetadataInterface[], - resolverBuilderMethods: ResolverBuilderMethods, + workspaceResolverBuilderMethods: WorkspaceResolverBuilderMethods, ): Promise { const factories = new Map< - ResolverBuilderMethodNames, - ResolverBuilderFactoryInterface + WorkspaceResolverBuilderMethodNames, + WorkspaceResolverBuilderFactoryInterface >([ ['findMany', this.findManyResolverFactory], ['findOne', this.findOneResolverFactory], @@ -54,7 +54,7 @@ export class ResolverFactory { for (const objectMetadata of objectMetadataCollection) { // Generate query resolvers - for (const methodName of resolverBuilderMethods.queries) { + for (const methodName of workspaceResolverBuilderMethods.queries) { const resolverName = getResolverName(objectMetadata, methodName); const resolverFactory = factories.get(methodName); @@ -76,7 +76,7 @@ export class ResolverFactory { } // Generate mutation resolvers - for (const methodName of resolverBuilderMethods.mutations) { + for (const methodName of workspaceResolverBuilderMethods.mutations) { const resolverName = getResolverName(objectMetadata, methodName); const resolverFactory = factories.get(methodName); diff --git a/server/src/tenant/schema-builder/factories/args.factory.ts b/server/src/workspace/workspace-schema-builder/factories/args.factory.ts similarity index 81% rename from server/src/tenant/schema-builder/factories/args.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/args.factory.ts index 59f226ca4ab..d3fdb87f138 100644 --- a/server/src/tenant/schema-builder/factories/args.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/args.factory.ts @@ -2,11 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLFieldConfigArgumentMap } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ArgsMetadata } from 'src/tenant/schema-builder/interfaces/param-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ArgsMetadata } from 'src/workspace/workspace-schema-builder/interfaces/param-metadata.interface'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { TypeMapperService } from 'src/tenant/schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { TypeMapperService } from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; @Injectable() export class ArgsFactory { @@ -19,7 +19,7 @@ export class ArgsFactory { public create( { args, objectMetadata }: ArgsMetadata, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigArgumentMap { const fieldConfigMap: GraphQLFieldConfigArgumentMap = {}; diff --git a/server/src/tenant/schema-builder/factories/connection-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/connection-type-definition.factory.ts similarity index 84% rename from server/src/tenant/schema-builder/factories/connection-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/connection-type-definition.factory.ts index 88e6e1b75b7..1b46d667d4b 100644 --- a/server/src/tenant/schema-builder/factories/connection-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/connection-type-definition.factory.ts @@ -2,8 +2,8 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLFieldConfigMap, GraphQLObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; @@ -26,7 +26,7 @@ export class ConnectionTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): ObjectTypeDefinition { const kind = ObjectTypeDefinitionKind.Connection; @@ -43,7 +43,7 @@ export class ConnectionTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigMap { const fields: GraphQLFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/connection-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/connection-type.factory.ts similarity index 71% rename from server/src/tenant/schema-builder/factories/connection-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/connection-type.factory.ts index f74dbea1bda..7117bcec81a 100644 --- a/server/src/tenant/schema-builder/factories/connection-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/connection-type.factory.ts @@ -2,15 +2,15 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLOutputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { PageInfoType } from 'src/tenant/schema-builder/graphql-types/object'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { PageInfoType } from 'src/workspace/workspace-schema-builder/graphql-types/object'; import { ConnectionTypeDefinitionKind } from './connection-type-definition.factory'; import { ObjectTypeDefinitionKind } from './object-type-definition.factory'; @@ -27,7 +27,7 @@ export class ConnectionTypeFactory { public create( objectMetadata: ObjectMetadataInterface, kind: ConnectionTypeDefinitionKind, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLOutputType { if (kind === ConnectionTypeDefinitionKind.PageInfo) { diff --git a/server/src/tenant/schema-builder/factories/edge-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/edge-type-definition.factory.ts similarity index 82% rename from server/src/tenant/schema-builder/factories/edge-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/edge-type-definition.factory.ts index 4102177b301..e6c1bfa4bdc 100644 --- a/server/src/tenant/schema-builder/factories/edge-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/edge-type-definition.factory.ts @@ -2,8 +2,8 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLFieldConfigMap, GraphQLObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; @@ -26,7 +26,7 @@ export class EdgeTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): ObjectTypeDefinition { const kind = ObjectTypeDefinitionKind.Edge; @@ -43,7 +43,7 @@ export class EdgeTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigMap { const fields: GraphQLFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/edge-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/edge-type.factory.ts similarity index 70% rename from server/src/tenant/schema-builder/factories/edge-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/edge-type.factory.ts index 1e90d0187cb..5baf5d5d1d1 100644 --- a/server/src/tenant/schema-builder/factories/edge-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/edge-type.factory.ts @@ -2,15 +2,15 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLOutputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { CursorScalarType } from 'src/tenant/schema-builder/graphql-types/scalars'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { CursorScalarType } from 'src/workspace/workspace-schema-builder/graphql-types/scalars'; import { ObjectTypeDefinitionKind } from './object-type-definition.factory'; import { EdgeTypeDefinitionKind } from './edge-type-definition.factory'; @@ -27,7 +27,7 @@ export class EdgeTypeFactory { public create( objectMetadata: ObjectMetadataInterface, kind: EdgeTypeDefinitionKind, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLOutputType { if (kind === EdgeTypeDefinitionKind.Cursor) { diff --git a/server/src/tenant/schema-builder/factories/extend-object-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/extend-object-type-definition.factory.ts similarity index 84% rename from server/src/tenant/schema-builder/factories/extend-object-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/extend-object-type-definition.factory.ts index f0c28685920..ea5b8c35e8c 100644 --- a/server/src/tenant/schema-builder/factories/extend-object-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/extend-object-type-definition.factory.ts @@ -6,18 +6,18 @@ import { GraphQLObjectType, } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { objectContainsCompositeField } from 'src/tenant/schema-builder/utils/object-contains-composite-field'; -import { getResolverArgs } from 'src/tenant/schema-builder/utils/get-resolver-args.util'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { objectContainsCompositeField } from 'src/workspace/workspace-schema-builder/utils/object-contains-composite-field'; +import { getResolverArgs } from 'src/workspace/workspace-schema-builder/utils/get-resolver-args.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { RelationDirection, deduceRelationDirection, -} from 'src/tenant/utils/deduce-relation-direction.util'; +} from 'src/workspace/utils/deduce-relation-direction.util'; import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity'; import { RelationTypeFactory } from './relation-type.factory'; @@ -47,7 +47,7 @@ export class ExtendObjectTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): ObjectTypeDefinition { const kind = ObjectTypeDefinitionKind.Plain; const gqlType = this.typeDefinitionsStorage.getObjectTypeByKey( @@ -104,7 +104,7 @@ export class ExtendObjectTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigMap { const fields: GraphQLFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/factories.ts b/server/src/workspace/workspace-schema-builder/factories/factories.ts similarity index 97% rename from server/src/tenant/schema-builder/factories/factories.ts rename to server/src/workspace/workspace-schema-builder/factories/factories.ts index bf6df0ecd59..6a68b92ed4a 100644 --- a/server/src/tenant/schema-builder/factories/factories.ts +++ b/server/src/workspace/workspace-schema-builder/factories/factories.ts @@ -18,7 +18,7 @@ import { RelationTypeFactory } from './relation-type.factory'; import { ExtendObjectTypeDefinitionFactory } from './extend-object-type-definition.factory'; import { OrphanedTypesFactory } from './orphaned-types.factory'; -export const schemaBuilderFactories = [ +export const workspaceSchemaBuilderFactories = [ ArgsFactory, InputTypeFactory, InputTypeDefinitionFactory, diff --git a/server/src/tenant/schema-builder/factories/filter-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/filter-type-definition.factory.ts similarity index 80% rename from server/src/tenant/schema-builder/factories/filter-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/filter-type-definition.factory.ts index 41c6ee19ce4..607d1c09625 100644 --- a/server/src/tenant/schema-builder/factories/filter-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/filter-type-definition.factory.ts @@ -2,12 +2,12 @@ import { Injectable } from '@nestjs/common'; import { GraphQLInputFieldConfigMap, GraphQLInputObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; -import { TypeMapperService } from 'src/tenant/schema-builder/services/type-mapper.service'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { TypeMapperService } from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { FilterTypeFactory } from './filter-type.factory'; import { @@ -24,7 +24,7 @@ export class FilterTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): InputTypeDefinition { const kind = InputTypeDefinitionKind.Filter; const filterInputType = new GraphQLInputObjectType({ @@ -63,7 +63,7 @@ export class FilterTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLInputFieldConfigMap { const fields: GraphQLInputFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/filter-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/filter-type.factory.ts similarity index 73% rename from server/src/tenant/schema-builder/factories/filter-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/filter-type.factory.ts index 36d1084befd..48b15813911 100644 --- a/server/src/tenant/schema-builder/factories/filter-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/filter-type.factory.ts @@ -2,14 +2,14 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLInputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; import { InputTypeDefinitionKind } from './input-type-definition.factory'; @@ -24,7 +24,7 @@ export class FilterTypeFactory { public create( fieldMetadata: FieldMetadataInterface, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLInputType { let filterType = this.typeMapperService.mapToFilterType( diff --git a/server/src/tenant/schema-builder/factories/input-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/input-type-definition.factory.ts similarity index 80% rename from server/src/tenant/schema-builder/factories/input-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/input-type-definition.factory.ts index 12d1efd8630..31796031424 100644 --- a/server/src/tenant/schema-builder/factories/input-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/input-type-definition.factory.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { GraphQLInputFieldConfigMap, GraphQLInputObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { InputTypeFactory } from './input-type.factory'; @@ -30,7 +30,7 @@ export class InputTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, kind: InputTypeDefinitionKind, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): InputTypeDefinition { return { target: objectMetadata.id, @@ -48,7 +48,7 @@ export class InputTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, kind: InputTypeDefinitionKind, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLInputFieldConfigMap { const fields: GraphQLInputFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/input-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/input-type.factory.ts similarity index 74% rename from server/src/tenant/schema-builder/factories/input-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/input-type.factory.ts index 804ae43b0d7..5d75927ca28 100644 --- a/server/src/tenant/schema-builder/factories/input-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/input-type.factory.ts @@ -2,14 +2,14 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLInputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; import { InputTypeDefinitionKind } from './input-type-definition.factory'; @@ -25,7 +25,7 @@ export class InputTypeFactory { public create( fieldMetadata: FieldMetadataInterface, kind: InputTypeDefinitionKind, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLInputType { let inputType: GraphQLInputType | undefined = diff --git a/server/src/workspace/workspace-schema-builder/factories/mutation-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/mutation-type.factory.ts new file mode 100644 index 00000000000..c736c9ea19c --- /dev/null +++ b/server/src/workspace/workspace-schema-builder/factories/mutation-type.factory.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; + +import { GraphQLObjectType } from 'graphql'; + +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { WorkspaceResolverBuilderMutationMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; + +import { ObjectTypeName, RootTypeFactory } from './root-type.factory'; + +@Injectable() +export class MutationTypeFactory { + constructor(private readonly rootTypeFactory: RootTypeFactory) {} + create( + objectMetadataCollection: ObjectMetadataInterface[], + workspaceResolverMethodNames: WorkspaceResolverBuilderMutationMethodNames[], + options: WorkspaceBuildSchemaOptions, + ): GraphQLObjectType { + return this.rootTypeFactory.create( + objectMetadataCollection, + workspaceResolverMethodNames, + ObjectTypeName.Mutation, + options, + ); + } +} diff --git a/server/src/tenant/schema-builder/factories/object-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/object-type-definition.factory.ts similarity index 79% rename from server/src/tenant/schema-builder/factories/object-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/object-type-definition.factory.ts index 6bcf01dbfd9..d420eade0c2 100644 --- a/server/src/tenant/schema-builder/factories/object-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/object-type-definition.factory.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { GraphQLFieldConfigMap, GraphQLObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { OutputTypeFactory } from './output-type.factory'; @@ -29,7 +29,7 @@ export class ObjectTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, kind: ObjectTypeDefinitionKind, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): ObjectTypeDefinition { return { target: objectMetadata.id, @@ -45,7 +45,7 @@ export class ObjectTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, kind: ObjectTypeDefinitionKind, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigMap { const fields: GraphQLFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/order-by-type-definition.factory.ts b/server/src/workspace/workspace-schema-builder/factories/order-by-type-definition.factory.ts similarity index 78% rename from server/src/tenant/schema-builder/factories/order-by-type-definition.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/order-by-type-definition.factory.ts index 27b55cef951..9d9127b391a 100644 --- a/server/src/tenant/schema-builder/factories/order-by-type-definition.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/order-by-type-definition.factory.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { GraphQLInputFieldConfigMap, GraphQLInputObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; import { pascalCase } from 'src/utils/pascal-case'; -import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util'; +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; import { InputTypeDefinition, @@ -20,7 +20,7 @@ export class OrderByTypeDefinitionFactory { public create( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): InputTypeDefinition { const kind = InputTypeDefinitionKind.OrderBy; @@ -39,7 +39,7 @@ export class OrderByTypeDefinitionFactory { private generateFields( objectMetadata: ObjectMetadataInterface, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLInputFieldConfigMap { const fields: GraphQLInputFieldConfigMap = {}; diff --git a/server/src/tenant/schema-builder/factories/order-by-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/order-by-type.factory.ts similarity index 72% rename from server/src/tenant/schema-builder/factories/order-by-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/order-by-type.factory.ts index 5db2d225668..0ee630d97a9 100644 --- a/server/src/tenant/schema-builder/factories/order-by-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/order-by-type.factory.ts @@ -2,14 +2,14 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLInputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; import { InputTypeDefinitionKind } from './input-type-definition.factory'; @@ -24,7 +24,7 @@ export class OrderByTypeFactory { public create( fieldMetadata: FieldMetadataInterface, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLInputType { let orderByType = this.typeMapperService.mapToOrderByType( diff --git a/server/src/tenant/schema-builder/factories/orphaned-types.factory.ts b/server/src/workspace/workspace-schema-builder/factories/orphaned-types.factory.ts similarity index 83% rename from server/src/tenant/schema-builder/factories/orphaned-types.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/orphaned-types.factory.ts index d8e13f7370c..72e767a4b89 100644 --- a/server/src/tenant/schema-builder/factories/orphaned-types.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/orphaned-types.factory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { GraphQLNamedType } from 'graphql'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; @Injectable() export class OrphanedTypesFactory { diff --git a/server/src/tenant/schema-builder/factories/output-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/output-type.factory.ts similarity index 74% rename from server/src/tenant/schema-builder/factories/output-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/output-type.factory.ts index 79be5d7ba38..519bcac15c2 100644 --- a/server/src/tenant/schema-builder/factories/output-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/output-type.factory.ts @@ -2,14 +2,14 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLOutputType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { TypeMapperService, TypeOptions, -} from 'src/tenant/schema-builder/services/type-mapper.service'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; +} from 'src/workspace/workspace-schema-builder/services/type-mapper.service'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; import { ObjectTypeDefinitionKind } from './object-type-definition.factory'; @@ -25,7 +25,7 @@ export class OutputTypeFactory { public create( fieldMetadata: FieldMetadataInterface, kind: ObjectTypeDefinitionKind, - buildOtions: BuildSchemaOptions, + buildOtions: WorkspaceBuildSchemaOptions, typeOptions: TypeOptions, ): GraphQLOutputType { let gqlType: GraphQLOutputType | undefined = diff --git a/server/src/workspace/workspace-schema-builder/factories/query-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/query-type.factory.ts new file mode 100644 index 00000000000..aae048ce6c6 --- /dev/null +++ b/server/src/workspace/workspace-schema-builder/factories/query-type.factory.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; + +import { GraphQLObjectType } from 'graphql'; + +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { WorkspaceResolverBuilderQueryMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; + +import { ObjectTypeName, RootTypeFactory } from './root-type.factory'; + +@Injectable() +export class QueryTypeFactory { + constructor(private readonly rootTypeFactory: RootTypeFactory) {} + create( + objectMetadataCollection: ObjectMetadataInterface[], + workspaceResolverMethodNames: WorkspaceResolverBuilderQueryMethodNames[], + options: WorkspaceBuildSchemaOptions, + ): GraphQLObjectType { + return this.rootTypeFactory.create( + objectMetadataCollection, + workspaceResolverMethodNames, + ObjectTypeName.Query, + options, + ); + } +} diff --git a/server/src/tenant/schema-builder/factories/relation-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/relation-type.factory.ts similarity index 79% rename from server/src/tenant/schema-builder/factories/relation-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/relation-type.factory.ts index 2c047f38661..e8d12d4dd11 100644 --- a/server/src/tenant/schema-builder/factories/relation-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/relation-type.factory.ts @@ -2,12 +2,12 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLOutputType } from 'graphql'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; -import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; +import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface'; import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { RelationDirection } from 'src/tenant/utils/deduce-relation-direction.util'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { RelationDirection } from 'src/workspace/utils/deduce-relation-direction.util'; import { ObjectTypeDefinitionKind } from './object-type-definition.factory'; diff --git a/server/src/tenant/schema-builder/factories/root-type.factory.ts b/server/src/workspace/workspace-schema-builder/factories/root-type.factory.ts similarity index 69% rename from server/src/tenant/schema-builder/factories/root-type.factory.ts rename to server/src/workspace/workspace-schema-builder/factories/root-type.factory.ts index 7d05f43b4b3..4fe78208c52 100644 --- a/server/src/tenant/schema-builder/factories/root-type.factory.ts +++ b/server/src/workspace/workspace-schema-builder/factories/root-type.factory.ts @@ -2,13 +2,13 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLFieldConfigMap, GraphQLObjectType } from 'graphql'; -import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; -import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; +import { WorkspaceBuildSchemaOptions } from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; +import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; -import { TypeDefinitionsStorage } from 'src/tenant/schema-builder/storages/type-definitions.storage'; -import { getResolverName } from 'src/tenant/utils/get-resolver-name.util'; -import { getResolverArgs } from 'src/tenant/schema-builder/utils/get-resolver-args.util'; +import { TypeDefinitionsStorage } from 'src/workspace/workspace-schema-builder/storages/type-definitions.storage'; +import { getResolverName } from 'src/workspace/utils/get-resolver-name.util'; +import { getResolverArgs } from 'src/workspace/workspace-schema-builder/utils/get-resolver-args.util'; import { ArgsFactory } from './args.factory'; import { ObjectTypeDefinitionKind } from './object-type-definition.factory'; @@ -30,15 +30,15 @@ export class RootTypeFactory { create( objectMetadataCollection: ObjectMetadataInterface[], - resolverMethodNames: ResolverBuilderMethodNames[], + workspaceResolverMethodNames: WorkspaceResolverBuilderMethodNames[], objectTypeName: ObjectTypeName, - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ): GraphQLObjectType { - if (resolverMethodNames.length === 0) { + if (workspaceResolverMethodNames.length === 0) { this.logger.error( `No resolver methods were found for ${objectTypeName.toString()}`, { - resolverMethodNames, + workspaceResolverMethodNames, objectTypeName, options, }, @@ -53,7 +53,7 @@ export class RootTypeFactory { name: objectTypeName.toString(), fields: this.generateFields( objectMetadataCollection, - resolverMethodNames, + workspaceResolverMethodNames, options, ), }); @@ -61,13 +61,13 @@ export class RootTypeFactory { private generateFields( objectMetadataCollection: ObjectMetadataInterface[], - resolverMethodNames: ResolverBuilderMethodNames[], - options: BuildSchemaOptions, + workspaceResolverMethodNames: WorkspaceResolverBuilderMethodNames[], + options: WorkspaceBuildSchemaOptions, ): GraphQLFieldConfigMap { const fieldConfigMap: GraphQLFieldConfigMap = {}; for (const objectMetadata of objectMetadataCollection) { - for (const methodName of resolverMethodNames) { + for (const methodName of workspaceResolverMethodNames) { const name = getResolverName(objectMetadata, methodName); const args = getResolverArgs(methodName); const outputType = this.typeDefinitionsStorage.getObjectTypeByKey( diff --git a/server/src/tenant/schema-builder/graphql-types/enum/index.ts b/server/src/workspace/workspace-schema-builder/graphql-types/enum/index.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/enum/index.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/enum/index.ts diff --git a/server/src/tenant/schema-builder/graphql-types/enum/order-by-direction.enum-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/enum/order-by-direction.enum-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/enum/order-by-direction.enum-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/enum/order-by-direction.enum-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/big-float-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/big-float-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/big-float-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/big-float-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/big-int-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/big-int-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/big-int-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/big-int-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/boolean-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/boolean-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/boolean-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/boolean-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/date-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/date-filter.input-type.ts similarity index 82% rename from server/src/tenant/schema-builder/graphql-types/input/date-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/date-filter.input-type.ts index 5b771e0831b..e61744b853f 100644 --- a/server/src/tenant/schema-builder/graphql-types/input/date-filter.input-type.ts +++ b/server/src/workspace/workspace-schema-builder/graphql-types/input/date-filter.input-type.ts @@ -1,6 +1,6 @@ import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull } from 'graphql'; -import { DateScalarType } from 'src/tenant/schema-builder/graphql-types/scalars'; +import { DateScalarType } from 'src/workspace/workspace-schema-builder/graphql-types/scalars'; export const DateFilterType = new GraphQLInputObjectType({ name: 'DateFilter', diff --git a/server/src/tenant/schema-builder/graphql-types/input/date-time-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/date-time-filter.input-type.ts similarity index 83% rename from server/src/tenant/schema-builder/graphql-types/input/date-time-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/date-time-filter.input-type.ts index 91d5570bce1..d5ac00d5278 100644 --- a/server/src/tenant/schema-builder/graphql-types/input/date-time-filter.input-type.ts +++ b/server/src/workspace/workspace-schema-builder/graphql-types/input/date-time-filter.input-type.ts @@ -1,6 +1,6 @@ import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull } from 'graphql'; -import { DateTimeScalarType } from 'src/tenant/schema-builder/graphql-types/scalars'; +import { DateTimeScalarType } from 'src/workspace/workspace-schema-builder/graphql-types/scalars'; export const DatetimeFilterType = new GraphQLInputObjectType({ name: 'DateTimeFilter', diff --git a/server/src/tenant/schema-builder/graphql-types/input/float-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/float-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/float-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/float-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/index.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/index.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/index.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/index.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/int-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/int-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/int-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/int-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/string-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/string-filter.input-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/input/string-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/string-filter.input-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/input/time-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/time-filter.input-type.ts similarity index 82% rename from server/src/tenant/schema-builder/graphql-types/input/time-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/time-filter.input-type.ts index b52e40f7b5f..eb71dd6942d 100644 --- a/server/src/tenant/schema-builder/graphql-types/input/time-filter.input-type.ts +++ b/server/src/workspace/workspace-schema-builder/graphql-types/input/time-filter.input-type.ts @@ -1,6 +1,6 @@ import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull } from 'graphql'; -import { TimeScalarType } from 'src/tenant/schema-builder/graphql-types/scalars'; +import { TimeScalarType } from 'src/workspace/workspace-schema-builder/graphql-types/scalars'; export const TimeFilterType = new GraphQLInputObjectType({ name: 'TimeFilter', diff --git a/server/src/tenant/schema-builder/graphql-types/input/uuid-filter.input-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/input/uuid-filter.input-type.ts similarity index 75% rename from server/src/tenant/schema-builder/graphql-types/input/uuid-filter.input-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/input/uuid-filter.input-type.ts index 2fed155e8c6..9cdd76a7f37 100644 --- a/server/src/tenant/schema-builder/graphql-types/input/uuid-filter.input-type.ts +++ b/server/src/workspace/workspace-schema-builder/graphql-types/input/uuid-filter.input-type.ts @@ -1,6 +1,6 @@ import { GraphQLInputObjectType, GraphQLList } from 'graphql'; -import { UUIDScalarType } from 'src/tenant/schema-builder/graphql-types/scalars'; +import { UUIDScalarType } from 'src/workspace/workspace-schema-builder/graphql-types/scalars'; export const UUIDFilterType = new GraphQLInputObjectType({ name: 'UUIDFilter', diff --git a/server/src/tenant/schema-builder/graphql-types/object/index.ts b/server/src/workspace/workspace-schema-builder/graphql-types/object/index.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/object/index.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/object/index.ts diff --git a/server/src/tenant/schema-builder/graphql-types/object/page-into.object-type.ts b/server/src/workspace/workspace-schema-builder/graphql-types/object/page-into.object-type.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/object/page-into.object-type.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/object/page-into.object-type.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/big-float.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/big-float.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/big-float.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/big-float.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/big-int.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/big-int.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/big-int.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/big-int.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/cursor.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/cursor.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/cursor.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/cursor.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/date-time.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/date-time.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/date-time.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/date-time.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/date.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/date.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/date.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/date.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/index.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/index.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/index.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/index.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/time.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/time.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/time.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/time.scalar.ts diff --git a/server/src/tenant/schema-builder/graphql-types/scalars/uuid.scalar.ts b/server/src/workspace/workspace-schema-builder/graphql-types/scalars/uuid.scalar.ts similarity index 100% rename from server/src/tenant/schema-builder/graphql-types/scalars/uuid.scalar.ts rename to server/src/workspace/workspace-schema-builder/graphql-types/scalars/uuid.scalar.ts diff --git a/server/src/tenant/schema-builder/interfaces/field-metadata.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/field-metadata.interface.ts similarity index 100% rename from server/src/tenant/schema-builder/interfaces/field-metadata.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/field-metadata.interface.ts diff --git a/server/src/tenant/schema-builder/interfaces/object-metadata.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/object-metadata.interface.ts similarity index 100% rename from server/src/tenant/schema-builder/interfaces/object-metadata.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/object-metadata.interface.ts diff --git a/server/src/tenant/schema-builder/interfaces/param-metadata.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/param-metadata.interface.ts similarity index 78% rename from server/src/tenant/schema-builder/interfaces/param-metadata.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/param-metadata.interface.ts index 6c8e0fa6660..f8ca6cbc6e7 100644 --- a/server/src/tenant/schema-builder/interfaces/param-metadata.interface.ts +++ b/server/src/workspace/workspace-schema-builder/interfaces/param-metadata.interface.ts @@ -1,4 +1,4 @@ -import { InputTypeDefinitionKind } from 'src/tenant/schema-builder/factories/input-type-definition.factory'; +import { InputTypeDefinitionKind } from 'src/workspace/workspace-schema-builder/factories/input-type-definition.factory'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; import { ObjectMetadataInterface } from './object-metadata.interface'; diff --git a/server/src/tenant/schema-builder/interfaces/relation-metadata.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface.ts similarity index 100% rename from server/src/tenant/schema-builder/interfaces/relation-metadata.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface.ts diff --git a/server/src/tenant/schema-builder/interfaces/build-schema-optionts.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface.ts similarity index 86% rename from server/src/tenant/schema-builder/interfaces/build-schema-optionts.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface.ts index e651f133d43..19bd21e2788 100644 --- a/server/src/tenant/schema-builder/interfaces/build-schema-optionts.interface.ts +++ b/server/src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface.ts @@ -1,7 +1,7 @@ export type DateScalarMode = 'isoDate' | 'timestamp'; export type NumberScalarMode = 'float' | 'integer'; -export interface BuildSchemaOptions { +export interface WorkspaceBuildSchemaOptions { /** * Date scalar mode * @default 'isoDate' diff --git a/server/src/tenant/schema-builder/interfaces/schema-builder-context.interface.ts b/server/src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface.ts similarity index 78% rename from server/src/tenant/schema-builder/interfaces/schema-builder-context.interface.ts rename to server/src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface.ts index 46751bc66bb..3136ea75da5 100644 --- a/server/src/tenant/schema-builder/interfaces/schema-builder-context.interface.ts +++ b/server/src/workspace/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface.ts @@ -1,6 +1,6 @@ import { FieldMetadataInterface } from './field-metadata.interface'; -export interface SchemaBuilderContext { +export interface WorkspaceSchemaBuilderContext { workspaceId: string; targetTableName: string; fieldMetadataCollection: FieldMetadataInterface[]; diff --git a/server/src/tenant/schema-builder/object-definitions/currency.object-definition.ts b/server/src/workspace/workspace-schema-builder/object-definitions/currency.object-definition.ts similarity index 81% rename from server/src/tenant/schema-builder/object-definitions/currency.object-definition.ts rename to server/src/workspace/workspace-schema-builder/object-definitions/currency.object-definition.ts index fbd2ed07301..86677b38a5e 100644 --- a/server/src/tenant/schema-builder/object-definitions/currency.object-definition.ts +++ b/server/src/workspace/workspace-schema-builder/object-definitions/currency.object-definition.ts @@ -1,5 +1,5 @@ -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; diff --git a/server/src/tenant/schema-builder/object-definitions/link.object-definition.ts b/server/src/workspace/workspace-schema-builder/object-definitions/link.object-definition.ts similarity index 79% rename from server/src/tenant/schema-builder/object-definitions/link.object-definition.ts rename to server/src/workspace/workspace-schema-builder/object-definitions/link.object-definition.ts index 822c1ea7124..e179c23fc6e 100644 --- a/server/src/tenant/schema-builder/object-definitions/link.object-definition.ts +++ b/server/src/workspace/workspace-schema-builder/object-definitions/link.object-definition.ts @@ -1,5 +1,5 @@ -import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface'; -import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface'; +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; +import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; diff --git a/server/src/tenant/schema-builder/services/type-mapper.service.ts b/server/src/workspace/workspace-schema-builder/services/type-mapper.service.ts similarity index 94% rename from server/src/tenant/schema-builder/services/type-mapper.service.ts rename to server/src/workspace/workspace-schema-builder/services/type-mapper.service.ts index 76276f4483d..effc9329ce8 100644 --- a/server/src/tenant/schema-builder/services/type-mapper.service.ts +++ b/server/src/workspace/workspace-schema-builder/services/type-mapper.service.ts @@ -19,7 +19,7 @@ import { import { DateScalarMode, NumberScalarMode, -} from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface'; +} from 'src/workspace/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; import { @@ -30,8 +30,8 @@ import { FloatFilterType, IntFilterType, BooleanFilterType, -} from 'src/tenant/schema-builder/graphql-types/input'; -import { OrderByDirectionType } from 'src/tenant/schema-builder/graphql-types/enum'; +} from 'src/workspace/workspace-schema-builder/graphql-types/input'; +import { OrderByDirectionType } from 'src/workspace/workspace-schema-builder/graphql-types/enum'; export interface TypeOptions { nullable?: boolean; diff --git a/server/src/tenant/schema-builder/storages/type-definitions.storage.ts b/server/src/workspace/workspace-schema-builder/storages/type-definitions.storage.ts similarity index 91% rename from server/src/tenant/schema-builder/storages/type-definitions.storage.ts rename to server/src/workspace/workspace-schema-builder/storages/type-definitions.storage.ts index 3e066b7c237..f659baf58ad 100644 --- a/server/src/tenant/schema-builder/storages/type-definitions.storage.ts +++ b/server/src/workspace/workspace-schema-builder/storages/type-definitions.storage.ts @@ -6,11 +6,11 @@ import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.en import { InputTypeDefinition, InputTypeDefinitionKind, -} from 'src/tenant/schema-builder/factories/input-type-definition.factory'; +} from 'src/workspace/workspace-schema-builder/factories/input-type-definition.factory'; import { ObjectTypeDefinition, ObjectTypeDefinitionKind, -} from 'src/tenant/schema-builder/factories/object-type-definition.factory'; +} from 'src/workspace/workspace-schema-builder/factories/object-type-definition.factory'; // Must be scoped on REQUEST level @Injectable({ scope: Scope.REQUEST }) diff --git a/server/src/tenant/schema-builder/type-definitions.generator.ts b/server/src/workspace/workspace-schema-builder/type-definitions.generator.ts similarity index 93% rename from server/src/tenant/schema-builder/type-definitions.generator.ts rename to server/src/workspace/workspace-schema-builder/type-definitions.generator.ts index a161dbd7614..0a44366b5cc 100644 --- a/server/src/tenant/schema-builder/type-definitions.generator.ts +++ b/server/src/workspace/workspace-schema-builder/type-definitions.generator.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { FieldMetadataEntity } from 'src/metadata/field-metadata/field-metadata.entity'; -import { customTableDefaultColumns } from 'src/tenant-migration-runner/utils/custom-table-default-column.util'; +import { customTableDefaultColumns } from 'src/workspace/workspace-migration-runner/utils/custom-table-default-column.util'; import { TypeDefinitionsStorage } from './storages/type-definitions.storage'; import { @@ -13,7 +13,7 @@ import { InputTypeDefinitionKind, } from './factories/input-type-definition.factory'; import { getFieldMetadataType } from './utils/get-field-metadata-type.util'; -import { BuildSchemaOptions } from './interfaces/build-schema-optionts.interface'; +import { WorkspaceBuildSchemaOptions } from './interfaces/workspace-build-schema-optionts.interface'; import { currencyObjectDefinition } from './object-definitions/currency.object-definition'; import { linkObjectDefinition } from './object-definitions/link.object-definition'; import { ObjectMetadataInterface } from './interfaces/object-metadata.interface'; @@ -51,7 +51,7 @@ export class TypeDefinitionsGenerator { generate( objectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { // Generate static objects first because they can be used in dynamic objects this.generateStaticObjectTypeDefs(options); @@ -59,7 +59,7 @@ export class TypeDefinitionsGenerator { this.generateDynamicObjectTypeDefs(objectMetadataCollection, options); } - private generateStaticObjectTypeDefs(options: BuildSchemaOptions) { + private generateStaticObjectTypeDefs(options: WorkspaceBuildSchemaOptions) { const staticObjectMetadataCollection = [ currencyObjectDefinition, linkObjectDefinition, @@ -78,7 +78,7 @@ export class TypeDefinitionsGenerator { private generateDynamicObjectTypeDefs( dynamicObjectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { this.logger.log( `Generating dynamicObjects: [${dynamicObjectMetadataCollection @@ -98,7 +98,7 @@ export class TypeDefinitionsGenerator { private generateObjectTypeDefs( objectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { const objectTypeDefs = objectMetadataCollection.map((objectMetadata) => { const fields = this.mergeFieldsWithDefaults(objectMetadata.fields); @@ -119,7 +119,7 @@ export class TypeDefinitionsGenerator { private generatePaginationTypeDefs( objectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { const edgeTypeDefs = objectMetadataCollection.map((objectMetadata) => { const fields = this.mergeFieldsWithDefaults(objectMetadata.fields); @@ -157,7 +157,7 @@ export class TypeDefinitionsGenerator { private generateInputTypeDefs( objectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { const inputTypeDefs = objectMetadataCollection .map((objectMetadata) => { @@ -203,7 +203,7 @@ export class TypeDefinitionsGenerator { private generateExtendedObjectTypeDefs( objectMetadataCollection: ObjectMetadataInterface[], - options: BuildSchemaOptions, + options: WorkspaceBuildSchemaOptions, ) { // Generate extended object type defs only for objects that contain composite fields const objectMetadataCollectionWithCompositeFields = diff --git a/server/src/tenant/schema-builder/utils/__tests__/clean-entity-name.spec.ts b/server/src/workspace/workspace-schema-builder/utils/__tests__/clean-entity-name.spec.ts similarity index 87% rename from server/src/tenant/schema-builder/utils/__tests__/clean-entity-name.spec.ts rename to server/src/workspace/workspace-schema-builder/utils/__tests__/clean-entity-name.spec.ts index e964c95d0ef..32874b48edb 100644 --- a/server/src/tenant/schema-builder/utils/__tests__/clean-entity-name.spec.ts +++ b/server/src/workspace/workspace-schema-builder/utils/__tests__/clean-entity-name.spec.ts @@ -1,4 +1,4 @@ -import { cleanEntityName } from 'src/tenant/schema-builder/utils/clean-entity-name.util'; +import { cleanEntityName } from 'src/workspace/workspace-schema-builder/utils/clean-entity-name.util'; describe('cleanEntityName', () => { test('should camelCase strings', () => { diff --git a/server/src/tenant/schema-builder/utils/__tests__/get-field-metadata-type.spec.ts b/server/src/workspace/workspace-schema-builder/utils/__tests__/get-field-metadata-type.spec.ts similarity index 84% rename from server/src/tenant/schema-builder/utils/__tests__/get-field-metadata-type.spec.ts rename to server/src/workspace/workspace-schema-builder/utils/__tests__/get-field-metadata-type.spec.ts index 27b1761dc79..d436015798b 100644 --- a/server/src/tenant/schema-builder/utils/__tests__/get-field-metadata-type.spec.ts +++ b/server/src/workspace/workspace-schema-builder/utils/__tests__/get-field-metadata-type.spec.ts @@ -1,5 +1,5 @@ import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; -import { getFieldMetadataType } from 'src/tenant/schema-builder/utils/get-field-metadata-type.util'; +import { getFieldMetadataType } from 'src/workspace/workspace-schema-builder/utils/get-field-metadata-type.util'; describe('getFieldMetadataType', () => { it.each([ diff --git a/server/src/tenant/schema-builder/utils/__tests__/get-resolver-args.spec.ts b/server/src/workspace/workspace-schema-builder/utils/__tests__/get-resolver-args.spec.ts similarity index 75% rename from server/src/tenant/schema-builder/utils/__tests__/get-resolver-args.spec.ts rename to server/src/workspace/workspace-schema-builder/utils/__tests__/get-resolver-args.spec.ts index 86271e8c383..c90ab63d3b3 100644 --- a/server/src/tenant/schema-builder/utils/__tests__/get-resolver-args.spec.ts +++ b/server/src/workspace/workspace-schema-builder/utils/__tests__/get-resolver-args.spec.ts @@ -1,8 +1,8 @@ -import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; -import { InputTypeDefinitionKind } from 'src/tenant/schema-builder/factories/input-type-definition.factory'; -import { getResolverArgs } from 'src/tenant/schema-builder/utils/get-resolver-args.util'; +import { InputTypeDefinitionKind } from 'src/workspace/workspace-schema-builder/factories/input-type-definition.factory'; +import { getResolverArgs } from 'src/workspace/workspace-schema-builder/utils/get-resolver-args.util'; describe('getResolverArgs', () => { const expectedOutputs = { @@ -40,7 +40,7 @@ describe('getResolverArgs', () => { Object.entries(expectedOutputs).forEach(([resolverType, expectedOutput]) => { it(`should return correct args for ${resolverType} resolver`, () => { expect( - getResolverArgs(resolverType as ResolverBuilderMethodNames), + getResolverArgs(resolverType as WorkspaceResolverBuilderMethodNames), ).toEqual(expectedOutput); }); }); @@ -49,7 +49,7 @@ describe('getResolverArgs', () => { it('should throw an error for an unknown resolver type', () => { const unknownType = 'unknownType'; expect(() => - getResolverArgs(unknownType as ResolverBuilderMethodNames), + getResolverArgs(unknownType as WorkspaceResolverBuilderMethodNames), ).toThrow(`Unknown resolver type: ${unknownType}`); }); }); diff --git a/server/src/tenant/schema-builder/utils/clean-entity-name.util.ts b/server/src/workspace/workspace-schema-builder/utils/clean-entity-name.util.ts similarity index 100% rename from server/src/tenant/schema-builder/utils/clean-entity-name.util.ts rename to server/src/workspace/workspace-schema-builder/utils/clean-entity-name.util.ts diff --git a/server/src/tenant/schema-builder/utils/get-field-metadata-type.util.ts b/server/src/workspace/workspace-schema-builder/utils/get-field-metadata-type.util.ts similarity index 100% rename from server/src/tenant/schema-builder/utils/get-field-metadata-type.util.ts rename to server/src/workspace/workspace-schema-builder/utils/get-field-metadata-type.util.ts diff --git a/server/src/tenant/schema-builder/utils/get-resolver-args.util.ts b/server/src/workspace/workspace-schema-builder/utils/get-resolver-args.util.ts similarity index 80% rename from server/src/tenant/schema-builder/utils/get-resolver-args.util.ts rename to server/src/workspace/workspace-schema-builder/utils/get-resolver-args.util.ts index 3ccaa73fc31..deb7f460d14 100644 --- a/server/src/tenant/schema-builder/utils/get-resolver-args.util.ts +++ b/server/src/workspace/workspace-schema-builder/utils/get-resolver-args.util.ts @@ -1,11 +1,11 @@ -import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; -import { ArgMetadata } from 'src/tenant/schema-builder/interfaces/param-metadata.interface'; +import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; +import { ArgMetadata } from 'src/workspace/workspace-schema-builder/interfaces/param-metadata.interface'; import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; -import { InputTypeDefinitionKind } from 'src/tenant/schema-builder/factories/input-type-definition.factory'; +import { InputTypeDefinitionKind } from 'src/workspace/workspace-schema-builder/factories/input-type-definition.factory'; export const getResolverArgs = ( - type: ResolverBuilderMethodNames, + type: WorkspaceResolverBuilderMethodNames, ): { [key: string]: ArgMetadata } => { switch (type) { case 'findMany': diff --git a/server/src/workspace/workspace-schema-builder/utils/object-contains-composite-field.ts b/server/src/workspace/workspace-schema-builder/utils/object-contains-composite-field.ts new file mode 100644 index 00000000000..caf882f352f --- /dev/null +++ b/server/src/workspace/workspace-schema-builder/utils/object-contains-composite-field.ts @@ -0,0 +1,11 @@ +import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface'; + +import { isCompositeFieldMetadataType } from 'src/workspace/utils/is-composite-field-metadata-type.util'; + +export const objectContainsCompositeField = ( + objectMetadata: ObjectMetadataInterface, +): boolean => { + return objectMetadata.fields.some((field) => + isCompositeFieldMetadataType(field.type), + ); +}; diff --git a/server/src/tenant/schema-builder/graphql-schema.factory.ts b/server/src/workspace/workspace-schema-builder/workspace-graphql-schema.factory.ts similarity index 69% rename from server/src/tenant/schema-builder/graphql-schema.factory.ts rename to server/src/workspace/workspace-schema-builder/workspace-graphql-schema.factory.ts index ea15c4055e9..321d6bcb3b7 100644 --- a/server/src/tenant/schema-builder/graphql-schema.factory.ts +++ b/server/src/workspace/workspace-schema-builder/workspace-graphql-schema.factory.ts @@ -2,19 +2,19 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLSchema } from 'graphql'; -import { ResolverBuilderMethods } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface'; +import { WorkspaceResolverBuilderMethods } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; import { TypeDefinitionsGenerator } from './type-definitions.generator'; -import { BuildSchemaOptions } from './interfaces/build-schema-optionts.interface'; +import { WorkspaceBuildSchemaOptions } from './interfaces/workspace-build-schema-optionts.interface'; import { QueryTypeFactory } from './factories/query-type.factory'; import { MutationTypeFactory } from './factories/mutation-type.factory'; import { ObjectMetadataInterface } from './interfaces/object-metadata.interface'; import { OrphanedTypesFactory } from './factories/orphaned-types.factory'; @Injectable() -export class GraphQLSchemaFactory { - private readonly logger = new Logger(GraphQLSchemaFactory.name); +export class WorkspaceGraphQLSchemaFactory { + private readonly logger = new Logger(WorkspaceGraphQLSchemaFactory.name); constructor( private readonly typeDefinitionsGenerator: TypeDefinitionsGenerator, @@ -25,8 +25,8 @@ export class GraphQLSchemaFactory { async create( objectMetadataCollection: ObjectMetadataInterface[], - resolverBuilderMethods: ResolverBuilderMethods, - options: BuildSchemaOptions = {}, + workspaceResolverBuilderMethods: WorkspaceResolverBuilderMethods, + options: WorkspaceBuildSchemaOptions = {}, ): Promise { // Generate type definitions this.typeDefinitionsGenerator.generate(objectMetadataCollection, options); @@ -35,12 +35,12 @@ export class GraphQLSchemaFactory { const schema = new GraphQLSchema({ query: this.queryTypeFactory.create( objectMetadataCollection, - [...resolverBuilderMethods.queries], + [...workspaceResolverBuilderMethods.queries], options, ), mutation: this.mutationTypeFactory.create( objectMetadataCollection, - [...resolverBuilderMethods.mutations], + [...workspaceResolverBuilderMethods.mutations], options, ), types: this.orphanedTypesFactory.create(), diff --git a/server/src/tenant/schema-builder/schema-builder.module.ts b/server/src/workspace/workspace-schema-builder/workspace-schema-builder.module.ts similarity index 64% rename from server/src/tenant/schema-builder/schema-builder.module.ts rename to server/src/workspace/workspace-schema-builder/workspace-schema-builder.module.ts index 9bfb0780d22..748c2efd522 100644 --- a/server/src/tenant/schema-builder/schema-builder.module.ts +++ b/server/src/workspace/workspace-schema-builder/workspace-schema-builder.module.ts @@ -4,22 +4,22 @@ import { JwtAuthGuard } from 'src/guards/jwt.auth.guard'; import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; import { TypeDefinitionsGenerator } from './type-definitions.generator'; -import { GraphQLSchemaFactory } from './graphql-schema.factory'; +import { WorkspaceGraphQLSchemaFactory } from './workspace-graphql-schema.factory'; -import { schemaBuilderFactories } from './factories/factories'; +import { workspaceSchemaBuilderFactories } from './factories/factories'; import { TypeDefinitionsStorage } from './storages/type-definitions.storage'; import { TypeMapperService } from './services/type-mapper.service'; @Module({ imports: [ObjectMetadataModule], providers: [ - ...schemaBuilderFactories, + ...workspaceSchemaBuilderFactories, TypeDefinitionsGenerator, TypeDefinitionsStorage, TypeMapperService, - GraphQLSchemaFactory, + WorkspaceGraphQLSchemaFactory, JwtAuthGuard, ], - exports: [GraphQLSchemaFactory], + exports: [WorkspaceGraphQLSchemaFactory], }) -export class SchemaBuilderModule {} +export class WorkspaceSchemaBuilderModule {} diff --git a/server/src/tenant/tenant.service.spec.ts b/server/src/workspace/workspace.factory.spec.ts similarity index 58% rename from server/src/tenant/tenant.service.spec.ts rename to server/src/workspace/workspace.factory.spec.ts index d6db3d66c00..f14b2e13ab6 100644 --- a/server/src/tenant/tenant.service.spec.ts +++ b/server/src/workspace/workspace.factory.spec.ts @@ -3,18 +3,18 @@ import { Test, TestingModule } from '@nestjs/testing'; import { DataSourceService } from 'src/metadata/data-source/data-source.service'; import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service'; -import { TenantService } from './tenant.service'; +import { WorkspaceFactory } from './workspace.factory'; -import { ResolverFactory } from './resolver-builder/resolver.factory'; -import { GraphQLSchemaFactory } from './schema-builder/graphql-schema.factory'; +import { WorkspaceResolverFactory } from './workspace-resolver-builder/workspace-resolver.factory'; +import { WorkspaceGraphQLSchemaFactory } from './workspace-schema-builder/workspace-graphql-schema.factory'; -describe('TenantService', () => { - let service: TenantService; +describe('WorkspaceFactory', () => { + let service: WorkspaceFactory; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ - TenantService, + WorkspaceFactory, { provide: DataSourceService, useValue: {}, @@ -24,17 +24,17 @@ describe('TenantService', () => { useValue: {}, }, { - provide: GraphQLSchemaFactory, + provide: WorkspaceGraphQLSchemaFactory, useValue: {}, }, { - provide: ResolverFactory, + provide: WorkspaceResolverFactory, useValue: {}, }, ], }).compile(); - service = module.get(TenantService); + service = module.get(WorkspaceFactory); }); it('should be defined', () => { diff --git a/server/src/tenant/tenant.service.ts b/server/src/workspace/workspace.factory.ts similarity index 63% rename from server/src/tenant/tenant.service.ts rename to server/src/workspace/workspace.factory.ts index ee19535f3ec..80410de7fd7 100644 --- a/server/src/tenant/tenant.service.ts +++ b/server/src/workspace/workspace.factory.ts @@ -7,20 +7,22 @@ import { gql } from 'graphql-tag'; import { DataSourceService } from 'src/metadata/data-source/data-source.service'; import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service'; -import { GraphQLSchemaFactory } from './schema-builder/graphql-schema.factory'; -import { resolverBuilderMethodNames } from './resolver-builder/factories/factories'; -import { ResolverFactory } from './resolver-builder/resolver.factory'; +import { WorkspaceGraphQLSchemaFactory } from './workspace-schema-builder/workspace-graphql-schema.factory'; +import { workspaceResolverBuilderMethodNames } from './workspace-resolver-builder/factories/factories'; +import { WorkspaceResolverFactory } from './workspace-resolver-builder/workspace-resolver.factory'; @Injectable() -export class TenantService { +export class WorkspaceFactory { constructor( private readonly dataSourceService: DataSourceService, private readonly objectMetadataService: ObjectMetadataService, - private readonly graphQLSchemaFactory: GraphQLSchemaFactory, - private readonly resolverFactory: ResolverFactory, + private readonly workspaceGraphQLSchemaFactory: WorkspaceGraphQLSchemaFactory, + private readonly workspaceResolverFactory: WorkspaceResolverFactory, ) {} - async createTenantSchema(workspaceId: string | undefined) { + async createGraphQLSchema( + workspaceId: string | undefined, + ): Promise { if (!workspaceId) { return new GraphQLSchema({}); } @@ -40,14 +42,14 @@ export class TenantService { workspaceId, ); - const autoGeneratedSchema = await this.graphQLSchemaFactory.create( + const autoGeneratedSchema = await this.workspaceGraphQLSchemaFactory.create( objectMetadataCollection, - resolverBuilderMethodNames, + workspaceResolverBuilderMethodNames, ); - const autoGeneratedResolvers = await this.resolverFactory.create( + const autoGeneratedResolvers = await this.workspaceResolverFactory.create( workspaceId, objectMetadataCollection, - resolverBuilderMethodNames, + workspaceResolverBuilderMethodNames, ); // TODO: Cache the generate type definitions diff --git a/server/src/workspace/workspace.module.ts b/server/src/workspace/workspace.module.ts new file mode 100644 index 00000000000..b60b5105071 --- /dev/null +++ b/server/src/workspace/workspace.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; + +import { MetadataModule } from 'src/metadata/metadata.module'; +import { DataSourceModule } from 'src/metadata/data-source/data-source.module'; +import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module'; + +import { WorkspaceFactory } from './workspace.factory'; + +import { WorkspaceSchemaBuilderModule } from './workspace-schema-builder/workspace-schema-builder.module'; +import { WorkspaceResolverBuilderModule } from './workspace-resolver-builder/workspace-resolver-builder.module'; + +@Module({ + imports: [ + MetadataModule, + DataSourceModule, + ObjectMetadataModule, + WorkspaceSchemaBuilderModule, + WorkspaceResolverBuilderModule, + ], + providers: [WorkspaceFactory], + exports: [WorkspaceFactory], +}) +export class WorkspaceModule {}