import { GraphQLObjectType, GraphQLString, GraphQLInputObjectType, GraphQLBoolean, GraphQLInt, GraphQLList, GraphQLFloat, GraphQLNonNull, } from 'graphql'; import { authorized } from '../auth'; import { IProjectTpl, IUpdateProjectTpl, } from '../model/renovationProjectTpl'; import { createRenovationProjectTpl, deleteRenovationProjectTpl, updateRenovationProjectTpl, } from './renovationProjectTplRepository'; interface ICreateProjectTplInput { input: IProjectTpl; } interface IUpdateProjectTplInput { input: IUpdateProjectTpl; } interface IDeleteProjectTplInput { input: { id: string; }; } const projectTplDescription = { id: 'Project template id', name: 'Project template name', description: 'Project template description', status: 'Project template status', hierarchyDepth: 'Project hierarchy depth (3 by default and no more than 3)', created: 'Creation date', updated: 'Date of the last update', }; const createProjectTplInputType = new GraphQLInputObjectType({ name: 'CreateProjectTplInputType', description: 'Create new project template input type', fields: () => ({ name: { type: new GraphQLNonNull(GraphQLString), description: projectTplDescription.name, }, description: { type: new GraphQLNonNull(GraphQLString), description: projectTplDescription.description, }, hierarchyDepth: { type: GraphQLInt, description: projectTplDescription.hierarchyDepth, }, }), }); const updateProjectTplInputType = new GraphQLInputObjectType({ name: 'UpdateProjectTplInputType', description: 'Update project template input type', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: projectTplDescription.id, }, name: { type: GraphQLString, description: projectTplDescription.name, }, description: { type: GraphQLString, description: projectTplDescription.description, }, status: { type: GraphQLString, description: projectTplDescription.status, }, }), }); const deleteProjectTplInputType = new GraphQLInputObjectType({ name: 'DeleteProjectTplInputType', description: 'Delete project template input type', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: projectTplDescription.id, }, }), }); const projectTplType = new GraphQLObjectType({ name: 'ProjectTplType', description: 'Project template', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: projectTplDescription.id, }, name: { type: GraphQLString, description: projectTplDescription.name, }, description: { type: GraphQLString, description: projectTplDescription.description, }, status: { type: GraphQLString, description: projectTplDescription.status, }, created: { type: GraphQLString, description: projectTplDescription.created, }, updated: { type: GraphQLString, description: projectTplDescription.updated, }, }), }); export default { createRenovationProjectTpl: { description: 'Creates a new project template', type: projectTplType, args: { input: { type: new GraphQLNonNull(createProjectTplInputType) }, }, resolve: authorized( ['AM', 'CE'], (_: any, { input }: ICreateProjectTplInput) => { return createRenovationProjectTpl(input); }, ), }, updateRenovationProjectTpl: { description: 'Update project template', type: projectTplType, args: { input: { type: new GraphQLNonNull(updateProjectTplInputType) }, }, resolve: authorized( ['AM', 'CE'], (_: any, { input }: IUpdateProjectTplInput) => { return updateRenovationProjectTpl(input); }, ), }, deleteRenovationProjectTpl: { description: 'Delete project template', type: GraphQLBoolean, args: { input: { type: new GraphQLNonNull(deleteProjectTplInputType) }, }, resolve: authorized( ['AM', 'CE'], (_: any, { input }: IDeleteProjectTplInput) => { return deleteRenovationProjectTpl(input.id); }, ), }, };