Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
98646b7
First pass, code gen working
Jun 29, 2020
691cc5f
Resolver registry, enums
Jul 2, 2020
09f39d0
Testing query resolver
Jul 6, 2020
323bf71
Fix framework version constraint
Jul 6, 2020
914e036
We're reading dataobjects
Jul 10, 2020
a50fa56
We have CRUD
Jul 13, 2020
16eb6ca
Custom properties, nested types and more
Jul 20, 2020
814e0ab
Inheritance chains working
Jul 22, 2020
b64ce75
Massive namespacing refactor
Jul 22, 2020
7fd63a1
Add procedural API, lazy definitions
Jul 23, 2020
af6ed74
Procedural API improvements
Jul 23, 2020
936b1ef
Pagination is working
Jul 26, 2020
93f2be1
query filter type created
Jul 27, 2020
d41443e
Query filter
Jul 30, 2020
d0267dd
Inheritance chain is back as a plugin
Jul 30, 2020
a4173b1
Abstract QueryFilter so it's not just for dataobjects
Jul 30, 2020
51cb64e
Refactor to use inheritance for nested filter input
Aug 2, 2020
e851184
Benchmark testing, preparing for test launch
Aug 3, 2020
b4efabc
Interfaces, unions, all kinds of stuff for assets and version compat
Aug 7, 2020
6a182f4
Add querperf and schemaperf headers
Aug 7, 2020
3a7e0bd
Fix readone
Aug 7, 2020
abe9aae
Annotations, dead code removal
Aug 9, 2020
b83958f
Re-run same benchmarks
chillu Aug 13, 2020
f7ec08e
Schema persister dependancy
senorgeno Aug 5, 2020
552912d
Split types into separate files. Mega speed boost
Aug 17, 2020
35e9776
Incremental builds. 🚀
Aug 17, 2020
e7209cf
Proper output handling
Aug 18, 2020
7b76a39
Fix cache pollution
Aug 18, 2020
938efbc
Temporary die to check controller perf
Aug 18, 2020
5cda34f
Remove dev.yml
Aug 18, 2020
df55070
Replace middlewares
Aug 19, 2020
d5adb0a
Fix invalid code for unions, interfaces
Aug 20, 2020
135426a
Clean up old tests, simplify code gen storage
Aug 20, 2020
b1f50c6
md5 signatures
Aug 20, 2020
3669acf
Fix incomplete field signature on types
Aug 20, 2020
e6af49f
New simplified constructor for Controller
Aug 21, 2020
5b12640
Define schema docs
Aug 24, 2020
ed3d0bb
Docs updates
Aug 24, 2020
6c760fb
Doc doc doc docking
Aug 24, 2020
65d67e9
Doc reorganising for doc site
Aug 25, 2020
dc46267
Docky docky docky
Aug 25, 2020
e6d8b31
Start on upgrade docs
Aug 25, 2020
2c7a6db
Upgrading docs done
Aug 25, 2020
c33d329
Plugin docs
Aug 26, 2020
331fa7c
DOCS: Add new graphql 4 docs
Aug 26, 2020
04d3434
Revisions per max
Aug 27, 2020
bda5070
Update src/Schema/Interfaces/ResolverProvider.php
Aug 27, 2020
6c74dad
Fix pass by reference error
Aug 30, 2020
e7cb1ea
Update docs/en/01_getting_started/04_working_with_dataobjects/07_nest…
Sep 2, 2020
e301dbf
Update src/Schema/Schema.php
Sep 2, 2020
f6931bb
Update src/Schema/Schema.php
Sep 2, 2020
6e673fe
Update src/Controller.php
Sep 2, 2020
fe6d5ff
Update src/Controller.php
Sep 2, 2020
470217e
Update src/Middleware/CSRFMiddleware.php
Sep 2, 2020
278a51c
Update src/QueryHandler/QueryHandler.php
Sep 2, 2020
c6ecb9d
Update src/QueryHandler/QueryHandler.php
Sep 2, 2020
221361f
Update src/QueryHandler/QueryHandler.php
Sep 2, 2020
2f5d8cb
Update src/QueryHandler/QueryHandler.php
Sep 2, 2020
0f9eb8c
Update src/Schema/DataObject/FieldAccessor.php
Sep 2, 2020
6841480
Update src/Schema/DataObject/CreateCreator.php
Sep 2, 2020
cae3cbe
Remove docs
Sep 2, 2020
9e51197
Move query filter to DataObject
Sep 3, 2020
6e2ae09
Remove custom logger
Sep 3, 2020
942d866
Update src/Schema/DataObject/Plugin/Paginator.php
Sep 3, 2020
0caa7d1
Update src/Schema/DataObject/Plugin/QuerySort.php
Sep 3, 2020
7882d67
Update src/Schema/DataObject/Resolver.php
Sep 3, 2020
e4c01cd
Update src/Schema/Interfaces/OperationCreator.php
Sep 3, 2020
f01b298
Code storage optimisations, simplify encodedType API, add ModelFieldP…
Sep 5, 2020
5a2a0b6
Fix pagination resolver
Sep 7, 2020
78006a5
Monolithic canView plugin
Sep 8, 2020
c07f819
Make fieldResolver authoratative, fix __extend
Sep 9, 2020
0e26886
Heaps of hackday fixes
Sep 11, 2020
8118324
Flushless yaml
Sep 13, 2020
7b85edd
Flushless tidy up
Sep 14, 2020
b2a258b
Allow global flushless schema
Sep 15, 2020
f0fd9b9
Uppercase typenames
Sep 15, 2020
c9ae855
Remove ViewableData, use standard PHP templating, improve builds 50%
Sep 15, 2020
c3136fb
Update src/Schema/Schema.php
Sep 16, 2020
c1642c2
Update src/Schema/DataObject/Plugin/QueryFilter/Filters/InFilter.php
Sep 16, 2020
1f3e1c0
Nested queries pluggable
Sep 16, 2020
5caa4e7
Nested query tidy up, template tidy up
Sep 16, 2020
dcca6f3
Remove useless class
Sep 16, 2020
c4951e1
Revert readOne change
Sep 17, 2020
acbd2ab
Add hasPlugin, new done() function for resolver chain interruption
Sep 17, 2020
36095e0
ReadOne now works just like read, only with firstResult plugin applied
Sep 17, 2020
cedacb7
Experimental query caching
Sep 18, 2020
b99606d
Heaps of fixes for elemental compat
Sep 21, 2020
80cf697
BUGFIX: Default plugins should not override custom
Sep 21, 2020
c163c97
Remove nested operations
Sep 21, 2020
2350996
NEW: dev/graphql admin
Sep 21, 2020
b2f5830
Configure operation names
Sep 23, 2020
62f0492
NEW schema defaults
Sep 24, 2020
ce62cd3
Inherited plugins
Sep 25, 2020
b42e3f9
NEW atomic schema build
Sep 26, 2020
78d11e8
NEW exclude, customise ALL
Sep 26, 2020
deb36aa
Include whitelist of fields for input tyep
Sep 26, 2020
6a97f7b
NEW: Major revisions to __extends
Sep 27, 2020
3844ab4
Change global config precedence
Sep 28, 2020
d6fdb42
Fix precedence of flushable config
Sep 29, 2020
d2f3bf5
More revisions to _extends union to show only explicitly exposed nati…
Sep 29, 2020
ab43420
Per-model configuation, restore nested_query_plugins
Oct 2, 2020
232a85e
Ensure types inherit parent fields
Oct 2, 2020
8a2d2f0
New dev/build extension
Oct 2, 2020
d76a697
Plugin validation improvements
Oct 5, 2020
60a1060
Fix cache pollution in multi schema builds
Oct 5, 2020
11642b0
Heaps of fixes for elemental compat
Oct 7, 2020
a1865ce
More revisions to type-mapping persistence
Oct 7, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,606 changes: 2 additions & 2,604 deletions README.md

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions _config/assets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@ Name: graphqlassets
Only:
moduleexists: 'silverstripe/assets'
---
## Assign the type to DBFile as a dependency
SilverStripe\GraphQL\Schema\Schema:
schemas:
'*':
types:
DBFile:
fields:
filename: String
hash: String
variant: String
url: String

