export function PresenceSchema()

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;
};