diff --git a/packages/backend/src/graphql/graphql-schema.ts b/packages/backend/src/graphql/graphql-schema.ts index a69aeb34..4f714b24 100644 --- a/packages/backend/src/graphql/graphql-schema.ts +++ b/packages/backend/src/graphql/graphql-schema.ts @@ -1,5 +1,7 @@ -import { GraphQLObjectType, GraphQLSchema, GraphQLString, GraphQLList } from 'graphql'; +import { GraphQLObjectType, GraphQLSchema, GraphQLString, GraphQLList, GraphQLNonNull } from 'graphql'; import getApps from './queries/get-apps'; +import getApp from './queries/get-app'; +import appType from './types/app'; const queryType = new GraphQLObjectType({ name: 'Query', @@ -10,7 +12,14 @@ const queryType = new GraphQLObjectType({ name: { type: GraphQLString } }, resolve: (_, { name }) => getApps(name) - } + }, + getApp: { + type: appType, + args: { + name: { type: GraphQLNonNull(GraphQLString) }, + }, + resolve: (_, { name }) => getApp(name) + }, } }); diff --git a/packages/backend/src/graphql/queries/get-app.ts b/packages/backend/src/graphql/queries/get-app.ts new file mode 100644 index 00000000..586e2392 --- /dev/null +++ b/packages/backend/src/graphql/queries/get-app.ts @@ -0,0 +1,11 @@ +import App from '../../models/app'; + +const getApp = (name: string) => { + if(!name) { + throw new Error('No name provided.') + } + + return App.findOneByName(name) +} + +export default getApp; diff --git a/packages/backend/src/graphql/types/app.ts b/packages/backend/src/graphql/types/app.ts new file mode 100644 index 00000000..3669c807 --- /dev/null +++ b/packages/backend/src/graphql/types/app.ts @@ -0,0 +1,14 @@ +import { GraphQLObjectType, GraphQLString, GraphQLList } from 'graphql'; +import fieldType from './field'; + +const appType = new GraphQLObjectType({ + name: 'App', + fields: { + name: { type: GraphQLString }, + iconUrl: { type: GraphQLString }, + docUrl: { type: GraphQLString }, + fields: { type: GraphQLList(fieldType) } + } +}); + +export default appType; diff --git a/packages/backend/src/graphql/types/field.ts b/packages/backend/src/graphql/types/field.ts new file mode 100644 index 00000000..19e08d73 --- /dev/null +++ b/packages/backend/src/graphql/types/field.ts @@ -0,0 +1,18 @@ +import { GraphQLObjectType, GraphQLString, GraphQLBoolean} from 'graphql'; + +const fieldType = new GraphQLObjectType({ + name: 'field', + fields: { + key: { type: GraphQLString }, + label: { type: GraphQLString }, + type: { type: GraphQLString }, + required: { type: GraphQLBoolean}, + readOnly: { type: GraphQLBoolean}, + placeholder: { type: GraphQLString}, + description: { type: GraphQLString}, + docUrl: { type: GraphQLString}, + clickToCopy: { type: GraphQLBoolean}, + } +}) + +export default fieldType; diff --git a/packages/backend/src/models/app.ts b/packages/backend/src/models/app.ts index 1e6eb37e..2705556a 100644 --- a/packages/backend/src/models/app.ts +++ b/packages/backend/src/models/app.ts @@ -8,6 +8,11 @@ class App { if(!name) return this.list; return this.list.filter((app) => app.includes(name.toLowerCase())); } + + static findOneByName(name: string): object { + const rawAppData = fs.readFileSync(this.folderPath + `/${name}/info.json`, 'utf-8'); + return JSON.parse(rawAppData); + } } export default App;