SilverStripe\Assets\Storage\DBFile:
graphql_type:
Filename: String
Hash: String
Variant: String
URL: String
Width: Int
Height: Int
graphql_type: DBFile

## Register the types to the manager
SilverStripe\GraphQL\Scaffolding\Scaffolders\SchemaScaffolder:
fixed_types:
- SilverStripe\Assets\Storage\DBFile
SilverStripe\Assets\File:
allowed_extensions:
- graphql
Expand Down
69 changes: 17 additions & 52 deletions _config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,74 +3,39 @@ Name: graphqlconfig
---
# Define the type parsers
SilverStripe\Core\Injector\Injector:
SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface.string:
class: SilverStripe\GraphQL\Scaffolding\Util\StringTypeParser
SilverStripe\GraphQL\Scaffolding\Interfaces\TypeParserInterface.array:
class: SilverStripe\GraphQL\Scaffolding\Util\ArrayTypeParser

SilverStripe\GraphQL\QueryHandler\QueryHandlerInterface:
class: SilverStripe\GraphQL\QueryHandler\QueryHandler

SilverStripe\GraphQL\Middleware\QueryMiddleware.csrf:
class: SilverStripe\GraphQL\Middleware\CSRFMiddleware

SilverStripe\GraphQL\Middleware\QueryMiddleware.httpMethod:
class: SilverStripe\GraphQL\Middleware\HTTPMethodMiddleware

