Documentation May 3, 2020

Abstract Schema Graph

The MetaMate community progressively models the abstract schema graph around real-world data. Following, a high-level perspective on how the asg emerges, and how it propagates through the stack.

graph TD entities[entities] --> expansion[expansion] actions[actions] --> expansion[expansion] expansion[expansion] --> asg[asg] asg[asg] --> |powers| metactl[metactl] metactl[metactl aaaa] --> |generates| clientsdks[client sdks] metactl[metactl aaaa] --> |generates| servicesdks[service sdks] clientsdks[client sdks] --> |power| services[services] clientsdks[client sdks] --> |power| clients[clients] servicesdks[service sdks] --> |power| services[services] asg[asg] --> |powers| metamate[MetaMate aaa] clients[clients] --> |read/write| metamate[MetaMate aaa] services[services] --> |read/write| metamate[MetaMate aaa] metamate[MetaMate aaa] --> |reads/writes| services[services] class metactl metactl-icon; class metamate metamate-icon;

Entities

This stage defines core and domain-specific entity types, how they relate to one another and which ones are going to be exposed by endpoints. Core entity types are ClientAccount, ServiceAccount, and Service, to name a few. Domain-specific entities are HackerNewsActivity, Post, or PostFeed, for example. Currently, these entities are defined as code but are going to be served by MetaMates soon (see Roadmap).

Actions

The action stage defines endpoints that are hard to model in a CRUD fashion. Examples of this are the LookupService, AuthenticateClientAccount or VerifyToken endpoints.

Expansion

graph TD entities[entities] --> expansion[expansion] actions[actions] --> expansion[expansion] expansion[expansion] --> asg[asg]

This stage processes the previously defined entity types, adds further fields to types, generates relation and relationship types, and composes generic types like SocialAccountFilter, SocialAccountSort, and SocialAccountSelect entities. The expansion stage further generates the communication bits of the asg on top of that. It adds generic types like GetSocialAccountsRequest, PostSocialAccountsRequest, PutSocialAccountsRequest, DeleteSocialAccountsRequest and the according Response counterparts for all exposed types, and connects them to endpoints.

metactl

graph TD metactl[metactl aaaa] --> |generates| servicesdks[service sdks] metactl[metactl aaaa] --> |generates| clientsdks[client sdks] asg[asg] --> |powers| metactl[metactl] class metactl metactl-icon;

metactl is MetaMate’s CLI. It relies on the asg to query MetaMate instances, to inspect nodes in the asg, and most importantly, to generate project tailored and typed SDKs.

MetaMate

graph TD asg[asg] --> |powers| metamate[MetaMate aaa] clients[clients] --> |read/write| metamate[MetaMate aaa] services[services] --> |read/write| metamate[MetaMate aaa] metamate[MetaMate aaa] --> |reads/writes| services[services] class metamate metamate-icon;

The asg powers MetaMate’s internal and generic type representation system. MetaMate uses it to boot the communication stack, like composing the graphql schema and exposing a generic http/json based API. MetaMate furthermore enforces validation rules, defined by the asg.

Nodes

graph TD root[root] basictype[basictype] endpoint[endpoint] enum[enum] type[type] field[field] path[path] relation[relation]

The asg is composed of 8 different kinds of nodes. Nodes carry binary flags and are interconnected via edges.

Root

The Root node holds a reference to all other nodes. It’s the starting point when retrieving nodes or traversing the graph.

BasicType

BasicType nodes hold low-level types. They are predefined and constrained by the typing capabilities of various serialization formats. They currently consist of bool, int32, float64, and string.

graph TD basictype[basictype]

Enum

Enum nodes represent a predefined set of string values.

graph TD enum[enum]

Type

Type nodes define custom data structures.

graph LR Type[Type] --> | For | Type0[Type] Type[Type] --> | FilteredBy | Type0[Type] Type[Type] --> | SortedBy | Type0[Type] Type[Type] --> | SelectedBy | Type0[Type] Type[Type] --> | Collection | Type0[Type] Type[Type] --> | Request | Type0[Type] Type[Type] --> | Response | Type0[Type] Type[Type] --> | GetRequest | Type0[Type] Type[Type] --> | GetCollection | Type0[Type] Type[Type] --> | GetRelations | Type0[Type] Type[Type] --> | GetResponse | Type0[Type] Type[Type] --> | PipeRequest | Type0[Type] Type[Type] --> | PipeResponse | Type0[Type] Type[Type] --> | GetEndpoint | Type0[Type] Type[Type] --> | PipeEndpoint | Type0[Type] Type[Type] --> | For | Enum[Enum] Type[Type] --> | ListKind | Enum[Enum] Type[Type] --> | BelongsTo | Enum[Enum] Type[Type] --> | Get | Endpoint[Endpoint] Type[Type] --> | Pipe | Endpoint[Endpoint] Type[Type] --> | Holds | Fields[Fields] Type[Type] --> | EdgedByFields | Fields[Fields] Type[Type] --> | EdgedByListFields | Fields[Fields] Type[Type] --> | Holds | Relations[Relations] Type[Type] --> | ToOneRelations | Types[Types] Type[Type] --> | ToManyRelations | Types[Types] Type[Type] --> | Misses | Types[Types] Type[Type] --> | Dependencies | Types[Types] Type[Type] --> | Dependencies | Enums[Enums]

Field

Field nodes are referenced by Type nodes and either hold BasicType, Enum or Type nodes.

graph TD Field[Field] --> |Holds| BasicType[BasicType] Field[Field] --> |Holds| Enum[Enum] Field[Field] --> |For| Field[Field] Field[Field] --> |RelatedTo| Field[Field] Field[Field] --> |RelatedThrough| Relation[Relation] Field[Field] --> |Holds| Type[Type] Field[Field] --> |HeldBy| Type[Type] Field[Field] --> |BelongsTo| Path[Path]

Relation

Relation nodes hold an active and a passive Path node.

graph TD Relation[Relation] --> |NodeA| Type[Type] Relation[Relation] --> |NodeB| Type[Type] Relation[Relation] --> |Active| Path[Path] Relation[Relation] --> |Passive| Path[Path]

Path

Path nodes are attached to Relation nodes and model either an active or passive relation path between Type nodes and specify a cardinality. Post mentions many SocialAccounts is an active, HackerNewsActivity mentioned by many Posts is it’s passive counterpart Path.

graph TD Path[Path] --> |From| Type[Type] Path[Path] --> |To| Type[Type] Path[Path] --> |BelongsTo| Relation[Relation]

Endpoint

Endpoint nodes

graph TD Endpoint[Endpoint] --> |For| Type[Type] Endpoint[Endpoint] --> |Request| Type[Type] Endpoint[Endpoint] --> |Response| Type[Type] Endpoint[Endpoint] --> |Dependencies| Types[Types] Endpoint[Endpoint] --> |Dependencies| Enums[Enums]
comments powered by Disqus