UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

115 lines (113 loc) 6.65 kB
import { getTypes } from "./get-types.js"; import { resolveMutation } from "../resolvers/mutation.js"; import { SYSTEM_DENY_LIST } from "./index.js"; import "../index.js"; import { GraphQLBoolean, GraphQLID, GraphQLList, GraphQLNonNull } from "graphql"; import { toInputObjectType } from "graphql-compose"; //#region src/services/graphql/schema/write.ts function getWritableTypes(gql, schemaComposer, schema, inconsistentFields, ReadCollectionTypes) { const { CollectionTypes: CreateCollectionTypes } = getTypes(schemaComposer, gql.scope, schema, inconsistentFields, "create"); const { CollectionTypes: UpdateCollectionTypes } = getTypes(schemaComposer, gql.scope, schema, inconsistentFields, "update"); const DeleteCollectionTypes = {}; for (const collection of Object.values(schema.create.collections)) { if (Object.keys(collection.fields).length === 0) continue; if (SYSTEM_DENY_LIST.includes(collection.collection)) continue; if (collection.collection in CreateCollectionTypes === false) continue; const collectionIsReadable = collection.collection in ReadCollectionTypes; const creatableFields = CreateCollectionTypes[collection.collection]?.getFields() || {}; if (Object.keys(creatableFields).length > 0) { const resolverDefinition = { name: `create_${collection.collection}_items`, type: collectionIsReadable ? new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(ReadCollectionTypes[collection.collection].getType()))) : GraphQLBoolean, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }; if (collectionIsReadable) resolverDefinition.args = ReadCollectionTypes[collection.collection].getResolver(collection.collection).getArgs(); CreateCollectionTypes[collection.collection].addResolver(resolverDefinition); CreateCollectionTypes[collection.collection].addResolver({ name: `create_${collection.collection}_item`, type: collectionIsReadable ? ReadCollectionTypes[collection.collection] : GraphQLBoolean, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); CreateCollectionTypes[collection.collection].getResolver(`create_${collection.collection}_items`).addArgs({ ...CreateCollectionTypes[collection.collection].getResolver(`create_${collection.collection}_items`).getArgs(), data: [toInputObjectType(CreateCollectionTypes[collection.collection]).setTypeName(`create_${collection.collection}_input`).NonNull] }); CreateCollectionTypes[collection.collection].getResolver(`create_${collection.collection}_item`).addArgs({ ...CreateCollectionTypes[collection.collection].getResolver(`create_${collection.collection}_item`).getArgs(), data: toInputObjectType(CreateCollectionTypes[collection.collection]).setTypeName(`create_${collection.collection}_input`).NonNull }); } } for (const collection of Object.values(schema.update.collections)) { if (Object.keys(collection.fields).length === 0) continue; if (SYSTEM_DENY_LIST.includes(collection.collection)) continue; if (collection.collection in UpdateCollectionTypes === false) continue; const collectionIsReadable = collection.collection in ReadCollectionTypes; const updatableFields = UpdateCollectionTypes[collection.collection]?.getFields() || {}; if (Object.keys(updatableFields).length > 0) if (collection.singleton) UpdateCollectionTypes[collection.collection].addResolver({ name: `update_${collection.collection}`, type: collectionIsReadable ? ReadCollectionTypes[collection.collection] : GraphQLBoolean, args: { data: toInputObjectType(UpdateCollectionTypes[collection.collection]).setTypeName(`update_${collection.collection}_input`).NonNull }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); else { UpdateCollectionTypes[collection.collection].addResolver({ name: `update_${collection.collection}_batch`, type: collectionIsReadable ? new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(ReadCollectionTypes[collection.collection].getType()))) : GraphQLBoolean, args: { ...collectionIsReadable ? ReadCollectionTypes[collection.collection].getResolver(collection.collection).getArgs() : {}, data: [toInputObjectType(UpdateCollectionTypes[collection.collection]).setTypeName(`update_${collection.collection}_input`).NonNull] }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); UpdateCollectionTypes[collection.collection].addResolver({ name: `update_${collection.collection}_items`, type: collectionIsReadable ? new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(ReadCollectionTypes[collection.collection].getType()))) : GraphQLBoolean, args: { ...collectionIsReadable ? ReadCollectionTypes[collection.collection].getResolver(collection.collection).getArgs() : {}, ids: new GraphQLNonNull(new GraphQLList(GraphQLID)), data: toInputObjectType(UpdateCollectionTypes[collection.collection]).setTypeName(`update_${collection.collection}_input`).NonNull }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); UpdateCollectionTypes[collection.collection].addResolver({ name: `update_${collection.collection}_item`, type: collectionIsReadable ? ReadCollectionTypes[collection.collection] : GraphQLBoolean, args: { id: new GraphQLNonNull(GraphQLID), data: toInputObjectType(UpdateCollectionTypes[collection.collection]).setTypeName(`update_${collection.collection}_input`).NonNull }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); } } DeleteCollectionTypes["many"] = schemaComposer.createObjectTC({ name: `delete_many`, fields: { ids: new GraphQLNonNull(new GraphQLList(GraphQLID)) } }); DeleteCollectionTypes["one"] = schemaComposer.createObjectTC({ name: `delete_one`, fields: { id: new GraphQLNonNull(GraphQLID) } }); for (const collection of Object.values(schema.delete.collections)) { DeleteCollectionTypes["many"].addResolver({ name: `delete_${collection.collection}_items`, type: DeleteCollectionTypes["many"], args: { ids: new GraphQLNonNull(new GraphQLList(GraphQLID)) }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); DeleteCollectionTypes["one"].addResolver({ name: `delete_${collection.collection}_item`, type: DeleteCollectionTypes["one"], args: { id: new GraphQLNonNull(GraphQLID) }, resolve: async ({ args, info }) => await resolveMutation(gql, args, info) }); } return { CreateCollectionTypes, UpdateCollectionTypes, DeleteCollectionTypes }; } //#endregion export { getWritableTypes };