Skip to content

Commit

Permalink
Updates GraphQL SDL Required Types logic (#432)
Browse files Browse the repository at this point in the history
* Strict Query return types

* Any required fields in schema are required in Input types

* Adds separate create and update input types

* Use new input types in scaffold new/edit components

* Update tests for Create/Update inputs in scaffold

Co-authored-by: Rob Cameron <rob.cameron@fastmail.com>
  • Loading branch information
cannikin and cannikin committed Apr 14, 2020
1 parent 743a48c commit a3f5ec2
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const QUERY = gql`
}
`
const UPDATE_POST_MUTATION = gql`
mutation UpdatePostMutation($id: Int!, $input: PostInput!) {
mutation UpdatePostMutation($id: Int!, $input: UpdatePostInput!) {
updatePost(id: $id, input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const QUERY = gql`
}
`
const UPDATE_POST_MUTATION = gql`
mutation UpdateUserProfileMutation($id: Int!, $input: UserProfileInput!) {
mutation UpdateUserProfileMutation($id: Int!, $input: UpdateUserProfileInput!) {
updateUserProfile(id: $id, input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { navigate, routes } from '@redwoodjs/router'
import UserProfileForm from 'src/components/UserProfileForm'

const CREATE_POST_MUTATION = gql`
mutation CreateUserProfileMutation($input: UserProfileInput!) {
mutation CreateUserProfileMutation($input: CreateUserProfileInput!) {
createUserProfile(input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { navigate, routes } from '@redwoodjs/router'
import PostForm from 'src/components/PostForm'

const CREATE_POST_MUTATION = gql`
mutation CreatePostMutation($input: PostInput!) {
mutation CreatePostMutation($input: CreatePostInput!) {
createPost(input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const QUERY = gql`
}
`
const UPDATE_POST_MUTATION = gql`
mutation Update${singularPascalName}Mutation($id: ${idType}!, $input: ${singularPascalName}Input!) {
mutation Update${singularPascalName}Mutation($id: ${idType}!, $input: Update${singularPascalName}Input!) {
update${singularPascalName}(id: $id, input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { navigate, routes } from '@redwoodjs/router'
import ${singularPascalName}Form from 'src/components/${singularPascalName}Form'

const CREATE_POST_MUTATION = gql`
mutation Create${singularPascalName}Mutation($input: ${singularPascalName}Input!) {
mutation Create${singularPascalName}Mutation($input: Create${singularPascalName}Input!) {
create${singularPascalName}(input: $input) {
id
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ export const schema = gql`
}
type Query {
userProfiles: [UserProfile]
userProfiles: [UserProfile!]!
}
input UserProfileInput {
input CreateUserProfileInput {
username: String!
userId: Int!
}
input UpdateUserProfileInput {
username: String
userId: Int
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,23 @@ export const schema = gql`
}
type Query {
userProfiles: [UserProfile]
userProfile(id: Int!): UserProfile
userProfiles: [UserProfile!]!
userProfile(id: Int!): UserProfile!
}
input UserProfileInput {
input CreateUserProfileInput {
username: String!
userId: Int!
}
input UpdateUserProfileInput {
username: String
userId: Int
}
type Mutation {
createUserProfile(input: UserProfileInput!): UserProfile
updateUserProfile(id: Int!, input: UserProfileInput!): UserProfile
deleteUserProfile(id: Int!): UserProfile
createUserProfile(input: CreateUserProfileInput!): UserProfile!
updateUserProfile(id: Int!, input: UpdateUserProfileInput!): UserProfile!
deleteUserProfile(id: Int!): UserProfile!
}
`
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,16 @@ export const schema = gql`
}
type Query {
users: [User]
users: [User!]!
}
input UserInput {
input CreateUserInput {
name: String
email: String!
isAdmin: Boolean!
}
input UpdateUserInput {
name: String
email: String
isAdmin: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,20 @@ export const schema = gql`
}
type Query {
posts: [Post]
post(id: Int!): Post
posts: [Post!]!
post(id: Int!): Post!
}
input PostInput {
input CreatePostInput {
title: String!
slug: String!
author: String!
body: String!
image: String
postedAt: DateTime
}
input UpdatePostInput {
title: String
slug: String
author: String
Expand All @@ -24,8 +33,8 @@ export const schema = gql`
}
type Mutation {
createPost(input: PostInput!): Post
updatePost(id: Int!, input: PostInput!): Post
deletePost(id: Int!): Post
createPost(input: CreatePostInput!): Post!
updatePost(id: Int!, input: UpdatePostInput!): Post!
deletePost(id: Int!): Post!
}
`
30 changes: 23 additions & 7 deletions packages/cli/src/commands/generate/sdl/sdl.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,25 @@ const querySDL = (model) => {
return model.fields.map((field) => modelFieldToSDL(field))
}

const inputSDL = (model, types = {}) => {
const inputSDL = (model, required, types = {}) => {
return model.fields
.filter((field) => {
return (
IGNORE_FIELDS_FOR_INPUT.indexOf(field.name) === -1 &&
field.kind !== 'object'
)
})
.map((field) => modelFieldToSDL(field, false, types))
.map((field) => modelFieldToSDL(field, required, types))
}

// creates the CreateInput type (all fields are required)
const createInputSDL = (model, types = {}) => {
return inputSDL(model, true, types)
}

// creates the UpdateInput type (not all fields are required)
const updateInputSDL = (model, types = {}) => {
return inputSDL(model, false, types)
}

const idType = (model) => {
Expand Down Expand Up @@ -64,7 +74,8 @@ const sdlFromSchemaModel = async (name) => {

return {
query: querySDL(model).join('\n '),
input: inputSDL(model, types).join('\n '),
createInput: createInputSDL(model, types).join('\n '),
updateInput: updateInputSDL(model, types).join('\n '),
idType: idType(model),
relations: relationsForModel(model),
}
Expand All @@ -76,17 +87,22 @@ const sdlFromSchemaModel = async (name) => {
}

export const files = async ({ name, crud }) => {
const { query, input, idType, relations } = await sdlFromSchemaModel(
pascalcase(pluralize.singular(name))
)
const {
query,
createInput,
updateInput,
idType,
relations,
} = await sdlFromSchemaModel(pascalcase(pluralize.singular(name)))

const template = generateTemplate(
path.join('sdl', 'templates', 'sdl.js.template'),
{
name,
crud,
query,
input,
createInput,
updateInput,
idType,
}
)
Expand Down
18 changes: 11 additions & 7 deletions packages/cli/src/commands/generate/sdl/templates/sdl.js.template
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ export const schema = gql`
}

type Query {
${pluralCamelName}: [${singularPascalName}]<% if (crud) { %>
${singularCamelName}(id: ${idType}!): ${singularPascalName}<% } %>
${pluralCamelName}: [${singularPascalName}!]!<% if (crud) { %>
${singularCamelName}(id: ${idType}!): ${singularPascalName}!<% } %>
}

input ${singularPascalName}Input {
${input}
input Create${singularPascalName}Input {
${createInput}
}

input Update${singularPascalName}Input {
${updateInput}
}<% if (crud) { %>

type Mutation {
create${singularPascalName}(input: ${singularPascalName}Input!): ${singularPascalName}
update${singularPascalName}(id: ${idType}!, input: ${singularPascalName}Input!): ${singularPascalName}
delete${singularPascalName}(id: ${idType}!): ${singularPascalName}
create${singularPascalName}(input: Create${singularPascalName}Input!): ${singularPascalName}!
update${singularPascalName}(id: ${idType}!, input: Update${singularPascalName}Input!): ${singularPascalName}!
delete${singularPascalName}(id: ${idType}!): ${singularPascalName}!
}<% } %>
`

0 comments on commit a3f5ec2

Please sign in to comment.