GraphQL JSON:API Hypermedia Architecture Analysis - sgml/signature GitHub Wiki
+---------------------+
| Incoming API |
| Request |
+----------+----------+
|
v
+----------+----------+
| IP Access Control |
| (Whitelist/Blacklist)|
+----------+----------+
|
+----------------------+----------------------+
| |
+-----v-----+ +-----v-----+
| Whitelist | | Blacklist |
+-----+-----+ +-----+-----+
| |
+-------v-------+ +---------v---------+
| Email Approval | | ML-Based Detection|
| Workflow | | (Anomaly Model) |
+---------------+ +-------------------+
|
v
+----------+----------+
| Access Decision |
| (Allow or Block API)|
+----------+----------+
|
v
+---------------------+
| API Gateway / |
| Application Logic |
+---------------------+
- https://www.oreilly.com/library/view/learning-graphql/9781492030706/ch04.html
- https://developer.github.com/v4/guides/intro-to-graphql/
- http://spec.graphql.org/June2018/#sec-Introspection
- https://docs.aws.amazon.com/appsync/latest/devguide/scalars.html
- https://arxiv.org/pdf/1907.13012.pdf
- https://blog.acolyer.org/2018/05/21/semantics-and-complexity-of-graphql/
- http://graphql.github.io/learn/validation/
- https://medium.com/paypal-engineering/graphql-resolvers-best-practices-cd36fdbcef55
- https://gist.github.com/sam-kiptoo/ab28a5e51c3132a8bbff4d921e76c6e2
- https://dmyz.org/en/archives/1172
- https://docs.graphene-python.org/projects/sqlalchemy/en/latest/tutorial/
- https://blog.logrocket.com/code-first-vs-schema-first-development-graphql/
- https://teckexperts.com/building-api-with-python-flask-graphql-sqlalchemy-postgresql-460.html
- https://medium.com/@fasterpancakes/graphql-server-up-and-running-with-50-lines-of-python-85e8ada9f637
- https://itnext.io/python-graphql-tips-tricks-and-performance-improvements-beede1f4adb6
- https://blog.graphqleditor.com/GraphQL-Performance-issues-and-how-to-handle-them/
- https://www.freecodecamp.org/news/five-common-problems-in-graphql-apps-and-how-to-fix-them-ac74d37a293c/
- https://www.apollographql.com/Apollo-graphql-at-enterprise-scale-final.pdf
- https://owasp.org/www-chapter-vancouver/assets/presentations/2020-06_GraphQL_Security.pdf
- https://www.howtographql.com/advanced/4-security/
- https://about.sourcegraph.com/graphql/graphql-under-the-hood
- https://hasura.io/blog/using-custom-sql-functions-for-queries-with-postgres-and-graphql-ddca6caf6681/
- https://www.apollographql.com/docs/apollo-server/federation/core-concepts/
- https://www.keystonejs.com/guides/mutation-lifecycle
- https://medium.com/naresh-bhatia/graphql-concepts-i-wish-someone-explained-to-me-a-year-ago-514d5b3c0eab
- https://www.howtographql.com/advanced/2-more-graphql-concepts/
- https://blog.apollographql.com/the-concepts-of-graphql-bc68bd819be3
- https://html.developreference.com/article/10312827/GraphQL%3A+One+Big+Query+vs+Lots+of+Little+Queries
- https://graphql.org/learn/schema/
- https://graphql.org/learn/best-practices/
- https://atheros.ai/blog/graphql-best-practices-for-graphql-schema-design
- https://techblog.commercetools.com/modeling-graphql-mutations-52d4369f73b1
- http://graphdatamodeling.com/Graph%20Data%20Modeling/GraphQL/GraphQL.html
- https://medium.com/ottofellercom/two-important-things-about-graphql-schema-design-c729f474e749
- https://medium.com/atheros/graphql-best-practices-for-graphql-schema-design-91fcab4dec0a
- https://blog.apollographql.com/graphql-schema-design-building-evolvable-schemas-1501f3c59ed5
- https://blog.apollographql.com/graphql-schema-design-building-evolvable-schemas-1501f3c59ed5
- https://www.forbes.com/sites/cognitiveworld/2019/10/28/graphql-and-the-rise-of-universal-data-access/
- https://www.npmjs.com/package/graphql-to-sparql
- https://www.topquadrant.com/graphql/graphql-queries.html
- https://graphql.org/blog/rest-api-graphql-wrapper/
- https://graphql.org/graphql-js/utilities/
- http://spec.graphql.org/June2018/
- https://www.linkedin.com/pulse/yet-another-query-language-really-athanassios-hatzis-phd
- https://edgecoders.com/you-dont-need-a-fancy-framework-to-use-graphql-with-react-b47b436626fb
- https://apisyouwonthate.com/blog/representing-state-in-rest-and-graphql
- https://arxiv.org/pdf/1903.04181.pdf
- https://s3.amazonaws.com/artifacts.opencypher.org/website/materials/sql-pg-2018-0046r3-GQL-Scope-and-Features.pdf
- https://blog.apollographql.com/graphql-schema-design-building-evolvable-schemas-1501f3c59ed5
- https://www.apollographql.com/docs/apollo-server/schema/schema/
- https://engineering.shopify.com/blogs/engineering/solving-the-n-1-problem-for-graphql-through-batching
- https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3
- https://stackoverflow.com/questions/53863934/is-graphql-schema-circular-reference-an-anti-pattern
- https://github.com/graphql/graphql-spec/issues/91
- https://github.com/graphql/graphql-js/issues/373
- https://www.freecodecamp.org/news/five-common-problems-in-graphql-apps-and-how-to-fix-them-ac74d37a293c/
- https://apihandyman.io/and-graphql-for-all-a-few-things-to-think-about-before-blindly-dumping-rest-for-graphql/
- https://arxiv.org/pdf/1907.13012.pdf
- https://airtechzone.iata.org/docs/Data%20Formats%20-%20Paradigms%20-%20GraphQL.pdf
- https://blog.apimatic.io/moving-to-graphql-from-soap-or-rest-2383f7dc6523
- https://blog.softwaremill.com/how-to-communicate-your-microservices-6542cb4f98c7
Declare args
$args
Declaare matching JSON
{"args": {
"name": "jim rome,
"createdBy": "radio",
"data": "{\"msg\": \"hi\", \"group_name\": \"bye\", \"group_description\": \"guy\", \"group_cadence\": \"why\"}"
}
}
https://github.com/graphql/graphiql/issues/670
https://lucasconstantino.github.io/graphiql-online/
https://blog.logrocket.com/graphql-variables-in-simple-terms/
https://github.com/graphql/graphiql/issues/72
from requests_ratelimiter import LimiterSession
import time
# Create a session with a rate limit of 5 requests per second
session = LimiterSession(per_second=5)
def send_requests():
for i in range(20):
response = session.get('https://httpbin.org/get')
print(f'Request {i+1}: {response.status_code}')
time.sleep(1) # Optional: Add additional sleep if needed
send_requests()
- https://github.com/postmanlabs/postman-docs/issues
- https://learning.postman.com/docs/getting-started/installation/installation-and-updates/#installing-postman-on-linux
- https://github.com/postmanlabs/postman-app-support/
- https://jss.sitecore.com/docs/fundamentals/architecture
- http://xahlee.info/w/steve_yegge_google_platforms_rant.html
- https://mherman.org/blog/designing-a-restful-api-with-node-and-postgres/
- https://scotch.io/tutorials/super-simple-graphql-with-node
- https://swagger.io/docs/specification/using-ref/
- https://www.smashingmagazine.com/2018/01/graphql-primer-new-api-part-1/
- https://swagger.io/docs/specification/using-ref/
- https://articles.microservices.com/an-alternative-way-of-visualizing-microservice-architecture-837cbee575c1
- https://blogs.mulesoft.com/dev/api-dev/common-api-mistakes/
- https://laravel-news.com/json-api-introduction
- https://nordicapis.com/the-benefits-of-using-json-api/
- https://jsonapi.org/format/#document-meta
- http://www.opensearchserver.com/documentation/api_v1/README.md
- https://developer.avid.com/ctms/hal_intro.html
| Step Group | Step Description | Location (Old Repo / New Repo) | Notes |
|---|---|---|---|
| Repo Setup | Freeze GraphQL schema and tag baseline | Old Repo | Prevents schema drift during migration |
| Repo Setup | Initialize new Flask REST repo | New Repo | Clean project, no shared code |
| Repo Setup | Add constructor-only Injector subclass | New Repo | Disallow method/property/service-locator injection |
| Repo Setup | Add folder structure (services, blueprints, tests) | New Repo | Keeps REST code isolated |
| Inventory | List all GraphQL queries → map to GET | Old Repo | Drives REST endpoint creation |
| Inventory | List all GraphQL mutations → map to POST/PATCH | Old Repo | Ensures full coverage |
| Inventory | Identify nested GraphQL fields to flatten | Old Repo | REST is resource-first |
| Inventory | Identify resolvers with multi-model logic | Old Repo | These require decomposition |
| REST Design | Define REST resources from scratch | New Repo | No existing REST resources |
| REST Design | Define GET/POST/PATCH endpoints per resource | New Repo | Only allowed HTTP verbs |
| REST Design | Define URL structure (/api/v1/) | New Repo | Stable REST contract |
| REST Design | Define request/response JSON shapes | New Repo | No error envelopes needed |
| Service Layer | Extract resolver logic into service classes | New Repo | Shared-nothing architecture |
| Service Layer | Ensure services use constructor injection only | New Repo | Enforced by custom Injector |
| Service Layer | Remove all GraphQL context usage | New Repo | Services must be pure |
| Blueprints | Create one blueprint per domain | New Repo | Constructor-injected services |
| Blueprints | Implement GET/POST/PATCH routes | New Repo | No auth, no error handling |
| Blueprints | Use request.json for input parsing | New Repo | Minimalist request handling |
| Blueprints | Return plain JSON responses | New Repo | No exception handling |
| Postman | Add Postman collection generator | New Repo | Auto-scans Flask URL map |
| Postman | Expose /postman.json or generate in CI | New Repo | Supports client migration |
| Proxy Layer | Implement REST proxy class (GET/POST/PATCH) | Old Repo | Forwards GraphQL ops to REST |
| Proxy Layer | Add feature flags per operation | Old Repo | Enables reversible migration |
| Proxy Layer | Wrap resolvers with toggle logic | Old Repo | Switch old/new behavior safely |
| Proxy Layer | Forward GraphQL queries to REST GET | Old Repo | Reversible cutover |
| Proxy Layer | Forward GraphQL mutations to REST POST/PATCH | Old Repo | Reversible cutover |
| Staged Migration | Implement REST endpoint for one operation | New Repo | Incremental rollout |
| Staged Migration | Add pytest tests for the new endpoint | New Repo | DI override for test doubles |
| Staged Migration | Add endpoint to Postman collection | New Repo | Keeps documentation aligned |
| Staged Migration | Flip feature flag for that operation | Old Repo | GraphQL now proxies to REST |
| Staged Migration | Monitor behavior and roll back if needed | Old Repo | Reversible at any time |
| Staged Migration | Remove old resolver logic after stability | Old Repo | Only when safe |
| Final Removal | Remove all GraphQL resolvers | Old Repo | After all ops migrated |
| Final Removal | Remove GraphQL schema and middleware | Old Repo | GraphQL fully retired |
| Final Removal | Remove GraphiQL/Playground | Old Repo | No longer needed |
| Final Removal | Remove GraphQL libraries | Old Repo | Clean dependency tree |
| Final Removal | Freeze or archive old repo | Old Repo | REST becomes canonical API |
| Final Cleanup | Remove proxy layer and feature flags | Old Repo | No more dual operation |
| Final Cleanup | Regenerate final Postman collection | New Repo | REST-only documentation |
| Final Cleanup | Tag final migration release in both repos | Both | Marks completion |