SilverStripe\GraphQL\PersistedQuery\PersistedQueryMappingProvider:
class: SilverStripe\GraphQL\PersistedQuery\JSONStringProvider

SilverStripe\GraphQL\PersistedQuery\HTTPProvider:
constructor:
httpClient: '%$SilverStripe\GraphQL\PersistedQuery\GuzzleHTTPClient'
SilverStripe\GraphQL\Permission\QueryPermissionChecker.default:
class: SilverStripe\GraphQL\Permission\CanViewPermissionChecker
SilverStripe\GraphQL\Scaffolding\Scaffolders\ItemQueryScaffolder:
properties:
permissionChecker: '%$SilverStripe\GraphQL\Permission\QueryPermissionChecker.default'
SilverStripe\GraphQL\Scaffolding\Scaffolders\ListQueryScaffolder:
properties:
permissionChecker: '%$SilverStripe\GraphQL\Permission\QueryPermissionChecker.default'
SilverStripe\GraphQL\Pagination\Connection:
properties:
permissionChecker: '%$SilverStripe\GraphQL\Permission\QueryPermissionChecker.default'

# Set up a default endpoint that can be activated with a Director rule
SilverStripe\GraphQL\Manager.default:
class: SilverStripe\GraphQL\Manager
constructor:
schemaKey: default
properties:
Middlewares:
CSRFMiddleware: '%$SilverStripe\GraphQL\Middleware\QueryMiddleware.csrf'
HTTPMethodMiddleware: '%$SilverStripe\GraphQL\Middleware\QueryMiddleware.httpMethod'
SilverStripe\GraphQL\Controller.default:
class: SilverStripe\GraphQL\Controller
constructor:
manager: '%$SilverStripe\GraphQL\Manager.default'
SilverStripe\GraphQL\Schema\Interfaces\SchemaStorageCreator:
class: 'SilverStripe\GraphQL\Schema\Storage\CodeGenerationStoreCreator'

# Assign each DBField subclass with an associated internal type
SilverStripe\ORM\FieldType\DBField:
extensions:
- SilverStripe\GraphQL\Scaffolding\Extensions\TypeCreatorExtension
graphql_type: String
SilverStripe\ORM\FieldType\DBInt:
graphql_type: Int
SilverStripe\ORM\FieldType\DBBoolean:
graphql_type: Boolean
SilverStripe\ORM\FieldType\DBFloat:
graphql_type: Float
SilverStripe\ORM\FieldType\DBPrimaryKey:
graphql_type: ID
SilverStripe\ORM\FieldType\DBForeignKey:
graphql_type: ID
Psr\SimpleCache\CacheInterface.FileSchemaStore:
factory: SilverStripe\Core\Cache\CacheFactory
constructor:
namespace: "GraphQLSchema"

# Register the CRUD
SilverStripe\GraphQL\Scaffolding\Scaffolders\OperationScaffolder:
operations:
create: SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Create
read: SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Read
readOne: SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\ReadOne
update: SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Update
delete: SilverStripe\GraphQL\Scaffolding\Scaffolders\CRUD\Delete
SilverStripe\GraphQL\Schema\Storage\CodeGenerationStore:
properties:
rootDir: '`BASE_PATH`'

