GraphQL

From Chorke Wiki
Jump to navigation Jump to search

Schema

type Project {
  name: String
  tagline: String
  contributors: [User]
}

Query

{
  project(name: "GraphQL") {
    tagline
  }
}

Results

{
  "project": {
    "tagline": "A query language for APIs"
  }
}

Scalar

About the types you can assign to fields or to the return values of operations. Graphql Java supports the following types:

String                  Boolean                  Int
Float                   ID                       Long
Short                   Byte                     Float
BigDecimal              BigInteger

Sencha Store

Ext/data/
 ├─ operation/
 │  ├─ Create     [POST  ]
 │  ├─ Destory    [DELETE]
 │  ├─ Operation
 │  ├─ Read       [GET   ]
 │  └─ Update     [PUT   ]
 │
 ├─ proxy/
 │  ├─ Ajax
 │  ├─ Proxy
 │  └─ Rest
 │
 ├─ reader/
 │  ├─ Array
 │  ├─ JSON
 │  ├─ Reader
 │  └─ XML
 │
 ├─ request/
 │  ├─ Ajax
 │  ├─ Base
 │  └─ Form
 │
 │
 ├─ writer/
 │  ├─ Array
 │  ├─ JSON
 │  └─ XML
 │
 │
 

Ext/grid/filters/
 ├─ filter
 └─ Filters
https://docs.sencha.com/extjs/6.2.0/classic/Ext.data.JsonStore.html
https://docs.sencha.com/extjs/6.2.0/classic/src/JsonStore.js.html
https://docs.sencha.com/extjs/6.2.0/classic/Ext.data.proxy.Rest.html
https://docs.sencha.com/extjs/6.2.0/classic/src/Rest.js.html
https://docs.sencha.com/extjs/6.2.0/classic/Ext.data.proxy.Ajax.html
https://docs.sencha.com/extjs/6.2.0/classic/src/Ajax.js-1.html
https://docs.sencha.com/extjs/6.2.0/classic/Ext.toolbar.Paging.html
https://docs.sencha.com/extjs/6.2.0/classic/src/Paging.js.html
https://docs.sencha.com/extjs/6.2.0/classic/Ext.grid.filters.Filters.html
https://docs.sencha.com/extjs/6.2.0/classic/src/Filters.js.html

Custom Scalar

@Component
public class DateScalarType extends GraphQLScalarType {
    public DateScalarType() {
        super("Date", "java.sql.Date", new Coercing<Date, String>() {

            @Override
            public String serialize(Object dataFetcherResult) throws CoercingSerializeException {
                if(dataFetcherResult != null && dataFetcherResult instanceof Date) {
                    Date sqlDate = (Date)dataFetcherResult;
                    java.util.Date date = new Date(sqlDate.getTime());
                    String isoDate = DateUtil.format(date, DateUtil.ISO_DATE);
                    return isoDate;
                }
                return null;
            }

            @Override
            public Date parseValue(Object input) throws CoercingParseValueException {
                if(input != null && input instanceof String) {
                    String isoDate = (String)input;
                    java.util.Date date = DateUtil.parse(isoDate, DateUtil.ISO_DATE);
                    Date sqlDate = (date != null) ? new Date(date.getTime()) : null;
                    return sqlDate;
                }
                return null;
            }

            @Override
            public Date parseLiteral(Object input) throws CoercingParseLiteralException {
                if(input != null && input instanceof StringValue) {
                    String isoDate = ((StringValue)input).getValue();
                    java.util.Date date = DateUtil.parse(isoDate, DateUtil.ISO_DATE);
                    Date sqlDate = (date != null) ? new Date(date.getTime()) : null;
                    return sqlDate;
                }
                return null;
            }
        });
    }
}

Handle Lazy Loads

import javax.servlet.Filter;
import org.springframework.context.annotation.Configuration
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;

@Configuration
public class SpringGraqphQLConfig {

    /**
     * Register the {@link OpenEntityManagerInViewFilter} so that the
     * GraphQL-Servlet can handle lazy loads during execution.
     *
     * @return
     */
    @Bean
     public Filter OpenFilter() {
        return new OpenEntityManagerInViewFilter();
    }
}

Convention

1. Query:
  i   => searchUsers: [User]
  ii  => searchUsersByOffset(page: Int, size: Int): [User]
  iii => searchUser(id: String): User
  iv  => searchUserCount: Long
  v   => searchUserPageCount(size: Int): Long

2. Mutation:
  i   => insertUser(in: UserIn!): User!
  ii  => updateUser(id: String!, in: UserIn!): User!
  iii => deleteUser(id: String!): Boolean!

References