Skip to main content

GraphQL Schema Documentation

Overview

This documentation details the GraphQL schema for a location-based group tracking application. The schema defines the structure for managing users, groups, beacons (tracking sessions), and real-time location updates.

Types

Location

Represents geographical coordinates

type Location {
lat: String!
lon: String!
}

Beacon

Represents a tracking session

type Beacon {
_id: ID!
title: String
shortcode: String!
createdAt: Float!
updatedAt: Float!
startsAt: Float!
expiresAt: Float!
location: Location! # Most recent location
leader: User! # Session leader
showAdminName: Boolean!
followers: [User!]! # Session participants
route: [Location!]! # Track history
landmarks: [Landmark!]! # Points of interest
group: Group! # Parent group
}

Landmark

Represents points of interest during a tracking session

type Landmark {
_id: ID!
createdAt: Float!
title: String!
location: Location!
createdBy: User!
}

User

Represents application users

type User {
_id: ID!
createdAt: Float!
name: String # Optional for anonymous access
email: String # Optional for anonymous access
isVerified: Boolean
location: Location # Optional for anonymous access
beacons: [Beacon!]!
groups: [Group!]!
}

Group

Represents user groups

type Group {
_id: ID!
title: String
shortcode: String!
leader: User!
members: [User!]!
beacons: [Beacon!]!
}

Queries

User Queries

  • me: User: Get current user's profile
  • hello: String: Basic health check query

Beacon Queries

  • beacon(id: ID!): Beacon!: Get specific beacon
  • nearbyBeacons(id: ID!, location: LocationInput!, radius: Float!): [Beacon!]!: Find beacons within radius
  • beacons(groupId: ID!, page: Int, pageSize: Int): [Beacon!]!: Get paginated beacons for a group
  • filterBeacons(id: ID!, type: String): [Beacon!]!: Filter beacons by type

Group Queries

  • group(id: ID!): Group!: Get specific group
  • groups(page: Int, pageSize: Int): [Group!]!: Get paginated list of user's groups

Mutations

Authentication

register(user: RegistrationInput): User!
login(id: ID, credentials: AuthPayload): String!
oAuth(userInput: oAuthInput): String
sendVerificationCode(email: String!): String!
completeVerification(userId: String!): User!

Group Management

createGroup(group: GroupInput): Group!
joinGroup(shortcode: String!): Group!
removeMember(groupId: ID!, memberId: ID!): User!
changeShortcode(groupId: ID!): Group!

Beacon Management

createBeacon(beacon: BeaconInput, groupID: String!): Beacon!
joinBeacon(shortcode: String!): Beacon!
deleteBeacon(id: ID!): Boolean!
rescheduleHike(newExpiresAt: Float!, newStartsAt: Float!, beaconID: ID!): Beacon!
changeLeader(beaconID: ID!, newLeaderID: ID!): Beacon!

Location & Safety

createLandmark(landmark: LandmarkInput, beaconID: ID!): Landmark!
updateUserLocation(id: ID!, location: LocationInput!): User
sos(id: ID!): User!

Subscriptions

Real-time Updates

type Subscription {
beaconLocations(id: ID!): BeaconLocationsPayload!
JoinLeaveBeacon(id: ID!): JoinLeaveBeaconPayload!
groupUpdate(groupIds: [ID!]): UpdatedGroupPayload!
}

Subscription Payloads

BeaconLocationsPayload

type BeaconLocationsPayload {
userSOS: User # SOS alerts
route: [Location] # Route updates
updatedUser: User # User location updates
landmark: Landmark # New landmarks
}

JoinLeaveBeaconPayload

type JoinLeaveBeaconPayload {
newfollower: User
inactiveuser: User
}

UpdatedGroupPayload

type UpdatedGroupPayload {
groupId: ID!
newUser: User
newBeacon: Beacon
deletedBeacon: Beacon
updatedBeacon: Beacon
}

Input Types

Location Input

input LocationInput {
lat: String!
lon: String!
}

Beacon Input

input BeaconInput {
title: String
startsAt: Float # Default is Date.now
expiresAt: Float!
startLocation: LocationInput!
}

Authentication Inputs

input AuthPayload {
email: String!
password: String!
}

input RegistrationInput {
name: String!
credentials: AuthPayload
}

input oAuthInput {
email: String
name: String
}

Other Inputs

input LandmarkInput {
title: String!
location: LocationInput!
}

input GroupInput {
title: String!
}

Notes

  • All IDs are represented as GraphQL ID type
  • Timestamps are represented as Float type (Unix timestamps)
  • Required fields are marked with !
  • Arrays of required items are marked with [Type!]
  • Required arrays are marked with [Type]!
  • Required arrays of required items are marked with [Type!]!