as-services/docs/conventions/graphql.md
devthejo d5febb45c8
Some checks failed
/ build (map[dockerfile:./services/tasks/Dockerfile name:tasks]) (push) Failing after 1m25s
/ deploy (push) Has been skipped
/ build (map[dockerfile:./services/files/Dockerfile name:files]) (push) Failing after 1m34s
/ build (map[dockerfile:./services/app/Dockerfile name:app]) (push) Successful in 2m9s
/ build (map[dockerfile:./services/api/Dockerfile name:api]) (push) Failing after 1m42s
/ build (map[dockerfile:./services/web/Dockerfile name:web]) (push) Failing after 1m18s
/ build (map[dockerfile:./services/watchers/Dockerfile name:watchers]) (push) Failing after 1m22s
/ build (map[dockerfile:./services/hasura/Dockerfile name:hasura]) (push) Successful in 2m3s
chore(init): available sources
2025-04-13 10:34:01 +02:00

2.7 KiB

Graphql Conventions:

Global rules:

All names are camelCase

Hasura tables:

spec:

  • match SQL methods

Root FieldsCustom:

  • Select -> selectMany${Table}
  • Select by PK -> selectOne${Table}
  • Select Aggregate -> selectAgg${Table}
  • Select Stream -> selectStream${Table}
  • Insert/Upsert -> insertMany${Table}
  • Insert/Upsert One -> insertOne${Table}
  • Update -> updateMany${Table}
  • Update Many -> updateBatch${Table}
  • Update One -> updateOne${Table}
  • Delete -> deleteMany${Table}
  • Delete One -> deleteOne${Table}

Relations naming:

  • one -> one${Table}
  • many -> many${Table}
  • one named link -> one${Table}As${LinkName}
  • many named link -> many${Table}As${LinkName}
  • one by foreign key -> one${Table}By${ForeignKey}
  • many by foreign key -> many${Table}By${ForeignKey}

Enum tables naming:

  • enum_${Type=ColumnName}
  • enum_${Table}_${Type=ColumnName} columns:
  • value (primary)
  • label (optional)

Columns:

GraphQL field name: camelCase(${column})

Computed Columns:

  • PostgreSQL function name: computed_${table_name}__${column_name}

API Remote Schema:

spec:

  • avoid collisions with hasura
  • match HTTP methods
  • match REST paths

Root Fields:

  • ${DataName}.post.js -> POST /${DataName} -> addOne${DataName}
  • ${DataName}/{id}.get.js -> GET /${DataName}/{id} -> getOne${DataName}
  • ${DataName}/{id}.sub.js -> GET /${DataName}/{id} -> ${DataName}
  • ${DataName}/{id}.put.js -> PUT /${DataName}/{id} -> setOne${DataName}
  • ${DataName}/{id}.delete.js -> DELETE /${DataName}/{id} -> delOne${DataName}
  • ${DataName}/index.post.js -> POST /${DataName}/ -> addMany${DataName}
  • ${DataName}/index.get.js -> GET /${DataName}/ -> getMany${DataName}
  • ${DataName}/index.sub.js -> GET /${DataName}/ -> subMany${DataName}
  • ${DataName}/index.put.js -> PUT /${DataName}/ -> setMany${DataName}
  • ${DataName}/index.delete.js -> DELETE /${DataName}/ -> delMany${DataName}
  • ${ActionName}.patch.js -> PATCH /${ActionName} -> do${ActionName}

Async Api:

  • ${DataName}.chan/index.sub.js -> WS /${ChannelName} -> subMany${ChannelName}
  • ${DataName}.chan/index.pub.js -> WS /${ChannelName} -> pubMany${ChannelName}
  • ${DataName}.chan/{id}.sub.js -> WS /${ChannelName} -> subOne${ChannelName}
  • ${DataName}.chan/{id}.pub.js -> WS /${ChannelName} -> pubOne${ChannelName}
  • ${ChannelName}.chan/${OperationName}.sub.js -> WS /${ChannelName} -> ${OperationName}${ChannelName}
  • ${ChannelName}.chan/${OperationName}.pub.js -> WS /${ChannelName} -> ${OperationName}${ChannelName}