Как заставить GraphQL автоматически вставлять текущий UTC при мутации? - PullRequest
0 голосов
/ 18 сентября 2018

Мой код мутации выглядит следующим образом:

Mutation: {
  addPost: async (parent, args) => {
    // Add new post to dbPosts
    const task = fawn.Task();
    task.save(
      dbPost,
      {
        _id: new mongoose.Types.ObjectId(),
        title: args.title,
        content: args.content,
        created: args.created,
        author: {
          id: args.author_id,
          first_name: args.author_first_name,
          last_name: args.author_last_name,
        }
      }
    );
  }
}

Схема, с которой я работаю, определяется как:

scalar DateTime

type Query {
  posts: [Post],
  post(id: ID!): Post,
}

type Mutation {
  addPost(
    title: String!,
    content: String!,
    created: DateTime!,
    author_id: String!,
    author_first_name: String!
     author_last_name: String!): Post,
}

type Post {
  id: ID!
  title: String!,
  content: String!,
  author: Author!,
  created: DateTime,
}

Как видно, я также использую собственный скаляробрабатывать значения даты / времени.Этот пользовательский скаляр DateTime разрешается следующим образом:

const { GraphQLScalarType } = require('graphql/type');

const tmUTC = () => {
  const tmLoc = new Date();
  return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
};

DateTime = new GraphQLScalarType({
  name: 'DateTime',
  description: 'Date/Time custom scalar type',
  parseValue: () => { // runs on mutation
    return tmUTC();
  },
  serialize: (value) => { // runs on query
    return new Date(value.getTime());
  },
  parseLiteral: () => {
    return tmUTC();
  },
});

module.exports = DateTime;

Теперь это работает нормально, и я могу вставлять и извлекать записи с отметкой времени, как и ожидалось.Однако мне все еще нужно передать фиктивный аргумент для поля created, чтобы решатель DateTime включил:

mutation{
  addPost(
    title: "Ghostbusters",
    content: "Lots and lots of ghosts here...",
    created: "",
    author_id: "5ba0c2491c9d440000ac8fc3",
    author_first_name: "Bill",
    author_last_name: "Murray"
  ){
    title
    content
    id
    created
  }
}

Я даже могу оставить это поле пустым, и время все равно будетзаписано.Но я не могу просто оставить это в своем мутационном вызове.Есть ли способ добиться этого?Здесь цель состоит в том, чтобы GraphQL автоматически выполнял преобразователь DateTime без необходимости явного ввода поля created в вызове мутации.

1 Ответ

0 голосов
/ 18 сентября 2018

в вашей мутации, удалите требование для созданного, чтобы потребоваться

type Mutation {
  addPost(
    title: String!,
    content: String!,
    // created: DateTime!, changed in next line
    created: DateTime, // no ! means not required
    author_id: String!,
    author_first_name: String!
     author_last_name: String!): Post,
}

Затем в вашей задаче объединить созданный аргумент, если оно не

  addPost: async (parent, args) => {
    // if args does not have created, make it here if it is required by task
    const task = fawn.Task();
    task.save(
      dbPost,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...