@Test-style

Как написать вложенный запроса GraphQL?

BackEnd: node.js + koa +mongoDB(mongoose)
Front: Vue.js + apollo
Работаю с действующим приложением, расширяю функционал, и вот попал на трудности. Второй день читаю доки, но всё равно, что-то не клеится с вложенным запросом. И так, есть
schema.js (много деструктуризации, много импортов, лишние убрал...)
import { userQueries, userMutations } from './user'
import { partnerQueries } from './partner'

export default new GraphQLSchema({
    query: new GraphQLObjectType({
        name: 'Query',
        fields: {
            ...partnerQueries,
        },
    }),
    mutation: new GraphQLObjectType({
        name: 'Mutation',
        fields: {
            ...userMutations,
        }
    }),
    subscription: new GraphQLObjectType({
        name: 'Subscriptions',
        fields: {
            ...userQueries,
        },
    }),
})

Далее отдельный файл с типами types.js :
import {
	GraphQLObjectType,
	GraphQLString,
	GraphQLFloat,
	GraphQLBoolean,
	GraphQLList,
	GraphQLID,
} from "graphql";
import GraphQLJSON from "graphql-type-json"

// GraphQL schema
const referralsUser = {
	_id: {
		type: GraphQLID,
	},
	email: {
		type: GraphQLString,
	},
	name: {
		type: GraphQLString,
	},	
	referralLink: {
		type: GraphQLString,
	}
}
const paymentsTotal = {
    _id: {
		type: GraphQLID,
	},
    total: {
        type: GraphQLFloat,
    },
}

И файл запросов queries.js
import {
	GraphQLID,
	GraphQLList,
	GraphQLString,
} from "graphql";

import { referralsUserType, paymentsTotalUserType } from "./types";
import { userModel } from "@/api/user/models";
import { paymentModel } from "@/api/pay/models";

const myReferralUser = {
    type: new GraphQLList(referralsUserType),
	args: {
		referralLink: {
			type: GraphQLString,
		}
	},
	resolve: async (root, args, context) => {
		return await userModel.find({referrerCode: args.referralLink}).exec()
	},
}
const paymentsTotalUser = {
	type: paymentsTotalUserType,
	args: {
		userId: {type: GraphQLID}
	},
	resolve: async (root, args, context) => {
		let list = await paymentModel.find({user: args.userId, status: 'confirmed'}),
			total = 0
		list.forEach( payment => total += payment.total)
		return {_id: args.id, total: total}
	}
}
export default {
	myReferralUser,
	paymentsTotalUser
}

И в корне папки index.js собирающий дефолтный экспорт в именованный ( export { default as partnerQueries } from './queries' )
И собственно задача, по отдельности работающая без проблем.
Список реферралов:
query {
  myReferralUser( referralLink: "admin") {
    name
      }
}

Возвращает мне 
{
  "data": {
    "myReferralUser": [
      {
        "name": "Jane Doe"
      },
      {
        "name": "researcher"
      },
      {
        "name": "Heroy"
      }
    ]
  }
}


И запрос "Сумма всех подтвержденных платежей.":
query {
  paymentsTotalUser( id: "617962c4f0ce29392ce35d03") {
    total    
  }
Возвращает
{
  "data": {
    "paymentsTotalUser": {
      "total": 0
    }
  }
}
}

На самом деле, первых запрос - это статистика, в которой ожидается объект со сведеными данными. И их еще нужно много... Но сейчас вопрос в одном. Как создать запрос, на получение списка реферралов, где для каждого реферрала будет прикручен еще одно свойство, являющееся результатом другого запроса. Отношение один-к-многим.
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы