in lib/schema.ts [41:105]
export function PresenceSchema() : AppSync.Schema {
// Instantiate the schema
const schema = new AppSync.Schema();
// A Required ID type ("ID!")
const requiredId = AppSync.GraphqlType.id({isRequired: true});
// User defined types: enum for presence state, and required version (i.e. "status!")
const status = new AppSync.EnumType("Status", {
definition: ["online", "offline"]
});
const requiredStatus = typeFromObject(status, {isRequired: true});
// Main type returned by API calls:
// Directives are used to set access through IAM and API KEY
// In production, recommendation would be to use Cognito or Open Id
// (https://docs.aws.amazon.com/appsync/latest/devguide/security.html)
const presence = new AppSync.ObjectType("Presence", {
definition: {
id: requiredId,
status: requiredStatus
},
directives: [AppSync.Directive.iam(), AppSync.Directive.apiKey()]
});
const returnPresence = typeFromObject(presence);
// Add user defined types to the schema
schema.addType(status);
schema.addType(presence);
// Add queries
schema.addQuery("heartbeat", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId }
}));
schema.addQuery("status", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId }
}));
// Add mutations
schema.addMutation("connect", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId }
}));
schema.addMutation("disconnect", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId }
}));
schema.addMutation("disconnected", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId },
directives: [AppSync.Directive.iam()]
}));
// Add subscription
schema.addSubscription("onStatus", new AppSync.Field({
returnType: returnPresence,
args: { id: requiredId },
directives: [AppSync.Directive.subscribe("connect","disconnected")]
}));
return schema;
};