@strapi/plugin-graphql 4.15.5 → 4.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/index.d.ts +16 -0
- package/dist/admin/admin/src/pluginId.d.ts +1 -0
- package/dist/admin/index.js +31 -17
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +31 -17
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/bootstrap.d.ts +5 -0
- package/dist/server/bootstrap.d.ts.map +1 -0
- package/dist/server/config/default-config.d.ts +9 -0
- package/dist/server/config/default-config.d.ts.map +1 -0
- package/dist/server/config/index.d.ts +10 -0
- package/dist/server/config/index.d.ts.map +1 -0
- package/dist/server/format-graphql-error.d.ts +4 -0
- package/dist/server/format-graphql-error.d.ts.map +1 -0
- package/dist/server/index.d.ts +301 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2970 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +2949 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/services/builders/dynamic-zones.d.ts +14 -0
- package/dist/server/services/builders/dynamic-zones.d.ts.map +1 -0
- package/dist/server/services/builders/entity-meta.d.ts +6 -0
- package/dist/server/services/builders/entity-meta.d.ts.map +1 -0
- package/dist/server/services/builders/entity.d.ts +12 -0
- package/dist/server/services/builders/entity.d.ts.map +1 -0
- package/dist/server/services/builders/enums.d.ts +8 -0
- package/dist/server/services/builders/enums.d.ts.map +1 -0
- package/dist/server/services/builders/filters/content-type.d.ts +8 -0
- package/dist/server/services/builders/filters/content-type.d.ts.map +1 -0
- package/dist/server/services/builders/filters/index.d.ts +6 -0
- package/dist/server/services/builders/filters/index.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/and.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/and.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/between.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/between.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/contains.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/contains.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/containsi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/containsi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/ends-with.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/ends-with.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/eq.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/eq.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/eqi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/eqi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/gt.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/gt.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/gte.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/gte.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/in.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/in.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/index.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/index.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/lt.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/lt.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/lte.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/lte.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/ne.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/ne.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/nei.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/nei.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-contains.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-contains.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-containsi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-containsi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-in.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-in.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-null.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-null.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/not.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/null.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/null.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/or.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/or.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/starts-with.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/starts-with.d.ts.map +1 -0
- package/dist/server/services/builders/generic-morph.d.ts +6 -0
- package/dist/server/services/builders/generic-morph.d.ts.map +1 -0
- package/dist/server/services/builders/index.d.ts +58 -0
- package/dist/server/services/builders/index.d.ts.map +1 -0
- package/dist/server/services/builders/input.d.ts +7 -0
- package/dist/server/services/builders/input.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/collection-type.d.ts +8 -0
- package/dist/server/services/builders/mutations/collection-type.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/index.d.ts +7 -0
- package/dist/server/services/builders/mutations/index.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/single-type.d.ts +8 -0
- package/dist/server/services/builders/mutations/single-type.d.ts.map +1 -0
- package/dist/server/services/builders/queries/collection-type.d.ts +8 -0
- package/dist/server/services/builders/queries/collection-type.d.ts.map +1 -0
- package/dist/server/services/builders/queries/index.d.ts +7 -0
- package/dist/server/services/builders/queries/index.d.ts.map +1 -0
- package/dist/server/services/builders/queries/single-type.d.ts +8 -0
- package/dist/server/services/builders/queries/single-type.d.ts.map +1 -0
- package/dist/server/services/builders/relation-response-collection.d.ts +10 -0
- package/dist/server/services/builders/relation-response-collection.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/association.d.ts +10 -0
- package/dist/server/services/builders/resolvers/association.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/component.d.ts +10 -0
- package/dist/server/services/builders/resolvers/component.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/dynamic-zone.d.ts +10 -0
- package/dist/server/services/builders/resolvers/dynamic-zone.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/index.d.ts +30 -0
- package/dist/server/services/builders/resolvers/index.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/mutation.d.ts +13 -0
- package/dist/server/services/builders/resolvers/mutation.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/query.d.ts +12 -0
- package/dist/server/services/builders/resolvers/query.d.ts.map +1 -0
- package/dist/server/services/builders/response-collection.d.ts +12 -0
- package/dist/server/services/builders/response-collection.d.ts.map +1 -0
- package/dist/server/services/builders/response.d.ts +10 -0
- package/dist/server/services/builders/response.d.ts.map +1 -0
- package/dist/server/services/builders/type.d.ts +19 -0
- package/dist/server/services/builders/type.d.ts.map +1 -0
- package/dist/server/services/builders/utils.d.ts +52 -0
- package/dist/server/services/builders/utils.d.ts.map +1 -0
- package/dist/server/services/constants.d.ts +128 -0
- package/dist/server/services/constants.d.ts.map +1 -0
- package/dist/server/services/content-api/index.d.ts +8 -0
- package/dist/server/services/content-api/index.d.ts.map +1 -0
- package/dist/server/services/content-api/policy.d.ts +7 -0
- package/dist/server/services/content-api/policy.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/collection-type.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/collection-type.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/component.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/component.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/dynamic-zones.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/dynamic-zones.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/enums.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/enums.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/filters.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/filters.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/index.d.ts +24 -0
- package/dist/server/services/content-api/register-functions/content-type/index.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/inputs.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/inputs.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/index.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/index.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/internals.d.ts +4 -0
- package/dist/server/services/content-api/register-functions/internals.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/polymorphic.d.ts +5 -0
- package/dist/server/services/content-api/register-functions/polymorphic.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/scalars.d.ts +4 -0
- package/dist/server/services/content-api/register-functions/scalars.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/single-type.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/single-type.d.ts.map +1 -0
- package/dist/server/services/content-api/wrap-resolvers.d.ts +18 -0
- package/dist/server/services/content-api/wrap-resolvers.d.ts.map +1 -0
- package/dist/server/services/extension/extension.d.ts +63 -0
- package/dist/server/services/extension/extension.d.ts.map +1 -0
- package/dist/server/services/extension/index.d.ts +3 -0
- package/dist/server/services/extension/index.d.ts.map +1 -0
- package/dist/server/services/extension/shadow-crud-manager.d.ts +40 -0
- package/dist/server/services/extension/shadow-crud-manager.d.ts.map +1 -0
- package/dist/server/services/format/index.d.ts +20 -0
- package/dist/server/services/format/index.d.ts.map +1 -0
- package/dist/server/services/format/return-types.d.ts +22 -0
- package/dist/server/services/format/return-types.d.ts.map +1 -0
- package/dist/server/services/index.d.ts +287 -0
- package/dist/server/services/index.d.ts.map +1 -0
- package/dist/server/services/internals/args/index.d.ts +8 -0
- package/dist/server/services/internals/args/index.d.ts.map +1 -0
- package/dist/server/services/internals/args/pagination.d.ts +3 -0
- package/dist/server/services/internals/args/pagination.d.ts.map +1 -0
- package/dist/server/services/internals/args/publication-state.d.ts +4 -0
- package/dist/server/services/internals/args/publication-state.d.ts.map +1 -0
- package/dist/server/services/internals/args/sort.d.ts +3 -0
- package/dist/server/services/internals/args/sort.d.ts.map +1 -0
- package/dist/server/services/internals/helpers/get-enabled-scalars.d.ts +4 -0
- package/dist/server/services/internals/helpers/get-enabled-scalars.d.ts.map +1 -0
- package/dist/server/services/internals/helpers/index.d.ts +6 -0
- package/dist/server/services/internals/helpers/index.d.ts.map +1 -0
- package/dist/server/services/internals/index.d.ts +46 -0
- package/dist/server/services/internals/index.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/date.d.ts +3 -0
- package/dist/server/services/internals/scalars/date.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/index.d.ts +10 -0
- package/dist/server/services/internals/scalars/index.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/time.d.ts +8 -0
- package/dist/server/services/internals/scalars/time.d.ts.map +1 -0
- package/dist/server/services/internals/types/error.d.ts +8 -0
- package/dist/server/services/internals/types/error.d.ts.map +1 -0
- package/dist/server/services/internals/types/filters.d.ts +6 -0
- package/dist/server/services/internals/types/filters.d.ts.map +1 -0
- package/dist/server/services/internals/types/index.d.ts +28 -0
- package/dist/server/services/internals/types/index.d.ts.map +1 -0
- package/dist/server/services/internals/types/pagination.d.ts +10 -0
- package/dist/server/services/internals/types/pagination.d.ts.map +1 -0
- package/dist/server/services/internals/types/publication-state.d.ts +10 -0
- package/dist/server/services/internals/types/publication-state.d.ts.map +1 -0
- package/dist/server/services/internals/types/response-collection-meta.d.ts +11 -0
- package/dist/server/services/internals/types/response-collection-meta.d.ts.map +1 -0
- package/dist/server/services/type-registry.d.ts +15 -0
- package/dist/server/services/type-registry.d.ts.map +1 -0
- package/dist/server/services/types.d.ts +7 -0
- package/dist/server/services/types.d.ts.map +1 -0
- package/dist/server/services/utils/attributes.d.ts +14 -0
- package/dist/server/services/utils/attributes.d.ts.map +1 -0
- package/dist/server/services/utils/index.d.ts +81 -0
- package/dist/server/services/utils/index.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/entity-to-response-entity.d.ts +33 -0
- package/dist/server/services/utils/mappers/entity-to-response-entity.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.d.ts +13 -0
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.d.ts +6 -0
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/index.d.ts +36 -0
- package/dist/server/services/utils/mappers/index.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.d.ts +9 -0
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.d.ts.map +1 -0
- package/dist/server/services/utils/naming.d.ts +37 -0
- package/dist/server/services/utils/naming.d.ts.map +1 -0
- package/package.json +28 -16
- package/strapi-server.js +1 -11
- package/.eslintignore +0 -1
- package/.eslintrc +0 -14
- package/admin/src/index.js +0 -38
- package/admin/src/pluginId.js +0 -5
- package/admin/src/translations/dk.json +0 -5
- package/admin/src/translations/en.json +0 -5
- package/admin/src/translations/es.json +0 -5
- package/admin/src/translations/fr.json +0 -5
- package/admin/src/translations/pl.json +0 -5
- package/admin/src/translations/ru.json +0 -5
- package/admin/src/translations/sv.json +0 -5
- package/admin/src/translations/tr.json +0 -5
- package/admin/src/translations/zh-Hans.json +0 -5
- package/admin/src/translations/zh.json +0 -5
- package/packup.config.ts +0 -42
- package/server/bootstrap.js +0 -134
- package/server/config/default-config.js +0 -13
- package/server/config/index.js +0 -7
- package/server/format-graphql-error.js +0 -45
- package/server/services/builders/dynamic-zones.js +0 -97
- package/server/services/builders/entity-meta.js +0 -7
- package/server/services/builders/entity.js +0 -43
- package/server/services/builders/enums.js +0 -26
- package/server/services/builders/filters/content-type.js +0 -111
- package/server/services/builders/filters/index.js +0 -7
- package/server/services/builders/filters/operators/and.js +0 -15
- package/server/services/builders/filters/operators/between.js +0 -15
- package/server/services/builders/filters/operators/contains.js +0 -13
- package/server/services/builders/filters/operators/containsi.js +0 -13
- package/server/services/builders/filters/operators/ends-with.js +0 -13
- package/server/services/builders/filters/operators/eq.js +0 -23
- package/server/services/builders/filters/operators/eqi.js +0 -13
- package/server/services/builders/filters/operators/gt.js +0 -13
- package/server/services/builders/filters/operators/gte.js +0 -13
- package/server/services/builders/filters/operators/in.js +0 -15
- package/server/services/builders/filters/operators/index.js +0 -40
- package/server/services/builders/filters/operators/lt.js +0 -13
- package/server/services/builders/filters/operators/lte.js +0 -13
- package/server/services/builders/filters/operators/ne.js +0 -13
- package/server/services/builders/filters/operators/nei.js +0 -13
- package/server/services/builders/filters/operators/not-contains.js +0 -13
- package/server/services/builders/filters/operators/not-containsi.js +0 -13
- package/server/services/builders/filters/operators/not-in.js +0 -15
- package/server/services/builders/filters/operators/not-null.js +0 -13
- package/server/services/builders/filters/operators/not.js +0 -19
- package/server/services/builders/filters/operators/null.js +0 -13
- package/server/services/builders/filters/operators/or.js +0 -15
- package/server/services/builders/filters/operators/starts-with.js +0 -13
- package/server/services/builders/generic-morph.js +0 -41
- package/server/services/builders/index.js +0 -92
- package/server/services/builders/input.js +0 -121
- package/server/services/builders/mutations/collection-type.js +0 -191
- package/server/services/builders/mutations/index.js +0 -9
- package/server/services/builders/mutations/single-type.js +0 -164
- package/server/services/builders/queries/collection-type.js +0 -122
- package/server/services/builders/queries/index.js +0 -9
- package/server/services/builders/queries/single-type.js +0 -71
- package/server/services/builders/relation-response-collection.js +0 -32
- package/server/services/builders/resolvers/association.js +0 -92
- package/server/services/builders/resolvers/component.js +0 -25
- package/server/services/builders/resolvers/dynamic-zone.js +0 -9
- package/server/services/builders/resolvers/index.js +0 -18
- package/server/services/builders/resolvers/mutation.js +0 -38
- package/server/services/builders/resolvers/query.js +0 -34
- package/server/services/builders/response-collection.js +0 -40
- package/server/services/builders/response.js +0 -32
- package/server/services/builders/type.js +0 -363
- package/server/services/builders/utils.js +0 -134
- package/server/services/constants.js +0 -153
- package/server/services/content-api/index.js +0 -188
- package/server/services/content-api/policy.js +0 -60
- package/server/services/content-api/register-functions/collection-type.js +0 -72
- package/server/services/content-api/register-functions/component.js +0 -15
- package/server/services/content-api/register-functions/content-type/dynamic-zones.js +0 -36
- package/server/services/content-api/register-functions/content-type/enums.js +0 -33
- package/server/services/content-api/register-functions/content-type/filters.js +0 -15
- package/server/services/content-api/register-functions/content-type/index.js +0 -13
- package/server/services/content-api/register-functions/content-type/inputs.js +0 -21
- package/server/services/content-api/register-functions/index.js +0 -22
- package/server/services/content-api/register-functions/internals.js +0 -13
- package/server/services/content-api/register-functions/polymorphic.js +0 -69
- package/server/services/content-api/register-functions/scalars.js +0 -14
- package/server/services/content-api/register-functions/single-type.js +0 -72
- package/server/services/content-api/wrap-resolvers.js +0 -148
- package/server/services/extension/extension.js +0 -94
- package/server/services/extension/index.js +0 -5
- package/server/services/extension/shadow-crud-manager.js +0 -161
- package/server/services/format/index.js +0 -7
- package/server/services/format/return-types.js +0 -27
- package/server/services/index.js +0 -21
- package/server/services/internals/args/index.js +0 -11
- package/server/services/internals/args/pagination.js +0 -19
- package/server/services/internals/args/publication-state.js +0 -12
- package/server/services/internals/args/sort.js +0 -10
- package/server/services/internals/helpers/get-enabled-scalars.js +0 -17
- package/server/services/internals/helpers/index.js +0 -7
- package/server/services/internals/index.js +0 -13
- package/server/services/internals/scalars/date.js +0 -22
- package/server/services/internals/scalars/index.js +0 -17
- package/server/services/internals/scalars/time.js +0 -36
- package/server/services/internals/types/error.js +0 -34
- package/server/services/internals/types/filters.js +0 -39
- package/server/services/internals/types/index.js +0 -29
- package/server/services/internals/types/pagination.js +0 -24
- package/server/services/internals/types/publication-state.js +0 -24
- package/server/services/internals/types/response-collection-meta.js +0 -46
- package/server/services/type-registry.js +0 -104
- package/server/services/utils/attributes.js +0 -78
- package/server/services/utils/index.js +0 -11
- package/server/services/utils/mappers/entity-to-response-entity.js +0 -12
- package/server/services/utils/mappers/graphql-filters-to-strapi-query.js +0 -119
- package/server/services/utils/mappers/graphql-scalar-to-operators.js +0 -17
- package/server/services/utils/mappers/index.js +0 -13
- package/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +0 -25
- package/server/services/utils/naming.js +0 -287
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { extendType, nonNull } = require('nexus');
|
|
4
|
-
const { sanitize } = require('@strapi/utils');
|
|
5
|
-
|
|
6
|
-
module.exports = ({ strapi }) => {
|
|
7
|
-
const { service: getService } = strapi.plugin('graphql');
|
|
8
|
-
|
|
9
|
-
const { naming } = getService('utils');
|
|
10
|
-
const { transformArgs } = getService('builders').utils;
|
|
11
|
-
const { toEntityResponse } = getService('format').returnTypes;
|
|
12
|
-
|
|
13
|
-
const {
|
|
14
|
-
getCreateMutationTypeName,
|
|
15
|
-
getUpdateMutationTypeName,
|
|
16
|
-
getDeleteMutationTypeName,
|
|
17
|
-
getEntityResponseName,
|
|
18
|
-
getContentTypeInputName,
|
|
19
|
-
} = naming;
|
|
20
|
-
|
|
21
|
-
const addCreateMutation = (t, contentType) => {
|
|
22
|
-
const { uid } = contentType;
|
|
23
|
-
|
|
24
|
-
const createMutationName = getCreateMutationTypeName(contentType);
|
|
25
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
26
|
-
|
|
27
|
-
t.field(createMutationName, {
|
|
28
|
-
type: responseTypeName,
|
|
29
|
-
|
|
30
|
-
args: {
|
|
31
|
-
// Create payload
|
|
32
|
-
data: nonNull(getContentTypeInputName(contentType)),
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
async resolve(parent, args, context) {
|
|
36
|
-
const { auth } = context.state;
|
|
37
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
38
|
-
|
|
39
|
-
// Sanitize input data
|
|
40
|
-
const sanitizedInputData = await sanitize.contentAPI.input(
|
|
41
|
-
transformedArgs.data,
|
|
42
|
-
contentType,
|
|
43
|
-
{ auth }
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
Object.assign(transformedArgs, { data: sanitizedInputData });
|
|
47
|
-
|
|
48
|
-
const { create } = getService('builders')
|
|
49
|
-
.get('content-api')
|
|
50
|
-
.buildMutationsResolvers({ contentType });
|
|
51
|
-
|
|
52
|
-
const value = await create(parent, transformedArgs);
|
|
53
|
-
|
|
54
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const addUpdateMutation = (t, contentType) => {
|
|
60
|
-
const { uid } = contentType;
|
|
61
|
-
|
|
62
|
-
const updateMutationName = getUpdateMutationTypeName(contentType);
|
|
63
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
64
|
-
|
|
65
|
-
// todo[v4]: Don't allow to filter using every unique attributes for now
|
|
66
|
-
// Only authorize filtering using unique scalar fields for updateOne queries
|
|
67
|
-
// const uniqueAttributes = getUniqueAttributesFiltersMap(attributes);
|
|
68
|
-
|
|
69
|
-
t.field(updateMutationName, {
|
|
70
|
-
type: responseTypeName,
|
|
71
|
-
|
|
72
|
-
args: {
|
|
73
|
-
// Query args
|
|
74
|
-
id: nonNull('ID'),
|
|
75
|
-
// todo[v4]: Don't allow to filter using every unique attributes for now
|
|
76
|
-
// ...uniqueAttributes,
|
|
77
|
-
|
|
78
|
-
// Update payload
|
|
79
|
-
data: nonNull(getContentTypeInputName(contentType)),
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
async resolve(parent, args, context) {
|
|
83
|
-
const { auth } = context.state;
|
|
84
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
85
|
-
|
|
86
|
-
// Sanitize input data
|
|
87
|
-
const sanitizedInputData = await sanitize.contentAPI.input(
|
|
88
|
-
transformedArgs.data,
|
|
89
|
-
contentType,
|
|
90
|
-
{ auth }
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
Object.assign(transformedArgs, { data: sanitizedInputData });
|
|
94
|
-
|
|
95
|
-
const { update } = getService('builders')
|
|
96
|
-
.get('content-api')
|
|
97
|
-
.buildMutationsResolvers({ contentType });
|
|
98
|
-
|
|
99
|
-
const value = await update(parent, transformedArgs);
|
|
100
|
-
|
|
101
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const addDeleteMutation = (t, contentType) => {
|
|
107
|
-
const { uid } = contentType;
|
|
108
|
-
|
|
109
|
-
const deleteMutationName = getDeleteMutationTypeName(contentType);
|
|
110
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
111
|
-
|
|
112
|
-
// todo[v4]: Don't allow to filter using every unique attributes for now
|
|
113
|
-
// Only authorize filtering using unique scalar fields for updateOne queries
|
|
114
|
-
// const uniqueAttributes = getUniqueAttributesFiltersMap(attributes);
|
|
115
|
-
|
|
116
|
-
t.field(deleteMutationName, {
|
|
117
|
-
type: responseTypeName,
|
|
118
|
-
|
|
119
|
-
args: {
|
|
120
|
-
// Query args
|
|
121
|
-
id: nonNull('ID'),
|
|
122
|
-
// todo[v4]: Don't allow to filter using every unique attributes for now
|
|
123
|
-
// ...uniqueAttributes,
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
async resolve(parent, args, ctx) {
|
|
127
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
128
|
-
|
|
129
|
-
const { delete: deleteResolver } = getService('builders')
|
|
130
|
-
.get('content-api')
|
|
131
|
-
.buildMutationsResolvers({ contentType });
|
|
132
|
-
|
|
133
|
-
const value = await deleteResolver(parent, args, ctx);
|
|
134
|
-
|
|
135
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
136
|
-
},
|
|
137
|
-
});
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
buildCollectionTypeMutations(contentType) {
|
|
142
|
-
const createMutationName = `Mutation.${getCreateMutationTypeName(contentType)}`;
|
|
143
|
-
const updateMutationName = `Mutation.${getUpdateMutationTypeName(contentType)}`;
|
|
144
|
-
const deleteMutationName = `Mutation.${getDeleteMutationTypeName(contentType)}`;
|
|
145
|
-
|
|
146
|
-
const extension = getService('extension');
|
|
147
|
-
|
|
148
|
-
const registerAuthConfig = (action, auth) => {
|
|
149
|
-
return extension.use({ resolversConfig: { [action]: { auth } } });
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const isActionEnabled = (action) => {
|
|
153
|
-
return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
const isCreateEnabled = isActionEnabled('create');
|
|
157
|
-
const isUpdateEnabled = isActionEnabled('update');
|
|
158
|
-
const isDeleteEnabled = isActionEnabled('delete');
|
|
159
|
-
|
|
160
|
-
if (isCreateEnabled) {
|
|
161
|
-
registerAuthConfig(createMutationName, { scope: [`${contentType.uid}.create`] });
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (isUpdateEnabled) {
|
|
165
|
-
registerAuthConfig(updateMutationName, { scope: [`${contentType.uid}.update`] });
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (isDeleteEnabled) {
|
|
169
|
-
registerAuthConfig(deleteMutationName, { scope: [`${contentType.uid}.delete`] });
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return extendType({
|
|
173
|
-
type: 'Mutation',
|
|
174
|
-
|
|
175
|
-
definition(t) {
|
|
176
|
-
if (isCreateEnabled) {
|
|
177
|
-
addCreateMutation(t, contentType);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (isUpdateEnabled) {
|
|
181
|
-
addUpdateMutation(t, contentType);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (isDeleteEnabled) {
|
|
185
|
-
addDeleteMutation(t, contentType);
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
});
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const createCollectionTypeMutationsBuilder = require('./collection-type');
|
|
4
|
-
const createSingleTypeMutationsBuilder = require('./single-type');
|
|
5
|
-
|
|
6
|
-
module.exports = (context) => ({
|
|
7
|
-
...createCollectionTypeMutationsBuilder(context),
|
|
8
|
-
...createSingleTypeMutationsBuilder(context),
|
|
9
|
-
});
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { extendType, nonNull } = require('nexus');
|
|
4
|
-
const { omit, isNil } = require('lodash/fp');
|
|
5
|
-
|
|
6
|
-
const utils = require('@strapi/utils');
|
|
7
|
-
|
|
8
|
-
const { sanitize, validate } = utils;
|
|
9
|
-
const { NotFoundError } = utils.errors;
|
|
10
|
-
|
|
11
|
-
module.exports = ({ strapi }) => {
|
|
12
|
-
const { service: getService } = strapi.plugin('graphql');
|
|
13
|
-
|
|
14
|
-
const { naming } = getService('utils');
|
|
15
|
-
const { transformArgs } = getService('builders').utils;
|
|
16
|
-
const { toEntityResponse } = getService('format').returnTypes;
|
|
17
|
-
|
|
18
|
-
const {
|
|
19
|
-
getUpdateMutationTypeName,
|
|
20
|
-
getEntityResponseName,
|
|
21
|
-
getContentTypeInputName,
|
|
22
|
-
getDeleteMutationTypeName,
|
|
23
|
-
} = naming;
|
|
24
|
-
|
|
25
|
-
const addUpdateMutation = (t, contentType) => {
|
|
26
|
-
const { uid } = contentType;
|
|
27
|
-
|
|
28
|
-
const updateMutationName = getUpdateMutationTypeName(contentType);
|
|
29
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
30
|
-
|
|
31
|
-
t.field(updateMutationName, {
|
|
32
|
-
type: responseTypeName,
|
|
33
|
-
|
|
34
|
-
args: {
|
|
35
|
-
// Update payload
|
|
36
|
-
data: nonNull(getContentTypeInputName(contentType)),
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
async resolve(parent, args, context) {
|
|
40
|
-
const { auth } = context.state;
|
|
41
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
42
|
-
|
|
43
|
-
// Sanitize input data
|
|
44
|
-
const sanitizedInputData = await sanitize.contentAPI.input(
|
|
45
|
-
transformedArgs.data,
|
|
46
|
-
contentType,
|
|
47
|
-
{ auth }
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
Object.assign(transformedArgs, { data: sanitizedInputData });
|
|
51
|
-
|
|
52
|
-
const { create, update } = getService('builders')
|
|
53
|
-
.get('content-api')
|
|
54
|
-
.buildMutationsResolvers({ contentType });
|
|
55
|
-
|
|
56
|
-
// For single types, the validation and sanitization of args is done here instead of being
|
|
57
|
-
// delegated to the query builders since we're calling the entity service directly
|
|
58
|
-
|
|
59
|
-
await validate.contentAPI.query(omit(['data', 'files'], transformedArgs), contentType, {
|
|
60
|
-
auth,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const sanitizedQuery = await sanitize.contentAPI.query(
|
|
64
|
-
omit(['data', 'files'], transformedArgs),
|
|
65
|
-
contentType,
|
|
66
|
-
{
|
|
67
|
-
auth,
|
|
68
|
-
}
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
const entity = await strapi.entityService.findMany(uid, sanitizedQuery);
|
|
72
|
-
|
|
73
|
-
// Create or update
|
|
74
|
-
const value = isNil(entity)
|
|
75
|
-
? create(parent, transformedArgs)
|
|
76
|
-
: update(uid, { id: entity.id, data: transformedArgs.data });
|
|
77
|
-
|
|
78
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const addDeleteMutation = (t, contentType) => {
|
|
84
|
-
const { uid } = contentType;
|
|
85
|
-
|
|
86
|
-
const deleteMutationName = getDeleteMutationTypeName(contentType);
|
|
87
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
88
|
-
|
|
89
|
-
t.field(deleteMutationName, {
|
|
90
|
-
type: responseTypeName,
|
|
91
|
-
|
|
92
|
-
args: {},
|
|
93
|
-
|
|
94
|
-
async resolve(parent, args, ctx) {
|
|
95
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
96
|
-
|
|
97
|
-
const { delete: deleteResolver } = getService('builders')
|
|
98
|
-
.get('content-api')
|
|
99
|
-
.buildMutationsResolvers({ contentType });
|
|
100
|
-
|
|
101
|
-
// For single types, the validation and sanitization of args is done here instead of being
|
|
102
|
-
// delegated to the query builders since we're calling the entity service directly
|
|
103
|
-
|
|
104
|
-
await validate.contentAPI.query(transformedArgs, contentType, { auth: ctx?.state?.auth });
|
|
105
|
-
|
|
106
|
-
const sanitizedQuery = await sanitize.contentAPI.query(transformedArgs, contentType, {
|
|
107
|
-
auth: ctx?.state?.auth,
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
const entity = await strapi.entityService.findMany(uid, sanitizedQuery);
|
|
111
|
-
|
|
112
|
-
if (!entity) {
|
|
113
|
-
throw new NotFoundError('Entity not found');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const value = await deleteResolver(parent, { id: entity.id, params: transformedArgs });
|
|
117
|
-
|
|
118
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
return {
|
|
124
|
-
buildSingleTypeMutations(contentType) {
|
|
125
|
-
const updateMutationName = `Mutation.${getUpdateMutationTypeName(contentType)}`;
|
|
126
|
-
const deleteMutationName = `Mutation.${getDeleteMutationTypeName(contentType)}`;
|
|
127
|
-
|
|
128
|
-
const extension = getService('extension');
|
|
129
|
-
|
|
130
|
-
const registerAuthConfig = (action, auth) => {
|
|
131
|
-
return extension.use({ resolversConfig: { [action]: { auth } } });
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const isActionEnabled = (action) => {
|
|
135
|
-
return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
const isUpdateEnabled = isActionEnabled('update');
|
|
139
|
-
const isDeleteEnabled = isActionEnabled('delete');
|
|
140
|
-
|
|
141
|
-
if (isUpdateEnabled) {
|
|
142
|
-
registerAuthConfig(updateMutationName, { scope: [`${contentType.uid}.update`] });
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (isDeleteEnabled) {
|
|
146
|
-
registerAuthConfig(deleteMutationName, { scope: [`${contentType.uid}.delete`] });
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return extendType({
|
|
150
|
-
type: 'Mutation',
|
|
151
|
-
|
|
152
|
-
definition(t) {
|
|
153
|
-
if (isUpdateEnabled) {
|
|
154
|
-
addUpdateMutation(t, contentType);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (isDeleteEnabled) {
|
|
158
|
-
addDeleteMutation(t, contentType);
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
};
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { extendType } = require('nexus');
|
|
4
|
-
|
|
5
|
-
module.exports = ({ strapi }) => {
|
|
6
|
-
const { service: getService } = strapi.plugin('graphql');
|
|
7
|
-
|
|
8
|
-
const { naming } = getService('utils');
|
|
9
|
-
const { transformArgs, getContentTypeArgs } = getService('builders').utils;
|
|
10
|
-
const { toEntityResponse, toEntityResponseCollection } = getService('format').returnTypes;
|
|
11
|
-
|
|
12
|
-
const {
|
|
13
|
-
getFindOneQueryName,
|
|
14
|
-
getEntityResponseName,
|
|
15
|
-
getFindQueryName,
|
|
16
|
-
getEntityResponseCollectionName,
|
|
17
|
-
} = naming;
|
|
18
|
-
|
|
19
|
-
const buildCollectionTypeQueries = (contentType) => {
|
|
20
|
-
const findOneQueryName = `Query.${getFindOneQueryName(contentType)}`;
|
|
21
|
-
const findQueryName = `Query.${getFindQueryName(contentType)}`;
|
|
22
|
-
|
|
23
|
-
const extension = getService('extension');
|
|
24
|
-
|
|
25
|
-
const registerAuthConfig = (action, auth) => {
|
|
26
|
-
return extension.use({ resolversConfig: { [action]: { auth } } });
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const isActionEnabled = (action) => {
|
|
30
|
-
return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const isFindOneEnabled = isActionEnabled('findOne');
|
|
34
|
-
const isFindEnabled = isActionEnabled('find');
|
|
35
|
-
|
|
36
|
-
if (isFindOneEnabled) {
|
|
37
|
-
registerAuthConfig(findOneQueryName, { scope: [`${contentType.uid}.findOne`] });
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (isFindEnabled) {
|
|
41
|
-
registerAuthConfig(findQueryName, { scope: [`${contentType.uid}.find`] });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return extendType({
|
|
45
|
-
type: 'Query',
|
|
46
|
-
|
|
47
|
-
definition(t) {
|
|
48
|
-
if (isFindOneEnabled) {
|
|
49
|
-
addFindOneQuery(t, contentType);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (isFindEnabled) {
|
|
53
|
-
addFindQuery(t, contentType);
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Register a "find one" query field to the nexus type definition
|
|
61
|
-
* @param {OutputDefinitionBlock<Query>} t
|
|
62
|
-
* @param contentType
|
|
63
|
-
*/
|
|
64
|
-
const addFindOneQuery = (t, contentType) => {
|
|
65
|
-
const { uid } = contentType;
|
|
66
|
-
|
|
67
|
-
const findOneQueryName = getFindOneQueryName(contentType);
|
|
68
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
69
|
-
|
|
70
|
-
t.field(findOneQueryName, {
|
|
71
|
-
type: responseTypeName,
|
|
72
|
-
|
|
73
|
-
args: getContentTypeArgs(contentType, { multiple: false }),
|
|
74
|
-
|
|
75
|
-
async resolve(parent, args, ctx) {
|
|
76
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
77
|
-
|
|
78
|
-
const { findOne } = getService('builders')
|
|
79
|
-
.get('content-api')
|
|
80
|
-
.buildQueriesResolvers({ contentType });
|
|
81
|
-
|
|
82
|
-
// queryResolvers will sanitize params
|
|
83
|
-
const value = findOne(parent, transformedArgs, ctx);
|
|
84
|
-
|
|
85
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Register a "find" query field to the nexus type definition
|
|
92
|
-
* @param {OutputDefinitionBlock<Query>} t
|
|
93
|
-
* @param contentType
|
|
94
|
-
*/
|
|
95
|
-
const addFindQuery = (t, contentType) => {
|
|
96
|
-
const { uid } = contentType;
|
|
97
|
-
|
|
98
|
-
const findQueryName = getFindQueryName(contentType);
|
|
99
|
-
const responseCollectionTypeName = getEntityResponseCollectionName(contentType);
|
|
100
|
-
|
|
101
|
-
t.field(findQueryName, {
|
|
102
|
-
type: responseCollectionTypeName,
|
|
103
|
-
|
|
104
|
-
args: getContentTypeArgs(contentType),
|
|
105
|
-
|
|
106
|
-
async resolve(parent, args, ctx) {
|
|
107
|
-
const transformedArgs = transformArgs(args, { contentType, usePagination: true });
|
|
108
|
-
|
|
109
|
-
const { find } = getService('builders')
|
|
110
|
-
.get('content-api')
|
|
111
|
-
.buildQueriesResolvers({ contentType });
|
|
112
|
-
|
|
113
|
-
// queryResolvers will sanitize params
|
|
114
|
-
const nodes = await find(parent, transformedArgs, ctx);
|
|
115
|
-
|
|
116
|
-
return toEntityResponseCollection(nodes, { args: transformedArgs, resourceUID: uid });
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
return { buildCollectionTypeQueries };
|
|
122
|
-
};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const createCollectionTypeQueriesBuilder = require('./collection-type');
|
|
4
|
-
const createSingleTypeQueriesBuilder = require('./single-type');
|
|
5
|
-
|
|
6
|
-
module.exports = (context) => ({
|
|
7
|
-
...createCollectionTypeQueriesBuilder(context),
|
|
8
|
-
...createSingleTypeQueriesBuilder(context),
|
|
9
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { extendType } = require('nexus');
|
|
4
|
-
|
|
5
|
-
module.exports = ({ strapi }) => {
|
|
6
|
-
const { service: getService } = strapi.plugin('graphql');
|
|
7
|
-
|
|
8
|
-
const { naming } = getService('utils');
|
|
9
|
-
const { transformArgs, getContentTypeArgs } = getService('builders').utils;
|
|
10
|
-
const { toEntityResponse } = getService('format').returnTypes;
|
|
11
|
-
|
|
12
|
-
const { getFindOneQueryName, getEntityResponseName } = naming;
|
|
13
|
-
|
|
14
|
-
const buildSingleTypeQueries = (contentType) => {
|
|
15
|
-
const findQueryName = `Query.${getFindOneQueryName(contentType)}`;
|
|
16
|
-
|
|
17
|
-
const extension = getService('extension');
|
|
18
|
-
|
|
19
|
-
const registerAuthConfig = (action, auth) => {
|
|
20
|
-
return extension.use({ resolversConfig: { [action]: { auth } } });
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const isActionEnabled = (action) => {
|
|
24
|
-
return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const isFindEnabled = isActionEnabled('find');
|
|
28
|
-
|
|
29
|
-
if (isFindEnabled) {
|
|
30
|
-
registerAuthConfig(findQueryName, { scope: [`${contentType.uid}.find`] });
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return extendType({
|
|
34
|
-
type: 'Query',
|
|
35
|
-
|
|
36
|
-
definition(t) {
|
|
37
|
-
if (isFindEnabled) {
|
|
38
|
-
addFindQuery(t, contentType);
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const addFindQuery = (t, contentType) => {
|
|
45
|
-
const { uid } = contentType;
|
|
46
|
-
|
|
47
|
-
const findQueryName = getFindOneQueryName(contentType);
|
|
48
|
-
const responseTypeName = getEntityResponseName(contentType);
|
|
49
|
-
|
|
50
|
-
t.field(findQueryName, {
|
|
51
|
-
type: responseTypeName,
|
|
52
|
-
|
|
53
|
-
args: getContentTypeArgs(contentType),
|
|
54
|
-
|
|
55
|
-
async resolve(parent, args, ctx) {
|
|
56
|
-
const transformedArgs = transformArgs(args, { contentType });
|
|
57
|
-
|
|
58
|
-
const queriesResolvers = getService('builders')
|
|
59
|
-
.get('content-api')
|
|
60
|
-
.buildQueriesResolvers({ contentType });
|
|
61
|
-
|
|
62
|
-
// queryResolvers will sanitize params
|
|
63
|
-
const value = queriesResolvers.find(parent, transformedArgs, ctx);
|
|
64
|
-
|
|
65
|
-
return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
return { buildSingleTypeQueries };
|
|
71
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { objectType, nonNull } = require('nexus');
|
|
4
|
-
const { defaultTo, prop, pipe } = require('lodash/fp');
|
|
5
|
-
|
|
6
|
-
module.exports = ({ strapi }) => {
|
|
7
|
-
const { naming } = strapi.plugin('graphql').service('utils');
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
/**
|
|
11
|
-
* Build a type definition for a content API relation's collection response for a given content type
|
|
12
|
-
* @param {object} contentType The content type which will be used to build its content API response definition
|
|
13
|
-
* @return {NexusObjectTypeDef}
|
|
14
|
-
*/
|
|
15
|
-
buildRelationResponseCollectionDefinition(contentType) {
|
|
16
|
-
const name = naming.getRelationResponseCollectionName(contentType);
|
|
17
|
-
const entityName = naming.getEntityName(contentType);
|
|
18
|
-
|
|
19
|
-
return objectType({
|
|
20
|
-
name,
|
|
21
|
-
|
|
22
|
-
definition(t) {
|
|
23
|
-
t.nonNull.list.field('data', {
|
|
24
|
-
type: nonNull(entityName),
|
|
25
|
-
|
|
26
|
-
resolve: pipe(prop('nodes'), defaultTo([])),
|
|
27
|
-
});
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
};
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { get } = require('lodash/fp');
|
|
4
|
-
|
|
5
|
-
const utils = require('@strapi/utils');
|
|
6
|
-
|
|
7
|
-
const { sanitize, validate, pipeAsync } = utils;
|
|
8
|
-
const { ApplicationError } = utils.errors;
|
|
9
|
-
|
|
10
|
-
module.exports = ({ strapi }) => {
|
|
11
|
-
const { service: getGraphQLService } = strapi.plugin('graphql');
|
|
12
|
-
|
|
13
|
-
const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;
|
|
14
|
-
const { transformArgs } = getGraphQLService('builders').utils;
|
|
15
|
-
const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
buildAssociationResolver({ contentTypeUID, attributeName }) {
|
|
19
|
-
const contentType = strapi.getModel(contentTypeUID);
|
|
20
|
-
const attribute = contentType.attributes[attributeName];
|
|
21
|
-
|
|
22
|
-
if (!attribute) {
|
|
23
|
-
throw new ApplicationError(
|
|
24
|
-
`Failed to build an association resolver for ${contentTypeUID}::${attributeName}`
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const isMediaAttribute = isMedia(attribute);
|
|
29
|
-
const isMorphAttribute = isMorphRelation(attribute);
|
|
30
|
-
|
|
31
|
-
const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;
|
|
32
|
-
const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');
|
|
33
|
-
|
|
34
|
-
const targetContentType = strapi.getModel(targetUID);
|
|
35
|
-
|
|
36
|
-
return async (parent, args = {}, context = {}) => {
|
|
37
|
-
const { auth } = context.state;
|
|
38
|
-
|
|
39
|
-
const transformedArgs = transformArgs(args, {
|
|
40
|
-
contentType: targetContentType,
|
|
41
|
-
usePagination: true,
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
await validate.contentAPI.query(transformedArgs, targetContentType, {
|
|
45
|
-
auth,
|
|
46
|
-
});
|
|
47
|
-
const sanitizedQuery = await sanitize.contentAPI.query(transformedArgs, targetContentType, {
|
|
48
|
-
auth,
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
const data = await strapi.entityService.load(
|
|
52
|
-
contentTypeUID,
|
|
53
|
-
parent,
|
|
54
|
-
attributeName,
|
|
55
|
-
sanitizedQuery
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
const info = {
|
|
59
|
-
args: sanitizedQuery,
|
|
60
|
-
resourceUID: targetUID,
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// If this a polymorphic association, it sanitizes & returns the raw data
|
|
64
|
-
// Note: The value needs to be wrapped in a fake object that represents its parent
|
|
65
|
-
// so that the sanitize util can work properly.
|
|
66
|
-
if (isMorphAttribute) {
|
|
67
|
-
// Helpers used for the data cleanup
|
|
68
|
-
const wrapData = (dataToWrap) => ({ [attributeName]: dataToWrap });
|
|
69
|
-
const sanitizeData = (dataToSanitize) => {
|
|
70
|
-
return sanitize.contentAPI.output(dataToSanitize, contentType, { auth });
|
|
71
|
-
};
|
|
72
|
-
const unwrapData = get(attributeName);
|
|
73
|
-
|
|
74
|
-
// Sanitizer definition
|
|
75
|
-
const sanitizeMorphAttribute = pipeAsync(wrapData, sanitizeData, unwrapData);
|
|
76
|
-
|
|
77
|
-
return sanitizeMorphAttribute(data);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// If this is a to-many relation, it returns an object that
|
|
81
|
-
// matches what the entity-response-collection's resolvers expect
|
|
82
|
-
if (isToMany) {
|
|
83
|
-
return toEntityResponseCollection(data, info);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Else, it returns an object that matches
|
|
87
|
-
// what the entity-response's resolvers expect
|
|
88
|
-
return toEntityResponse(data, info);
|
|
89
|
-
};
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
};
|