prismake / typegql

Create GraphQL schema with TypeScript classes.

Home Page:https://prismake.github.io/typegql/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

feature request: @MutationField and @QueryField

capaj opened this issue · comments

Currently if I return a class from @Mutation() and @Query() and I want to have a field like patch(
image
) on the class, this field is exposed on mutations and on queries as well. I'd like to avoid this-hence the new decorator. This could be achieved with a decorator config like @Field({mutationOnly: true}) or @Field({query: false}), but IMHO it's own decorator is more explicit way.

I didnt understand your question. I'd appreciate if you take your time re-writing it :) If it'd be race called 'who is the fastests to submit issue', you'd win ;) )

basically:

@ObjectType()
class User {
  @Field() name: string

  @Field() price: number

  @Field() // here I would use the MutationField
  setSuperUser(): User {
    // do some actual mutation, not important for this demonstration
    return this
  }
}

@Schema()
class SuperSchema {
  @Mutation()
  createUser(name: string, price: number): User {
    const user = new User()
    return user
  }

  @Query()
  @Mutation()
  getUserById(id: number): User {
    return new User()
  }
}

const schema = compileSchema({ roots: [SuperSchema2] })
console.log('schema: ', printSchema(schema))

now the compiled schema looks like:

type Mutation {
  createUser(name: String!, price: Float!): User
 getUserById(id: Float!): User
}

type Query {
  getUserById(id: Float!): User
}

type User {
  name: String
  price: Float
  setSuperUser: User
}

Now anyone can just call this query:

{
 getUserById(1) { setSuperUser {name}}
}

but I would like them to only be able to call that via a mutation like

mutation {
 getUserById(1) { setSuperUser {name}}
}

currently they can call it like a query and mutation both.

First of all, I think getUserById should be inside query, not inside mutation. Mutations are meant to mutate the state of the app.

Anyway, I see you're using

  @Query()
  @Mutation()
  getUserById(id: number): User {
    return new User()
  }

You're using both Mutation and Query decorator - that's the reason it's bresent in both. If you'd leave only @Mutation - it'll not be present in query anymore.

Sorry for not responding sooner. The thing is I have a User class. This class has Fields which are reading so they are gql queries, but it also has Field which are mutating the User instance.
That is why I have both Query and Mutation decorators there.
If I only put Query there, I can't call

mutation {
 getUserById(1) { setSuperUser {name}}
}

Having field that is mutating is rather not good idea.

why?

Could you describe in details your desired schema?