Фильтрация по дате в Гэтсби потенциально сложна.Многие даты отправки API в JSON в виде строк - в формате ISO8601.Это означает, что GraphQL будет также рассматривать даты как строки.Это хорошо, если вы довольны фильтрацией на равенство строк, но обычно вы не фильтруете по датам.
Обычный вариант использования - фильтрация по датам в прошлом или будущем.В большинстве случаев мы бы сравнивали с текущей датой less than
или more than
.К сожалению, это не будет работать для строк дат в GraphQL.Операторы lt
и gt
применяются только к числам и не работают для строк.
К счастью, есть аварийный люк - setFieldsOnGraphQLNodeType
.Это позволяет нам взять узел содержимого и добавить собственные поля с производными данными. Мы можем взять строку даты и проанализировать ее в метку времени - число.С датой в качестве временной метки graphql может делать свое дело и разрешать фильтры lt
и gt
.
Допустим, мы пишем блог и что фильтровать сообщения, опубликованные в прошлом.Мы можем добавить поле publishedAt
datetime в нашу ContentModel, которое поможет нашим авторам контента публиковать вещи в будущем.Мы можем отфильтровать будущие записи, пока не преобразуем publishedAt
из строки даты в число.
Вот как это выглядит:
exports.setFieldsOnGraphQLNodeType = ({ type }) => {
if (type.name === `ContentfulBlogPost`) {
return {
publishAtTimestamp: {
type: GraphQLFloat,
resolve: source => {
return new Date(source.publishAt).getTime();
}
}
};
}
// by default return empty object
return {};
};
У ContentfulBlogPost теперь есть новое поле publishedAtTimestamp
, которое является числом, что означает, что теперь вы можете фильтровать его с помощью lt
или gt
query {
allContentfulBlogPost(
filter: { publishedAtTimestamp: { lt: $SOME_TIMESTAMP } }
) {
edges {
node {
id
...otherFields
}
}
}
}