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 32c583537..c4857b861 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 703a33ba1..f36415e3d 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 66f323562..b39a5ab4d 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 f567b4c6e..6b64f2148 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 6e3e9f80a..f782e8cba 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 075c2d96b..0cd817b4d 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 1bcbd1a90..16123a1e5 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 c89e440df..c7f501f3f 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 5057754ba..7e70ddfa3 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 c77f97fbe..00eecfb15 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 815977039..48943a33e 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 d873257d9..c1ab24296 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 efd0b0102..bfaf8a640 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 0ca77546b..383581774 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 9431e321b..f6e4cd885 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 beadeae58..000000000 --- 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 495af4891..000000000 --- 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 c8c9ef9c4..000000000 --- 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 b56f22ab7..000000000 --- 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 89ec659ca..000000000 --- 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 dff01df6d..000000000 --- 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 a96340cf3..000000000 --- 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 104e152de..000000000 --- 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 13de6ac50..000000000 --- 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 394bc59ac..000000000 --- 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 e93d862cd..000000000 --- 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 07b10a021..000000000 --- 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 12520c108..000000000 --- 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 fe455d9fc..000000000 --- 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 9acf36a49..000000000 --- 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 ea7975335..000000000 --- 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 6da05a302..000000000 --- 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 90a2568bb..000000000 --- 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 eaabfa121..000000000 --- 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 13de6ac50..000000000 --- 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 a12b26a16..000000000 --- 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 a7d42b79f..000000000 --- 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 3dce50c7c..000000000 --- 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 4d91e5a53..000000000 --- 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 c14772261..000000000 --- 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 fabc1480f..84ac894b2 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 3f826a8dd..2e9d4dbac 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 e94efe0c8..8ae831d41 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 b8a650b36..f8f5a7a81 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 5b6fff111..9754aa2ba 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 6ba6e5e33..09520be8c 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 e0bdcdf8d..cfea77a47 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 000000000..501462ad0 --- /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 e98737f62..566be4e9a 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 b630378cc..6fc3c74ba 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 000000000..c2afb0d93 --- /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 000000000..f77de6987 --- /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 000000000..80c69ead8 --- /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 0911dbef4..f0fd7bf43 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 000000000..8962c0c61 --- /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 000000000..f8db8958f --- /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 000000000..ac659ad96 --- /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 880f2bba4..0982f6aea 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 a0826dc72..5c3cf4821 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 f789ef3f9..6aede0941 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 fd9484cb8..235b85e9e 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 140bed388..5ef332b55 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 f95109257..799de88d9 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 7db817b5d..b1cae30df 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 c5856b10f..ac387b4e2 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 ae5b8013e..ffe449301 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 cf769deed..8554a329c 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 d6c41e1d6..98f27fb06 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 20e4af320..eb43812a9 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 90a2568bb..ac52140da 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 000000000..319df6f38 --- /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 5a09e3728..56b10aaef 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 dc6e051cd..74c43bf48 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 000000000..5edb49373 --- /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 d69637ca2..b0bb89aa5 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 643f3a3d7..f138a711e 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 70c0845dd..2e5c67f5c 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 000000000..a2340ea39 --- /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 aeba1ca9f..e543951e1 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 000000000..66bd291a0 --- /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 000000000..7b1e2ce97 --- /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 000000000..052bb1044 --- /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 7b1d2d40b..ec02b4892 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 000000000..4ffa99971 --- /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 000000000..c97182817 --- /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 000000000..72a6abd92 --- /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 464f1f890..4bca0075e 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 000000000..d1c880039 --- /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 000000000..5b13f96cf --- /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 000000000..390f35a5f --- /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 6d9cb2faa..826e4e63d 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 59f226ca4..d3fdb87f1 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 88e6e1b75..1b46d667d 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 f74dbea1b..7117bcec8 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 4102177b3..e6c1bfa4b 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 1e90d0187..5baf5d5d1 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 f0c286859..ea5b8c35e 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 bf6df0ecd..6a68b92ed 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 41c6ee19c..607d1c096 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 36d1084be..48b158139 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 12d1efd86..317960314 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 804ae43b0..5d75927ca 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 000000000..c736c9ea1 --- /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 6bcf01dbf..d420eade0 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 27b55cef9..9d9127b39 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 5db2d2256..0ee630d97 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 d8e13f737..72e767a4b 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 79be5d7ba..519bcac15 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 000000000..aae048ce6 --- /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 2c047f386..e8d12d4dd 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 7d05f43b4..4fe78208c 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 5b771e083..e61744b85 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 91d5570bc..d5ac00d52 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 b52e40f7b..eb71dd694 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 2fed155e8..9cdd76a7f 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 6c8e0fa66..f8ca6cbc6 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 e651f133d..19bd21e27 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 46751bc66..3136ea75d 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 fbd2ed073..86677b38a 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 822c1ea71..e179c23fc 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 76276f448..effc9329c 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 3e066b7c2..f659baf58 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 a161dbd76..0a44366b5 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 e964c95d0..32874b48e 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 27b1761dc..d43601579 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 86271e8c3..c90ab63d3 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 3ccaa73fc..deb7f460d 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 000000000..caf882f35 --- /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 ea15c4055..321d6bcb3 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 9bfb0780d..748c2efd5 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 d6db3d66c..f14b2e13a 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 ee19535f3..80410de7f 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 000000000..b60b51050 --- /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 {}