SilverStripe\GraphQL\Controller:
extensions:
- SilverStripe\GraphQL\Extensions\IntrospectionProvider
SilverStripe\GraphQL\Manager:
SilverStripe\GraphQL\Schema\Schema:
schemas: []
---
Only:
Expand Down
18 changes: 18 additions & 0 deletions _config/dataobject.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
Name: silverstripe-graphql-dataobject
---
SilverStripe\GraphQL\Schema\DataObject\DataObjectModel:
operations:
read: 'SilverStripe\GraphQL\Schema\DataObject\ReadCreator'
readOne: 'SilverStripe\GraphQL\Schema\DataObject\ReadOneCreator'
delete: 'SilverStripe\GraphQL\Schema\DataObject\DeleteCreator'
update: 'SilverStripe\GraphQL\Schema\DataObject\UpdateCreator'
create: 'SilverStripe\GraphQL\Schema\DataObject\CreateCreator'
SilverStripe\ORM\DataObject:
graphql_blacklisted_fields:
ClassName: true
LinkTracking: true
FileTracking: true
extensions:
- SilverStripe\GraphQL\Extensions\DevBuildExtension

18 changes: 18 additions & 0 deletions _config/dbtypes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
Name: graphql-dbtypes
---
# Assign each DBField subclass with an associated internal type
SilverStripe\ORM\FieldType\DBField:
graphql_type: String
SilverStripe\ORM\FieldType\DBInt:
graphql_type: Int
SilverStripe\ORM\FieldType\DBBoolean:
graphql_type: Boolean
SilverStripe\ORM\FieldType\DBFloat:
graphql_type: Float
SilverStripe\ORM\FieldType\DBDecimal:
graphql_type: Float
SilverStripe\ORM\FieldType\DBPrimaryKey:
graphql_type: ID
SilverStripe\ORM\FieldType\DBForeignKey:
graphql_type: ID
12 changes: 12 additions & 0 deletions _config/default-schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
Name: 'graphql-default-schema'
---
SilverStripe\Core\Injector\Injector:
# Set up a default endpoint that can be activated with a Director rule
SilverStripe\GraphQL\Controller.default:
class: SilverStripe\GraphQL\Controller
constructor:
schema: default
# use a custom handler so it's easy to override/add middlewares in the default schema
handler: '%$SilverStripe\GraphQL\QueryHandler\QueryHandlerInterface.default'

19 changes: 11 additions & 8 deletions _config/dev.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
---
Name: graphqltest
Before:
- '#sapphiretest'
Name: graphql-dev
---
SilverStripe\Core\Injector\Injector:
SilverStripe\Dev\State\SapphireTestState:
properties:
States:
disabletypecaching: '%$SilverStripe\GraphQL\Dev\State\DisableTypeCacheState'
SilverStripe\Dev\DevelopmentAdmin:
registered_controllers:
graphql:
controller: SilverStripe\GraphQL\Dev\DevelopmentAdmin
links:
build: 'Build/rebuild the GraphQL schema'
SilverStripe\GraphQL\Dev\DevelopmentAdmin:
registered_controllers:
build:
controller: SilverStripe\GraphQL\Dev\Build
39 changes: 13 additions & 26 deletions _config/filters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,17 @@
Name: graphql-filters
---
SilverStripe\Core\Injector\Injector:
SilverStripe\GraphQL\QueryFilter\FilterRegistryInterface:
class: SilverStripe\GraphQL\QueryFilter\FieldFilterRegistry
SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\FilterRegistryInterface:
class: SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\FieldFilterRegistry
constructor:
contains: '%$SilverStripe\GraphQL\QueryFilter\Filters\ContainsFilter'
eq: '%$SilverStripe\GraphQL\QueryFilter\Filters\EqualToFilter'
gt: '%$SilverStripe\GraphQL\QueryFilter\Filters\GreaterThanFilter'
lt: '%$SilverStripe\GraphQL\QueryFilter\Filters\LessThanFilter'
gte: '%$SilverStripe\GraphQL\QueryFilter\Filters\GreaterThanOrEqualFilter'
lte: '%$SilverStripe\GraphQL\QueryFilter\Filters\LessThanOrEqualFilter'
in: '%$SilverStripe\GraphQL\QueryFilter\Filters\InFilter'
endswith: '%$SilverStripe\GraphQL\QueryFilter\Filters\EndsWithFilter'
startswith: '%$SilverStripe\GraphQL\QueryFilter\Filters\StartsWithFilter'
SilverStripe\GraphQL\QueryFilter\DataObjectQueryFilter:
properties:
filterRegistry: '%$SilverStripe\GraphQL\QueryFilter\FilterRegistryInterface'
SilverStripe\ORM\FieldType\DBField:
graphql_default_filters: [ eq, in ]
SilverStripe\ORM\FieldType\DBInt:
graphql_default_filters: [ gt, lt, gte, lte ]
SilverStripe\ORM\FieldType\DBDate:
graphql_default_filters: [ gt, lt, gte, lte ]
SilverStripe\ORM\FieldType\DBTime:
graphql_default_filters: [ gt, lt, gte, lte ]
SilverStripe\ORM\FieldType\DBFloat:
graphql_default_filters: [ gt, lt, gte, lte ]
SilverStripe\ORM\FieldType\DBString:
graphql_default_filters: [ contains ]
contains: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\ContainsFilter'
eq: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\EqualToFilter'
ne: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\EqualToFilter'
gt: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\GreaterThanFilter'
lt: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\LessThanFilter'
gte: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\GreaterThanOrEqualFilter'
lte: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\LessThanOrEqualFilter'
in: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\InFilter'
endswith: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\EndsWithFilter'
startswith: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\Filters\StartsWithFilter'

