From 084a831e7a17366a1278e64e69f4592f6ad743ec Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sun, 17 Oct 2021 15:10:38 +0200 Subject: [PATCH] feat: Implement getConnectedApps graphQL query --- .../src/graphql/queries/get-connected-apps.ts | 43 +++++++++++++++++++ packages/backend/src/graphql/root-query.ts | 6 ++- packages/backend/src/graphql/types/app.ts | 3 +- packages/backend/src/models/connection.ts | 1 + 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 packages/backend/src/graphql/queries/get-connected-apps.ts diff --git a/packages/backend/src/graphql/queries/get-connected-apps.ts b/packages/backend/src/graphql/queries/get-connected-apps.ts new file mode 100644 index 00000000..e0036ce1 --- /dev/null +++ b/packages/backend/src/graphql/queries/get-connected-apps.ts @@ -0,0 +1,43 @@ +import { GraphQLList, GraphQLString } from 'graphql'; +import Connection from '../../models/connection'; +import App from '../../models/app'; +import RequestWithCurrentUser from '../../types/express/request-with-current-user'; +import appType from '../types/app'; + +type Params = { + name: string +} + +const getConnectedAppsResolver = async (params: Params, req: RequestWithCurrentUser) => { + let apps = App.findAll(params.name) + + const connections = await Connection.query() + .select('connections.key') + .count('connections.id as count') + .where({ user_id: req.currentUser.id, verified: true }) + .groupBy('connections.key') + + const connectionKeys = connections.map(connection => connection.key) + + apps = apps + .filter((app: any) => connectionKeys.includes(app.key)) + .map((app: any) => { + const connection = connections + .find((connection: any) => connection.key === app.key) + + app.connectionCount = connection.count; + return app; + }) + + return apps; +} + +const getConnectedApps = { + type: GraphQLList(appType), + args: { + name: { type: GraphQLString } + }, + resolve: (_: any, params: Params, req: RequestWithCurrentUser) => getConnectedAppsResolver(params, req) +} + +export default getConnectedApps; diff --git a/packages/backend/src/graphql/root-query.ts b/packages/backend/src/graphql/root-query.ts index 5ae6dada..5546a69a 100644 --- a/packages/backend/src/graphql/root-query.ts +++ b/packages/backend/src/graphql/root-query.ts @@ -1,12 +1,14 @@ import { GraphQLObjectType } from 'graphql'; import getApps from './queries/get-apps'; import getApp from './queries/get-app'; +import getConnectedApps from './queries/get-connected-apps'; const rootQuery = new GraphQLObjectType({ name: 'Query', fields: { - getApps: getApps, - getApp: getApp + getApps, + getApp, + getConnectedApps } }); diff --git a/packages/backend/src/graphql/types/app.ts b/packages/backend/src/graphql/types/app.ts index 74460e5d..2f2d30a3 100644 --- a/packages/backend/src/graphql/types/app.ts +++ b/packages/backend/src/graphql/types/app.ts @@ -1,4 +1,4 @@ -import { GraphQLObjectType, GraphQLString, GraphQLList } from 'graphql'; +import { GraphQLObjectType, GraphQLString, GraphQLList, GraphQLInt } from 'graphql'; import fieldType from './field'; import authenticationStepType from './authentication-step'; @@ -7,6 +7,7 @@ const appType = new GraphQLObjectType({ fields: { name: { type: GraphQLString }, key: { type: GraphQLString }, + connectionCount: { type: GraphQLInt }, slug: { type: GraphQLString }, iconUrl: { type: GraphQLString }, docUrl: { type: GraphQLString }, diff --git a/packages/backend/src/models/connection.ts b/packages/backend/src/models/connection.ts index 5e1dc368..635498cc 100644 --- a/packages/backend/src/models/connection.ts +++ b/packages/backend/src/models/connection.ts @@ -7,6 +7,7 @@ class Connection extends Base { data!: any userId!: number verified: boolean + count: number static tableName = 'connections';