Есть ли способ определить определение типа для объекта с изменяющимися именами свойств в GraphQL?

Я работаю над получением данных из API с помощью graphql-yoga и node-fetch (в node.js). Вот как выглядит мой код:

const {GraphQLServer} = require('graphql-yoga');
const fetch = require('node-fetch');

const typeDefs = `

    type Query {
        getTimeseries: Timeseries
    }

    type Timeseries {
        end_date: String
        start_date: String
    }
`;

const resolvers = {

    Query: {

        getTimeseries: async (_, {}) => {
            const response = await fetch(`https://fxmarketapi.com/apitimeseries?api_key=48Ki5q0sTKFQR3fuTvHw&currency=EURUSD,GBPUSD&interval=daily&start_date=2020-04-30&end_date=2020-05-01&format=ohlc`);
            return response.json();
        },
    },
};

const server = new GraphQLServer({
    typeDefs,
    resolvers
});
server.start(() => console.log('Server is running on localhost:4000'));

Данные, которые вы получаете при запуске данных из конечной точки API, которую я использую, показаны ниже:

{
    "end_date": "2020-05-01",
    "price": {
        "2020-04-30": {
            "EURUSD": {
                "close": 1.09528,
                "high": 1.09726,
                "low": 1.08331,
                "open": 1.08735
            },
            "GBPUSD": {
                "close": 1.25951,
                "high": 1.26432,
                "low": 1.24292,
                "open": 1.24671
            }
        },
        "2020-05-03": {
            "EURUSD": {
                "close": 1.09802,
                "high": 1.10152,
                "low": 1.09348,
                "open": 1.09528
            },
            "GBPUSD": {
                "close": 1.24941,
                "high": 1.25993,
                "low": 1.24859,
                "open": 1.25918
            }
        }
    },
    "start_date": "2020-04-30"
}

На данный момент, основываясь на моем коде выше, я могу получить только значения, содержащиеся в полях start_date и end_date, когда я запускаю свой запрос. Однако я не знаю, как создать определение типа для извлечения объекта под price, потому что имена полей — это даты, и они меняются каждый день. Пожалуйста, помогите мне написать определение типа и преобразователь для запроса, который мы будем использовать для получения этих данных.

Ps: при запуске тестов вы можете столкнуться с некоторыми кодами ошибок. Это должно помочь вам понять, что это за ошибка:

202 -   Requested currency code invalid or not in plan for Live and Convert Endpoints
203 -   Requested currency code invalid or not in plan for the Historical, Change, Timeseries and Pandas Endpoints
301 -   Invalid date type
302 -   Requested date is a weekend applicable to Historical, Change, Timeseries and Pandas Endpoints
401 -   Api_Key is invalid
501 -   Requestout of Range
502 -   Interval Parameters invalid

person Leon Peter    schedule 05.05.2020    source источник
comment
GraphQL не поддерживает структуру данных, которую вы пытаетесь реализовать. Вероятно, вам следует преобразовать ответ в структуру, которую может представить в вашей схеме. В противном случае вам придется использовать собственный скаляр, как указано в связанном дублировании.   -  person Daniel Rearden    schedule 05.05.2020
comment
@DanielRearden Отлично! использование пользовательского скаляра, как указано выше, работает. Однако вы упомянули, что я, вероятно, мог бы преобразовать ответ в структуру, которую можно представить в моей схеме. Как бы вы это сделали?   -  person Leon Peter    schedule 05.05.2020
comment
Например: price: [{ date: '2020-04-30', rates: [{ currency: 'EURUSD', values: { close: 1.09528 } }] }. Вы перебираете ключи объекта price и создаете соответствующий массив из значений.   -  person Daniel Rearden    schedule 05.05.2020
comment
Потрясающе, я понимаю. Спасибо.   -  person Leon Peter    schedule 05.05.2020