30 changes: 30 additions & 0 deletions _config/middlewares.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
Name: 'graphql-middlewares'
---
SilverStripe\Core\Injector\Injector:
# default implementation
SilverStripe\GraphQL\QueryHandler\QueryHandlerInterface:
class: SilverStripe\GraphQL\QueryHandler\QueryHandler
properties:
Middlewares:
csrf: '%$SilverStripe\GraphQL\Middleware\CSRFMiddleware'
httpMethod: '%$SilverStripe\GraphQL\Middleware\HTTPMethodMiddleware'

# duplicate implementation do that the default schema has its own instance to
# configure without affecting other schemas
SilverStripe\GraphQL\QueryHandler\QueryHandlerInterface.default:
class: SilverStripe\GraphQL\QueryHandler\QueryHandler
properties:
Middlewares:
csrf: '%$SilverStripe\GraphQL\Middleware\CSRFMiddleware'
httpMethod: '%$SilverStripe\GraphQL\Middleware\HTTPMethodMiddleware'

Psr\SimpleCache\CacheInterface.graphql:
factory: SilverStripe\Core\Cache\CacheFactory
constructor:
namespace: "graphql"
defaultLifetime: 600

SilverStripe\GraphQL\Middleware\QueryCachingMiddleware:
properties:
Cache: '%$Psr\SimpleCache\CacheInterface.graphql'
16 changes: 16 additions & 0 deletions _config/model.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
Name: silverstripe-graphql-model
---
SilverStripe\Core\Injector\Injector:
SilverStripe\GraphQL\Schema\Registry\SchemaModelCreatorRegistry:
constructor:
dataobject: '%$SilverStripe\GraphQL\Schema\DataObject\ModelCreator'
SilverStripe\GraphQL\Schema\Schema:
schemas:
'*':
modelConfig:
DataObject:
type_formatter: [ 'SilverStripe\Core\ClassInfo', 'shortName' ]
type_prefix: ''
type_mapping: []
nested_query_plugins: []
14 changes: 14 additions & 0 deletions _config/plugins.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
Name: graphql-plugins
---
SilverStripe\Core\Injector\Injector:
SilverStripe\GraphQL\Schema\Registry\PluginRegistry:
constructor:
paginator: '%$SilverStripe\GraphQL\Schema\Plugin\PaginationPlugin'
dataobjectPaginator: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\Paginator'
dataobjectQueryFilter: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QueryFilter\QueryFilter'
dataobjectQuerySort: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\QuerySort'
dataobjectInheritance: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\Inheritance'
canViewPermission: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\CanViewPermission'
firstResult: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\FirstResult'
inheritedPlugins: '%$SilverStripe\GraphQL\Schema\DataObject\Plugin\InheritedPlugins'
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
"type": "silverstripe-vendormodule",
"license": "BSD-3-Clause",
"require": {
"silverstripe/framework": "^5",
"silverstripe/framework": "^4",
"silverstripe/vendor-plugin": "^1.0",
"webonyx/graphql-php": "~0.12.6"
"webonyx/graphql-php": "^14.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7",
Expand Down
7 changes: 3 additions & 4 deletions examples/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
This folder contains a "pseudo-module" for SilverStripe
with some runnable code examples. In order to try them out yourself,
move the `examples` folder to the top level of your SilverStripe
project and remove the `_manifest_exclude` file.
## COMING SOON ##

The v4 release of this module does not yet have any example code.
59 changes: 0 additions & 59 deletions examples/_config/config.yml

This file was deleted.

Loading