diff --git a/.github/workflows/codegen.yml b/.github/workflows/codegen.yml new file mode 100644 index 0000000..2766cb1 --- /dev/null +++ b/.github/workflows/codegen.yml @@ -0,0 +1,79 @@ +name: Code Generation + +on: + workflow_dispatch: {} + pull_request: {} + +jobs: + codegen: + name: Regenerate Ariadne Codegen + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v6 + + - name: Git Config + run: | + git config --global user.name "GitHub Actions" + git config --global user.email "mickey.mouse@playerdata.com" + git config --global push.autoSetupRemote true + + - name: Generate Branch Name + id: branch-name + run: echo "branch-name=codegen-$(openssl rand -hex 4)" >> "$GITHUB_OUTPUT" + + - run: git checkout -b ${{ steps.branch-name.outputs.branch-name }} + + - uses: actions/setup-python@v6 + with: + python-version: '3.12' + + - name: Install uv + uses: astral-sh/setup-uv@v6.6.1 + with: + enable-cache: true + cache-suffix: '-venv-codegen' + activate-environment: true + + - name: Install Dependencies + run: uv sync --group codegen --locked + + - name: Fetch the Schema + run: uv run --no-sync scripts/fetch_schema.py + + - name: Code Generation + run: uv run --no-sync ariadne-codegen + + - name: Fix Imports + run: uv run --no-sync scripts/fixup.py + + - name: Generate GitHub App Token + id: app_token + uses: actions/create-github-app-token@v2 + with: + app-id: 73365 + private-key: ${{ secrets.BEAVERBOT_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + + - name: Create PR + env: + GH_TOKEN: ${{ steps.app_token.outputs.token }} + run: | + git add . + git commit -m "chore: update graphql schema" + git fetch origin + git rebase origin/main -X theirs + git push --force + gh pr create \ + --title "Code Generation" \ + --body "Automagically generated schema updates." \ + --base main \ + --head ${{ steps.branch-name.outputs.branch-name }} + + # - name: Enable Automerge + # if: steps.create-pr.outputs.pull-request-number + # run: gh pr merge ${{ steps.create-pr.outputs.pull-request-number }} --auto --squash + # env: + # GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index df0079d..6f46a7c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,7 +26,7 @@ jobs: activate-environment: true - name: Install Dependencies - run: uv sync --extra dev --locked + run: uv sync --group test --locked - name: Lint Check (Ruff) run: uv run --no-sync ruff check . diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aaa11ba..bce01a3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: activate-environment: true - name: Install Dependencies - run: uv sync --extra dev --locked + run: uv sync --group test --locked - name: Run Tests run: uv run --no-sync pytest diff --git a/pyproject.toml b/pyproject.toml index 28bda1a..668a584 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,13 +14,15 @@ dependencies = [ "requests-oauthlib>=2.0.0", ] -[project.optional-dependencies] -dev = [ - "ariadne-codegen>=0.17.0", - "ruff>=0.14.14", - "pytest>=8.4.2", - "pytest-asyncio>=0.24.0", - "ipykernel>=7.1.0", +[dependency-groups] +codegen = [ + "ariadne-codegen>=0.17.2", +] +test = [ + "ipykernel>=7.2.0", + "pytest>=9.0.2", + "pytest-asyncio>=1.3.0", + "ruff>=0.15.1", ] [build-system] @@ -40,12 +42,11 @@ remove-unused-variables = true ignore-init-module-imports = true [tool.ariadne-codegen] -remote_schema_url = "https://app.playerdata.co.uk/api/graphql" +schema_path = "schema.graphql" target_package_name = "playerdatapy" enable_custom_operations = true client_file_name = "gqlclient" client_class_name = "GraphqlClient" -remote_schema_headers = {"Authorization" = "$AUTH_TOKEN"} [tool.ruff.lint] ignore = ["F405", "F403"] diff --git a/schema.graphql b/schema.graphql new file mode 100644 index 0000000..1a414c2 --- /dev/null +++ b/schema.graphql @@ -0,0 +1,13297 @@ +schema { + query: Query + mutation: Mutation + subscription: RootSubscription +} + +""" +Acceleration zone boundaries in m/s² +""" +type AccelzoneLowerBounds { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +""" +Acceleration zone boundaries in m/s² +""" +input AccelzoneLowerBoundsInput { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +""" +Autogenerated return type of Accelzones. +""" +type AccelzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of AcceptPrivacyPolicy. +""" +type AcceptPrivacyPolicyPayload { + errors: [ValidationError!]! + + """ + The PrivacyPolicyAcceptance + """ + privacyPolicyAcceptance: PrivacyPolicyAcceptance +} + +""" +Autogenerated return type of AddAthleteGroup. +""" +type AddAthleteGroupPayload { + athleteGroup: AthleteGroup + errors: [ValidationError!]! +} + +""" +Autogenerated return type of AddExistingPersonToClub. +""" +type AddExistingPersonToClubPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of AddNewPersonToClub. +""" +type AddNewPersonToClubPayload { + errors: [ValidationError!]! + person: Person +} + +""" +Autogenerated return type of AddSurveyAnswer. +""" +type AddSurveyAnswerPayload { + errors: [ValidationError!]! + surveyAnswer: SurveyAnswer +} + +""" +Autogenerated return type of AddSurveyQuestion. +""" +type AddSurveyQuestionPayload { + errors: [ValidationError!]! + survey: Survey +} + +""" +The different aggregation functions +""" +enum AggFuncEnum { + avg + avgByAthlete + avgByParticipation + avgBySession + max + sum +} + +""" +An aggregate for a question and assignment. +""" +interface AggregateInterface { + surveyDistribution: SurveyDistribution! + surveyQuestion: SurveyQuestion! +} + +""" +Aggregated session type +""" +type AggregatedSession { + """ + The aggregated session metric set + """ + aggregatedSessionMetricSet: AggregatedSessionMetricSet + + """ + Configured metrics for the aggregated session + """ + configuredAggMetrics: ConfiguredAggMetrics + + """ + Configured metrics for session + """ + configuredMetrics: ConfiguredMetrics @deprecated(reason: "use configuredAggMetrics instead") + + """ + The date of the session + """ + sessionDateTime: ISO8601DateTime! + + """ + Type of the session, e.g., 'Sessions::TrainingSession' or 'Sessions::MatchSession' + """ + sessionDetailsType: String! +} + +""" +Aggregated session metric set type +""" +type AggregatedSessionMetricSet implements CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +""" +An anchor device +""" +type Anchor implements DeviceInterface { + """ + The board version of the device + """ + boardName: FirmwareBoardName! + + """ + The device's full ID + """ + id: ID! + + """ + The owner of this device + """ + owner: DeviceOwner + + """ + The device's short ID, in hex format + """ + serialNumber: String! @deprecated(reason: "Use serialNumberHex instead") + + """ + The device's short ID, in hex format + """ + serialNumberHex: String! + + """ + base64 encoded copy of the passed in message encrypted and signed with the device's key + """ + signedMessage( + """ + The base64 encoded message to be encrypted + """ + messageBase64: String! + ): String +} + +enum AppAuthenticationFlow { + """ + Person is directed to Athlete Dashboard + """ + ATHLETE_DASHBOARD + + """ + Person has club, decide route on client side + """ + CURRENT_CLUB + + """ + Person without DOB or gender + """ + DETAILS + + """ + Person has an Edge that can be scanned + """ + EDGE_ASSIGNMENT + + """ + Person has no club or individual Athlete + """ + NO_CLUB + + """ + Person needs to accept a new privacy policy + """ + PRIVACY_POLICY_ACCEPTANCE + + """ + Can select from a list of clubs + """ + SELECT_CLUB + + """ + Person needs to update app to latest version + """ + UPDATE_APP +} + +type AppMessage { + context: AppMessageContext + contextualMessageContent: JSON @deprecated(reason: "Use context instead") + id: ID! + read: Boolean! + triggeredAt: ISO8601DateTime! + type: AppMessageTypeEnum! +} + +""" +The context of an app message +""" +union AppMessageContext = DataReadyContext | LegacySurveyDistributedContext | NewPersonalBestContext | SessionBlueprintSessionCreationFailedContext | SessionBlueprintSessionCreationSkippedAthletesContext | SessionBlueprintSessionCreationSkippedGatewaysContext | SurveyCompletedContext | SurveyReminderContext + +enum AppMessageTypeEnum { + AccountSuspended + AccountUnpaid + DataReady + FirmwareUpdateAvailable + GatewayFirmwareUpdateAvailable + LegacySurveyDistributed + NewPersonalBest + SessionBlueprintSessionCreationFailed + SessionBlueprintSessionCreationSkippedAthletes + SessionBlueprintSessionCreationSkippedGateways + SurveyCompleted + SurveyReminder +} + +""" +Autogenerated return type of ArchiveClubMember. +""" +type ArchiveClubMemberPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of ArchivePitch. +""" +type ArchivePitchPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of ArchiveSurvey. +""" +type ArchiveSurveyPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of AssignDevice. +""" +type AssignDevicePayload { + errors: [ValidationError!]! + + """ + The serial number of the assigned device + """ + serialNumber: String +} + +""" +Autogenerated return type of AssignEdge. +""" +type AssignEdgePayload { + edge: Edge + errors: [ValidationError!]! +} + +""" +An Athlete +""" +type Athlete implements AthleteOrStaff { + archivedAt: ISO8601DateTime + athleteGroups: [AthleteGroup!] + + """ + The athlete's auto-calculated top speed in km/h + """ + autoTopSpeedKph: Float + + """ + Whether the athlete's relative accel zones are automatically updated + """ + autoUpdateRelativeAccelzones: Boolean + + """ + Whether the athlete's relative decel zones are automatically updated + """ + autoUpdateRelativeDecelzones: Boolean + + """ + Whether the athlete's relative heart rate zones are automatically updated + """ + autoUpdateRelativeHeartRate: Boolean + + """ + Whether the athlete's relative speedzones are automatically updated + """ + autoUpdateRelativeSpeedzones: Boolean + club: Club + + """ + An athlete's configured personal bests + """ + configuredPersonalBests( + """ + Optional start_date filter + """ + startDate: ISO8601Date + ): ConfiguredPersonalBests + + """ + Custom identifier for external system integration + """ + customId: String + + """ + The athlete's custom max acceleration in m/s² + """ + customMaxAccelerationMs2: Float + + """ + The athlete's custom max deceleration in m/s² + """ + customMaxDecelerationMs2: Float + + """ + Explicitly set maximum heart rate in BPM + """ + customMaxHeartRateBpm: Float + + """ + The athlete's custom top speed in kph + """ + customTopSpeedKph: Float + defaultPosition: PositionDefinition + + """ + Heart rate zone boundaries as percentages + """ + heartRateBoundsPercentages: [Float!] @deprecated(reason: "Use labelled_heart_rate_bounds_percentages instead") + id: ID! + + """ + Initials derived from the athlete's name + """ + initials: String! + + """ + Labelled accelzones in m/s² + """ + labelledAccelzonesLowerBoundsMs2: AthleteLabelledAccelzones + + """ + Labelled decelzones in m/s² + """ + labelledDecelzonesLowerBoundsMs2: AthleteLabelledDecelzones + + """ + Labelled heart rate bounds percentages + """ + labelledHeartRateBoundsPercentages: AthleteLabelledHeartRateBounds + + """ + Labelled speedzones in km/h + """ + labelledSpeedzonesLowerBoundsKph: AthleteLabelledSpeedzones + lastEdgeUsed(clubId: ID @deprecated(reason: "An athlete can only be associated with one club")): Edge + + """ + Maximum heart rate (explicit or age-calculated) + """ + maxHeartRate: Float + + """ + Calculated metrics overview between two dates, end date defaults to today + """ + metricsSummary(endDate: ISO8601Date, startDate: ISO8601Date!): AthleteMetricsSummary @deprecated(reason: "use time_safe_metrics_summary, this one isn't timezone safe") + name: String! + person: Person! + personId: ID! @deprecated(reason: "Use `person` instead") + profilePicture: ProfilePicture! + + """ + An athlete's session participations + """ + sessionParticipations(limit: Int, offset: Int, startTime: ISO8601Date): [SessionParticipation!]! + + """ + An athlete's sessions + """ + sessions(limit: Int, offset: Int): [Session!]! + + """ + Lower bounds of the athlete's speedzones in km/h + """ + speedzonesLowerBoundsKph: [Float!] @deprecated(reason: "Use\n labelled_speedzones_lower_bounds_kph instead") + + """ + Calculated metrics overview between two datetimes, end date defaults to now + """ + timeSafeMetricsSummary(endTime: ISO8601DateTime, startTime: ISO8601DateTime!): AthleteMetricsSummary + + """ + The athlete's top speed in km/h + """ + topSpeedKph: Float + totalRecords: AthleteRecords +} + +""" +Attributes for assigning accelzones to athletes +""" +input AthleteAccelzoneAttributes { + """ + Lower bound values of the accelzones in m/s² + """ + accelzonesLowerBoundsMs2: AccelzoneLowerBoundsInput + + """ + IDs of the athletes + """ + athleteIds: [ID!]! +} + +""" +Mapping of an athlete to a list of clipped time intervals +""" +input AthleteClippedTimesInput { + """ + The ID of the athlete + """ + athleteId: ID! + + """ + An array of intervals for this athlete + """ + clippedTimePeriods: [IntervalInput!]! +} + +""" +Attributes for assigning decelzones to athletes +""" +input AthleteDecelzoneAttributes { + """ + IDs of the athletes + """ + athleteIds: [ID!]! + + """ + Lower bound values of the decelzones in m/s² + """ + decelzonesLowerBoundsMs2: DecelzoneLowerBoundsInput +} + +""" +An Athlete Group +""" +type AthleteGroup { + athletes( + """ + Include archived athletes in the group + """ + includeArchived: Boolean + ): [Athlete!]! + club: Club! + colour: String! + id: ID! + name: String! +} + +""" +Attributes for creating a new athlete group +""" +input AthleteGroupAttributes { + athleteIds: [ID!]! + clubId: ID! + colour: String! + name: String! +} + +""" +Attributes for assigning heart rate bounds to athletes +""" +input AthleteHeartRateBoundsAttributes { + """ + IDs of the athletes + """ + athleteIds: [ID!]! + + """ + Explicit maximum heart rate in BPM + """ + customMaxHeartRateBpm: Float + + """ + Heart rate zone boundaries as percentages + """ + heartRateBoundsPercentages: HeartRateLowerBoundsInput +} + +""" +Absolute/Relative accelzones labelled by the boundary type +""" +type AthleteLabelledAccelzones { + """ + Labelled absolute accelzones in m/s² + """ + absolute: AccelzoneLowerBounds + + """ + Labelled relative accelzones in m/s² + """ + relative: AccelzoneLowerBounds +} + +""" +Absolute/Relative decelzones labelled by the boundary type +""" +type AthleteLabelledDecelzones { + """ + Labelled absolute decelzones in m/s² + """ + absolute: DecelzoneLowerBounds + + """ + Labelled relative decelzones in m/s² + """ + relative: DecelzoneLowerBounds +} + +""" +Relative heart rate bounds percentages +""" +type AthleteLabelledHeartRateBounds { + """ + Labelled relative heart rate bounds percentages + """ + relative: HeartRateLowerBounds +} + +""" +Absolute/Relative speedzones labelled by the boundary type +""" +type AthleteLabelledSpeedzones { + """ + Labelled absolute speedzones in km/h + """ + absolute: SpeedzoneLowerBounds + + """ + Labelled relative speedzones in km/h + """ + relative: SpeedzoneLowerBounds +} + +""" +Aggregated metrics across one or more session participations +""" +type AthleteMetricsSummary { + athlete: Athlete! + avgAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDistanceM: Float @deprecated(reason: "use avgTotalDistanceM instead") + avgHighIntensityEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgHighIntensityRunDistanceM: Float @deprecated(reason: "use avgTotalHighIntensityDistanceM instead") + avgMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + avgRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgSprintCount: Int @deprecated(reason: "use avgSprintEvents instead") + avgSprintDistanceM: Float @deprecated(reason: "use avgTotalSprintDistanceM instead") + avgSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + avgTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkload: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadIntensity: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadVolume: Float @deprecated(reason: "use configuredAggMetrics instead") + + """ + Configured metrics for the participation summary + """ + configuredAggMetrics: ConfiguredAggMetrics + + """ + Configured metrics for the participation summary + """ + configuredMetrics: ConfiguredMetrics @deprecated(reason: "use configuredAggMetrics instead") + maxMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + maxRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxSpeedKph: Float @deprecated(reason: "use maxMaxSpeedKph instead") + maxTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + sprintEvents: Int @deprecated(reason: "Use totalSprintEvents instead") + totalAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityRunDistanceM: Float @deprecated(reason: "Use totalHighIntensityDistanceM instead") + totalSprintCount: Int @deprecated(reason: "Use totalSprintEvents instead") + totalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") +} + +""" +An athlete or staff +""" +interface AthleteOrStaff { + archivedAt: ISO8601DateTime + id: ID! + initials: String! + name: String! + person: Person! + personId: ID! @deprecated(reason: "Use `person` instead") + profilePicture: ProfilePicture! +} + +""" +Autogenerated return type of AthletePeriodMetricsUpdatedSubscription. +""" +type AthletePeriodMetricsUpdatedSubscriptionPayload { + """ + The new metric set + """ + metricSet: MatchSessionAthletePeriodMetricSet +} + +""" +Overall session records for an athlete +""" +type AthleteRecords { + """ + An athlete's total distance travelled + """ + configuredTotalDistance: GenericMetric + + """ + An athlete's personal best records + """ + personalBests( + """ + Optional start_date filter + """ + startDate: ISO8601Date + ): PersonalBests! + + """ + An athlete's total distance travelled + """ + totalDistance: Int! @deprecated(reason: "Use total_distance_covered instead") + + """ + An athlete's total distance travelled + """ + totalDistanceCovered: Int @deprecated(reason: "Use configured_total_distance instead") + + """ + An athlete's total match sessions + """ + totalMatchSessions: Int! + + """ + An athlete's total time played + """ + totalTimePlayed: Int! + + """ + An athlete's total training sessions + """ + totalTrainingSessions: Int! +} + +""" +Attributes for assigning relative accelzones to athletes +""" +input AthleteRelativeAccelzoneAttributes { + """ + IDs of the athletes + """ + athleteIds: [ID!]! + + """ + Whether to auto update the relative accelzones + """ + autoUpdateRelativeAccelzones: Boolean + + """ + A custom max acceleration override for the athlete + """ + customMaxAccelerationMs2: Float + + """ + Lower bound values of the relative accelzones + """ + relativeAccelzonesLowerBounds: AccelzoneLowerBoundsInput +} + +""" +Attributes for assigning relative decelzones to athletes +""" +input AthleteRelativeDecelzoneAttributes { + """ + IDs of the athletes + """ + athleteIds: [ID!]! + + """ + Whether to auto update the relative decelzones + """ + autoUpdateRelativeDecelzones: Boolean + + """ + A custom max deceleration override for the athlete + """ + customMaxDecelerationMs2: Float + + """ + Lower bound values of the relative decelzones + """ + relativeDecelzonesLowerBounds: DecelzoneLowerBoundsInput +} + +""" +Autogenerated return type of AthleteSegmentMetricsUpdatedSubscription. +""" +type AthleteSegmentMetricsUpdatedSubscriptionPayload { + """ + Configured athlete metrics for the segment participation + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + + """ + The new metric set + """ + metricSet: TrainingSessionSegmentAthleteMetricSet +} + +""" +Link to a athlete session participation in the mobile app +""" +type AthleteSessionLink { + """ + The ID of the athlete + """ + athleteId: ID! + + """ + The name of the athlete + """ + athleteName: String! + + """ + The screen to navigate to (always 'AthleteSession') + """ + screen: String! + + """ + The ID of the session + """ + sessionId: ID! + + """ + The start time of the session + """ + sessionStartTime: ISO8601DateTime! +} + +""" +Autogenerated return type of AthleteSessionMetricsUpdatedSubscription. +""" +type AthleteSessionMetricsUpdatedSubscriptionPayload { + """ + Configured athlete metrics for the session participation + """ + configuredMetrics( + """ + requested Json keys + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics +} + +""" +Attributes for assigning speedzones to athletes +""" +input AthleteSpeedzoneAttributes { + """ + ID of the athlete + """ + athleteIds: [ID!]! + + """ + Lower bound value of the speedzone + """ + speedzonesLowerBoundsKph: SpeedzoneLowerBoundsInput +} + +""" +An athlete or staff or pd staff +""" +type AthleteStaffOrPdStaff { + """ + The id of the athlete, staff or pd staff + """ + id: ID! + + """ + The name of the athlete, staff or pd staff + """ + name: String! + + """ + The person associated with the athlete, staff or pd staff + """ + person: Person! +} + +type AveragePosition { + id: ID! + maxX: Float! + maxY: Float! + xPosition: Float! + yPosition: Float! +} + +""" +A Ball device +""" +type Ball implements DeviceInterface { + """ + The board version of the device + """ + boardName: FirmwareBoardName! + + """ + The device's full ID + """ + id: ID! + + """ + The last time the ball was synced + """ + lastSyncTime: ISO8601DateTime + + """ + The owner of this device + """ + owner: DeviceOwner + + """ + The device's short ID, in hex format + """ + serialNumber: String! @deprecated(reason: "Use serialNumberHex instead") + + """ + The device's short ID, in hex format + """ + serialNumberHex: String! + + """ + base64 encoded copy of the passed in message encrypted and signed with the device's key + """ + signedMessage( + """ + The base64 encoded message to be encrypted + """ + messageBase64: String! + ): String +} + +""" +A ball data recording for a session +""" +type BallDataRecording { + """ + The ball associated with this recording + """ + ball: Ball! + + """ + Whether the recording has GPS data + """ + hasGpsData: Boolean! + + """ + The ID of the ball data recording + """ + id: ID! + + """ + The last time the ball data recording was updated + """ + updatedAt: ISO8601DateTime! + + """ + The URL to download the data file + """ + url( + """ + The format of the data file to download + """ + format: DatafileFormat + + """ + When true, don't include events outside the session start/end times + """ + sessionTimesOnly: Boolean + ): String +} + +""" +Banded jump zone boundaries in cm +""" +type BandedJumpZoneLowerBounds { + """ + High banded jump zone lower bound in cm + """ + high: Float! + + """ + Low banded jump zone lower bound in cm + """ + low: Float! + + """ + Medium banded jump zone lower bound in cm + """ + medium: Float! +} + +""" +Banded jump zone boundaries in cm +""" +input BandedJumpZoneLowerBoundsInput { + """ + High banded jump zone lower bound in cm + """ + high: Float! + + """ + Low banded jump zone lower bound in cm + """ + low: Float! + + """ + Medium banded jump zone lower bound in cm + """ + medium: Float! +} + +""" +Represents non-fractional signed whole numeric values. Since the value may +exceed the size of a 32-bit integer, it's encoded as a string. +""" +scalar BigInt + +type Bucket { + endExclusive: Float! + startInclusive: Float! + value: Float! +} + +""" +Autogenerated return type of BulkApprove. +""" +type BulkApprovePayload { + """ + Approved athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Attributes for updating a match event +""" +input BulkUpdateMatchEventAttributes { + id: ID! + involvingTeam: MatchEventTeam + matchEventTypeId: ID! + occurredAt: ISO8601DateTime + sessionParticipationId: ID +} + +""" +A camera ownership +""" +type CameraOwnership { + """ + The ID of the camera ownership + """ + id: ID! +} + +""" +CellRange config for a report chart +""" +type CellRange { + """ + the columns for the chart + """ + columns: [String!]! + + """ + end index for data + """ + rowEndIndex: Int + + """ + pinned end index for data + """ + rowEndPinned: Int + + """ + start index for data + """ + rowStartIndex: Int + + """ + pinned start index for data + """ + rowStartPinned: Int +} + +type ChargebeeSubscription implements CustomerSubscription { + cancelledAt: ISO8601DateTime + id: ID! + subscriptionPortalUrl: String! +} + +""" +Config for a report chart +""" +type ChartConfig { + """ + The charts aggregation function + """ + aggFunc: AggFuncEnum + + """ + Config for the charts range + """ + cellRange: CellRange! + + """ + The chart type, e.g. `line` + """ + chartType: ChartTypeEnum! + + """ + The series category type + """ + seriesChartTypes: [SeriesChartType!] + + """ + Whether the chart ranges should be shown + """ + suppressChartRanges: Boolean! + + """ + Whether the axis should swap + """ + switchCategorySeries: Boolean! + + """ + Whether the chart should be linked to the grid + """ + unlinkChart: Boolean! +} + +""" +data type for a column, required by AG Grid when creating charts +""" +enum ChartDataTypeEnum { + category + excluded + series + time +} + +""" +The different chart types we support +""" +enum ChartTypeEnum { + bar + boxPlot + column + columnLineCombo + customCombo + line + pie + radarLine + stackedBar + stackedColumn + table +} + +""" +Attributes for claiming a Person +""" +input ClaimPersonAttributes { + """ + if Person has accepted eula + """ + acceptedEula: Boolean! + + """ + if Person has accepted privacy policy + """ + acceptedPrivacyPolicy: Boolean! + + """ + email for Person to claim + """ + email: String! + + """ + password for new person + """ + password: String! +} + +""" +Autogenerated return type of ClaimPerson. +""" +type ClaimPersonPayload { + errors: [ValidationError!]! + + """ + the claimed Person + """ + person: Person +} + +""" +An array of clipped time periods (in MS, relative to start time) denoting activity for processing +""" +type ClippedTimePeriod { + """ + The relative end time (in MS) of the clipped time period + """ + endOffset: Int! + + """ + The relative start time (in MS) of the clipped time period + """ + startOffset: Int! + + """ + The IDs of the tag definitions that are associated with the clipped time period + """ + tagDefinitions: [TagDefinition!] +} + +""" +Mapping of an athlete to a list of their clipped time intervals for the given time period +""" +type ClippedTimePeriodByAthlete { + """ + Athlete ID + """ + athleteId: ID! + + """ + Array of tuples [start_time, end_time] in MS + """ + clippedTimePeriods: [ClippedTimePeriod!]! +} + +type Club { + """ + Timezone aware sessions metrics aggregated by day and session type + """ + aggregatedSessions(filter: SessionsSessionAggregateMetricsFilter!, limit: Int @deprecated(reason: "Cannot be used with aggregation."), offset: Int @deprecated(reason: "Cannot be used with aggregation.")): [AggregatedSession!] + + """ + Archived Members of the club + """ + archivedMembers: [AthleteOrStaff!]! + + """ + Find athlete by ID or custom_id + """ + athlete( + """ + Custom identifier for external system integration + """ + customId: String + + """ + Athlete ID + """ + id: ID + ): Athlete + + """ + Athlete groups in club + """ + athleteGroups(withMembers: Boolean = false): [AthleteGroup!] + + """ + Athlete metrics summaries. Defaults: end_date today, offset 0, limit 5, sort_by total_distance_m + """ + athleteStats(endDate: ISO8601Date, limit: Int, offset: Int, sortFields: [SortField!] = [], startDate: ISO8601Date!): [AthleteMetricsSummary!]! @deprecated(reason: "use time_safe_athlete_stats, this one isn't timezone safe") + + """ + Athletes in the club + """ + athletes( + availableForSessionId: ID + + """ + Filter athletes by custom_id + """ + customId: String + ): [Athlete!]! + + """ + Chat session plans for the club + """ + chatSessionPlans(limit: Int, offset: Int): [SessionPlan!]! + + """ + Configured athlete metric summary. + """ + configuredAthleteStats(endTime: ISO8601DateTime, limit: Int, offset: Int, sortField: String, startTime: ISO8601DateTime!): [ConfigurableAthleteSummary!]! + + """ + All configurable metric definitions for this club + """ + configuredMetricDefinitions(listType: ConfiguredMetricListTypeEnum = null): [GenericMetric!]! + + """ + breakdown of metrics by date, optionally grouped by athlete ids + """ + dayBreakdown(athleteIds: [String!], numberOfDays: Int, sessionFilter: String): [DayBreakdownOverview!]! + + """ + Edges owned by this club + """ + edges(edgeIds: [ID!]): [Edge!]! @deprecated(reason: "Use edges_currently_owned instead") + + """ + Edges currently owned by this club + """ + edgesCurrentlyOwned(edgeIds: [ID!]): [Edge!]! + + """ + Check if a feature is available for this club + """ + feature(name: String!): FeatureCheck! + + """ + Flexible reports for the club + """ + flexibleReports(limit: Int, offset: Int!): [FlexibleReport!]! + + """ + Count of flexible reports for the club + """ + flexibleReportsCount: Int! + + """ + Gateways currently owned by this club + """ + gatewaysCurrentlyOwned(filter: LiveDataGatewayOwnershipGatewaysCurrentlyOwnedFilter, limit: Int, offset: Int): [GatewayOwnership!]! + + """ + Check if the club has renamed edges + """ + hasRenamedEdges: Boolean! + hasSubstitutionEvents: Boolean + id: ID! + + """ + The last live session for the club + """ + inProgressLiveSession: Session + initials: String! + + """ + The last training session with metrics recorded for a club + """ + lastSession: Session + + """ + A list of sessions with metrics recorded from the last thirty days for a club + """ + lastThirtyDaysSessions: [Session!] + + """ + A list of the sessions that can be live sessions + """ + liveReadySessions(limit: Int, offset: Int!): [Session!]! + matchDefinitions: [MatchDefinition!] + + """ + A list of match sessions belonging to a club + """ + matchSessions(limit: Int, offset: Int!): [MatchSession!]! + + """ + The median of maximum accelerations (in m/s²) across all active club athletes. + Calculates each athlete's top acceleration from their session data, then + returns the median. Uses continuous interpolation - if there's an even number + of athletes, the result will be the average of the two middle values (e.g., + [3.0, 5.0] returns 4.0) + """ + medianActiveAthleteMaxAccelerationMs2: Float + + """ + The median of maximum decelerations (in m/s²) across all active club athletes. + Calculates each athlete's top deceleration from their session data, then + returns the median. Uses continuous interpolation - if there's an even number + of athletes, the result will be the average of the two middle values (e.g., + [3.0, 5.0] returns 4.0) + """ + medianActiveAthleteMaxDecelerationMs2: Float + + """ + The median of maximum speeds (in kph) across all active club athletes. + Calculates each athlete's top speed from their session data, then returns the + median. Uses continuous interpolation - if there's an even number of athletes, + the result will be the average of the two middle values (e.g., [30, 34] returns 32.0) + """ + medianActiveAthleteTopSpeedKph: Float + + """ + Members of the club + """ + members: [AthleteOrStaff!]! + name: String! + organisation: Organisation! + + """ + Pending members of the club + """ + pendingMembers: [PendingMember!]! + pitchDefinition: PitchDefinition + + """ + Pitches defined by the club + """ + pitches(archivedCheckDate: ISO8601DateTime): [Pitch!]! + positionDefinitions: [PositionDefinition!] + referralCode: String + + """ + All available segment titles + """ + segmentTitles: [SegmentTitle!]! @deprecated(reason: "Use Segment Titles from the Settings Type instead") + + """ + Session blueprints for the club used for recurring sessions + """ + sessionBlueprints(limit: Int, offset: Int): [SessionBlueprint!]! + + """ + Count of session blueprints for the club + """ + sessionBlueprintsCount: Int! + + """ + A list of session participations for athletes in the club + """ + sessionParticipations(filter: SessionsSessionParticipationBaseFilter, limit: Int, offset: Int!, order: [OrderInputObject!]): [SessionParticipation!]! + + """ + A session tag definition + """ + sessionTagDefinition(id: ID!): SessionTagDefinition! @deprecated(reason: "Use tagDefinition instead") + + """ + Defined session tag definitions for this club + """ + sessionTagDefinitions: [SessionTagDefinition!]! @deprecated(reason: "Use tagDefinitions instead") + + """ + A list of the sessions belonging to a club + """ + sessions(filter: SessionsSessionBaseFilter, limit: Int, offset: Int!, order: [OrderInputObject!]): [Session!]! + settings: Settings! + signupToken: String! + sport: ClubSport! @deprecated(reason: "use sport_id") + sportDefinition: SportDefinition! + sportId: ClubSport! + + """ + Staff in the club + """ + staff: [Staff!]! + + """ + A survey distribution + """ + surveyDistribution(id: ID!): SurveyDistribution! @deprecated(reason: "Use the root level SurveyDistribution instead") + + """ + All survey distributions + """ + surveyDistributions(filter: SurveysSurveyDistributionBaseFilter, limit: Int, offset: Int): [SurveyDistribution!]! + + """ + All surveys + """ + surveys( + """ + Returns only archived surveys + """ + archived: Boolean + + """ + Maximum number of surveys to return + """ + limit: Int + + """ + Number of surveys to skip + """ + offset: Int + + """ + Order by field and direction + """ + order: [OrderInputObject!] + sessionSurveys: Boolean @deprecated(reason: "Surveys are no longer session specific") + trainingSessionSurveys: Boolean @deprecated(reason: "Surveys are no longer session specific") + ): [Survey!]! + suspended: Boolean! + + """ + A tag definition + """ + tagDefinition(id: ID!): TagDefinition! + + """ + Defined tag definitions for this club + """ + tagDefinitions(taggableType: TaggableTypeEnum): [TagDefinition!]! + + """ + Athlete metrics summaries. Defaults: end_time now, offset 0, limit 5, sort_by total_distance_m + """ + timeSafeAthleteStats(endTime: ISO8601DateTime, limit: Int, offset: Int, sortFields: [SortField!] = [], startTime: ISO8601DateTime!): [AthleteMetricsSummary!]! + + """ + The user's timeline + """ + timeline(dateRange: [ISO8601Date!]): [TimelineDay!]! + + """ + The top athlete speed in kph + """ + topAthleteSpeedKph: Float + + """ + The top performers for the club + """ + topPerformers(startDate: ISO8601DateTime): [TopPerformers!]! + + """ + A list of training sessions belonging to a club + """ + trainingSessions(limit: Int, offset: Int!): [TrainingSession!]! + + """ + Unconfirmed pending members of the club + """ + unconfirmedPendingMembers: [PendingMember!]! + + """ + breakdown of a weeks metrics by day, optionally grouped by athlete ids + """ + weekBreakdown(athleteIds: [String!], startDate: ISO8601Date!): ClubWeekOverview! + + """ + Weekly load data including high/low load athletes and average session load + """ + weeklySessionLoad: WeeklyLoad! +} + +""" +Club context information for chat personalization +""" +type ClubContext { + """ + The club's goals and objectives + """ + goals: String! + + """ + The unique identifier for the club context + """ + id: ID! + + """ + The competitive level of the club + """ + level: String! +} + +""" +Attributes for creating or updating a Chat::ClubContext +""" +input ClubContextAttributes { + """ + The club's goals and objectives + """ + goals: String! + + """ + The competitive level of the club + """ + level: String! +} + +type ClubMutation { + """ + Add a question to a survey + """ + addSurveyQuestion(questionId: ID!, surveyId: ID!): AddSurveyQuestionPayload + + """ + Distribute a survey to Athletes for completion + """ + createSurveyDistribution(attributes: SurveyDistributionAttributes!): CreateSurveyDistributionPayload + + """ + Destroys a survey + """ + destroySurvey(surveyId: ID!): DestroySurveyPayload + + """ + Remove a question from a survey + """ + removeSurveyQuestion(questionId: ID!, surveyId: ID!): RemoveSurveyQuestionPayload +} + +input ClubPersonFilter { + nameCont: String +} + +""" +Aggregated metrics across one or more session participations +""" +type ClubSessionsSummaryMetrics { + avgAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDistanceM: Float @deprecated(reason: "use avgTotalDistanceM instead") + avgHighIntensityEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgHighIntensityRunDistanceM: Float @deprecated(reason: "use avgTotalHighIntensityDistanceM instead") + avgMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + avgRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgSprintCount: Int @deprecated(reason: "use avgSprintEvents instead") + avgSprintDistanceM: Float @deprecated(reason: "use avgTotalSprintDistanceM instead") + avgSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + avgTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkload: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadIntensity: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadVolume: Float @deprecated(reason: "use configuredAggMetrics instead") + + """ + Configured metrics for the participation summary + """ + configuredAggMetrics: ConfiguredAggMetrics + + """ + Configured metrics for the participation summary + """ + configuredMetrics: ConfiguredMetrics @deprecated(reason: "use configuredAggMetrics instead") + maxMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + maxRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxSpeedKph: Float @deprecated(reason: "use maxMaxSpeedKph instead") + maxTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + sprintEvents: Int @deprecated(reason: "Use totalSprintEvents instead") + totalAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityRunDistanceM: Float @deprecated(reason: "Use totalHighIntensityDistanceM instead") + totalSprintCount: Int @deprecated(reason: "Use totalSprintEvents instead") + totalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") +} + +enum ClubSport { + american_football + association_football + association_football_referees + baseball + basketball + cricket + gaelic_football + hockey + hurling + mens_lacrosse + other + polo + rugby + rugby_league + shinty + volleyball + womens_lacrosse +} + +""" +Aggregated metrics for each day of a week +""" +type ClubWeekOverview { + friday: ClubSessionsSummaryMetrics! + monday: ClubSessionsSummaryMetrics! + saturday: ClubSessionsSummaryMetrics! + + """ + summary of metrics for whole week + """ + summary: ClubSessionsSummaryMetrics! + sunday: ClubSessionsSummaryMetrics! + thursday: ClubSessionsSummaryMetrics! + tuesday: ClubSessionsSummaryMetrics! + wednesday: ClubSessionsSummaryMetrics! +} + +""" +Coach context information for chat personalization +""" +type CoachContext { + """ + The coach's career goals + """ + careerGoals: String! + + """ + The coach's competency level or area of expertise + """ + competency: String! + + """ + The unique identifier for the coach context + """ + id: ID! + + """ + When the coach context was last updated + """ + updatedAt: ISO8601DateTime! +} + +""" +Attributes for creating or updating a coach context +""" +input CoachContextAttributesInput { + """ + The coach's career goals + """ + careerGoals: String! + + """ + The coach's competency level or area of expertise + """ + competency: String! +} + +interface CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +interface CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + diveEvents: Int + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +""" +Configured athlete metric summary. +""" +type ConfigurableAthleteSummary { + """ + Athlete + """ + athlete: Athlete! + + """ + Generic metrics + """ + metric: GenericMetric! +} + +""" +A generic aggregated metric type with additional data columns +""" +type ConfiguredAggMetrics { + """ + The metrics for the metric set + """ + data: [GenericMetric!] + + """ + Additional metric set metadata columns + """ + metadata: MetricSetAggMetadata +} + +""" +Configured metric list type. +""" +enum ConfiguredMetricListTypeEnum { + """ + Leaderboard + """ + leaderboard +} + +""" +A generic metric type with additional data columns +""" +type ConfiguredMetrics { + """ + The metrics for the metric set + """ + data: [GenericMetric!] + + """ + Additional metric set metadata columns + """ + metadata: MetricSetMetadata +} + +""" +Configured personal best records for an athlete or person +""" +type ConfiguredPersonalBests { + """ + The metrics for the metric set + """ + data: [GenericPersonalBestsMetric!]! +} + +""" +Autogenerated return type of CreateCustomQuestionDefinition. +""" +type CreateCustomQuestionDefinitionPayload { + """ + Custom Question Definition Object + """ + customQuestionDefinition: CustomQuestionDefinition + errors: [ValidationError!]! +} + +""" +Autogenerated return type of CreateDataset. +""" +type CreateDatasetPayload { + """ + The created dataset + """ + dataset: Dataset + errors: [ValidationError!]! +} + +""" +Input for creating a DeviceSync with an uploaded file blob +""" +input CreateDeviceSyncInput { + """ + ID of the club (optional for individual athletes) + """ + clubId: ID + + """ + ID of the device (edge) + """ + deviceId: ID! + + """ + Type of device + """ + deviceType: DeviceSyncTypeEnum = edge + + """ + End time of the sync period + """ + endTime: ISO8601DateTime! + + """ + Signed blob ID from ActiveStorage direct upload + """ + signedBlobId: ID! + + """ + Start time of the sync period + """ + startTime: ISO8601DateTime! + + """ + Version of the device sync data format + """ + version: Int! +} + +""" +Autogenerated return type of CreateDeviceSync. +""" +type CreateDeviceSyncPayload { + """ + The created device sync record + """ + deviceSync: DeviceSync + errors: [ValidationError!]! +} + +""" +Autogenerated return type of CreateEdgeName. +""" +type CreateEdgeNamePayload { + edgeName: EdgeName + errors: [ValidationError!]! +} + +""" +Attributes for creating a flexible report chart +""" +input CreateFlexibleReportChartAttributes { + """ + The configuration for the chart + """ + chartConfig: JSON! + + """ + If chart data labels should be displayed + """ + displayDataLabels: Boolean = false + + """ + The filters for the chart data + """ + filters: JSON! + + """ + The ID of the flexible report + """ + flexibleReportId: ID! + + """ + The sort config for the chart data + """ + sortConfig: JSON + + """ + The title of the chart + """ + title: String! +} + +""" +Autogenerated return type of CreateFlexibleReportChart. +""" +type CreateFlexibleReportChartPayload { + errors: [ValidationError!]! + + """ + The created flexible report chart + """ + reportChart: FlexibleReportChart +} + +""" +Autogenerated return type of CreateFlexibleReport. +""" +type CreateFlexibleReportPayload { + errors: [ValidationError!]! + + """ + the created FlexibleReport + """ + report: FlexibleReport +} + +""" +Autogenerated return type of CreateMatchEvent. +""" +type CreateMatchEventPayload { + errors: [ValidationError!]! + matchEvent: MatchEvent +} + +""" +Autogenerated return type of CreateMatchEvents. +""" +type CreateMatchEventsPayload { + errors: [ValidationError!]! + matchEvents: [MatchEvent!] +} + +""" +Autogenerated return type of CreatePitch. +""" +type CreatePitchPayload { + errors: [ValidationError!]! + pitch: Pitch +} + +""" +Autogenerated return type of CreateQuestion. +""" +type CreateQuestionPayload { + errors: [ValidationError!]! + + """ + The question that was asked + """ + question: Question +} + +""" +Autogenerated return type of CreateReport. +""" +type CreateReportPayload { + errors: [ValidationError!]! + report: Report +} + +""" +Autogenerated return type of CreateResponse. +""" +type CreateResponsePayload { + errors: [ValidationError!]! + + """ + The created response + """ + response: Response +} + +""" +Autogenerated return type of CreateSegment. +""" +type CreateSegmentPayload { + errors: [ValidationError!]! + segment: Segment +} + +""" +Autogenerated return type of CreateSession. +""" +type CreateSessionPayload { + errors: [ValidationError!]! + + """ + Session + """ + session: Session +} + +""" +Autogenerated return type of CreateSessionTagDefinition. +""" +type CreateSessionTagDefinitionPayload { + errors: [ValidationError!]! + sessionTagDefinition: SessionTagDefinition +} + +""" +Autogenerated return type of CreateSurveyDistribution. +""" +type CreateSurveyDistributionPayload { + errors: [ValidationError!]! + surveyDistribution: SurveyDistribution +} + +""" +Autogenerated return type of CreateSurvey. +""" +type CreateSurveyPayload { + errors: [ValidationError!]! + survey: Survey +} + +""" +Autogenerated return type of CreateSurveyTimerTrigger. +""" +type CreateSurveyTimerTriggerPayload { + errors: [ValidationError!]! + surveyTimerTrigger: SurveyTimerTrigger +} + +""" +Autogenerated return type of CreateTagDefinition. +""" +type CreateTagDefinitionPayload { + errors: [ValidationError!]! + + """ + The tag definition + """ + tagDefinition: TagDefinition +} + +""" +Autogenerated return type of CreateVideoRecording. +""" +type CreateVideoRecordingPayload { + errors: [ValidationError!]! + + """ + The created video recording + """ + videoRecording: VideoRecording +} + +""" +The type of polymorphic creator +""" +enum CreatorTypeEnum { + Athlete + Staff +} + +type CryptoCharacteristicMismatch implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + decryptionArea: DecryptionArea! + time: ISO8601DateTime! +} + +type CryptoNonceMismatch implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + decryptionArea: DecryptionArea! + time: ISO8601DateTime! +} + +type CryptoSignatureError implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + decryptionArea: DecryptionArea! + time: ISO8601DateTime! +} + +""" +Available custom max metric types for athletes +""" +enum CustomMaxMetricEnum { + """ + Maximum acceleration in m/s² + """ + ACCELERATION + + """ + Maximum deceleration in m/s² + """ + DECELERATION + + """ + Maximum heart rate in BPM + """ + HEART_RATE + + """ + Top speed in km/h + """ + SPEED +} + +""" +Type for a custom question definition +""" +type CustomQuestionDefinition { + """ + Arguments of the question (min, max, labels, etc.) + """ + arguments: JSON + + """ + id + """ + id: ID! + + """ + The type of question (Range, NumericRange, etc.) + """ + questionType: String! + + """ + The question text + """ + text: String! +} + +""" +Attributes for creating a survey question +""" +input CustomQuestionDefinitionAttributes { + """ + The choices field for a Choice question type + """ + choices: [String!] + + """ + The labels field for Range question type + """ + labels: [String!] + + """ + The maximum field for a Range or NumericRange question type + """ + max: Int + + """ + The minimum field for a Range or NumericRange question type + """ + min: Int + + """ + The options field for a MultiSelect question type + """ + options: [String!] + + """ + The type of question + """ + questionType: String! + + """ + The question text + """ + text: String! +} + +interface CustomerSubscription { + cancelledAt: ISO8601DateTime + id: ID! + subscriptionPortalUrl: String! +} + +""" +A column for a dataset +""" +type DataColumn { + """ + the data type for charting the column + """ + chartDataType: ChartDataTypeEnum! + + """ + the column color (only present for series data type) + """ + color: String + + """ + the column id + """ + id: String! + + """ + the column name + """ + name: String! + + """ + the column rows + """ + rows: [String]! +} + +""" +The context of a data ready message +""" +type DataReadyContext { + """ + The id of the data ready message + """ + id: ID! + + """ + The type of session + """ + sessionType: SessionTypeEnum! +} + +type DataRecording { + athlete: Athlete! + edge: Edge! + edgeDiagnosticInformation: EdgeDiagnosticInformation + + """ + Edge name at time of session + """ + edgeLabel: String + hasGpsData: Boolean + hasUwbData: Boolean + id: ID! + lastPageReceivedAt: ISO8601DateTime @deprecated(reason: "Use metrics updatedAt instead") + updatedAt: ISO8601DateTime! +} + +enum DatafileFormat { + json + raw + v3 + v4 +} + +""" +A dataset used for flexible reporting +""" +type Dataset { + """ + The columns for the datasets + """ + columns: [DataColumn!]! + + """ + The creation date of the dataset + """ + createdAt: ISO8601DateTime! + + """ + The csv template id + """ + csvTemplateId: ID! + + """ + The dataset's date format + """ + datasetTemplate: DatasetTemplate! + + """ + The ends_at value of the dataset + """ + endsAt: ISO8601DateTime! + + """ + Errors that occurred during dataset generation + """ + errors: [String!]! + + """ + The dataset's related flexible report + """ + flexibleReport: FlexibleReport + + """ + The grid configuration for the dataset + """ + gridConfig: JSON + + """ + The dataset id + """ + id: ID! + + """ + The owner of the dataset + """ + owner: AthleteStaffOrPdStaff! + + """ + The starts_at value of the dataset + """ + startsAt: ISO8601DateTime! + + """ + The status of the dataset + """ + status: DatasetStatusEnum! + + """ + The dataset title + """ + title: String +} + +""" +Attributes for creating a dataset for flexible reporting +""" +input DatasetAttributes { + """ + Club ID + """ + clubId: ID! + + """ + CSV Template ID + """ + csvTemplateId: ID! + + """ + The end date for the range of + """ + endDate: ISO8601DateOrEmptyString + + """ + The grid config for the dataset + """ + gridConfig: JSON + + """ + The start date for the range of data + """ + startDate: ISO8601DateOrEmptyString + + """ + The title for the dataset + """ + title: String +} + +""" +Status of a dataset +""" +enum DatasetStatusEnum { + Completed + Failed + Generating +} + +""" +Dataset Template +""" +type DatasetTemplate { + """ + The date format of the template + """ + dateFormat: String! + + """ + The template id + """ + id: ID! + + """ + The template name + """ + name: String! + + """ + The owner type of the template + """ + ownerType: String! +} + +""" +Aggregated metrics for a date +""" +type DayBreakdownOverview { + date: ISO8601Date! + summary: ParticipationsMetricsSummary! +} + +""" +Deceleration zone boundaries in m/s² +""" +type DecelzoneLowerBounds { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +""" +Deceleration zone boundaries in m/s² +""" +input DecelzoneLowerBoundsInput { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +""" +Autogenerated return type of Decelzones. +""" +type DecelzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +enum DecryptionArea { + EdgeName + EnableDFU + HeartrateAssociationService + MeshInit +} + +""" +Autogenerated return type of DeleteAccelzones. +""" +type DeleteAccelzonesPayload { + """ + Athletes with deleted accelzones + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DeleteDecelzones. +""" +type DeleteDecelzonesPayload { + """ + Athletes with deleted decelzones + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DeleteHeartRateBounds. +""" +type DeleteHeartRateBoundsPayload { + """ + Athletes with deleted heart rate bounds + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DeleteSpeedzones. +""" +type DeleteSpeedzonesPayload { + """ + Athletes with deleted speedzones + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyAppMessage. +""" +type DestroyAppMessagePayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyAthleteGroup. +""" +type DestroyAthleteGroupPayload { + athleteGroups: [AthleteGroup!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyCustomQuestionDefinition. +""" +type DestroyCustomQuestionDefinitionPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyDataset. +""" +type DestroyDatasetPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyFlexibleReportCharts. +""" +type DestroyFlexibleReportChartsPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyFlexibleReports. +""" +type DestroyFlexibleReportsPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyMatchEvent. +""" +type DestroyMatchEventPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyMatchEvents. +""" +type DestroyMatchEventsPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroySegment. +""" +type DestroySegmentPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroySessionBlueprint. +""" +type DestroySessionBlueprintPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroySession. +""" +type DestroySessionPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroySessionTagDefinition. +""" +type DestroySessionTagDefinitionPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroySurvey. +""" +type DestroySurveyPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of DestroyTagDefinition. +""" +type DestroyTagDefinitionPayload { + errors: [ValidationError!]! +} + +type DetectedCoordinate { + """ + The latitude of the detected coordinate + """ + lat: Float! + + """ + The longitude of the detected coordinate + """ + lon: Float! +} + +type DetectedMatchEvent { + id: ID! + involvingTeam: MatchEventTeam + matchEventTypeId: ID! + matchMinute: Int + name: String! + occurredAt: ISO8601DateTime! + sessionParticipation: MatchSessionParticipation + sportDefinition: SportDefinition! + state: DetectedMatchEventState! +} + +enum DetectedMatchEventState { + confirmed + dismissed + pending +} + +""" +Information on a session that could have taken place +""" +type DetectedSession { + coordinates: [DetectedCoordinate!] + dataUploader: AthleteOrStaff + id: ID! + isProcessing: Boolean! @deprecated(reason: "This field is no longer used") + + """ + The pitch detected for this session + """ + pitch: Pitch + pitchCoordinateSetId: ID + + """ + Processing warnings for this detected session + """ + processingWarnings: [ProcessingWarning!]! +} + +""" +Attributes for updating a device +""" +input DeviceAttributes { + """ + firmware version for the device + """ + firmwareVersion: String! +} + +""" +A device (e.g. an Anchor, Edge, Gateway, Ball) +""" +interface DeviceInterface { + """ + The board version of the device + """ + boardName: FirmwareBoardName! + + """ + The device's full ID + """ + id: ID! + + """ + The owner of this device + """ + owner: DeviceOwner + + """ + The device's short ID, in hex format + """ + serialNumber: String! @deprecated(reason: "Use serialNumberHex instead") + + """ + The device's short ID, in hex format + """ + serialNumberHex: String! + + """ + base64 encoded copy of the passed in message encrypted and signed with the device's key + """ + signedMessage( + """ + The base64 encoded message to be encrypted + """ + messageBase64: String! + ): String +} + +""" +An owner of a device +""" +union DeviceOwner = Organisation | Person + +""" +The type of owner for a device +""" +enum DeviceOwnerType { + Organisation + Person +} + +""" +Device sync upload record +""" +type DeviceSync { + """ + ID of the associated device ownership + """ + deviceOwnershipId: ID! + + """ + Type of the associated device ownership + """ + deviceOwnershipType: String! + + """ + End time of the sync period + """ + endTime: ISO8601DateTime + + """ + Unique identifier for the device sync + """ + id: ID! + + """ + ID of the owner (staff or athlete) + """ + ownerId: ID + + """ + Start time of the sync period + """ + startTime: ISO8601DateTime + + """ + Version of the device sync data format + """ + version: Int! +} + +""" +The different device types that can be synced +""" +enum DeviceSyncTypeEnum { + ball + edge +} + +""" +The different harware devices +""" +enum DeviceTypeEnum { + Anchor + Ball + Edge + Gateway +} + +""" +Post data ingestion, additional diagnostics warnings are generated to determine +possible user errors during the session that explain why data may be missing +(e.g. they left the unit at the side of the pitch) +""" +type DiagnosticWarning { + """ + The type of the diagnostic warning. + """ + errorType: DiagnosticWarningErrorTypeEnum! + + """ + Explains why this warning occurred and what conditions led to it. + """ + explanation: String! + + """ + Unique identifier for the warning. Null for aggregated warnings. + """ + id: ID + + """ + A detailed message describing the warning. + """ + longMessage: String! + + """ + Describes the impact of this warning on the data or session. + """ + outcome: String! + + """ + List of recommended actions to prevent this warning in future sessions. + """ + remediation: [String!]! + + """ + A brief message summarizing the warning. + """ + shortMessage: String! +} + +""" +The type of diagnostic error +""" +enum DiagnosticWarningErrorTypeEnum { + BATTERY_DEPLETION + DATA_OUTSIDE_TIME_WINDOW + DATA_OVERWRITTEN + GPS_QUALITY + NO_GPS_DATA + PITCH_LOCATION_ERROR + UNIT_NOT_WORN + UNIT_SWITCHED_OFF +} + +""" +The display unit of the metric +""" +enum DisplayUnitEnum { + """ + Beats per minute + """ + BPM + + """ + Hours + """ + HOUR + + """ + Kilometers + """ + KM + + """ + Kilometers per hour + """ + KPH + + """ + Meters + """ + M + + """ + Minutes + """ + MIN + + """ + Seconds + """ + SEC + + """ + Unitless + """ + UNITLESS +} + +""" +Autogenerated return type of DuplicateFlexibleReport. +""" +type DuplicateFlexibleReportPayload { + errors: [ValidationError!]! + + """ + the created FlexibleReport + """ + report: FlexibleReport +} + +""" +Autogenerated return type of DuplicateSegment. +""" +type DuplicateSegmentPayload { + errors: [ValidationError!]! +} + +""" +Attributes to be used when duplicating a session +""" +input DuplicateSessionAttributes { + """ + New duplicated session start time. + """ + startTime: ISO8601DateTime! +} + +""" +Autogenerated return type of DuplicateSession. +""" +type DuplicateSessionPayload { + errors: [ValidationError!]! + + """ + Session + """ + session: Session +} + +""" +Autogenerated return type of DuplicateSurvey. +""" +type DuplicateSurveyPayload { + errors: [ValidationError!]! + + """ + Duplicated Survey + """ + survey: Survey +} + +""" +An Edge device +""" +type Edge implements DeviceInterface { + """ + The board version of the device + """ + boardName: FirmwareBoardName! + hasSessionData(sessionId: ID!): Boolean! + + """ + The device's full ID + """ + id: ID! + + """ + The last recorded edge name + """ + lastName(beforeTime: ISO8601DateTime): EdgeName + lastSeenAt: ISO8601DateTime + lastSyncTime: ISO8601DateTime + + """ + The organisation this edge is assigned to + """ + organisation: Organisation @deprecated(reason: "Use `owner` instead") + + """ + The owner of this device + """ + owner: DeviceOwner + renameMessage(newName: String!): String + + """ + The edge's short ID, in integer format + """ + serial: String! + + """ + The device's short ID, in hex format + """ + serialNumber: String! @deprecated(reason: "Use serialNumberHex instead") + + """ + The device's short ID, in hex format + """ + serialNumberHex: String! + + """ + base64 encoded copy of the passed in message encrypted and signed with the device's key + """ + signedMessage( + """ + The base64 encoded message to be encrypted + """ + messageBase64: String! + ): String +} + +type EdgeDataFile { + url(format: DatafileFormat): String +} + +type EdgeDiagnosticInformation { + boardVersion: String! + imageVersion: String! + metaEvents: [EdgeMetaEvent!]! + oldestDatapageTimestamp: ISO8601DateTime! +} + +interface EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + time: ISO8601DateTime! +} + +type EdgeName { + createdAt: ISO8601DateTime! + edge: Edge! + id: ID! + name: String! +} + +""" +The type of owner for a device +""" +enum EdgeOwnerType { + Organisation + Person +} + +input EdgeSessionFilter { + """ + Filter by edge name + """ + edgeNameCont: String @deprecated(reason: "Use edgeNameICont instead") + + """ + Filter by edge name (case insensitive) + """ + edgeNameICont: String + + """ + Filter by edge ID + """ + idEq: String + + """ + Filter by edges synced after date + """ + syncedAfter: [ISO8601DateTime!] +} + +""" +Autogenerated return type of EndEdgeOwnership. +""" +type EndEdgeOwnershipPayload { + edge: Edge + errors: [ValidationError!]! +} + +""" +An example prompt configuration for chat +""" +type ExamplePrompt { + """ + The description of the prompt + """ + description: String! + + """ + The icon name for the prompt + """ + icon: String! + + """ + The icon color (hex format) + """ + iconColor: String! + + """ + The actual prompt text to use + """ + prompt: String! + + """ + The title of the prompt + """ + title: String! +} + +type FeatureCheck { + enabled: Boolean! +} + +""" +An enum of all the features that can be enabled/disabled +""" +enum FeatureNameEnum { + """ + Enables scaling fonts for accessibility + """ + allow_font_scaling + + """ + Enables the anonymisation of session data on data recording addition + """ + anonymise_data_pipeline_enabled + + """ + Enables processing of gateway assignments received from the gateway assignment pipeline + """ + auto_gateway_assignment + + """ + Enables auto pitch detection + """ + auto_pitch_detection + + """ + Enables backfilling sampled speed blob job + """ + backfill_sampled_speed_blob_job + + """ + Enables the bad data clipping feature in the web application + """ + bad_data_clipping + + """ + Enables ball metrics + """ + ball_metrics + + """ + Enable report generation in the browser + """ + browser_report_gen + + """ + Enables setting up an edge to pair with a HR sensor + """ + bt_hr_sensor_pairing + + """ + *Deprecated* Enable chat interface + """ + chat + + """ + Enable extended chat capabilities including sports science research tools + """ + chat_extended_capabilities + + """ + Enables configurable metric comparisons + """ + configurable_comparison + + """ + *Deprecated* Enables scoped metric display by club + """ + configurable_metrics + + """ + Enable survey exports in CSV format + """ + csv_exports + + """ + Enables csv reporting options + """ + custom_csv + + """ + Enables custom survey questions + """ + custom_survey_questions + + """ + Enables customer flexible reporting + """ + customer_flexible_reporting + + """ + Enables live data backfill debounce + """ + debounce_live_data_backfill + + """ + Enables segments with nil duration + """ + duplicate_segment_null_times + + """ + Enables (self-serve) anchor firmware updates + """ + firmware_anchor_updates + + """ + Enables (self-serve) gateway firmware updates + """ + firmware_gateway_updates + + """ + Enables (self-serve) firmware updates, including prompts to update + """ + firmware_updates + + """ + Enables flexible reporting + """ + flexible_reporting + + """ + *Deprecated by Configurable Metrics* + """ + heartrate_data + + """ + Enables a variety of integrations with the hubspot API + """ + hubspot_integration + + """ + Enables the individual speed zones feature + """ + individual_speed_zones + + """ + Enables US / GB specific sports terms (e.g. match -> game) + """ + localized_terms + + """ + Enables new match session part processing + """ + match_session_parts_processing_v2 + + """ + Enables the reworked notifications modal + """ + notification_enhancements + + """ + Enables reading & writing pitches from Sessions::Session + """ + pitches_on_sessions + + """ + Enables processing diagnostics + """ + processing_diagnostics + + """ + Enables access to the recruitment dashboard via SSO + """ + recruitment_dashboard + + """ + Enables the report improvements feature + """ + report_improvements + + """ + Enables detected sessions v2 + """ + session_automation + + """ + Enables quick actions on sessions + """ + session_quick_actions + + """ + Enables archival of surveys + """ + survey_archival + + """ + Filters edge sync list to only show edges from a specific session + """ + sync_only_recent_edges + + """ + Enables speed graphs on tactical maps + """ + tactical_map_speed + + """ + Enables the tactical video playback feature + """ + tactical_video_playback + + """ + Enables using competitor S acceleration/deceleration metrics + """ + use_competitor_s_metrics + + """ + Enables warmup match session definitions + """ + warmup_match_session + + """ + Enables segment creation on the web + """ + web_segments + + """ + Enables the 2026 redesign of individual and club zone management + """ + zone_management_v2 +} + +enum FirmwareBoardName { + playerdata_anchor_v3_0_0 + playerdata_anchor_v5_0_0 + playerdata_anchor_v6_0_3 + playerdata_ball_v1_0_2 + playerdata_ball_v1_1_0 + playerdata_edge_v2_0_8 + playerdata_edge_v2_0_81 + playerdata_edge_v2_0_9 + playerdata_edge_v2_1_1 + playerdata_edge_v2_2_0 + playerdata_edge_v3_0_5 + playerdata_edge_v3_1_0 + playerdata_gateway_v1_0_0 + playerdata_gateway_v2_0_2_nrf5340_cpuapp + playerdata_gateway_v2_0_3_nrf5340_cpuapp +} + +enum FirmwareBuildProfile { + debug + release +} + +enum FirmwareFeatureVariant { + datafile_v4 + fixed + imu_recording + no_stillness + normal +} + +enum FirmwareProject { + anchor + anchor_factory_test + edge + edge_factory_test + gateway_v2 +} + +enum FirmwareVariant { + debug + release +} + +type FirmwareVersion { + boardName: String! + branchName: String! + buildProfile: FirmwareBuildProfile! + featureVariant: FirmwareFeatureVariant! + fileUrl: String! + firmwareVersion: String! + id: ID! + project: FirmwareProject! + variant: FirmwareVariant! @deprecated(reason: "Replaced by build_profile") +} + +""" +A report used for flexible reporting +""" +type FlexibleReport { + """ + The creation date of the report + """ + createdAt: ISO8601DateTime! + + """ + The dataset for the report + """ + dataset: Dataset! + + """ + The report id + """ + id: ID! + + """ + The owner of the report + """ + owner: AthleteStaffOrPdStaff! + + """ + The charts for the report + """ + reportCharts( + """ + Pagination limit + """ + limit: Int! + + """ + Pagination offset + """ + offset: Int! + ): [FlexibleReportChart!] + + """ + The report title + """ + title: String! + + """ + The last update date of the report + """ + updatedAt: ISO8601DateTime! +} + +""" +Attributes for creating a FlexibleReport +""" +input FlexibleReportAttributes { + """ + Club ID + """ + clubId: ID! + + """ + CSV Template ID (deprecated: will use a default template for flexible reports) + """ + csvTemplateId: ID + + """ + The end date for the range of + """ + endDate: ISO8601DateOrEmptyString + + """ + The grid config for the dataset + """ + gridConfig: JSON + + """ + The start date for the range of data + """ + startDate: ISO8601DateOrEmptyString + + """ + the report's title + """ + title: String! +} + +""" +A chart used within a flexible report +""" +type FlexibleReportChart { + """ + The chart config + """ + chartConfig: ChartConfig! + + """ + The creation date of the chart + """ + createdAt: ISO8601DateTime! + + """ + If chart data labels should be displayed + """ + displayDataLabels: Boolean! + + """ + The filters applied to the chart + """ + filters: JSON! + + """ + The chart id + """ + id: ID! + + """ + The position of the chart in the report + """ + position: Int + + """ + The sort config applied to the chart + """ + sortConfig: JSON! + + """ + The chart title + """ + title: String! + + """ + The last update date of the chart + """ + updatedAt: ISO8601DateTime! +} + +""" +A metric value type for float values +""" +type FloatMetricValue { + """ + The float value + """ + floatValue: Float! +} + +""" +A Live Data Gateway +""" +type Gateway implements DeviceInterface { + """ + The board version of the device + """ + boardName: FirmwareBoardName! + + """ + The public key for the certificate authority which signed the gateway certificate + """ + ca: String + + """ + The gateway's public certificate + """ + certificate: String + + """ + The organisation that currently owns the Gateway + """ + currentOrganisation: Organisation! + + """ + The firmware version the Gateway is running + """ + firmwareVersion: String! + + """ + The ID of the Gateway + """ + id: ID! + + """ + The owner of this device + """ + owner: DeviceOwner + + """ + The device's short ID, in hex format + """ + serialNumber: String! @deprecated(reason: "Use serialNumberHex instead") + + """ + The device's short ID, in hex format + """ + serialNumberHex: String! + + """ + base64 encoded copy of the passed in message encrypted and signed with the device's key + """ + signedMessage( + """ + The base64 encoded message to be encrypted + """ + messageBase64: String! + ): String +} + +""" +A Live Data Gateway Ownership +""" +type GatewayOwnership { + """ + The gateway + """ + gateway: Gateway! + + """ + The serial number of the gateway, in hex format + """ + gatewaySerial: String! + + """ + The sessions associated with the gateway ownership + """ + gatewaySessions: [GatewaySession!] + + """ + The ID of the Gateway ownership + """ + id: ID! + + """ + The name of the ownership + """ + name: String! +} + +""" +A Live Data Gateway Session +""" +type GatewaySession { + """ + A Gateway ownership + """ + gatewayOwnership: GatewayOwnership! + + """ + The ID of the Gateway Session + """ + id: ID! + + """ + The time of the last page received + """ + lastPageReceivedAt: ISO8601DateTime @deprecated(reason: "Use metrics updatedAt instead") + + """ + A session + """ + session: Session! +} + +""" +Attributes for a gateway session +""" +input GatewaySessionAttributes { + """ + A Gateway ownership ID + """ + gatewayOwnershipId: ID + + """ + A Session ID + """ + sessionId: ID @deprecated(reason: "Use the `session_id` argument to the mutation instead") +} + +""" +A generic metric type with common attributes +""" +type GenericMetric { + """ + The category of the metric + """ + category: String + + """ + The display unit of the metric + """ + displayUnit: DisplayUnitEnum @deprecated(reason: "Use `local_value_unit` instead") + + """ + The primary color of the icon + """ + iconColour: String + + """ + The name of the icon + """ + iconName: String + + """ + The secondary color of the icon + """ + iconSecondaryColour: String + + """ + The ID of the metric + """ + key: String! + + """ + The label for the metric + """ + label: String + + """ + The unit label of the metric in the local unit system + """ + localUnitLabel: String + + """ + The value of the metric in the local unit system + """ + localValue: MetricValueUnion + + """ + The unit of the metric value + """ + localValueUnit: DisplayUnitEnum + + """ + The precision of the metric + """ + precision: Int + + """ + The priority of the metric + """ + priority: Int + + """ + The short label for the metric + """ + shortLabel: String + + """ + The value of the metric + """ + value: MetricValueUnion @deprecated(reason: "Use `local_value` instead") +} + +""" +A generic metric explanation type with common attributes +""" +type GenericMetricExplanation { + """ + The value of the metric + """ + explanation: String + + """ + The primary color of the icon + """ + iconColour: String + + """ + The name of the icon + """ + iconName: String + + """ + The ID of the metric + """ + key: String! + + """ + The label for the metric + """ + label: String + + """ + The short label for the metric + """ + shortLabel: String +} + +""" +A generic personal bests type with common attributes and a date +""" +type GenericPersonalBestsMetric { + """ + The date the personal best was achieved + """ + achievedDate: ISO8601Date + + """ + The category of the metric + """ + category: String + + """ + The display unit of the metric + """ + displayUnit: DisplayUnitEnum @deprecated(reason: "Use `local_value_unit` instead") + + """ + The primary color of the icon + """ + iconColour: String + + """ + The name of the icon + """ + iconName: String + + """ + The secondary color of the icon + """ + iconSecondaryColour: String + + """ + The ID of the metric + """ + key: String! + + """ + The label for the metric + """ + label: String + + """ + The unit label of the metric in the local unit system + """ + localUnitLabel: String + + """ + The value of the metric in the local unit system + """ + localValue: MetricValueUnion + + """ + The unit of the metric value + """ + localValueUnit: DisplayUnitEnum + + """ + The precision of the metric + """ + precision: Int + + """ + The priority of the metric + """ + priority: Int + + """ + The type of session the personal best was achieved in + """ + sessionType: String! + + """ + The short label for the metric + """ + shortLabel: String + + """ + The value of the personal best metric + """ + value: Float +} + +""" +Autogenerated return type of HeartRateBounds. +""" +type HeartRateBoundsPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Heart rate zone boundaries as percentages +""" +type HeartRateLowerBounds { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +""" +Heart rate zone boundaries as percentages +""" +input HeartRateLowerBoundsInput { + """ + Zone 1 lower boundary + """ + zone1: Float! + + """ + Zone 2 lower boundary + """ + zone2: Float! + + """ + Zone 3 lower boundary + """ + zone3: Float! + + """ + Zone 4 lower boundary + """ + zone4: Float! + + """ + Zone 5 lower boundary + """ + zone5: Float! +} + +type HeartratePeripheralConnected implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + time: ISO8601DateTime! +} + +type HeartratePeripheralDisconnected implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + time: ISO8601DateTime! +} + +""" +An ISO 8601-encoded date +""" +scalar ISO8601Date @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") + +""" +An ISO8601 date string with flexibility for empty strings (eg. HTML input value='') +""" +scalar ISO8601DateOrEmptyString @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") + +""" +An ISO 8601-encoded datetime +""" +scalar ISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") + +""" +A metric value type for integer values +""" +type IntMetricValue { + """ + The integer value + """ + intValue: Int! +} + +""" +An interval representing a clipped time period with start_offset and end_offset in milliseconds +""" +input IntervalInput { + """ + End offset in milliseconds + """ + endOffset: Int! + + """ + Start offset in milliseconds + """ + startOffset: Int! + + """ + The tag definition IDs for the interval + """ + tagDefinitionIds: [ID!] +} + +""" +Represents untyped JSON +""" +scalar JSON + +""" +A metric value type for JSON values +""" +type JsonMetricValue { + """ + The JSON value + """ + jsonValue: JSON! +} + +""" +The context of a legacy survey distributed message +""" +type LegacySurveyDistributedContext { + """ + The title of the survey + """ + surveyTitle: String! +} + +""" +Link to a screen in the mobile app +""" +union Link = AthleteSessionLink | MatchSessionLink | TrainingSessionLink + +input LiveDataGatewayOwnershipAvailableGatewaysFilter { + nameCont: String +} + +input LiveDataGatewayOwnershipGatewaysCurrentlyOwnedFilter { + nameCont: String +} + +""" +Localized terminology for sports concepts +""" +type LocalizedTerms { + """ + Localized term for match/game + """ + match: String! + + """ + Localized term for pitch/field/court + """ + pitch: String! + + """ + Localized term for training/practice + """ + training: String! +} + +""" +A manual subscription +""" +type ManualSubscription implements CustomerSubscription { + cancelledAt: ISO8601DateTime + + """ + The id of the subscription + """ + id: ID! + subscriptionPortalUrl: String! +} + +type MapCoordinate { + latitude: Float! + longitude: Float! +} + +""" +Autogenerated return type of MarkAppMessageRead. +""" +type MarkAppMessageReadPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of MarkMultipleAppMessagesRead. +""" +type MarkMultipleAppMessagesReadPayload { + errors: [ValidationError!]! +} + +type MatchDefinition { + events: [MatchEventDefinition!]! + features: MatchFeature! + id: ID! + name: String! + periodBreakTimeMinutes: Int! + periodLengthMinutes: Int! + periods: [Period!]! +} + +type MatchEvent { + id: ID! + involvingTeam: MatchEventTeam + matchEventTypeId: ID! + matchMinute: Int + name: String! + occurredAt: ISO8601DateTime! + sessionParticipation: MatchSessionParticipation + sportDefinition: SportDefinition! +} + +""" +Attributes for a match event +""" +input MatchEventAttributes { + involvingTeam: MatchEventTeam + matchEventTypeId: ID! + occurredAt: ISO8601DateTime + sessionParticipationId: ID +} + +""" +Classes of match event +""" +enum MatchEventClassEnum { + OnPitchEvent + PitchEntryEvent + PitchExitEvent +} + +""" +Autogenerated return type of MatchEventCreatedSubscription. +""" +type MatchEventCreatedSubscriptionPayload { + """ + The new match event + """ + matchEvent: MatchEvent! +} + +type MatchEventDefinition { + className: String! + id: ID! + name: String! +} + +enum MatchEventTeam { + both_teams + opposing_team + our_team +} + +type MatchFeature { + avgPositions: Boolean! + heatmaps: Boolean! + pathmaps: Boolean! + playback: Boolean! +} + +""" +Attributes for defining a Match Period +""" +input MatchPeriodAttributes { + endTime: ISO8601DateTime! + startTime: ISO8601DateTime! +} + +type MatchSession implements Session & TimelineItem { + """ + Diagnostic warnings that apply to all session participations with data recordings + """ + aggregatedDiagnosticWarnings: [DiagnosticWarning!]! + assignableEdges(filter: EdgeSessionFilter): [Edge!]! @deprecated(reason: "Use availableEdges") + assignableLiveDataEdges(filter: EdgeSessionFilter, limit: Int, offset: Int): [Edge!]! @deprecated(reason: "Use availableEdges") + availableCameraOwnerships(limit: Int!, offset: Int!): [CameraOwnership!]! + availableEdges(filter: EdgeSessionFilter, limit: Int!, offset: Int!, order: [OrderInputObject!]): [Edge!]! + + """ + A list of gateway ownerships that can be used + """ + availableGateways(filter: LiveDataGatewayOwnershipAvailableGatewaysFilter, limit: Int, offset: Int): [GatewayOwnership!]! + ballDataRecordings( + """ + Only return recordings that have a downloadable URL + """ + withData: Boolean = false + ): [BallDataRecording!]! + + """ + The session blueprint that was created from this session + """ + childSessionBlueprint: SessionBlueprint + club: Club + + """ + Returns metrics for a session + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + Returns configured aggregated metrics for a session + """ + configuredMetricExplanations: [GenericMetricExplanation!] + createdByAi: Boolean! + creator: AthleteOrStaff! + dataProcessing: Boolean! + description: String + detectedMatchEvents: [DetectedMatchEvent!]! + detectedSession: DetectedSession + detectingMatchEvents: Boolean! @deprecated(reason: "No longer able to check if we are detecting match events") + edgeSyncRequired: Boolean! + endTime: ISO8601DateTime + gatewaySessions: [GatewaySession!]! + hasSurveyToAnswer: Boolean! + id: ID! + isLiveSession: Boolean! + isSurveyDistributionVisible: Boolean! + lastPageReceivedAt: ISO8601DateTime @deprecated(reason: "Use metrics updatedAt instead") + + """ + The latest AI-generated summary for this session + """ + latestAiSummary: SessionSummary + liveDataReady: Boolean! + matchDefinition: MatchDefinition! + matchEvents: [MatchEvent!]! + matchMinute(occurredAt: ISO8601DateTime!): Int + matchSessionMetricSet: MatchSessionMetricSet + matchSessionPeriods: [MatchSessionPeriod!]! + metricExplanations: MetricExplanations + metricSetVersion: String! + mySurveyAssignment: SurveyAssignment + opponent: String + opponentScore: Int + orderedSegments(limit: Int, offset: Int): [Segment!]! @deprecated(reason: "Use segments instead") + ourTeam: String! + owner: AthleteOrStaff! @deprecated(reason: "Use creator instead") + + """ + The session blueprint that created this session + """ + parentSessionBlueprint: SessionBlueprint + pitch: Pitch + + """ + The coordinate set used to calculate the match metrics + """ + pitchCoordinateSet: PitchCoordinateSet + + """ + Returns the match session before the current one if available. + When an athlete_id is provided, filters previous sessions to only those that the athlete participated in + """ + previousSession(athleteId: ID): MatchSession + + """ + Returns the quick action state for a session + """ + quickActionState: QuickActionStateEnum! + result: MatchSessionResult + score: Int + segments(limit: Int, offset: Int, order: [OrderInputObject!]): [Segment!]! + + """ + Returns the last 5 sessions of the same type and average load metrics for opposite type sessions + """ + sessionLoadHistory: SessionLoadHistory + sessionParticipation(athleteId: ID!, positionId: String): SessionParticipation + sessionParticipations(limit: Int, offset: Int, withData: Boolean): [MatchSessionParticipation!] + sessionParticipationsCount(withData: Boolean): Int! + + """ + Video for the session + """ + sessionVideo: SessionVideo + settings: Settings! + sportDefinition: SportDefinition + startTime: ISO8601DateTime! + surveyDistribution: SurveyDistribution + tags: [SessionTagDefinition!]! + + """ + The time this item should be displayed in the user's timeline + """ + timelineTime: ISO8601DateTime! + + """ + A list of gateway ownerships that are already assigned to this session + """ + unavailableGateways(atSessionTime: Boolean, limit: Int, offset: Int): [GatewayOwnership!]! + updatedAt: ISO8601DateTime! + + """ + Displays warnings as to why the session does not yet have metrics + """ + warnings: [SessionWarnings!]! +} + +type MatchSessionAthleteMetricSet implements CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + diveEvents: Int + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +type MatchSessionAthletePeriodMetricSet implements CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + athlete: Athlete! + averagePosition: AveragePosition + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + + """ + The configured metrics for the metric set + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + diveEvents: Int + heatmap: String + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + matchSessionPeriod: MatchSessionPeriod! + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + minutesPlayed: Int! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + pathmaps: [Pathmap!] + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +""" +Link to a match session in the mobile app +""" +type MatchSessionLink { + """ + The ID of the match session + """ + id: ID! + + """ + The name of the opposing team + """ + opponent: String! + + """ + The screen to navigate to (always 'MatchSession') + """ + screen: String! + + """ + The date of the session + """ + sessionDate: ISO8601Date! + + """ + The end time of the session + """ + sessionEndTime: ISO8601DateTime! + + """ + The start time of the session + """ + sessionStartTime: ISO8601DateTime! +} + +type MatchSessionMetricSet implements CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + + """ + The ID of the session metric set. + """ + id: ID! + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +type MatchSessionParticipation implements SessionParticipation { + """ + All configured athlete metrics for a match session participation + """ + allConfiguredAthleteMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): [ConfiguredMetrics!] + athlete: Athlete! + + """ + Returns the metrics for a participation + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + dataRecordings: [DataRecording!]! + datafiles: [EdgeDataFile!]! + + """ + The diagnostic warnings for the session participation + """ + diagnosticWarnings: [DiagnosticWarning!]! + edgeAssignmentGuess: Edge + filteredDataFileUrl: String + id: ID! + matchEvents( + """ + Classes of the event to include + """ + eventClasses: [MatchEventClassEnum!] + ): [MatchEvent!] + matchMinutesPlayed: Int! + matchSession: MatchSession + matchSessionParticipationParts: [MatchSessionParticipationPart!] + metricSet: MatchSessionAthleteMetricSet + periodMetricSets: [MatchSessionAthletePeriodMetricSet!] + pitchEntryEvents: [MatchEvent!] @deprecated(reason: "Use the matchEvents field instead") + pitchExitEvents: [MatchEvent!] @deprecated(reason: "Use the matchEvents field instead") + position: PositionDefinition + segmentParticipations: [SegmentParticipation!] + session: Session! + startingSquad: Boolean + tagDefinitions( + """ + Limit the number of tag definitions returned + """ + limit: Int + + """ + Offset the number of tag definitions returned + """ + offset: Int + ): [TagDefinition!] + + """ + Time filter ranges for the participation (array of [start_time, end_time] pairs) + """ + timeFilters: [[ISO8601DateTime!]!]! + + """ + The warnings for the session participation + """ + warnings: [SessionParticipationWarningCodes!]! +} + +""" +Represents a part of an athlete's participation in a match session +""" +type MatchSessionParticipationPart { + """ + Configured metrics for a match session participation part + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + + """ + The time when this participation part ended + """ + endTime: ISO8601DateTime! + + """ + Unique identifier for the match session participation part + """ + id: ID! + + """ + The overall match session participation this part belongs to + """ + matchSessionParticipation: MatchSessionParticipation! + + """ + The specific period of the match this participation part occurred in + """ + matchSessionPeriod: MatchSessionPeriod! + + """ + The set of metrics associated with this participation part + """ + metricSet: MatchSessionParticipationPartMetricSet + + """ + The overall session this participation part is associated with + """ + session: Session! + + """ + The time when this participation part started + """ + startTime: ISO8601DateTime! +} + +""" +Represents the metric set for a participation part in a match session +""" +type MatchSessionParticipationPartMetricSet implements CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + diveEvents: Int + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +type MatchSessionPeriod { + """ + Configured aggregated metrics for a match session period + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + detectedMatchEvents: [DetectedMatchEvent!] + endTime: ISO8601DateTime! + id: ID! + matchEvents: [MatchEvent!] + matchSessionAthletePeriodMetricSets: [MatchSessionAthletePeriodMetricSet!] + matchSessionParticipations: [MatchSessionParticipation!] + matchSessionPeriodMetricSet: MatchSessionPeriodMetricSet + name: String! + startTime: ISO8601DateTime! +} + +type MatchSessionPeriodMetricSet implements CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + id: ID! + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +enum MatchSessionResult { + draw + loss + win +} + +""" +Explanations for metrics +""" +type MetricExplanations { + """ + An explanation of the top speed metric + """ + maxSpeedKph: String! + + """ + An explanation of the metres per minute metric + """ + metresPerMinute: String! + + """ + An explanation of the sprint events metric + """ + sprintEvents: String! + + """ + An explanation of the acceleration events metric + """ + totalAccelerationEvents: String! + + """ + An explanation of the deceleration events metric + """ + totalDecelerationEvents: String! + + """ + An explanation of the total distance metric + """ + totalDistanceM: String! + + """ + An explanation of the high intensity distance metric + """ + totalHighIntensityDistanceM: String! + + """ + An explanation of the high intensity events metric + """ + totalHighIntensityEvents: String! + + """ + An explanation of the sprint distance metric + """ + totalSprintDistanceM: String! + + """ + An explanation of the workload metric + """ + workload: String! +} + +""" +Additional aggregated metric set metadata columns +""" +type MetricSetAggMetadata { + """ + The last update timestamp for the metric set + """ + updatedAt: ISO8601DateTime +} + +""" +Additional metric set metadata columns, including warnings and timestamps +""" +type MetricSetMetadata { + """ + The warnings for the metric set + """ + processingWarnings: [ProcessingWarning!]! + + """ + The last update timestamp for the metric set + """ + updatedAt: ISO8601DateTime +} + +""" +A union of possible metric value types +""" +union MetricValueUnion = FloatMetricValue | IntMetricValue | JsonMetricValue + +type MobileDevice { + firebaseToken: String! + id: ID! + platform: Platform +} + +""" +Attributes for a session +""" +input MutateSessionAttributes { + """ + Array of athlete UUIDs participating in the session. + """ + athleteIds: [ID!] + + """ + Create a blueprint from the session. + """ + blueprint: Boolean + + """ + The ID of the camera ownership to be assigned to the session. + """ + cameraOwnershipId: ID + + """ + The ID of the club that the session belongs to. + """ + clubId: ID + + """ + The id of the creator of the session + """ + creatorId: ID + + """ + A description of the session. + """ + description: String + + """ + The detected session associated with this session + """ + detectedSessionId: ID + + """ + Session end time + """ + endTime: ISO8601DateTime + + """ + Array of gateway ownership UUIDs. + """ + gatewayOwnershipIds: [ID!] + + """ + Required to set match_definitoon + """ + matchTypeId: ID + + """ + The opponent of the session. + """ + opponent: String + + """ + The opponent score of the session. + """ + opponentScore: Int + + """ + The name of our team. Used to rename the club name to a team name. + """ + ourTeam: String + + """ + The periods of a match session. + """ + periods: [MatchPeriodAttributes!] + + """ + The coordinate set for the pitch that the match was played on. + """ + pitchCoordinateSetId: ID + + """ + Session result. + """ + result: MatchSessionResult + + """ + The score of the session. + """ + score: Int + + """ + Array of session tag definition UUIDs. + """ + sessionTagDefinitionIds: [ID!] + + """ + The type of the session. + """ + sessionType: SessionTypeEnum + + """ + Session start time. + """ + startTime: ISO8601DateTime + + """ + A survey to be completed by all athletes participating + """ + surveyId: ID +} + +""" +Attributes for a session blueprint +""" +input MutateSessionBlueprintAttributes { + """ + Array of athlete UUIDs participating in the session. + """ + athleteIds: [ID!] + + """ + A description of the session. + """ + description: String + + """ + The duration of the session blueprint + """ + duration: Int + + """ + Array of gateway ownership UUIDs. + """ + gatewayOwnershipIds: [ID!] + + """ + The match type for the session blueprint + """ + matchTypeId: ID + + """ + Pitch coordinate set for a blueprint + """ + pitchCoordinateSetId: ID + + """ + The segments for the session blueprint + """ + segments: [SessionBlueprintSegmentAttributes!] + + """ + The type of the session to be created from the blueprint + """ + sessionType: SessionTypeEnum + + """ + The start time of the session blueprint + """ + startTime: String + + """ + A survey to be completed by all athletes participating + """ + surveyId: ID + + """ + Array of session tag definition UUIDs. + """ + tagDefinitionIds: [ID!] + + """ + The day of the week the session blueprint occurs on + """ + weekDay: Int +} + +type Mutation { + """ + Accept a privacy policy change + """ + acceptPrivacyPolicy( + """ + The ID of the policy to accept + """ + policyId: ID! + ): AcceptPrivacyPolicyPayload + addAthleteGroup(attributes: AthleteGroupAttributes!): AddAthleteGroupPayload + + """ + Adds an existing Person to a Club + """ + addExistingPersonToClub(personAttributes: UpdatePersonAttributes, signupToken: String!): AddExistingPersonToClubPayload + + """ + Adds a new Person to a Club + """ + addNewPersonToClub(attributes: NewPersonAttributes!): AddNewPersonToClubPayload + + """ + Answer a survey question + """ + addSurveyAnswer(attributes: SurveyAnswerAttributes!): AddSurveyAnswerPayload + + """ + Bulk approve of pending members, returning the approved athletes. + """ + approveAllPendingMembers( + """ + IDs of pending members to approve + """ + ids: [ID!]! + ): BulkApprovePayload + + """ + A Mutation Performed by Club Staff on a Club Member + """ + archiveClubMember( + """ + The ID of the club to update + """ + clubId: ID! + + """ + The ID of the person to update + """ + id: ID! + ): ArchiveClubMemberPayload + archivePitch(id: ID!): ArchivePitchPayload + + """ + Archive a survey + """ + archiveSurvey( + """ + The ID of the survey to archive + """ + id: ID! + ): ArchiveSurveyPayload + + """ + Assign a device to an owner + """ + assignDevice( + """ + ID of the owner to assign the device to + """ + ownerId: ID! + + """ + Type of the owner + """ + ownerType: DeviceOwnerType! + + """ + Serial number of the device to assign + """ + serialNumber: BigInt! + + """ + Type of hardware device + """ + type: DeviceTypeEnum! + ): AssignDevicePayload + + """ + Assign an edge to an owner + """ + assignEdge(edgeId: ID!, ownerId: ID!, ownerType: EdgeOwnerType!): AssignEdgePayload + + """ + Bulk update of athlete accelzones + """ + athletesAccelzones( + """ + Athlete accelzones attributes + """ + attributes: AthleteAccelzoneAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): AccelzonesPayload + + """ + Bulk update of athlete decelzones + """ + athletesDecelzones( + """ + Athlete decelzones attributes + """ + attributes: AthleteDecelzoneAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): DecelzonesPayload + + """ + Bulk delete of athlete accelzones + """ + athletesDeleteAccelzones( + """ + IDs of athletes whose accelzones are to be deleted + """ + athleteIds: [ID!]! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): DeleteAccelzonesPayload + + """ + Bulk delete of athlete decelzones + """ + athletesDeleteDecelzones( + """ + IDs of athletes whose decelzones are to be deleted + """ + athleteIds: [ID!]! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): DeleteDecelzonesPayload + + """ + Bulk delete of athlete heart rate bounds + """ + athletesDeleteHeartRateBounds( + """ + IDs of athletes whose heart rate bounds are to be deleted + """ + athleteIds: [ID!]! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): DeleteHeartRateBoundsPayload + + """ + Bulk delete of athlete speedzones + """ + athletesDeleteSpeedzones( + """ + IDs of athletes whose speedzones are to be deleted + """ + athleteIds: [ID!]! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): DeleteSpeedzonesPayload + + """ + Bulk update of athlete heart rate bounds + """ + athletesHeartRateBounds( + """ + Athlete heart rate bounds attributes + """ + attributes: AthleteHeartRateBoundsAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): HeartRateBoundsPayload + + """ + Bulk update of athlete relative accelzones + """ + athletesRelativeAccelzones( + """ + Athlete relative accelzones attributes + """ + attributes: AthleteRelativeAccelzoneAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): RelativeAccelzonesPayload + + """ + Bulk update of athlete relative decelzones + """ + athletesRelativeDecelzones( + """ + Athlete relative decelzones attributes + """ + attributes: AthleteRelativeDecelzoneAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): RelativeDecelzonesPayload + + """ + Bulk update of athlete speedzones + """ + athletesRelativeSpeedzones( + """ + Athlete relative speedzones attributes + """ + attributes: RelativeSpeedzoneAttributes! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + ): RelativeSpeedzonesPayload + + """ + Bulk update of athlete speedzones + """ + athletesSpeedzones( + """ + Athlete speedzones attributes + """ + attributes: AthleteSpeedzoneAttributes! + + """ + Whether to reprocess the speedzones + """ + reprocess: Boolean + ): SpeedzonesPayload + + """ + mutation for claiming an Athlete + """ + claimPerson( + """ + attributes for claiming a Person + """ + attributes: ClaimPersonAttributes! + ): ClaimPersonPayload + + """ + The club to perform mutations on + """ + club(id: ID!): ClubMutation + + """ + Respond to a question + """ + createChatResponse( + """ + The ID of the question to respond to + """ + questionId: ID! + + """ + The response + """ + response: String! + ): CreateResponsePayload + + """ + Create a custom question definition + """ + createCustomQuestionDefinition( + """ + Custom Question Definition Attributes + """ + attributes: CustomQuestionDefinitionAttributes! + clubId: ID! + ): CreateCustomQuestionDefinitionPayload + + """ + Create a dataset + """ + createDataset( + """ + Attributes for creating a dataset + """ + attributes: DatasetAttributes! + ): CreateDatasetPayload + + """ + Create a DeviceSync with an uploaded file blob + """ + createDeviceSync( + """ + Input parameters for creating a device sync + """ + input: CreateDeviceSyncInput! + ): CreateDeviceSyncPayload + createEdgeName(edgeId: ID!, name: String!): CreateEdgeNamePayload + + """ + create a FlexibleReport along with its dataset + """ + createFlexibleReport( + """ + attributes to create/update a flexible report + """ + attributes: FlexibleReportAttributes! + ): CreateFlexibleReportPayload + + """ + Create a flexible report chart + """ + createFlexibleReportChart( + """ + Attributes for creating a flexible report chart + """ + attributes: CreateFlexibleReportChartAttributes! + ): CreateFlexibleReportChartPayload + + """ + Create a match event + """ + createMatchEvent(attributes: MatchEventAttributes!, sessionId: ID!): CreateMatchEventPayload @deprecated(reason: "Use createMatchEvents instead") + + """ + Create match events + """ + createMatchEvents(attributes: [MatchEventAttributes!]!, sessionId: ID!): CreateMatchEventsPayload + + """ + Define a new pitch + """ + createPitch(attributes: PitchAttributes!, clubId: ID @deprecated(reason: "Use ownerId and ownerType instead"), detectedSessionId: ID, ownerId: ID, ownerType: OwnerEnum): CreatePitchPayload + + """ + Ask a question + """ + createQuestion( + """ + The question to ask + """ + question: String! + + """ + The ID of the staff member asking the question + """ + staffId: ID! + ): CreateQuestionPayload + createReport(attributes: ReportAttributes!): CreateReportPayload + + """ + Create a Training/Match session + """ + createSession( + """ + Session attributes + """ + attributes: MutateSessionAttributes! + ): CreateSessionPayload + + """ + Create a session segment + """ + createSessionSegment(attributes: SegmentAttributes!, id: ID): CreateSegmentPayload + + """ + Create a session tag definition + """ + createSessionTagDefinition(attributes: SessionTagDefinitionAttributes!, clubId: ID!): CreateSessionTagDefinitionPayload @deprecated(reason: "Use createTagDefinition instead.") + + """ + Create a new survey + """ + createSurvey(attributes: SurveyAttributes!, clubId: ID!): CreateSurveyPayload + + """ + Create a timer trigger for distributing surveys + """ + createSurveyTimerTrigger(attributes: SurveyTimerTriggerAttributes!): CreateSurveyTimerTriggerPayload + + """ + Create a tag definition + """ + createTagDefinition( + """ + Attributes for the tag definition + """ + attributes: TagDefinitionAttributes! + + """ + Tagger attributes + """ + tagger: TaggerAttributes! + ): CreateTagDefinitionPayload + + """ + Create a video recording record ready for camera upload + """ + createVideoRecording( + """ + Attributes for creating a new video recording + """ + attributes: VideoRecordingAttributes! + ): CreateVideoRecordingPayload + destroyAthleteGroup(groupId: ID!): DestroyAthleteGroupPayload + + """ + Destroy Custom Question Definition + """ + destroyCustomQuestionDefinition( + clubId: ID! + + """ + ID of the custom question definition to be destroyed + """ + id: ID! + ): DestroyCustomQuestionDefinitionPayload + + """ + Destroy a Dataset + """ + destroyDataset( + """ + ID of Dataset to destroy + """ + id: ID! + ): DestroyDatasetPayload + + """ + destroy flexible report charts given an array of FlexibleReportChart ids + """ + destroyFlexibleReportCharts( + """ + ids of FlexibleReportChart records + """ + chartIds: [ID!]! + ): DestroyFlexibleReportChartsPayload + + """ + destroy flexible reports given an array of FlexibleReport ids + """ + destroyFlexibleReports( + """ + ids of FlexibleReport records + """ + reportIds: [ID!]! + ): DestroyFlexibleReportsPayload + + """ + Destroy a match event + """ + destroyMatchEvent(id: ID!): DestroyMatchEventPayload @deprecated(reason: "Use destroyMatchEvents instead") + + """ + Destroy match events + """ + destroyMatchEvents(ids: [ID!]!): DestroyMatchEventsPayload + + """ + Destroy a session + """ + destroySession(id: ID!): DestroySessionPayload + + """ + Destroy a session blueprint + """ + destroySessionBlueprint( + """ + The ID of the session blueprint to destroy + """ + id: ID! + ): DestroySessionBlueprintPayload + + """ + Destroy a session segment + """ + destroySessionSegment(id: ID!): DestroySegmentPayload + + """ + Destroy a session tag definition + """ + destroySessionTagDefinition(id: ID!): DestroySessionTagDefinitionPayload @deprecated(reason: "Use destroyTagDefinition instead.") + + """ + Destroy a tag definition + """ + destroyTagDefinition( + """ + ID of the tag definition + """ + id: ID! + ): DestroyTagDefinitionPayload + + """ + Destroy an app message + """ + dismissAppMessage(id: ID!): DestroyAppMessagePayload + + """ + duplicate a FlexibleReport + """ + duplicateFlexibleReport( + """ + club ID the report is for + """ + clubId: ID! + + """ + ID of FlexibleReport to duplicate + """ + id: ID! + ): DuplicateFlexibleReportPayload + + """ + Duplicate a Training/Match session + """ + duplicateSession( + """ + Attributes to be used when duplicating a session + """ + attributes: DuplicateSessionAttributes! + + """ + ID of session to duplicate + """ + id: ID! + ): DuplicateSessionPayload + + """ + Duplicate a session segment, retaining its boundary times + """ + duplicateSessionSegment( + """ + The ID of the segment to duplicate + """ + id: ID! + ): DuplicateSegmentPayload + + """ + Duplicate an existing survey with a new title and ID + """ + duplicateSurvey( + """ + Input Attributes for Survey + """ + attributes: SurveyAttributes! + clubId: ID! + + """ + ID of the survey to be duplicated + """ + id: ID! + ): DuplicateSurveyPayload + + """ + End an edge's ownership + """ + endEdgeOwnership(edgeId: ID!): EndEdgeOwnershipPayload + + """ + Mark an app message as read + """ + markAppMessageRead(id: ID!): MarkAppMessageReadPayload + + """ + Mark multiple app messages as read + """ + markMultipleAppMessagesRead( + """ + IDs of the app messages to mark as read + """ + ids: [ID!]! + ): MarkMultipleAppMessagesReadPayload + + """ + Set up a gateway for use by the provided organisation + """ + provisionGateway( + """ + The Certificate Signing Request and COSE signature from the Gateway + """ + csr: String! + + """ + The current firmware version the Gateway is running + """ + firmwareVersion: String! + + """ + The organisation to assign the Gateway to + """ + organisationId: ID! + + """ + The serial number of the Gateway + """ + serialNumber: String! + ): ProvisionGatewayPayload + + """ + Rate a chat response + """ + rateChatResponse( + """ + The new rating for the response + """ + rating: RatingEnum + + """ + Explanation for the rating + """ + ratingExplanation: String + + """ + The ID of the response to rate + """ + responseId: ID! + ): RateResponsePayload + + """ + Recreates gateway sessions for a given gateway ownership and session. + """ + recreateGatewaySessions( + """ + Attributes for a Gateway Session + """ + attributes: [GatewaySessionAttributes!]! + + """ + A session ID + """ + sessionId: ID + ): RecreateGatewaySessionsPayload + + """ + Register a mobile device + """ + registerDevice(firebaseToken: String!, platform: Platform): RegisterDevicePayload + + """ + Remove a timer trigger + """ + removeSurveyTimerTrigger(surveyTimerTriggerId: ID!): RemoveSurveyTimerTriggerPayload + + """ + Resend the confirmation email to a PendingMember. + """ + resendPendingMemberConfirmationEmail( + """ + The ID of the pending member + """ + id: ID! + ): ResendConfirmationEmailPayload + resendReport(regenerate: Boolean, reportId: ID!): ResendReportPayload + + """ + Confirm or Dismiss a detected match event + """ + respondToDetectedMatchEvent(acceptEvent: Boolean!, id: ID!): RespondToDetectedMatchEventPayload @deprecated(reason: "Use respondToDetectedMatchEvents instead") + + """ + Confirm or Dismiss a set of detected match events + """ + respondToDetectedMatchEvents(acceptEvent: Boolean!, ids: [ID!]!): RespondToDetectedMatchEventsPayload + + """ + Approve or reject a PendingMember returning an Athlete or nothing. + """ + reviewPendingMember( + """ + Whether to approve the pending member + """ + approved: Boolean! + + """ + The ID of the pending member + """ + id: ID! + ): ReviewPendingMemberPayload + rotateLiveDataKeys(clubId: ID!): RotateLiveDataKeysPayload + + """ + set which players did not start in a match, other athletes on the session will be marked as starters + """ + setBenchedPlayers(matchSessionParticipations: [ID!]!, sessionId: ID!): SetBenchedPlayersPayload + + """ + Bulk update of a single custom max metric on athletes + """ + setCustomMaxMetric( + """ + IDs of athletes to update + """ + athleteIds: [ID!]! + + """ + The metric type to update + """ + metric: CustomMaxMetricEnum! + + """ + Whether to reprocess sessions after update + """ + reprocess: Boolean + + """ + The custom max value (nil to clear) + """ + value: Float + ): SetCustomMaxMetricPayload + + """ + Trigger the session detection v2 job + """ + triggerSessionDetectionV2( + """ + The Ids of Edges + """ + edgeIds: [String!]! + ): TriggerSessionDetectionV2Payload @deprecated(reason: "SessionDetectionV2 is not available") + + """ + A Mutation Performed by Club Staff on a Club Member + """ + unarchiveClubMember( + """ + The ID of the club to update + """ + clubId: ID! + + """ + The ID of the person to update + """ + id: ID! + ): UnarchiveClubMemberPayload + + """ + Update athlete's information + """ + updateAthlete(athleteId: ID!, attributes: UpdateAthleteAttributes!): UpdateAthletePayload + updateAthleteGroup(attributes: AthleteGroupAttributes!, groupId: ID!): UpdateAthleteGroupPayload + + """ + Update a club member's information + """ + updateClubMember( + attributes: UpdateClubMemberAttributes! + + """ + The ID of the club to update + """ + clubId: ID! + + """ + The ID of the person to update + """ + id: ID! + ): UpdateClubMemberPayload + + """ + Update settings for a club + """ + updateClubSettings( + attributes: UpdateClubSettingsAttributes! + clubId: ID! + + """ + Whether to reprocess sessions after zone changes + """ + reprocess: Boolean + ): UpdateClubSettingsPayload + + """ + Update a custom question definition + """ + updateCustomQuestionDefinition( + """ + Custom Question Definition Attributes + """ + attributes: CustomQuestionDefinitionAttributes! + clubId: ID! + + """ + ID of the custom question definition to be updated + """ + id: ID! + ): UpdateCustomQuestionDefinitionPayload + + """ + update a Dataset + """ + updateDataset( + """ + attributes to update a Dataset + """ + attributes: UpdateDatasetAttributes! + + """ + ID of Dataset to update + """ + id: ID! + ): UpdateDatasetPayload + + """ + Update the attributes for a device + """ + updateDevice( + """ + The attributes to update + """ + attributes: DeviceAttributes! + + """ + The serial number of the device + """ + serialNumber: BigInt! + + """ + The type of hardware device + """ + type: DeviceTypeEnum! + ): UpdateDevicePayload + + """ + update a FlexibleReport + """ + updateFlexibleReport( + """ + attributes to update a FlexibleReport + """ + attributes: UpdateFlexibleReportAttributes! + + """ + ID of FlexibleReport to update + """ + id: ID! + ): UpdateFlexibleReportPayload + + """ + Update a flexible report chart + """ + updateFlexibleReportChart( + """ + Attributes for updating a flexible report chart + """ + attributes: UpdateFlexibleReportChartAttributes! + + """ + ID of the flexible report chart to update. + """ + id: ID! + ): UpdateFlexibleReportChartPayload + + """ + Update position of a flexible report chart and reorder other charts accordingly + """ + updateFlexibleReportChartPosition( + """ + ID of the flexible report chart to update. + """ + id: ID! + + """ + New position for the chart. + """ + position: Int! + ): UpdateFlexibleReportChartPositionPayload + + """ + Update a gateway ownership's name + """ + updateGatewayOwnership( + """ + The attributes to update + """ + attributes: UpdateGatewayOwnershipAttributes! + + """ + The ID of the gateway ownership to update + """ + id: ID! + ): UpdateGatewayOwnershipPayload + + """ + Update a match event + """ + updateMatchEvent(attributes: MatchEventAttributes!, id: ID!): UpdateMatchEventPayload @deprecated(reason: "Use updateMatchEvents instead") + + """ + Update match events + """ + updateMatchEvents(attributes: [BulkUpdateMatchEventAttributes!]!): UpdateMatchEventsPayload + + """ + Updates a person's details + """ + updatePersonDetails( + attributes: UpdatePersonAttributes! + id: ID! + + """ + Whether to reprocess the speedzones + """ + reprocess: Boolean + ): UpdatePersonDetailsPayload + + """ + Update a pitch + """ + updatePitch(attributes: PitchAttributes!, pitchId: ID!): UpdatePitchPayload + + """ + Update a Training/Match session + """ + updateSession( + """ + Session attributes + """ + attributes: MutateSessionAttributes! + + """ + ID of session to update + """ + id: ID! + ): UpdateSessionPayload + + """ + Update a session blueprint + """ + updateSessionBlueprint( + """ + Session Blueprint attributes + """ + attributes: MutateSessionBlueprintAttributes! + + """ + ID of session blueprint to update + """ + id: ID! + ): UpdateSessionBlueprintPayload + + """ + Update session participations + """ + updateSessionParticipations( + """ + The attributes of the session participations + """ + attributes: [SessionParticipationAttributes!]! + ): UpdateSessionParticipationsPayload + + """ + Session positions + """ + updateSessionPositions(attributes: SessionPositionsAttributes!, id: ID!): UpdateSessionPositionsPayload + + """ + Update a session segment + """ + updateSessionSegment(attributes: SegmentAttributes @deprecated(reason: "Use patch instead."), id: ID!, patch: SegmentPatch): UpdateSegmentPayload @deprecated(reason: "Use updateSessionSegments instead") + + """ + Update session segments + """ + updateSessionSegments( + """ + List of segment patches to update session segments + """ + patches: [SegmentPatch!]! + ): UpdateSegmentsPayload + + """ + Update a session tag definition + """ + updateSessionTagDefinition(attributes: SessionTagDefinitionAttributes!, id: ID!): UpdateSessionTagDefinitionPayload @deprecated(reason: "Use updateTagDefinition instead.") + + """ + Update which staff have access to billing details + """ + updateStaffBilling(attributes: [UpdateStaffBillingAttributes!]!): UpdateStaffBillingPayload + + """ + Update a survey + """ + updateSurvey(attributes: SurveyAttributes!, id: ID!): UpdateSurveyPayload + + """ + Update a timer trigger + """ + updateSurveyTimerTrigger(attributes: SurveyTimerTriggerAttributes!, surveyTimerTriggerId: ID!): UpdateSurveyTimerTriggerPayload + + """ + Update a tag definition + """ + updateTagDefinition( + """ + Attributes for the tag definition + """ + attributes: TagDefinitionAttributes! + + """ + ID of the tag definition + """ + id: ID! + ): UpdateTagDefinitionPayload + + """ + Updates the user preferences for a given setting + """ + updateUserPreferences( + """ + Attributes for updating user preferences + """ + attributes: UpdateUserPreferencesAttributes! + ): UpdateUserPreferencesPayload + + """ + Create or update a chat club context + """ + upsertChatClubContext( + """ + The club context attributes to create or update + """ + attributes: ClubContextAttributes! + + """ + The club ID to create or update the context for + """ + clubId: ID! + ): UpsertChatClubContextPayload + + """ + Create or update a coach context + """ + upsertChatCoachContext( + """ + Attributes for the coach context + """ + attributes: CoachContextAttributesInput! + ): UpsertChatCoachContextPayload + + """ + Add EDGE data recordings to a session or update it + """ + upsertDataRecordings( + """ + Attributes for a data recording + """ + attributes: [UpsertDataRecordingsAttributes!]! + + """ + A session ID + """ + sessionId: ID! + ): UpsertDataRecordingsPayload + + """ + Create or update a session plan + """ + upsertSessionPlan( + """ + Session plan attributes + """ + attributes: SessionPlanAttributesInput! + + """ + ID of the club + """ + clubId: ID! + + """ + ID of session plan to update (null to create) + """ + sessionPlanId: ID + ): UpsertSessionPlanPayload +} + +""" +Attributes for creating a new Person +""" +input NewPersonAttributes { + acceptedEula: Boolean + acceptedPrivacyPolicy: Boolean! + dateOfBirth: ISO8601Date! + email: String! + gender: String! + name: String! + password: String! +} + +""" +The context of a new personal best message +""" +type NewPersonalBestContext { + """ + The id of the athlete + """ + athleteId: ID! + + """ + The new personal bests + """ + newPbs: PersonalBests! + + """ + The id of the session + """ + sessionId: ID! + + """ + The type of session + """ + sessionType: SessionTypeEnum! +} + +enum OperatingMode { + ChargeMode + DataCapture + DataTransfer + Error + FirmwareUpdate + HrPeripheralPairingMode + Powerdown +} + +type OperatingModeRequest implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + target: OperatingMode! + time: ISO8601DateTime! +} + +type OperatingModeTransition implements EdgeMetaEvent { + data: JSON! @deprecated(reason: "Use specific types instead") + target: OperatingMode! + time: ISO8601DateTime! +} + +enum OrderDirectionEnum { + asc + desc +} + +""" +A Parameter for ordering a list of records +""" +input OrderInputObject { + """ + The direction we want to order by + """ + direction: OrderDirectionEnum! + + """ + The field we want to order by + """ + field: String! +} + +type Organisation { + activeSubscription: CustomerSubscription + clubs: [Club!]! + edgeOwnershipsCount: Int! + id: ID! + name: String! + referralCode: String + subscriptions: [CustomerSubscription!] +} + +enum OwnerEnum { + Club + Person +} + +""" +Aggregated metrics across one or more session participations +""" +type ParticipationsMetricsSummary { + avgAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDistanceM: Float @deprecated(reason: "use avgTotalDistanceM instead") + avgHighIntensityEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgHighIntensityRunDistanceM: Float @deprecated(reason: "use avgTotalHighIntensityDistanceM instead") + avgMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + avgRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgSprintCount: Int @deprecated(reason: "use avgSprintEvents instead") + avgSprintDistanceM: Float @deprecated(reason: "use avgTotalSprintDistanceM instead") + avgSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + avgTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkload: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadIntensity: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadVolume: Float @deprecated(reason: "use configuredAggMetrics instead") + + """ + Configured metrics for the participation summary + """ + configuredAggMetrics: ConfiguredAggMetrics + + """ + Configured metrics for the participation summary + """ + configuredMetrics: ConfiguredMetrics @deprecated(reason: "use configuredAggMetrics instead") + maxMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + maxRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxSpeedKph: Float @deprecated(reason: "use maxMaxSpeedKph instead") + maxTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + sprintEvents: Int @deprecated(reason: "Use totalSprintEvents instead") + totalAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityRunDistanceM: Float @deprecated(reason: "Use totalHighIntensityDistanceM instead") + totalSprintCount: Int @deprecated(reason: "Use totalSprintEvents instead") + totalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") +} + +type Pathmap { + id: ID! + pathType: PathmapPathType! + paths: [[[Float!]!]!]! + pitchLimits: PathmapPitchLimits! +} + +enum PathmapPathType { + """ + high_intensity + """ + high_intensity + + """ + sprint + """ + sprint +} + +type PathmapPitchLimits { + maxX: Float! + maxY: Float! +} + +type PendingMember { + confirmationSentAt: ISO8601DateTime + confirmed: Boolean + email: String! + id: ID! + name: String! + resendConfirmationAllowed: Boolean! +} + +""" +Autogenerated return type of PendingMemberCreatedSubscription. +""" +type PendingMemberCreatedSubscriptionPayload { + """ + latest pending member created + """ + pendingMember: PendingMember +} + +type Period { + contributeToTotals: Boolean! + id: String! + name: String! +} + +""" +Autogenerated return type of PeriodMetricsUpdatedSubscription. +""" +type PeriodMetricsUpdatedSubscriptionPayload { + """ + Configured aggregated metrics for a match session period + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + The period metric set + """ + metricSet: MatchSessionPeriodMetricSet +} + +type Permission { + permitted: Boolean! +} + +enum PermissionAction { + Create + Destroy + Edit + Export + Index + New + Show + Update +} + +enum PermissionSubject { + Athlete + ClubSettings + PendingMember + Person + Pitch + Report + Session + SessionTagDefinition + Survey + SurveyDistribution + SurveyQuestion + SurveyTimerTrigger +} + +type Person { + accessibleEdges(clubId: ID @deprecated(reason: "Use org_ids instead"), edgeIds: [ID!], orgIds: [ID!]): [Edge!]! @deprecated(reason: "Use accessibleSyncables instead") + accessibleSyncables(deviceIds: [ID!], orgIds: [ID!]): [SyncableUnion!]! + aggregatedSessions(filter: SessionsSessionAggregatePersonMetricsFilter!, limit: Int @deprecated(reason: "Cannot be used with aggregation."), offset: Int @deprecated(reason: "Cannot be used with aggregation.")): [AggregatedSession!] + appMessages(clubId: ID): [AppMessage!]! + athlete(clubId: ID): Athlete + athleteClubs: [Club!]! @deprecated(reason: "Use athletes instead") + + """ + An athlete's session load history + """ + athleteLoadHistory(clubId: ID): SessionLoadHistory + athleteTotalRecords: AthleteRecords + athletes: [Athlete!]! + clubs(filter: ClubPersonFilter): [Club!]! + + """ + A person's configured personal bests + """ + configuredPersonalBests( + """ + Optional start_date filter + """ + startDate: ISO8601Date + ): ConfiguredPersonalBests + dateOfBirth: ISO8601Date + detectedSessions(clubId: ID): [DetectedSession!]! + + """ + Edges owned by the person + """ + edges: [Edge!] @deprecated(reason: "Use syncables_currently_owned instead") + + """ + Edges owned by the person + """ + edgesCurrentlyOwned: [Edge!] @deprecated(reason: "Use syncables_currently_owned instead") + email: String + + """ + Check if a feature is available for this person + """ + feature(name: String!): FeatureCheck! + gender: String + hasMultipleContexts: Boolean! + hasRegisteredEdge: Boolean! + id: ID! + initials: String! + + """ + The most recent session participation for a person with data + """ + lastSessionParticipationWithData: SessionParticipation + matchSessionParticipations(limit: Int!): [MatchSessionParticipation!]! + + """ + The minimum app version currently supported + """ + minimumAppVersion: String! + name: String! + playerDataStaff: Boolean! + profilePicture: ProfilePicture! + + """ + Session blueprints for the person used for recurring sessions + """ + sessionBlueprints(limit: Int, offset: Int): [SessionBlueprint!]! + + """ + Count of session blueprints for the person + """ + sessionBlueprintsCount: Int! + sessionParticipations(filter: SessionsSessionBaseFilter, limit: Int, offset: Int, order: [OrderInputObject!]): [SessionParticipation!]! + sessionParticipationsWithData(filter: SessionsSessionBaseFilter, limit: Int, offset: Int, order: [OrderInputObject!], startTimeGteq: ISO8601DateTime, startTimeLteq: ISO8601DateTime): [SessionParticipation!]! + + """ + personal user settings + """ + settings: Settings! + sportDefinition: SportDefinition + staff(clubId: ID!): Staff + staffClubs( + filter: ClubPersonFilter + + """ + Number of records to return + """ + limit: Int = 30 + + """ + Offset for pagination + """ + offset: Int + ): [Club!]! + + """ + Returns staff records for a person + """ + staffRecords: [Staff!]! + subscribedAt: ISO8601DateTime + subscription: CustomerSubscription + subscriptions: [CustomerSubscription!] + surveyAssignments(filter: SurveysSurveyAssignmentBaseFilter, limit: Int, offset: Int): [SurveyAssignment!]! + suspended: Boolean + + """ + Syncables owned by the person + """ + syncablesCurrentlyOwned: [SyncableUnion!] + + """ + The user's timeline + """ + timeline(dateRange: [ISO8601Date!], endDate: ISO8601Date @deprecated(reason: "Use date_range instead"), startDate: ISO8601Date @deprecated(reason: "Use date_range instead")): [TimelineDay!]! + trainingSessionParticipations(limit: Int!): [TrainingSessionParticipation!]! + unitOptions: UnitOptions + unitSystem: UnitSystem + + """ + breakdown of a weeks metrics by day + """ + weekBreakdown(startDate: ISO8601Date!): PersonWeekOverview! +} + +""" +Aggregated metrics across one or more session participations +""" +type PersonSessionsSummaryMetrics { + avgAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgDistanceM: Float @deprecated(reason: "use avgTotalDistanceM instead") + avgHighIntensityEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + avgHighIntensityRunDistanceM: Float @deprecated(reason: "use avgTotalHighIntensityDistanceM instead") + avgMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + avgRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + avgSprintCount: Int @deprecated(reason: "use avgSprintEvents instead") + avgSprintDistanceM: Float @deprecated(reason: "use avgTotalSprintDistanceM instead") + avgSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + avgTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgTotalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkload: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadIntensity: Float @deprecated(reason: "use configuredAggMetrics instead") + avgWorkloadVolume: Float @deprecated(reason: "use configuredAggMetrics instead") + + """ + Configured metrics for the participation summary + """ + configuredAggMetrics: ConfiguredAggMetrics + + """ + Configured metrics for the participation summary + """ + configuredMetrics: ConfiguredMetrics @deprecated(reason: "use configuredAggMetrics instead") + maxMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxMetresPerMinute: Float @deprecated(reason: "use configuredAggMetrics instead") + maxRawMaxSpeedKph: Float @deprecated(reason: "use configuredAggMetrics instead") + maxSpeedKph: Float @deprecated(reason: "use maxMaxSpeedKph instead") + maxTotalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + sprintEvents: Int @deprecated(reason: "Use totalSprintEvents instead") + totalAccelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDecelerationEvents: Float @deprecated(reason: "use configuredAggMetrics instead") + totalDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityEvents: Int @deprecated(reason: "use configuredAggMetrics instead") + totalHighIntensityRunDistanceM: Float @deprecated(reason: "Use totalHighIntensityDistanceM instead") + totalSprintCount: Int @deprecated(reason: "Use totalSprintEvents instead") + totalSprintDistanceM: Float @deprecated(reason: "use configuredAggMetrics instead") + totalSprintEvents: Int @deprecated(reason: "use configuredAggMetrics instead") +} + +""" +Aggregated metrics for each day of a week +""" +type PersonWeekOverview { + friday: PersonSessionsSummaryMetrics! + monday: PersonSessionsSummaryMetrics! + saturday: PersonSessionsSummaryMetrics! + + """ + summary of metrics for whole week + """ + summary: PersonSessionsSummaryMetrics! + sunday: PersonSessionsSummaryMetrics! + thursday: PersonSessionsSummaryMetrics! + tuesday: PersonSessionsSummaryMetrics! + wednesday: PersonSessionsSummaryMetrics! +} + +""" +Personal best records for an athlete +""" +type PersonalBests { + """ + Max number of acceleration events + """ + accelerationEvents: Int + + """ + Achievement date + """ + accelerationEventsDate: ISO8601DateTime + + """ + Max average speed in kilometres per hour + """ + avgSpeedKph: Float + + """ + Achievement date + """ + avgSpeedKphDate: ISO8601DateTime + + """ + Max number of deceleration events + """ + decelerationEvents: Int + + """ + Achievement date + """ + decelerationEventsDate: ISO8601DateTime + + """ + Max number of high intensity events + """ + highIntensityEvents: Int + + """ + Achievement date + """ + highIntensityEventsDate: ISO8601DateTime + + """ + Max heartrate in beats per minute + """ + maxHeartrateBpm: Int + + """ + Achievement date + """ + maxHeartrateBpmDate: ISO8601DateTime + + """ + Max Speed in kilometres per hour + """ + maxSpeedKph: Float + + """ + Achievement date + """ + maxSpeedKphDate: ISO8601DateTime + + """ + Max metres per minute + """ + metresPerMinute: Int + + """ + Achievement date + """ + metresPerMinuteDate: ISO8601DateTime + + """ + Max raw speed in kilometres per hour + """ + rawMaxSpeedKph: Float + + """ + Achievement date + """ + rawMaxSpeedKphDate: ISO8601DateTime + + """ + Max number of sprint events + """ + sprintEvents: Int + + """ + Achievement date + """ + sprintEventsDate: ISO8601DateTime + + """ + Max total distance in metres + """ + totalDistanceM: Int + + """ + Achievement date + """ + totalDistanceMDate: ISO8601DateTime + + """ + Max total high intensity distance in metres + """ + totalHighIntensityDistanceM: Int + + """ + Date + """ + totalHighIntensityDistanceMDate: ISO8601DateTime + + """ + Max total sprint distance in metres + """ + totalSprintDistanceM: Int + + """ + Achievement date + """ + totalSprintDistanceMDate: ISO8601DateTime +} + +type Pitch { + """ + The most recently created coordinate set for this pitch + """ + currentCoordinateSet: PitchCoordinateSet! + id: ID! + name: String! + pitchBackgroundUrl: String! + sportId: ClubSport! +} + +""" +Attributes for creating a new Pitch +""" +input PitchAttributes { + name: String! + pitchCoordinateSet: PitchCoordinateSetAttributes! + sportId: ClubSport +} + +type PitchCoordinate { + id: ID! + latitude: Float! + longitude: Float! +} + +""" +Attributes defining a pitch coorindate +""" +input PitchCoordinateAttributes { + latitude: Float! + longitude: Float! +} + +type PitchCoordinateSet { + bottomLeft: PitchCoordinate! + bottomRight: PitchCoordinate! + id: ID! + pitchCoordinates: [PitchCoordinate!]! @deprecated(reason: "use named coordinates instead") + topLeft: PitchCoordinate! + topRight: PitchCoordinate! +} + +""" +Attributes for defining pitch coordinates +""" +input PitchCoordinateSetAttributes { + bottomLeft: PitchCoordinateAttributes! + bottomRight: PitchCoordinateAttributes! + topLeft: PitchCoordinateAttributes! + topRight: PitchCoordinateAttributes! +} + +type PitchCorners { + bottomLeft: [Float!]! + bottomRight: [Float!]! + topLeft: [Float!]! + topRight: [Float!]! +} + +type PitchDefinition { + imagePath: String! + pitchCorners: PitchCorners! + ratio: Float! + reportImagePath: String! +} + +""" +Autogenerated return type of PitchDetectedSubscription. +""" +type PitchDetectedSubscriptionPayload { + """ + When the pitch detection completed + """ + detectedAt: ISO8601DateTime! + + """ + When this notification will expire (frontend should hide after this time) + """ + expiresAt: ISO8601DateTime! + + """ + The name of the detected pitch (null if no pitch detected) + """ + pitchName: String + + """ + The session ID where pitch detection was performed + """ + sessionId: ID! + + """ + Whether a pitch was successfully detected + """ + success: Boolean! +} + +enum Platform { + """ + A device running Android + """ + ANDROID + + """ + A device running iOS + """ + IOS + + """ + Running in a web browser + """ + WEB +} + +""" +Attributes for a position +""" +input PositionAttributes { + athleteId: String! + positionId: String +} + +type PositionDefinition { + id: String! + initial: String + name: String! +} + +""" +An object representing a privacy policy +""" +type PrivacyPolicy { + """ + Location of the privacy policy + """ + documentUrl: String! + + """ + ID of the PrivacyPolicy + """ + id: ID! + + """ + Date the policy take effect + """ + startDate: ISO8601Date! + + """ + The version number of the policy + """ + version: String! +} + +""" +An object representing an acceptance of a privacy policy by a person +""" +type PrivacyPolicyAcceptance { + """ + The method of acceptance + """ + acceptanceMethod: String! + + """ + Email address of the person + """ + email: String! + + """ + ID of the PrivacyPolicyAcceptance + """ + id: ID! + + """ + Name of the person + """ + name: String! + + """ + ID of the person who accepted the policy + """ + personId: ID! + + """ + The privacy policy + """ + privacyPolicy: PrivacyPolicy! + + """ + Accepted status of the PrivacyPolicyAcceptance + """ + status: String! + + """ + The version string + """ + version: String! +} + +enum ProcessingWarning { + """ + The anchor auto localisation process failed + """ + ANCHOR_LOCALISATION_FAILED + + """ + Provided data was (almost) entirely filtered by pitch bounds + """ + FILTERED_BY_PITCH_BOUNDS + + """ + Provided data predominantly below satellite count threshold + """ + FILTERED_BY_SATELLITE_COUNT + + """ + Provided data was (almost) entirely filtered out by time bounds + """ + FILTERED_BY_TIME + + """ + There was insufficient LPS data to track the athletes position + """ + INSUFFICIENT_LPS_DATA_TO_LOCALISE + + """ + Not enough high speed points to create a pitch from + """ + LOW_DATA_POINTS + + """ + There was no acceleration data in the provided file + """ + NO_ACCELERATION_DATA + + """ + There was no anchor data recorded + """ + NO_ANCHOR_DATA + + """ + Session reprocessed without datafile + """ + NO_DATA_FILE + + """ + There was no delta data recorded + """ + NO_DELTA_DATA + + """ + There was no data in the provided file + """ + NO_EDGE_DATA + + """ + There was no GPS data in the provided file + """ + NO_GPS_DATA + + """ + There was no LPS data recorded + """ + NO_LPS_DATA + + """ + No pitch was detected for this session + """ + NO_PITCH_DETECTED + + """ + (DEPRECATED) There was no UWB anchor position data in the provided file + """ + NO_UWB_ANCHOR_POSITION_DATA + + """ + (DEPRECATED) There was no UWB data in the provided file + """ + NO_UWB_DATA + + """ + (DEPRECATED) There was no UWB delta tag data in the provided file + """ + NO_UWB_DELTA_TAG_DATA + + """ + Could not produce valid LPS tracking data + """ + NO_VALID_LOCALISATION_DATA + + """ + There was no valid LPS data recorded + """ + NO_VALID_LPS_DATA + + """ + The pitch created by pitch detection was initially too large (150m x 200m) + reflecting a high speed in a large area. + """ + PITCH_TOO_LARGE + + """ + The pitch created by pitch detection was initially too small (20m x 50m) + reflecting a high speed in a small area. + """ + PITCH_TOO_SMALL + + """ + (DEPRECATED) Fixed and floating anchors not supported yet + """ + UWB_HYBRID_SYSTEMS_NOT_SUPPORTED + + """ + (DEPRECATED) The localisation process failed for the provided UWB data + """ + UWB_LOCALISATION_FAILED +} + +type ProfilePicture { + thumbnailUrl: String +} + +""" +Autogenerated return type of ProvisionGateway. +""" +type ProvisionGatewayPayload { + errors: [ValidationError!]! + + """ + The Gateway that has been provisioned + """ + gateway: Gateway +} + +type Query { + """ + Disambiguate authenticated navigation steps. + """ + appAuthenticationFlow(clubId: ID): AppAuthenticationFlow! + + """ + An athlete + """ + athlete(id: ID!): Athlete + + """ + An athlete group + """ + athleteGroup(id: ID!): AthleteGroup + + """ + The available templates for flexible reporting + """ + availableDatasetTemplates( + """ + The owner id + """ + ownerId: ID! + + """ + The owner type + """ + ownerType: OwnerEnum! + ): [DatasetTemplate!]! + + """ + Example prompts for chat interactions + """ + chatExamplePrompts(clubId: ID): [ExamplePrompt!]! + + """ + A chat question + """ + chatQuestion(id: ID!): Question! + + """ + Chat questions for the current staff member in a club + """ + chatQuestions(clubId: ID!, limit: Int, offset: Int): [Question!]! + + """ + The different string triggers for workflows + """ + chatWorkflowStringTriggers: JSON! + + """ + A club + """ + club(id: ID!): Club + + """ + The authenticated person + """ + currentPerson: Person! + + """ + Fetch the current privacy policy + """ + currentPrivacyPolicy: PrivacyPolicy + + """ + A dataset for flexible reporting + """ + datasets(clubId: ID, ids: [ID!], limit: Int, offset: Int): [Dataset!]! + + """ + Decide what flow a signup should take. + """ + decideSignupFlow(email: String): SignupFlow! + + """ + A device + """ + device( + """ + The board version of the device + """ + boardName: FirmwareBoardName! + + """ + The device's serial number + """ + serialNumber: BigInt! + ): DeviceInterface + + """ + Query single edge by ID/ Serial Number + """ + edge(id: ID!): Edge + + """ + All Edges currently owned and accessible to the user + """ + edges( + """ + A list of edge id's to return. Overrides other options. + """ + ids: [ID!] + ): [Edge!]! + + """ + Check if a feature is available + """ + feature( + clubId: ID + name: String @deprecated(reason: "use name_enum instead") + nameEnum: FeatureNameEnum + platform: Platform + + """ + Version number of the calling application, currently only for native devices + """ + version: String @deprecated(reason: "version sent in request headers") + ): FeatureCheck! + + """ + All firmware versions + """ + firmwareVersions(boardName: FirmwareBoardName!, buildProfile: FirmwareBuildProfile, featureVariant: FirmwareFeatureVariant, project: FirmwareProject!, variant: FirmwareVariant @deprecated(reason: "Use buildProfile instead")): [FirmwareVersion!]! + + """ + A flexible report + """ + flexibleReport(id: ID!): FlexibleReport + + """ + The latest firmware version available to the current person (in their given club) + """ + latestFirmwareVersions(boardNames: [FirmwareBoardName!]!, buildProfile: FirmwareBuildProfile, clubId: ID, featureVariant: FirmwareFeatureVariant, project: FirmwareProject): [FirmwareVersion!]! + + """ + The latest released metric version + """ + latestMetricSetVersion: String! + + """ + A match session + """ + matchSession(id: ID!): MatchSession + + """ + A match session participation + """ + matchSessionParticipation(id: ID!): MatchSessionParticipation + + """ + A collection of match session participation part objects + """ + matchSessionParticipationParts(ids: [ID!]!): [MatchSessionParticipationPart!] + + """ + Organisations + """ + organisations(ids: [ID!], limit: Int, offset: Int): [Organisation!]! + + """ + Check the current user's permissions + """ + permission(clubId: ID, requestedAction: PermissionAction!, subject: PermissionSubject, subjectId: ID): Permission! + + """ + Get a single person for editing + """ + person(id: ID!): Person! + + """ + A pitch + """ + pitch(id: ID!): Pitch! + + """ + All available survey question definitions + """ + questionDefinitions(clubId: ID): [SurveyQuestion!]! + + """ + A report + """ + report(id: ID!): Report + + """ + The set of reports allowed + """ + reportTypesAllowed(clubId: ID!): [ReportTypeEnum!]! + searchPlace(address: String!): MapCoordinate + + """ + A Segment + """ + segment(id: ID!): Segment + segmentParticipations(ids: [ID!]!): [SegmentParticipation!] + + """ + A session + """ + session(id: ID!): Session + + """ + A session blueprint + """ + sessionBlueprint(id: ID!): SessionBlueprint + + """ + A collection of session participation objects + """ + sessionParticipations(ids: [ID!]!, limit: Int, offset: Int): [SessionParticipation!] + + """ + Sessions + """ + sessions(filter: SessionsSessionFilter!, limit: Int, offset: Int): [Session!] + settings(ownerId: ID!, ownerType: OwnerEnum!): Settings! + singleSessionReport(clubId: ID!, sessionId: ID!): Report + sport(id: String, matchId: ID): SportDefinition + sports: [SportDefinition!]! + + """ + A survey + """ + survey(id: ID!): Survey! + + """ + A survey assignment + """ + surveyAssignment(id: ID!): SurveyAssignment! + + """ + A survey distribution + """ + surveyDistribution(id: ID!): SurveyDistribution! + + """ + A training session + """ + trainingSession(id: ID!): TrainingSession + + """ + A training session participation + """ + trainingSessionParticipation(id: ID!): TrainingSessionParticipation + userPreferences(keys: [String!], ownerId: ID!, ownerType: OwnerEnum!): [UserPreference!]! +} + +""" +A question for chat +""" +type Question { + """ + The conversation history, inlucding only bot and human messages + """ + conversationMessages: [Response!]! + + """ + The current bot message + """ + currentBotMessage: Response + + """ + The current system message + """ + currentSystemMessage: Response + + """ + An id for the question + """ + id: ID! + + """ + The question asked by the user + """ + question: String! + + """ + The subsequent responses + """ + responses: [Response!] @deprecated(reason: "Use conversation_messages instead") + + """ + The staff member who asked the question + """ + staff: Staff! +} + +""" +Autogenerated return type of QuestionSubscription. +""" +type QuestionSubscriptionPayload { + """ + The question + """ + question: Question! +} + +""" +Enum for quick action states +""" +enum QuickActionStateEnum { + """ + Quick action state after session ends + """ + AFTER_SESSION + + """ + Quick action state before session starts + """ + BEFORE_SESSION + + """ + Quick action state for match inside final segment + """ + MATCH_INSIDE_FINAL_SEGMENT + + """ + Quick action state for match inside non-final segment + """ + MATCH_INSIDE_NON_FINAL_SEGMENT + + """ + Quick action state for matches to skip past breaks or other gaps between segments + """ + MATCH_OUTSIDE_SEGMENT_WITH_FUTURE_SEGMENTS + + """ + Quick action state for training inside segment near session end (10 mins) + """ + TRAINING_INSIDE_SEGMENT_NEAR_SESSION_END + + """ + Quick action state for training inside segment with no future segments + """ + TRAINING_INSIDE_SEGMENT_NO_FUTURE_SEGMENTS + + """ + Quick action state for training inside segment with future segments + """ + TRAINING_INSIDE_SEGMENT_WITH_FUTURE_SEGMENTS + + """ + Quick action state for training outside segment near session end (10 mins) + """ + TRAINING_OUTSIDE_SEGMENT_NEAR_SESSION_END + + """ + Quick action state for training outside segment with no segments + """ + TRAINING_OUTSIDE_SEGMENT_NO_FUTURE_SEGMENTS + + """ + Quick action state for training outside segment with future segments + """ + TRAINING_OUTSIDE_SEGMENT_WITH_FUTURE_SEGMENTS + + """ + Failed to evaluate the correct quick action state for this session + """ + UNABLE_TO_DETERMINE +} + +type Range implements AggregateInterface { + mean: Float + surveyDistribution: SurveyDistribution! + surveyQuestion: SurveyQuestion! +} + +""" +Autogenerated return type of RateResponse. +""" +type RateResponsePayload { + errors: [ValidationError!]! + + """ + The rated response + """ + response: Response! +} + +""" +The rating of the response +""" +enum RatingEnum { + negative + positive +} + +""" +Autogenerated return type of RecreateGatewaySessions. +""" +type RecreateGatewaySessionsPayload { + errors: [ValidationError!]! + + """ + A Gateway Session + """ + gatewaySessions: [GatewaySession!] +} + +type RecurrenceSchedule { + rule: RecurrenceScheduleWeeklyRule! + startTime: ISO8601DateTime! +} + +input RecurrenceScheduleInput { + rule: RecurrenceScheduleWeeklyRuleInput! + startTime: ISO8601DateTime! +} + +type RecurrenceScheduleWeeklyRule { + days: [Int!]! +} + +input RecurrenceScheduleWeeklyRuleInput { + days: [Int!]! +} + +""" +Autogenerated return type of RegisterDevice. +""" +type RegisterDevicePayload { + errors: [ValidationError!]! + mobileDevice: MobileDevice +} + +""" +Autogenerated return type of RelativeAccelzones. +""" +type RelativeAccelzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of RelativeDecelzones. +""" +type RelativeDecelzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +The lower bounds for the speedzones +""" +input RelativeSpeedzoneAttributes { + """ + The ID of the athlete + """ + athleteIds: [ID!]! + + """ + Whether to auto update the speedzones + """ + autoUpdateRelativeSpeedzones: Boolean + + """ + A custom top speed override for the athlete + """ + customTopSpeedKph: Float + + """ + Lower bound value of the speedzone + """ + relativeSpeedzonesLowerBoundsKph: SpeedzoneLowerBoundsInput +} + +""" +Autogenerated return type of RelativeSpeedzones. +""" +type RelativeSpeedzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +""" +Autogenerated return type of RemoveSurveyQuestion. +""" +type RemoveSurveyQuestionPayload { + errors: [ValidationError!]! + survey: Survey +} + +""" +Autogenerated return type of RemoveSurveyTimerTrigger. +""" +type RemoveSurveyTimerTriggerPayload { + errors: [ValidationError!]! + survey: Survey +} + +type Report { + athletes: [Athlete!] + endDate: ISO8601DateTime + id: ID! + reportType: ReportType! + sentDate: ISO8601DateTime + sessions: [Session!] + startDate: ISO8601DateTime +} + +""" +Attributes for creating a Report +""" +input ReportAttributes { + athleteIds: [ID!] @deprecated(reason: "Use member_ids instead") + clubId: ID! + endDate: ISO8601DateTime + memberIds: [ID!] + reportType: String! + startDate: ISO8601DateTime +} + +enum ReportType { + AthleteReport + GroupReport + MultiSessionReport + SingleSessionReport +} + +enum ReportTypeEnum { + AthleteLoad + MultiSession + SingleSession +} + +""" +Autogenerated return type of ResendConfirmationEmail. +""" +type ResendConfirmationEmailPayload { + errors: [ValidationError!]! + + """ + The updated pending member + """ + pendingMember: PendingMember +} + +""" +Autogenerated return type of ResendReport. +""" +type ResendReportPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of RespondToDetectedMatchEvent. +""" +type RespondToDetectedMatchEventPayload { + detectedMatchEvent: DetectedMatchEvent + errors: [ValidationError!]! +} + +""" +Autogenerated return type of RespondToDetectedMatchEvents. +""" +type RespondToDetectedMatchEventsPayload { + detectedMatchEvents: [DetectedMatchEvent!] + errors: [ValidationError!]! +} + +enum ResponderEnum { + bot + human + system +} + +""" +A chat response +""" +type Response { + """ + The ID of the response + """ + id: ID! + + """ + App navigation links for deep linking into the mobile app (only present for bot responses) + """ + links: [Link!] + + """ + Multiple-choice options for the user to select (only present for bot responses) + """ + multiSelectOptions: [String!] + + """ + The rating of the response + """ + rating: RatingEnum + + """ + Explanation for the rating + """ + ratingExplanation: String + + """ + The responder of the response + """ + responder: ResponderEnum! + + """ + The human readable response + """ + response: String + + """ + Whether to show example questions to help guide the user + """ + showExampleQuestions: Boolean! + + """ + Single-choice options for the user to select one item (only present for bot responses) + """ + singleSelectOptions: [String!] +} + +""" +Autogenerated return type of ReviewPendingMember. +""" +type ReviewPendingMemberPayload { + """ + The approved athlete + """ + athlete: Athlete + errors: [ValidationError!]! +} + +type RootSubscription { + """ + Subscribe to period metrics having been updated for an athlete + """ + athletePeriodMetricsUpdatedEvent( + """ + The ID of the session participation which parents the metrics + """ + sessionParticipationId: ID! + ): AthletePeriodMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to segment metrics having been updated for an athlete + """ + athleteSegmentMetricsUpdatedEvent( + """ + The ID of the segment participation which parents the metrics + """ + segmentParticipationId: ID! + ): AthleteSegmentMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to session metrics having been updated for an athlete + """ + athleteSessionMetricsUpdatedEvent( + """ + The ID of the session participation which parents the metrics + """ + sessionParticipationId: ID! + ): AthleteSessionMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to Dataset updates + """ + datasetUpdatedEvent( + """ + The ID of the dataset + """ + id: ID + ): Dataset! + + """ + Subscribe to Live Data Gateway updates + """ + gateway( + """ + The gateway serial number in hex format (0x00000000) + """ + serialNumber: String! + ): Gateway + + """ + Subscribe to match events sessions being created + """ + matchEventCreatedEvent( + """ + The classes of the event to subscribe to + """ + eventClasses: [MatchEventClassEnum!] + + """ + The ID of the session participation + """ + sessionParticipationId: ID! + ): MatchEventCreatedSubscriptionPayload! + + """ + Subscription for when a Pending Member is created + """ + pendingMemberCreatedEvent( + """ + The club ID + """ + clubId: ID! + ): PendingMemberCreatedSubscriptionPayload! + + """ + Subscribe to period metric updates + """ + periodMetricsUpdatedEvent( + """ + The ID of the session period + """ + periodId: ID! + ): PeriodMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to person updates + """ + person( + """ + The ID of the person to subscribe to + """ + personId: ID! + ): Person! + + """ + Subscribe to pitch detection events for a session + """ + pitchDetectedEvent( + """ + The ID of the session to subscribe to pitch detection events + """ + sessionId: ID! + ): PitchDetectedSubscriptionPayload! + + """ + A chat question subscription + """ + question( + """ + The ID of the question to subscribe to + """ + questionId: ID! + ): QuestionSubscriptionPayload! + + """ + Subscribe to segment metrics having been updated + """ + segmentMetricsUpdatedEvent( + """ + The ID of the segment which parents the metrics + """ + segmentId: ID! + ): SegmentMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to session metrics having been updated + """ + sessionMetricsUpdatedEvent( + """ + The ID of the session which parents the metrics + """ + sessionId: ID! + ): SessionMetricsUpdatedSubscriptionPayload! + + """ + Subscribe to session details affecting session quick actions + """ + sessionQuickActionsEvent( + """ + The ID of the session which parents the metrics + """ + sessionId: ID! + ): SessionQuickActionsSubscriptionPayload! +} + +""" +Autogenerated return type of RotateLiveDataKeys. +""" +type RotateLiveDataKeysPayload { + errors: [ValidationError!]! +} + +type Segment { + clippedTimePeriodsByAthlete: [ClippedTimePeriodByAthlete!] + + """ + Returns configured aggregate metrics for a training session segment + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + createdAt: ISO8601DateTime! + endTime: ISO8601DateTime + id: ID! + processing: Boolean! @deprecated(reason: "We are not able to check this anymore based on MK5 processing") + segmentParticipation(athleteId: ID!): SegmentParticipation + + """ + The segment participations + """ + segmentParticipations( + """ + The number of participations to return + """ + limit: Int + + """ + The offset of the participations to return + """ + offset: Int + ): [SegmentParticipation!] + session: Session! + startTime: ISO8601DateTime + tags: [TagDefinition!]! + title: String! + trainingSessionSegmentMetricSet: TrainingSessionSegmentMetricSet + updatedAt: ISO8601DateTime! +} + +""" +Attributes for a session segment +""" +input SegmentAttributes { + """ + An array of intervals for each athlete's participation in the segment + """ + clippedTimePeriodsByAthlete: [AthleteClippedTimesInput!] + + """ + The time the segment ended + """ + endTime: ISO8601DateTime! + + """ + The ID of the segment + """ + id: ID + + """ + The segment participations + """ + participations: [SegmentParticipationPatch!] + + """ + The ID of the session the segment belongs to + """ + sessionId: ID! + + """ + The session participation IDs of athletes that participated in the segment + """ + sessionParticipationIds: [ID!] + + """ + The time the segment started + """ + startTime: ISO8601DateTime! + + """ + The tag definition IDs for the segment + """ + tagDefinitionIds: [ID!] + + """ + The title for the segment + """ + title: String! +} + +""" +Autogenerated return type of SegmentMetricsUpdatedSubscription. +""" +type SegmentMetricsUpdatedSubscriptionPayload { + """ + Configured aggregated metrics for the segment + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + The new metric set + """ + metricSet: TrainingSessionSegmentMetricSet +} + +type SegmentParticipation { + athlete: Athlete! + clippedTimePeriods: [ClippedTimePeriod!]! + + """ + Returns configured metrics for a segment participation + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + id: ID! + metrics: TrainingSessionSegmentAthleteMetricSet + position: PositionDefinition + segment: Segment! + sessionParticipation: TrainingSessionParticipation! + tagDefinitions: [TagDefinition!]! +} + +""" +Attributes for a segment participation +""" +input SegmentParticipationPatch { + """ + The ID of the segment participation + """ + id: ID! + + """ + The tag definition IDs for the segment participation + """ + tagDefinitionIds: [ID!] +} + +""" +Partial attributes for a session segment +""" +input SegmentPatch { + """ + An array of intervals for each athlete's participation in the segment + """ + clippedTimePeriodsByAthlete: [AthleteClippedTimesInput!] + + """ + The time the segment ended + """ + endTime: ISO8601DateTime + + """ + The ID of the segment + """ + id: ID + + """ + The segment participations + """ + participations: [SegmentParticipationPatch!] + + """ + The session participation IDs of athletes that participated in the segment + """ + sessionParticipationIds: [ID!] @deprecated(reason: "Use participations instead.") + + """ + The time the segment started + """ + startTime: ISO8601DateTime + + """ + The tag definition IDs for the segment + """ + tagDefinitionIds: [ID!] + + """ + The title for the segment + """ + title: String +} + +type SegmentTitle { + id: ID! + title: String! +} + +""" +Series chart type config for a report chart +""" +type SeriesChartType { + """ + type of chart + """ + chartType: SeriesChartTypeEnum! + + """ + column identifier + """ + colId: String! + + """ + secondary axis enabled for the chart + """ + secondaryAxis: Boolean! +} + +""" +The different chart types we support for combo charts +""" +enum SeriesChartTypeEnum { + groupedColumn + line + stackedColumn +} + +interface Session { + """ + Diagnostic warnings that apply to all session participations with data recordings + """ + aggregatedDiagnosticWarnings: [DiagnosticWarning!]! + assignableEdges(filter: EdgeSessionFilter): [Edge!]! @deprecated(reason: "Use availableEdges") + assignableLiveDataEdges(filter: EdgeSessionFilter, limit: Int, offset: Int): [Edge!]! @deprecated(reason: "Use availableEdges") + availableCameraOwnerships(limit: Int!, offset: Int!): [CameraOwnership!]! + availableEdges(filter: EdgeSessionFilter, limit: Int!, offset: Int!, order: [OrderInputObject!]): [Edge!]! + + """ + A list of gateway ownerships that can be used + """ + availableGateways(filter: LiveDataGatewayOwnershipAvailableGatewaysFilter, limit: Int, offset: Int): [GatewayOwnership!]! + ballDataRecordings( + """ + Only return recordings that have a downloadable URL + """ + withData: Boolean = false + ): [BallDataRecording!]! + + """ + The session blueprint that was created from this session + """ + childSessionBlueprint: SessionBlueprint + club: Club + + """ + Returns metrics for a session + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + Returns configured aggregated metrics for a session + """ + configuredMetricExplanations: [GenericMetricExplanation!] + createdByAi: Boolean! + creator: AthleteOrStaff! + dataProcessing: Boolean! + description: String + detectedSession: DetectedSession + edgeSyncRequired: Boolean! + endTime: ISO8601DateTime + gatewaySessions: [GatewaySession!]! + hasSurveyToAnswer: Boolean! + id: ID! + isLiveSession: Boolean! + isSurveyDistributionVisible: Boolean! + lastPageReceivedAt: ISO8601DateTime @deprecated(reason: "Use metrics updatedAt instead") + + """ + The latest AI-generated summary for this session + """ + latestAiSummary: SessionSummary + liveDataReady: Boolean! + metricExplanations: MetricExplanations + metricSetVersion: String! + mySurveyAssignment: SurveyAssignment + orderedSegments(limit: Int, offset: Int): [Segment!]! @deprecated(reason: "Use segments instead") + owner: AthleteOrStaff! @deprecated(reason: "Use creator instead") + + """ + The session blueprint that created this session + """ + parentSessionBlueprint: SessionBlueprint + + """ + Returns the quick action state for a session + """ + quickActionState: QuickActionStateEnum! + segments(limit: Int, offset: Int, order: [OrderInputObject!]): [Segment!]! + + """ + Returns the last 5 sessions of the same type and average load metrics for opposite type sessions + """ + sessionLoadHistory: SessionLoadHistory + sessionParticipation(athleteId: ID!, positionId: String): SessionParticipation + sessionParticipations(limit: Int, offset: Int, withData: Boolean): [SessionParticipation!] + sessionParticipationsCount(withData: Boolean): Int! + + """ + Video for the session + """ + sessionVideo: SessionVideo + settings: Settings! + startTime: ISO8601DateTime! + surveyDistribution: SurveyDistribution + tags: [SessionTagDefinition!]! + + """ + A list of gateway ownerships that are already assigned to this session + """ + unavailableGateways(atSessionTime: Boolean, limit: Int, offset: Int): [GatewayOwnership!]! + updatedAt: ISO8601DateTime! + + """ + Displays warnings as to why the session does not yet have metrics + """ + warnings: [SessionWarnings!]! +} + +""" +A session blueprint is a template for a session that can be used to create multiple sessions +""" +type SessionBlueprint { + athletes: [Athlete!]! + club: Club + createdAt: ISO8601DateTime! + creator: AthleteOrStaff! + description: String + duration: Int! + + """ + Gateway ownerships + """ + gatewayOwnerships: [GatewayOwnership!]! + id: ID! + matchDefinition: MatchDefinition + + """ + The next session from this blueprint + """ + nextOccurrence: ISO8601DateTime! + pitch: Pitch + pitchCoordinateSet: PitchCoordinateSet + segments: [SessionBlueprintSegment!]! + sessionType: String! + + """ + The number of sessions created from this blueprint + """ + sessionsCount: Int! + + """ + The survey will be automatically distributed to the created sessions + """ + survey: Survey + tags: [TagDefinition!]! + updatedAt: ISO8601DateTime! + weekDay: Int! +} + +""" +A session blueprint segment +""" +type SessionBlueprintSegment { + """ + Whether the segment contributes to session totals + """ + contributeToTotals: Boolean! + + """ + The end time of the segment + """ + endTime: ISO8601DateTime! + + """ + The period definition for the segment + """ + periodDefinitionId: ID! + + """ + The segment title for the segment + """ + sessionsSegmentTitleId: ID! + + """ + The start time of the segment + """ + startTime: ISO8601DateTime! +} + +""" +Attributes for defining a Match Period +""" +input SessionBlueprintSegmentAttributes { + """ + The end time of the segment + """ + endTime: ISO8601DateTime! + + """ + The start time of the segment + """ + startTime: ISO8601DateTime! +} + +""" +The context of a session blueprint session creation failed message +""" +type SessionBlueprintSessionCreationFailedContext { + """ + The errors that occurred + """ + errors: [ValidationError!]! + + """ + The next occurrence of the session blueprint + """ + nextOccurrence: ISO8601DateTime! + + """ + The session blueprint that failed to create a session + """ + sessionBlueprint: SessionBlueprint! @deprecated(reason: "Use session_blueprint_id instead.") + + """ + The id of the session blueprint that failed to create a session + """ + sessionBlueprintId: ID! +} + +""" +The context of a session blueprint session creation skipped athletes assignment message +""" +type SessionBlueprintSessionCreationSkippedAthletesContext { + """ + The ids of the athletes that were skipped + """ + athleteIds: [ID!]! + + """ + The names of the athletes that were skipped + """ + athleteNames: [String!]! + + """ + The athletes that were skipped + """ + athletes: [Athlete!]! @deprecated(reason: "Use athlete_ids and athlete_names instead.") + + """ + The next occurrence of the session blueprint + """ + nextOccurrence: ISO8601DateTime! + + """ + The session blueprint that skipped the athletes assignment + """ + sessionBlueprint: SessionBlueprint! @deprecated(reason: "Use session_blueprint_id instead.") + + """ + The id of the session blueprint that skipped the athletes assignment + """ + sessionBlueprintId: ID! +} + +""" +The context of a session blueprint session creation skipped gateways assignment message +""" +type SessionBlueprintSessionCreationSkippedGatewaysContext { + """ + The ids of the gateways that were skipped + """ + gatewayOwnershipIds: [ID!]! + + """ + The names of the gateways that were skipped + """ + gatewayOwnershipNames: [String!]! + + """ + The next occurrence of the session blueprint + """ + nextOccurrence: ISO8601DateTime! + + """ + The id of the session blueprint that skipped the gateways assignment + """ + sessionBlueprintId: ID! +} + +""" +Session load history with same type sessions and opposite type average +""" +type SessionLoadHistory { + """ + Average acceleration load for sessions of the opposite type + """ + comparisonAvgAccelerationLoad: Float + + """ + Average work for sessions of the opposite type + """ + comparisonAvgWork: Float + + """ + Sessions of the same type + """ + sessions: [SessionLoadHistoryEntry!]! +} + +""" +A previous session with its work or average work metric +""" +type SessionLoadHistoryEntry { + """ + The acceleration load value of the session participation + """ + accelerationLoad: Float + + """ + The average acceleration load of the session + """ + avgAccelerationLoad: Float + + """ + The average work of the session + """ + avgWork: Float + + """ + The ID of the session or session participation + """ + id: ID! + + """ + The type of the session + """ + sessionType: SessionTypeEnum! + + """ + The start date of the session + """ + startDate: ISO8601DateTime! + + """ + The work value of the session participation + """ + work: Float +} + +""" +Autogenerated return type of SessionMetricsUpdatedSubscription. +""" +type SessionMetricsUpdatedSubscriptionPayload { + """ + Configured aggregated metrics for the session + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + The new metric set + """ + metricSet: CommonAggregatedMetrics +} + +interface SessionParticipation { + athlete: Athlete! + + """ + Returns the metrics for a participation + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + dataRecordings: [DataRecording!]! + datafiles: [EdgeDataFile!]! + + """ + The diagnostic warnings for the session participation + """ + diagnosticWarnings: [DiagnosticWarning!]! + edgeAssignmentGuess: Edge + filteredDataFileUrl: String + id: ID! + position: PositionDefinition + segmentParticipations: [SegmentParticipation!] + session: Session! + tagDefinitions( + """ + Limit the number of tag definitions returned + """ + limit: Int + + """ + Offset the number of tag definitions returned + """ + offset: Int + ): [TagDefinition!] + + """ + Time filter ranges for the participation (array of [start_time, end_time] pairs) + """ + timeFilters: [[ISO8601DateTime!]!]! + + """ + The warnings for the session participation + """ + warnings: [SessionParticipationWarningCodes!]! +} + +""" +Attributes for session participation +""" +input SessionParticipationAttributes { + """ + The ID of the session participation + """ + id: ID! + + """ + The IDs of the tag definitions to add to the participation + """ + tagDefinitionIds: [ID!] + + """ + Time filter ranges for the participation (array of [start_time, end_time] pairs) + """ + timeFilters: [[ISO8601DateTime!]!] +} + +""" +The codes for the warnings +""" +enum SessionParticipationWarningCodes { + """ + The anchor auto localisation process failed + """ + ANCHOR_LOCALISATION_FAILED + + """ + Session has data syncs but one or more has no data file. + """ + EDGE_SYNC_REQUIRED + + """ + Provided data was (almost) entirely filtered by pitch bounds + """ + FILTERED_BY_PITCH_BOUNDS + + """ + Provided data predominantly below satellite count threshold + """ + FILTERED_BY_SATELLITE_COUNT + + """ + Provided data was (almost) entirely filtered out by time bounds + """ + FILTERED_BY_TIME + + """ + Session start time is in the future. + """ + FUTURE_SESSION + + """ + The session is in progress and a gateway can be assigned. + """ + GATEWAY_ASSIGNABLE + + """ + The Gateway has not connected to the network. + """ + GATEWAY_NOT_CONNECTED + + """ + There was insufficient LPS data to track the athletes position + """ + INSUFFICIENT_LPS_DATA_TO_LOCALISE + + """ + Live indoor session's are not supported. + """ + LIVE_INDOOR_SESSION + + """ + The session has gaps in data coverage that require edge sync. + """ + LIVE_SESSION_DATA_GAPS + + """ + Not enough high speed points to create a pitch from + """ + LOW_DATA_POINTS + + """ + There was no acceleration data in the provided file + """ + NO_ACCELERATION_DATA + + """ + There was no anchor data recorded + """ + NO_ANCHOR_DATA + + """ + Session has no session participations. + """ + NO_ATHLETES_ASSIGNED + + """ + Session reprocessed without datafile + """ + NO_DATA_FILE + + """ + There was no delta data recorded + """ + NO_DELTA_DATA + + """ + Session has no data recordings. + """ + NO_EDGES_ASSIGNED + + """ + There was no data in the provided file + """ + NO_EDGE_DATA + + """ + No data has been received from the Gateway. + """ + NO_GATEWAY_DATA + + """ + There was no GPS data in the provided file + """ + NO_GPS_DATA + + """ + There was no LPS data recorded + """ + NO_LPS_DATA + + """ + No pitch was detected for this session + """ + NO_PITCH_DETECTED + + """ + (DEPRECATED) There was no UWB anchor position data in the provided file + """ + NO_UWB_ANCHOR_POSITION_DATA + + """ + (DEPRECATED) There was no UWB data in the provided file + """ + NO_UWB_DATA + + """ + (DEPRECATED) There was no UWB delta tag data in the provided file + """ + NO_UWB_DELTA_TAG_DATA + + """ + Could not produce valid LPS tracking data + """ + NO_VALID_LOCALISATION_DATA + + """ + There was no valid LPS data recorded + """ + NO_VALID_LPS_DATA + + """ + The pitch created by pitch detection was initially too large (150m x 200m) + reflecting a high speed in a large area. + """ + PITCH_TOO_LARGE + + """ + The pitch created by pitch detection was initially too small (20m x 50m) + reflecting a high speed in a small area. + """ + PITCH_TOO_SMALL + + """ + (DEPRECATED) Fixed and floating anchors not supported yet + """ + UWB_HYBRID_SYSTEMS_NOT_SUPPORTED + + """ + (DEPRECATED) The localisation process failed for the provided UWB data + """ + UWB_LOCALISATION_FAILED +} + +""" +A chat session plan +""" +type SessionPlan { + """ + Club that owns this session plan + """ + club: Club! + + """ + Timestamp when the session plan was created + """ + createdAt: ISO8601DateTime! + + """ + URL to download the attached file + """ + fileUrl: String + + """ + Unique identifier for the session plan + """ + id: ID! + + """ + Title of the session plan + """ + title: String! + + """ + Timestamp when the session plan was last updated + """ + updatedAt: ISO8601DateTime! +} + +""" +Attributes for a session plan +""" +input SessionPlanAttributesInput { + """ + Markdown content for the session plan + """ + content: String! + + """ + Title of the session plan + """ + title: String! +} + +""" +Attributes for session positions +""" +input SessionPositionsAttributes { + athletePositions: [PositionAttributes!]! +} + +""" +Autogenerated return type of SessionQuickActionsSubscription. +""" +type SessionQuickActionsSubscriptionPayload { + """ + The session end time + """ + endTime: ISO8601DateTime + + """ + Ordered session segments + """ + orderedSegments( + """ + The number of segments to return + """ + limit: Int + + """ + The offset of the segments to return + """ + offset: Int + ): [Segment!]! @deprecated(reason: "Use segments instead") + + """ + The quick action state of the session + """ + quickActionState: QuickActionStateEnum! + + """ + Session segments + """ + segments( + """ + The number of segments to return + """ + limit: Int + + """ + The offset of the segments to return + """ + offset: Int + + """ + The order of the segments to return + """ + order: [OrderInputObject!] + ): [Segment!]! + + """ + The session participations + """ + sessionParticipations( + """ + The number of participations to return + """ + limit: Int + + """ + The offset of the participations to return + """ + offset: Int + + """ + Whether to include only participations with data recordings + """ + withData: Boolean + ): [SessionParticipation!] + + """ + The session start time + """ + startTime: ISO8601DateTime! + + """ + The session tag definitions + """ + tagDefinitions( + """ + The number of tag definitions to return + """ + limit: Int + + """ + The offset of the tag definitions to return + """ + offset: Int + ): [TagDefinition!]! +} + +""" +An AI-generated session summary +""" +type SessionSummary { + """ + Unique identifier for the session summary + """ + id: ID! + + """ + The AI-generated summary text + """ + summary: String! +} + +type SessionTagDefinition { + colour: String + id: ID! + label: String! +} + +""" +Attributes for a session tag definition +""" +input SessionTagDefinitionAttributes { + colour: String + label: String! +} + +""" +Enum for session type +""" +enum SessionTypeEnum { + """ + A session that is a match. + """ + MatchSession + + """ + A session that is a training. + """ + TrainingSession +} + +""" +Video for the session +""" +type SessionVideo { + """ + The camera ownership associated with the session + """ + cameraOwnership: CameraOwnership! + + """ + The ID of the session video + """ + id: ID! + + """ + The video recording for the session + """ + videoRecording: VideoRecording! +} + +""" +The codes for the warnings +""" +enum SessionWarningCodes { + """ + Session has data syncs but one or more has no data file. + """ + EDGE_SYNC_REQUIRED + + """ + Session start time is in the future. + """ + FUTURE_SESSION + + """ + The session is in progress and a gateway can be assigned. + """ + GATEWAY_ASSIGNABLE + + """ + The Gateway has not connected to the network. + """ + GATEWAY_NOT_CONNECTED + + """ + Live indoor session's are not supported. + """ + LIVE_INDOOR_SESSION + + """ + The session has gaps in data coverage that require edge sync. + """ + LIVE_SESSION_DATA_GAPS + + """ + Session has no session participations. + """ + NO_ATHLETES_ASSIGNED + + """ + Session has no data recordings. + """ + NO_EDGES_ASSIGNED + + """ + No data has been received from the Gateway. + """ + NO_GATEWAY_DATA +} + +""" +A warning for a session +""" +type SessionWarnings { + """ + The code for the warning + """ + code: SessionWarningCodes! + + """ + The message for the warning + """ + message: String! +} + +input SessionsSessionAggregateMetricsFilter { + sessionDetailsTypeEq: String + sessionParticipationsAthleteIdIn: [ID!]! + startTimeGteq: ISO8601DateTime! + startTimeLteq: ISO8601DateTime + tagIds: [ID!] +} + +input SessionsSessionAggregatePersonMetricsFilter { + sessionDetailsTypeEq: String + startTimeGteq: ISO8601DateTime! + startTimeLteq: ISO8601DateTime +} + +input SessionsSessionBaseFilter { + creatorIdEq: ID + creatorTypeEq: CreatorTypeEnum + hasMetricsEq: Boolean + sessionDetailsTypeEq: String + startTimeGteq: ISO8601DateTime + startTimeLteq: ISO8601DateTime + tagIds: [ID!] + withAthleteIds: [ID!] + withAthleteNameContaining: String + withMatchOpponentContaining: String + withMatchResult: String + withPitchNameContaining: String +} + +input SessionsSessionFilter { + clubIdEq: ID + clubNameCont: String @deprecated(reason: "use clubId instead. clubNameCont will be removed, and clubIdEq made required.") + endTimeLteq: ISO8601DateTime + sessionDetailsTypeEq: String + startTimeGteq: ISO8601DateTime +} + +input SessionsSessionParticipationBaseFilter { + """ + Filter by athlete position (case insensitive) + """ + athleteDefaultPositionICont: String + + """ + Filter by specific athlete IDs + """ + athleteIdIn: [ID!] + + """ + Filter by athlete name (case insensitive) + """ + athleteNameICont: String + sessionHasMetricsEq: Boolean + sessionSessionDetailsTypeEq: String + sessionStartTimeGteq: ISO8601DateTime + sessionStartTimeLteq: ISO8601DateTime +} + +""" +Autogenerated return type of SetBenchedPlayers. +""" +type SetBenchedPlayersPayload { + errors: [ValidationError!]! + sessionParticipations: [MatchSessionParticipation!] +} + +""" +Autogenerated return type of SetCustomMaxMetric. +""" +type SetCustomMaxMetricPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +type Settings { + """ + Whether EDGEs are automatically assigned to athletes + """ + autoEdgeAssignment: Boolean! @deprecated(reason: "setting no longer used") + + """ + Heart rate zone boundaries as percentages + """ + heartRateBoundsPercentages: [Float!]! @deprecated(reason: "Use labelled_heart_rate_bounds_percentages instead") + id: ID! + + """ + Labelled acceleration zone boundaries in m/s² + """ + labelledAccelzonesLowerBoundsMs2: AccelzoneLowerBounds! + + """ + Labelled banded jump zone boundaries in cm + """ + labelledBandedJumpZonesLowerBoundsCm: BandedJumpZoneLowerBounds! + + """ + Labelled deceleration zone boundaries in m/s² + """ + labelledDecelzonesLowerBoundsMs2: DecelzoneLowerBounds! + + """ + Labelled heart rate bounds percentages + """ + labelledHeartRateBoundsPercentages: HeartRateLowerBounds! + labelledSpeedzonesLowerBoundsKph: SpeedzoneLowerBounds! + + """ + Current metric version of the club + """ + metricVersion: String! + + """ + All previous match session opponent names + """ + opponentNames: [String!] + + """ + Pitches defined by the owner + """ + pitches(archivedCheckDate: ISO8601DateTime): [Pitch!]! + + """ + All available segment titles + """ + segmentTitles: [SegmentTitle!] + + """ + Allows the user to select which EDGEs to sync + """ + selectEdgesForSync: Boolean! + speedzonesLowerBoundsKph: [Float!]! @deprecated(reason: "Use the labelled speedzone field instead.") + userPreferences: JSON +} + +enum SignupFlow { + """ + This user is already part of this club + """ + ALREADY_LINKED + + """ + The email address is invalid + """ + INVALID_EMAIL + + """ + This is an existing user but for a different club + """ + LINK_TO_NEW_CLUB + + """ + This is a new user with a claimable athlete + """ + NEW_CLAIMABLE_ATHLETE + + """ + This is a new user, not already part of a club + """ + NEW_USER + + """ + No email address has been provided yet + """ + NO_EMAIL + + """ + The application to join the club is waiting for a response from club staff + """ + PENDING_MEMBER + + """ + To continue, the person must sign in + """ + SIGN_IN_REQUIRED +} + +enum SortField { + avg_acceleration_events + avg_deceleration_events + avg_distance_m + avg_high_intensity_distance_m @deprecated(reason: "Use avgTotalHighIntensityDistanceM instead") + avg_high_intensity_events + avg_high_intensity_run_distance_m @deprecated(reason: "Use avgTotalHighIntensityDistanceM instead") + avg_max_speed_kph + avg_metres_per_minute + avg_raw_max_speed_kph + avg_sprint_distance_m + avg_sprint_events + avg_total_high_intensity_distance_m + avg_workload + avg_workload_intensity + avg_workload_volume + max_max_speed_kph + max_metres_per_minute + max_raw_max_speed_kph + max_total_distance_m + total_acceleration_events + total_deceleration_events + total_distance_m + total_high_intensity_distance_m + total_high_intensity_events + total_high_intensity_run_distance_m @deprecated(reason: "Use totalHighIntensityDistanceM instead") + total_sprint_count @deprecated(reason: "Use totalSprintEvents instead") + total_sprint_distance_m + total_sprint_events +} + +type SpeedzoneLowerBounds { + highIntensity: Float! + jogging: Float! + lowIntensity: Float! + mediumIntensity: Float! + sprinting: Float! +} + +input SpeedzoneLowerBoundsInput { + highIntensity: Float! + jogging: Float! + lowIntensity: Float! + mediumIntensity: Float! + sprinting: Float! +} + +""" +Autogenerated return type of Speedzones. +""" +type SpeedzonesPayload { + """ + Updated athletes + """ + athletes: [Athlete!] + errors: [ValidationError!]! +} + +type SportDefinition { + hasPitchDefinition: Boolean! + id: ClubSport! + isIndoor: Boolean! + localizedTerms: LocalizedTerms! + matchDefinitions: [MatchDefinition!] + name: String! + pitchDefinition: PitchDefinition + positionDefinitions: [PositionDefinition!] +} + +""" +Staff +""" +type Staff implements AthleteOrStaff { + archivedAt: ISO8601DateTime + canAccessBilling: Boolean! + + """ + The coach context for chat personalization + """ + chatCoachContext: CoachContext + + """ + Whether the staff member needs to complete the chat onboarding workflow + """ + chatOnboardingRequired: Boolean! @deprecated(reason: "Onboarding is now triggered by LLM, not deterministically") + + """ + The club associated with the staff member + """ + club: Club + id: ID! + initials: String! + name: String! + person: Person! + personId: ID! @deprecated(reason: "Use `person` instead") + profilePicture: ProfilePicture! + reports(limit: Int, offset: Int): [Report!] +} + +type StripeSubscription implements CustomerSubscription { + cancelledAt: ISO8601DateTime + id: ID! + status: StripeSubscriptionStatus! + stripeProductName: String + stripeRenewalDate: ISO8601DateTime + stripeSubscriptionBillingCost: String + stripeSubscriptionBillingCurrency: String + subscriptionPortalUrl: String! +} + +enum StripeSubscriptionStatus { + active + cancelled + paused + unpaid +} + +type Survey { + """ + When the survey was archived or nil if not archived + """ + archivedAt: ISO8601DateTime + createdAt: ISO8601DateTime! + distributed: Boolean! + id: ID! + sessionSurvey: Boolean! @deprecated(reason: "Surveys are no longer session specific") + + """ + Times this survey has been distributed + """ + surveyDistributions(timeSpan: TimeSpanAttributes!): [SurveyDistribution!] + surveyQuestions: [SurveyQuestion!]! + + """ + A survey timer trigger + """ + timerTrigger(id: ID!): SurveyTimerTrigger + timerTriggers: [SurveyTimerTrigger!] + title: String! +} + +""" +Different types of survey aggregate. +""" +union SurveyAggregate = Range + +type SurveyAnswer { + answer: String! + id: ID! + surveyQuestion: SurveyQuestion! +} + +""" +Attributes for creating a survey answer +""" +input SurveyAnswerAttributes { + answer: String! + assignmentId: ID! + questionId: ID! +} + +type SurveyAssignment implements TimelineItem { + athlete: Athlete! + completed: Boolean! + distributeAt: ISO8601DateTime! + id: ID! + survey: Survey! + surveyAnswers: [SurveyAnswer!]! + + """ + The time this item should be displayed in the user's timeline + """ + timelineTime: ISO8601DateTime! +} + +""" +Attributes for creating a survey +""" +input SurveyAttributes { + """ + The IDs of the questions in the survey + """ + questionIds: [ID!] + + """ + Can this survey be associated with a session? + """ + sessionSurvey: Boolean @deprecated(reason: "Surveys are no longer session specific") + + """ + The timer triggers for the survey + """ + timerTriggers: [SurveyTimerTriggerCreateAttributes!] + + """ + The survey title + """ + title: String! +} + +""" +The context of a survey completed message +""" +type SurveyCompletedContext { + """ + The id of the distribution + """ + distributionId: ID! + + """ + The title of the survey + """ + surveyTitle: String! +} + +type SurveyDistribution implements TimelineItem { + createdAt: ISO8601DateTime! + distributeAt: ISO8601DateTime! + id: ID! + + """ + The session this survey distribution is associated with + """ + session: Session + + """ + The survey that has been distrbuted + """ + survey: Survey! + + """ + The answer aggregates for this distribution + """ + surveyAggregates: [SurveyAggregate!]! + + """ + The assignments for this distribution + """ + surveyAssignments: [SurveyAssignment!]! + + """ + The time this item should be displayed in the user's timeline + """ + timelineTime: ISO8601DateTime! +} + +""" +Attributes for creating a survey distribution +""" +input SurveyDistributionAttributes { + athleteIds: [ID!]! + + """ + The time the survey should be distributed. Rounded down to the previous minute. + """ + distributeAt: ISO8601DateTime! + surveyId: ID! +} + +type SurveyQuestion { + arguments: JSON + category: String! + deprecated: Boolean! + id: ID! + myAnswer(surveyAssignmentId: ID!): SurveyAnswer + priority: Int! + questionId: ID! + text: String! + type: String! +} + +""" +The context of a survey reminder message +""" +type SurveyReminderContext { + """ + The id of the survey assignment + """ + assignmentId: ID! + + """ + The title of the survey + """ + surveyTitle: String! +} + +type SurveyTimerTrigger { + athleteIds: [ID!]! + description: String! @deprecated(reason: "Not app timezone aware, use schedule_description + next_run_at instead") + id: ID! + lastRunAt: ISO8601DateTime + nextRunAt: ISO8601DateTime! + recurrenceSchedule: RecurrenceSchedule! + scheduleDescription: String! +} + +""" +Attributes for creating or updating a timer trigger +""" +input SurveyTimerTriggerAttributes { + athleteIds: [ID!]! + recurrenceSchedule: RecurrenceScheduleInput! + surveyId: ID! +} + +""" +Attributes for creating a timer trigger as part of survey creation +""" +input SurveyTimerTriggerCreateAttributes { + """ + The IDs of the athletes to include in the timer trigger + """ + athleteIds: [ID!]! + + """ + The recurrence schedule for the timer trigger + """ + recurrenceSchedule: RecurrenceScheduleInput! +} + +input SurveysSurveyAssignmentBaseFilter { + completedEq: Boolean + distributeAtGteq: ISO8601DateTime + distributeAtLteq: ISO8601DateTime + sessionSurveyEq: Boolean @deprecated(reason: "Surveys are no longer session specific") +} + +input SurveysSurveyDistributionBaseFilter { + athleteIdIn: [ID!] + completedEq: Boolean + distributeAtGteq: ISO8601DateTime + distributeAtLteq: ISO8601DateTime + sessionSurveyEq: Boolean @deprecated(reason: "Surveys are no longer session specific") +} + +""" +An edge or ball that can be synced +""" +union SyncableUnion = Ball | Edge + +""" +Tag definition +""" +type TagDefinition { + """ + Hex colour of tag + """ + colour: String + + """ + ID of tag + """ + id: ID! + + """ + Label of tag + """ + label: String! + + """ + Current valid taggable types for this tag definition + """ + validTaggableTypes: [TaggableTypeEnum!]! +} + +""" +Attributes for a tag definition +""" +input TagDefinitionAttributes { + """ + Hex colour of tag + """ + colour: String + + """ + Label of tag + """ + label: String! + + """ + Array of valid taggable filter options + """ + taggableFilterOptions: [TaggableTypeEnum!] +} + +""" +The types of model that tags can be applied to +""" +enum TaggableTypeEnum { + athlete + match_session + segment + segment_participation + segment_participation_part + session + session_participation + training_session +} + +""" +Attributes for the tagger (polymorphic association) +""" +input TaggerAttributes { + """ + ID of the tagger + """ + taggerId: ID! + + """ + Polymorphic type of tagger + """ + taggerType: TaggerTypeEnum! +} + +enum TaggerTypeEnum { + Club +} + +""" +indicates a time range +""" +type TimeRangeData { + """ + Start of period + """ + endTime: UnsafeISO8601DateTime! + + """ + End of period + """ + startTime: UnsafeISO8601DateTime! +} + +type TimeSeriesData { + endTime: UnsafeISO8601DateTime! + startTime: UnsafeISO8601DateTime! + value: Float! +} + +input TimeSpanAttributes { + from: ISO8601DateTime! + until: ISO8601DateTime! +} + +""" +A tuple where the first element is an iso8601 string and the second element is a float +""" +scalar TimeValue + +""" +A day in the user's timeline +""" +type TimelineDay { + """ + The date for this set of timeline items + """ + date: ISO8601Date! + items: [TimelineItem!]! +} + +""" +An entry in the user's timeline +""" +interface TimelineItem { + id: ID! + + """ + The time this item should be displayed in the user's timeline + """ + timelineTime: ISO8601DateTime! +} + +""" +Top performers for a club +""" +type TopPerformers { + """ + List of top performers for this metric + """ + athlete: Athlete + + """ + Metric information + """ + metric: GenericMetric! +} + +type TrainingSession implements Session & TimelineItem { + """ + Diagnostic warnings that apply to all session participations with data recordings + """ + aggregatedDiagnosticWarnings: [DiagnosticWarning!]! + assignableEdges(filter: EdgeSessionFilter): [Edge!]! @deprecated(reason: "Use availableEdges") + assignableLiveDataEdges(filter: EdgeSessionFilter, limit: Int, offset: Int): [Edge!]! @deprecated(reason: "Use availableEdges") + availableCameraOwnerships(limit: Int!, offset: Int!): [CameraOwnership!]! + availableEdges(filter: EdgeSessionFilter, limit: Int!, offset: Int!, order: [OrderInputObject!]): [Edge!]! + + """ + A list of gateway ownerships that can be used + """ + availableGateways(filter: LiveDataGatewayOwnershipAvailableGatewaysFilter, limit: Int, offset: Int): [GatewayOwnership!]! + ballDataRecordings( + """ + Only return recordings that have a downloadable URL + """ + withData: Boolean = false + ): [BallDataRecording!]! + + """ + The session blueprint that was created from this session + """ + childSessionBlueprint: SessionBlueprint + club: Club + + """ + Returns metrics for a session + """ + configuredAggMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredAggMetrics + + """ + Returns configured aggregated metrics for a session + """ + configuredMetricExplanations: [GenericMetricExplanation!] + createdByAi: Boolean! + creator: AthleteOrStaff! + dataProcessing: Boolean! + description: String + detectedSession: DetectedSession + edgeSyncRequired: Boolean! + endTime: ISO8601DateTime + gatewaySessions: [GatewaySession!]! + hasSurveyToAnswer: Boolean! + id: ID! + isLiveSession: Boolean! + isSurveyDistributionVisible: Boolean! + lastPageReceivedAt: ISO8601DateTime @deprecated(reason: "Use metrics updatedAt instead") + + """ + The latest AI-generated summary for this session + """ + latestAiSummary: SessionSummary + liveDataReady: Boolean! + metricExplanations: MetricExplanations + metricSetVersion: String! + mySurveyAssignment: SurveyAssignment + orderedSegments(limit: Int, offset: Int): [Segment!]! @deprecated(reason: "Use segments instead") + owner: AthleteOrStaff! @deprecated(reason: "Use creator instead") + + """ + The session blueprint that created this session + """ + parentSessionBlueprint: SessionBlueprint + + """ + Returns the session before the indicated one if avalable. + When an athlete_id is provided, filters previous sessions to only those that the athlete participated in + """ + previousSession(athleteId: ID): TrainingSession + + """ + Returns the quick action state for a session + """ + quickActionState: QuickActionStateEnum! + segments(limit: Int, offset: Int, order: [OrderInputObject!]): [Segment!]! + + """ + Returns the last 5 sessions of the same type and average load metrics for opposite type sessions + """ + sessionLoadHistory: SessionLoadHistory + sessionParticipation(athleteId: ID!, positionId: String): SessionParticipation + sessionParticipations(limit: Int, offset: Int, withData: Boolean): [TrainingSessionParticipation!] + sessionParticipationsCount(withData: Boolean): Int! + + """ + Video for the session + """ + sessionVideo: SessionVideo + settings: Settings! + startTime: ISO8601DateTime! + surveyDistribution: SurveyDistribution + tags: [SessionTagDefinition!]! + + """ + The time this item should be displayed in the user's timeline + """ + timelineTime: ISO8601DateTime! + trainingSessionMetricSet: TrainingSessionMetricSet + + """ + A list of gateway ownerships that are already assigned to this session + """ + unavailableGateways(atSessionTime: Boolean, limit: Int, offset: Int): [GatewayOwnership!]! + updatedAt: ISO8601DateTime! + + """ + Displays warnings as to why the session does not yet have metrics + """ + warnings: [SessionWarnings!]! +} + +type TrainingSessionAthleteMetricSet implements CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + averageSpeedKph: Float! @deprecated(reason: "use avgSpeedKph") + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedBreakdown: [TimeSeriesData!] @deprecated(reason: "use avgSpeedKphOverTime") + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + distanceProfileMAtKph: [Float!]! @deprecated(reason: "use distanceMAtKph") + diveEvents: Int + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceM: Float! @deprecated(reason: "use totalHighIntensityDistanceM") + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + speedzoneProfileZone: [Float!]! @deprecated(reason: "use timeAtKph") + sprintCount: Int! @deprecated(reason: "use sprintEvents") + sprintDistanceM: Float! @deprecated(reason: "use totalSprintDistanceM") + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +""" +Link to a training session in the mobile app +""" +type TrainingSessionLink { + """ + The ID of the training session + """ + id: ID! + + """ + The screen to navigate to (always 'TrainingSession') + """ + screen: String! + + """ + The date of the session + """ + sessionDate: ISO8601Date! + + """ + The end time of the session + """ + sessionEndTime: ISO8601DateTime! + + """ + The start time of the session + """ + sessionStartTime: ISO8601DateTime! +} + +type TrainingSessionMetricSet implements CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceM: Float! @deprecated(reason: "use avgTotalDistanceM") + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDistanceProfileMAtKph: [Float!]! @deprecated(reason: "use avgDistanceMAtKph") + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceM: Float! @deprecated(reason: "use avgTotalHighIntensityDistanceM") + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSpeedzoneProfileZone: [Float!]! @deprecated(reason: "use avgTimeAtKph") + avgSprintCount: Float! @deprecated(reason: "use avgSprintEvents") + avgSprintDistanceM: Float! @deprecated(reason: "use avgTotalSprintDistanceM") + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + highIntensityRunDistanceM: Float @deprecated(reason: "use totalHighIntensityDistanceM") + id: ID! + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + sprintDistanceM: Float @deprecated(reason: "use totalSprintDistanceM") + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +type TrainingSessionParticipation implements SessionParticipation { + athlete: Athlete! + athleteMetricSet: TrainingSessionAthleteMetricSet + + """ + Returns the metrics for a participation + """ + configuredMetrics( + """ + JSONb fields to return from metric set + """ + requestedJsonKeys: [String!] + ): ConfiguredMetrics + dataRecordings: [DataRecording!]! + datafiles: [EdgeDataFile!]! + + """ + The diagnostic warnings for the session participation + """ + diagnosticWarnings: [DiagnosticWarning!]! + edgeAssignmentGuess: Edge + filteredDataFileUrl: String + id: ID! + position: PositionDefinition + segmentParticipations: [SegmentParticipation!] + session: Session! + tagDefinitions( + """ + Limit the number of tag definitions returned + """ + limit: Int + + """ + Offset the number of tag definitions returned + """ + offset: Int + ): [TagDefinition!]! + + """ + Time filter ranges for the participation (array of [start_time, end_time] pairs) + """ + timeFilters: [[ISO8601DateTime!]!]! + trainingSession: TrainingSession! + + """ + The warnings for the session participation + """ + warnings: [SessionParticipationWarningCodes!]! +} + +type TrainingSessionSegmentAthleteMetricSet implements CommonAthleteMetrics { + accelerationEvents: Float + accelerationLoadPerContributingMinutes: Float + avgHeartrateBpm: Float + avgHeartrateBpmOverTime: [TimeSeriesData!] + avgPassDistanceM: Float + avgPassVelocityMps: Float + avgSpeedKph: Float! + avgSpeedKphOverTime: [TimeSeriesData!]! + clubZoneFiveAccelerationDistanceM: Float + clubZoneFiveAccelerationDurationS: Float + clubZoneFiveAccelerationEvents: Int + clubZoneFiveDecelerationDistanceM: Float + clubZoneFiveDecelerationDurationS: Float + clubZoneFiveDecelerationEvents: Int + clubZoneFourAccelerationDistanceM: Float + clubZoneFourAccelerationDurationS: Float + clubZoneFourAccelerationEvents: Int + clubZoneFourDecelerationDistanceM: Float + clubZoneFourDecelerationDurationS: Float + clubZoneFourDecelerationEvents: Int + clubZoneHighIntensityDistanceM: Float + clubZoneHighIntensityDurationS: Float + clubZoneHighIntensityEvents: Int + clubZoneHighSpeedRunningDistanceM: Float + clubZoneHighSpeedRunningDurationS: Float + clubZoneHighSpeedRunningEvents: Int + clubZoneJoggingDistanceM: Float + clubZoneJoggingDurationS: Float + clubZoneJoggingEvents: Int + clubZoneLowIntensityDistanceM: Float + clubZoneLowIntensityDurationS: Float + clubZoneLowIntensityEvents: Int + clubZoneMediumIntensityDistanceM: Float + clubZoneMediumIntensityDurationS: Float + clubZoneMediumIntensityEvents: Int + clubZoneOneAccelerationDistanceM: Float + clubZoneOneAccelerationDurationS: Float + clubZoneOneAccelerationEvents: Int + clubZoneOneDecelerationDistanceM: Float + clubZoneOneDecelerationDurationS: Float + clubZoneOneDecelerationEvents: Int + clubZoneSprintDistanceM: Float + clubZoneSprintDurationS: Float + clubZoneSprintEvents: Int + clubZoneThreeAccelerationDistanceM: Float + clubZoneThreeAccelerationDurationS: Float + clubZoneThreeAccelerationEvents: Int + clubZoneThreeDecelerationDistanceM: Float + clubZoneThreeDecelerationDurationS: Float + clubZoneThreeDecelerationEvents: Int + clubZoneTwoAccelerationDistanceM: Float + clubZoneTwoAccelerationDurationS: Float + clubZoneTwoAccelerationEvents: Int + clubZoneTwoDecelerationDistanceM: Float + clubZoneTwoDecelerationDurationS: Float + clubZoneTwoDecelerationEvents: Int + contributingDataTimes: [TimeRangeData!] + decelerationEvents: Float + distanceMAtKph: [Bucket!]! + distanceMOverTime: [TimeSeriesData!]! + diveEvents: Int + highDiveEvents: Int + highIntensityEvents: Int + highIntensityRunDistanceM: Float! @deprecated(reason: "use totalHighIntensityDistanceM") + highIntensityRunDistanceMOverTime: [TimeSeriesData!]! + highJumpEvents: Int + highMetabolicLoadDistanceM: Float + highMetabolicLoadEvents: Int + highSpeedRunDistanceM: Float + highSpeedRunEvents: Int + id: ID! + individualZoneFiveAccelerationDistanceM: Float + individualZoneFiveAccelerationDurationS: Float + individualZoneFiveAccelerationEvents: Int + individualZoneFiveDecelerationDistanceM: Float + individualZoneFiveDecelerationDurationS: Float + individualZoneFiveDecelerationEvents: Int + individualZoneFourAccelerationDistanceM: Float + individualZoneFourAccelerationDurationS: Float + individualZoneFourAccelerationEvents: Int + individualZoneFourDecelerationDistanceM: Float + individualZoneFourDecelerationDurationS: Float + individualZoneFourDecelerationEvents: Int + individualZoneHighIntensityDistanceM: Float + individualZoneHighIntensityDurationS: Float + individualZoneHighIntensityEvents: Int + individualZoneHighSpeedRunningDistanceM: Float + individualZoneHighSpeedRunningDurationS: Float + individualZoneHighSpeedRunningEvents: Int + individualZoneJoggingDistanceM: Float + individualZoneJoggingDurationS: Float + individualZoneJoggingEvents: Int + individualZoneLowIntensityDistanceM: Float + individualZoneLowIntensityDurationS: Float + individualZoneLowIntensityEvents: Int + individualZoneMediumIntensityDistanceM: Float + individualZoneMediumIntensityDurationS: Float + individualZoneMediumIntensityEvents: Int + individualZoneOneAccelerationDistanceM: Float + individualZoneOneAccelerationDurationS: Float + individualZoneOneAccelerationEvents: Int + individualZoneOneDecelerationDistanceM: Float + individualZoneOneDecelerationDurationS: Float + individualZoneOneDecelerationEvents: Int + individualZoneSprintDistanceM: Float + individualZoneSprintDurationS: Float + individualZoneSprintEvents: Int + individualZoneThreeAccelerationDistanceM: Float + individualZoneThreeAccelerationDurationS: Float + individualZoneThreeAccelerationEvents: Int + individualZoneThreeDecelerationDistanceM: Float + individualZoneThreeDecelerationDurationS: Float + individualZoneThreeDecelerationEvents: Int + individualZoneTwoAccelerationDistanceM: Float + individualZoneTwoAccelerationDurationS: Float + individualZoneTwoAccelerationEvents: Int + individualZoneTwoDecelerationDistanceM: Float + individualZoneTwoDecelerationDurationS: Float + individualZoneTwoDecelerationEvents: Int + leftDiveEvents: Int + leftHighDiveEvents: Int + leftLowDiveEvents: Int + longPassEvents: Int + lowDiveEvents: Int + lowJumpEvents: Int + maxAcceleration: Float + maxDeceleration: Float + maxHeartrateBpm: Float + maxSpeedKph: Float! + mediumJumpEvents: Int + mediumPassEvents: Int + metresPerMinute: Float! + ninetyPercentOfMaxSpeedDistanceM: Float + ninetyPercentOfMaxSpeedDurationS: Float + ninetyPercentOfMaxSpeedEvents: Int + ninetyPercentOfRawMaxSpeedDistanceM: Float + ninetyPercentOfRawMaxSpeedDurationS: Float + ninetyPercentOfRawMaxSpeedEvents: Float + passEvents: Int + percentageMaxSpeedKph: Float + percentageRawMaxSpeedKph: Float + processingWarnings: [ProcessingWarning!]! + rawMaxSpeedKph: Float + rightDiveEvents: Int + rightHighDiveEvents: Int + rightLowDiveEvents: Int + sampledSpeedKphOverTime: [TimeValue!]! + shortPassEvents: Int + socialImageUrl: String + sprintDistanceMOverTime: [TimeSeriesData!]! + sprintEvents: Int! + timeAtKph: [Bucket!]! + timeOnBallSeconds: Float + totalDistanceM: Float! + totalHighIntensityDistanceM: Float! + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalMediumIntensityDistanceM: Float + totalSprintDistanceM: Float! + touchEvents: Int + updatedAt: ISO8601DateTime! + work: Float + workload: Float + workloadIntensity: Float + workloadVolume: Float + zoneFiveHeartrateDurationS: Float + zoneFourHeartrateDurationS: Float + zoneOneHeartrateDurationS: Float + zoneThreeHeartrateDurationS: Float + zoneTwoHeartrateDurationS: Float +} + +type TrainingSessionSegmentMetricSet implements CommonAggregatedMetrics { + avgAccelerationEvents: Float + avgAccelerationLoadPerContributingMinutes: Float + avgClubZoneFiveAccelerationDistanceM: Float + avgClubZoneFiveAccelerationDurationS: Float + avgClubZoneFiveAccelerationEvents: Float + avgClubZoneFiveDecelerationDistanceM: Float + avgClubZoneFiveDecelerationDurationS: Float + avgClubZoneFiveDecelerationEvents: Float + avgClubZoneFourAccelerationDistanceM: Float + avgClubZoneFourAccelerationDurationS: Float + avgClubZoneFourAccelerationEvents: Float + avgClubZoneFourDecelerationDistanceM: Float + avgClubZoneFourDecelerationDurationS: Float + avgClubZoneFourDecelerationEvents: Float + avgClubZoneHighIntensityDistanceM: Float + avgClubZoneHighIntensityDurationS: Float + avgClubZoneHighIntensityEvents: Float + avgClubZoneHighSpeedRunningDistanceM: Float + avgClubZoneHighSpeedRunningDurationS: Float + avgClubZoneHighSpeedRunningEvents: Int + avgClubZoneJoggingDistanceM: Float + avgClubZoneJoggingDurationS: Float + avgClubZoneJoggingEvents: Float + avgClubZoneLowIntensityDistanceM: Float + avgClubZoneLowIntensityDurationS: Float + avgClubZoneLowIntensityEvents: Float + avgClubZoneMediumIntensityDistanceM: Float + avgClubZoneMediumIntensityDurationS: Float + avgClubZoneMediumIntensityEvents: Float + avgClubZoneOneAccelerationDistanceM: Float + avgClubZoneOneAccelerationDurationS: Float + avgClubZoneOneAccelerationEvents: Float + avgClubZoneOneDecelerationDistanceM: Float + avgClubZoneOneDecelerationDurationS: Float + avgClubZoneOneDecelerationEvents: Float + avgClubZoneSprintDistanceM: Float + avgClubZoneSprintDurationS: Float + avgClubZoneSprintEvents: Float + avgClubZoneThreeAccelerationDistanceM: Float + avgClubZoneThreeAccelerationDurationS: Float + avgClubZoneThreeAccelerationEvents: Float + avgClubZoneThreeDecelerationDistanceM: Float + avgClubZoneThreeDecelerationDurationS: Float + avgClubZoneThreeDecelerationEvents: Float + avgClubZoneTwoAccelerationDistanceM: Float + avgClubZoneTwoAccelerationDurationS: Float + avgClubZoneTwoAccelerationEvents: Float + avgClubZoneTwoDecelerationDistanceM: Float + avgClubZoneTwoDecelerationDurationS: Float + avgClubZoneTwoDecelerationEvents: Float + avgDecelerationEvents: Float + avgDistanceMAtKph: [Bucket!]! + avgDistanceMOverTime: [TimeSeriesData!]! + avgDiveEvents: Float + avgHighDiveEvents: Float + avgHighIntensityEvents: Float + avgHighIntensityRunDistanceM: Float! @deprecated(reason: "use avgTotalHighIntensityDistanceM") + avgHighIntensityRunDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgHighJumpEvents: Float + avgHighMetabolicLoadDistanceM: Float! + avgHighMetabolicLoadEvents: Float + avgHighSpeedRunDistanceM: Float + avgHighSpeedRunEvents: Float + avgIndividualZoneFiveAccelerationDistanceM: Float + avgIndividualZoneFiveAccelerationDurationS: Float + avgIndividualZoneFiveAccelerationEvents: Float + avgIndividualZoneFiveDecelerationDistanceM: Float + avgIndividualZoneFiveDecelerationDurationS: Float + avgIndividualZoneFiveDecelerationEvents: Float + avgIndividualZoneFourAccelerationDistanceM: Float + avgIndividualZoneFourAccelerationDurationS: Float + avgIndividualZoneFourAccelerationEvents: Float + avgIndividualZoneFourDecelerationDistanceM: Float + avgIndividualZoneFourDecelerationDurationS: Float + avgIndividualZoneFourDecelerationEvents: Float + avgIndividualZoneHighIntensityDistanceM: Float + avgIndividualZoneHighIntensityDurationS: Float + avgIndividualZoneHighIntensityEvents: Float + avgIndividualZoneHighSpeedRunningDistanceM: Float + avgIndividualZoneHighSpeedRunningDurationS: Float + avgIndividualZoneHighSpeedRunningEvents: Int + avgIndividualZoneJoggingDistanceM: Float + avgIndividualZoneJoggingDurationS: Float + avgIndividualZoneJoggingEvents: Float + avgIndividualZoneLowIntensityDistanceM: Float + avgIndividualZoneLowIntensityDurationS: Float + avgIndividualZoneLowIntensityEvents: Float + avgIndividualZoneMediumIntensityDistanceM: Float + avgIndividualZoneMediumIntensityDurationS: Float + avgIndividualZoneMediumIntensityEvents: Float + avgIndividualZoneOneAccelerationDistanceM: Float + avgIndividualZoneOneAccelerationDurationS: Float + avgIndividualZoneOneAccelerationEvents: Float + avgIndividualZoneOneDecelerationDistanceM: Float + avgIndividualZoneOneDecelerationDurationS: Float + avgIndividualZoneOneDecelerationEvents: Float + avgIndividualZoneSprintDistanceM: Float + avgIndividualZoneSprintDurationS: Float + avgIndividualZoneSprintEvents: Float + avgIndividualZoneThreeAccelerationDistanceM: Float + avgIndividualZoneThreeAccelerationDurationS: Float + avgIndividualZoneThreeAccelerationEvents: Float + avgIndividualZoneThreeDecelerationDistanceM: Float + avgIndividualZoneThreeDecelerationDurationS: Float + avgIndividualZoneThreeDecelerationEvents: Float + avgIndividualZoneTwoAccelerationDistanceM: Float + avgIndividualZoneTwoAccelerationDurationS: Float + avgIndividualZoneTwoAccelerationEvents: Float + avgIndividualZoneTwoDecelerationDistanceM: Float + avgIndividualZoneTwoDecelerationDurationS: Float + avgIndividualZoneTwoDecelerationEvents: Float + avgLeftDiveEvents: Float + avgLeftHighDiveEvents: Float + avgLeftLowDiveEvents: Float + avgLongPassEvents: Float + avgLowDiveEvents: Float + avgLowJumpEvents: Float + avgMaxAcceleration: Float + avgMaxDeceleration: Float + avgMaxSpeedKph: Float! + avgMediumJumpEvents: Float + avgMediumPassEvents: Float + avgMetresPerMinute: Float! + avgNinetyPercentOfMaxSpeedDistanceM: Float + avgNinetyPercentOfMaxSpeedDurationS: Float + avgNinetyPercentOfMaxSpeedEvents: Int + avgNinetyPercentOfRawMaxSpeedDistanceM: Float + avgNinetyPercentOfRawMaxSpeedDurationS: Float + avgNinetyPercentOfRawMaxSpeedEvents: Float + avgPassDistanceM: Float + avgPassEvents: Int + avgPassVelocityMps: Float + avgRightDiveEvents: Float + avgRightHighDiveEvents: Float + avgRightLowDiveEvents: Float + avgShortPassEvents: Float + avgSpeedKph: Float! + avgSprintDistanceMOverTime( + """ + The number of items to return + """ + limit: Int = 250 + + """ + The number of items to skip + """ + offset: Int = 0 + ): [TimeSeriesData!] + avgSprintEvents: Float! + avgTimeAtKph: [Bucket!]! + avgTimeOnBallSeconds: Float + avgTotalDistanceM: Float! + avgTotalHighIntensityDistanceM: Float! + avgTotalMediumIntensityDistanceM: Float + avgTotalSprintDistanceM: Float! + avgTouchEvents: Float + avgWork: Float + avgWorkload: Float + avgWorkloadIntensity: Float + avgWorkloadVolume: Float + avgZoneFiveHeartrateDurationS: Float + avgZoneFourHeartrateDurationS: Float + avgZoneOneHeartrateDurationS: Float + avgZoneThreeHeartrateDurationS: Float + avgZoneTwoHeartrateDurationS: Float + id: ID! + sampledSpeedKphOverTime: [TimeValue!]! + socialImageUrl: String + totalAccelerationEvents: Float + totalClubZoneFiveAccelerationDistanceM: Float + totalClubZoneFiveAccelerationDurationS: Float + totalClubZoneFiveAccelerationEvents: Int + totalClubZoneFiveDecelerationDistanceM: Float + totalClubZoneFiveDecelerationDurationS: Float + totalClubZoneFiveDecelerationEvents: Int + totalClubZoneFourAccelerationDistanceM: Float + totalClubZoneFourAccelerationDurationS: Float + totalClubZoneFourAccelerationEvents: Int + totalClubZoneFourDecelerationDistanceM: Float + totalClubZoneFourDecelerationDurationS: Float + totalClubZoneFourDecelerationEvents: Int + totalClubZoneHighIntensityDistanceM: Float + totalClubZoneHighIntensityDurationS: Float + totalClubZoneHighIntensityEvents: Int + totalClubZoneHighSpeedRunningDistanceM: Float + totalClubZoneHighSpeedRunningDurationS: Float + totalClubZoneHighSpeedRunningEvents: Int + totalClubZoneJoggingDistanceM: Float + totalClubZoneJoggingDurationS: Float + totalClubZoneJoggingEvents: Int + totalClubZoneLowIntensityDistanceM: Float + totalClubZoneLowIntensityDurationS: Float + totalClubZoneLowIntensityEvents: Int + totalClubZoneMediumIntensityDistanceM: Float + totalClubZoneMediumIntensityDurationS: Float + totalClubZoneMediumIntensityEvents: Int + totalClubZoneOneAccelerationDistanceM: Float + totalClubZoneOneAccelerationDurationS: Float + totalClubZoneOneAccelerationEvents: Int + totalClubZoneOneDecelerationDistanceM: Float + totalClubZoneOneDecelerationDurationS: Float + totalClubZoneOneDecelerationEvents: Int + totalClubZoneSprintDistanceM: Float + totalClubZoneSprintDurationS: Float + totalClubZoneSprintEvents: Int + totalClubZoneThreeAccelerationDistanceM: Float + totalClubZoneThreeAccelerationDurationS: Float + totalClubZoneThreeAccelerationEvents: Int + totalClubZoneThreeDecelerationDistanceM: Float + totalClubZoneThreeDecelerationDurationS: Float + totalClubZoneThreeDecelerationEvents: Int + totalClubZoneTwoAccelerationDistanceM: Float + totalClubZoneTwoAccelerationDurationS: Float + totalClubZoneTwoAccelerationEvents: Int + totalClubZoneTwoDecelerationDistanceM: Float + totalClubZoneTwoDecelerationDurationS: Float + totalClubZoneTwoDecelerationEvents: Int + totalDecelerationEvents: Float + totalDistanceM: Float! + totalDiveEvents: Int + totalHighDiveEvents: Int + totalHighIntensityDistanceM: Float! + totalHighIntensityEvents: Int + totalHighJumpEvents: Int + totalHighMetabolicLoadDistanceM: Float! + totalHighMetabolicLoadEvents: Int + totalHighSpeedRunDistanceM: Float + totalHighSpeedRunEvents: Int + totalIndividualZoneFiveAccelerationDistanceM: Float + totalIndividualZoneFiveAccelerationDurationS: Float + totalIndividualZoneFiveAccelerationEvents: Int + totalIndividualZoneFiveDecelerationDistanceM: Float + totalIndividualZoneFiveDecelerationDurationS: Float + totalIndividualZoneFiveDecelerationEvents: Int + totalIndividualZoneFourAccelerationDistanceM: Float + totalIndividualZoneFourAccelerationDurationS: Float + totalIndividualZoneFourAccelerationEvents: Int + totalIndividualZoneFourDecelerationDistanceM: Float + totalIndividualZoneFourDecelerationDurationS: Float + totalIndividualZoneFourDecelerationEvents: Int + totalIndividualZoneHighIntensityDistanceM: Float + totalIndividualZoneHighIntensityDurationS: Float + totalIndividualZoneHighIntensityEvents: Int + totalIndividualZoneHighSpeedRunningDistanceM: Float + totalIndividualZoneHighSpeedRunningDurationS: Float + totalIndividualZoneHighSpeedRunningEvents: Int + totalIndividualZoneJoggingDistanceM: Float + totalIndividualZoneJoggingDurationS: Float + totalIndividualZoneJoggingEvents: Int + totalIndividualZoneLowIntensityDistanceM: Float + totalIndividualZoneLowIntensityDurationS: Float + totalIndividualZoneLowIntensityEvents: Int + totalIndividualZoneMediumIntensityDistanceM: Float + totalIndividualZoneMediumIntensityDurationS: Float + totalIndividualZoneMediumIntensityEvents: Int + totalIndividualZoneOneAccelerationDistanceM: Float + totalIndividualZoneOneAccelerationDurationS: Float + totalIndividualZoneOneAccelerationEvents: Int + totalIndividualZoneOneDecelerationDistanceM: Float + totalIndividualZoneOneDecelerationDurationS: Float + totalIndividualZoneOneDecelerationEvents: Int + totalIndividualZoneSprintDistanceM: Float + totalIndividualZoneSprintDurationS: Float + totalIndividualZoneSprintEvents: Int + totalIndividualZoneThreeAccelerationDistanceM: Float + totalIndividualZoneThreeAccelerationDurationS: Float + totalIndividualZoneThreeAccelerationEvents: Int + totalIndividualZoneThreeDecelerationDistanceM: Float + totalIndividualZoneThreeDecelerationDurationS: Float + totalIndividualZoneThreeDecelerationEvents: Int + totalIndividualZoneTwoAccelerationDistanceM: Float + totalIndividualZoneTwoAccelerationDurationS: Float + totalIndividualZoneTwoAccelerationEvents: Int + totalIndividualZoneTwoDecelerationDistanceM: Float + totalIndividualZoneTwoDecelerationDurationS: Float + totalIndividualZoneTwoDecelerationEvents: Int + totalLeftDiveEvents: Int + totalLeftHighDiveEvents: Int + totalLeftLowDiveEvents: Int + totalLivePageDurationSeconds: Int @deprecated(reason: "Deprecated without replacement") + totalLongPassEvents: Int + totalLowDiveEvents: Int + totalLowJumpEvents: Int + totalMediumIntensityDistanceM: Float + totalMediumJumpEvents: Int + totalMediumPassEvents: Int + totalNinetyPercentOfMaxSpeedDistanceM: Float + totalNinetyPercentOfMaxSpeedDurationS: Float + totalNinetyPercentOfMaxSpeedEvents: Int + totalNinetyPercentOfRawMaxSpeedDistanceM: Float + totalNinetyPercentOfRawMaxSpeedDurationS: Float + totalNinetyPercentOfRawMaxSpeedEvents: Float + totalPassEvents: Int + totalRightDiveEvents: Int + totalRightHighDiveEvents: Int + totalRightLowDiveEvents: Int + totalShortPassEvents: Int + totalSprintDistanceM: Float! + totalSprintEvents: Int + totalTimeOnBallSeconds: Float + totalTouchEvents: Int + totalWork: Float + totalZoneFiveHeartrateDurationS: Float + totalZoneFourHeartrateDurationS: Float + totalZoneOneHeartrateDurationS: Float + totalZoneThreeHeartrateDurationS: Float + totalZoneTwoHeartrateDurationS: Float + updatedAt: ISO8601DateTime! +} + +""" +Autogenerated return type of TriggerSessionDetectionV2. +""" +type TriggerSessionDetectionV2Payload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of UnarchiveClubMember. +""" +type UnarchiveClubMemberPayload { + errors: [ValidationError!]! +} + +""" +User options for distance and speed unit display +""" +type UnitOptions { + """ + Distances and speeds should be displayed in Imperial units + """ + imperial: Boolean! + + """ + Distances should be displayed in yards and never converted to miles + """ + imperialYardsOnly: Boolean! + + """ + Speeds should be displayed in metres per second + """ + metresPerSecond: Boolean! + + """ + Distances and speeds should be displayed in Metric units + """ + metric: Boolean! +} + +""" +Input options for distance and speed unit display +""" +input UnitOptionsInput { + """ + Uses imperial units + """ + imperial: Boolean! + + """ + Uses short imperial units (yards) only + """ + imperialYardsOnly: Boolean! + + """ + Uses only metres per second only + """ + metresPerSecond: Boolean! + + """ + Uses metric units + """ + metric: Boolean! +} + +enum UnitSystem { + imperial + imperial_yards_only + metres_per_second + metric +} + +""" +An ISO 8601-encoded datetime. DateTimes may not be formatted as strictly as 'ISO8601DateTime' +""" +scalar UnsafeISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339") + +""" +Attributes for updating athletes information +""" +input UpdateAthleteAttributes { + """ + Custom identifier for external system integration + """ + customId: String + defaultPosition: String! +} + +""" +Autogenerated return type of UpdateAthleteGroup. +""" +type UpdateAthleteGroupPayload { + athleteGroup: AthleteGroup + errors: [ValidationError!]! +} + +""" +Autogenerated return type of UpdateAthlete. +""" +type UpdateAthletePayload { + athlete: Athlete + errors: [ValidationError!]! +} + +""" +Attributes for updating a club member's information +""" +input UpdateClubMemberAttributes { + """ + Default position for the member + """ + defaultPosition: String + + """ + Whether the member is an athlete + """ + isAthlete: Boolean! + + """ + Whether the member is a staff member + """ + isStaff: Boolean! + + """ + Club-specific name for the member + """ + name: String +} + +""" +Autogenerated return type of UpdateClubMember. +""" +type UpdateClubMemberPayload { + errors: [ValidationError!]! +} + +""" +Attributes for updating a Club's Settings +""" +input UpdateClubSettingsAttributes { + autoEdgeAssignment: Boolean @deprecated(reason: "setting no longer used") + labelledAccelzonesLowerBoundsMs2: AccelzoneLowerBoundsInput + labelledBandedJumpZonesLowerBoundsCm: BandedJumpZoneLowerBoundsInput + labelledDecelzonesLowerBoundsMs2: DecelzoneLowerBoundsInput + labelledHeartRateBoundsPercentages: HeartRateLowerBoundsInput + labelledSpeedzonesLowerBoundsKph: SpeedzoneLowerBoundsInput + selectEdgesForSync: Boolean + speedzonesLowerBoundsKph: [Float!] @deprecated(reason: "use labelled_speedzones_lower_bounds_kph") +} + +""" +Autogenerated return type of UpdateClubSettings. +""" +type UpdateClubSettingsPayload { + errors: [ValidationError!]! + settings: Settings! +} + +""" +Autogenerated return type of UpdateCustomQuestionDefinition. +""" +type UpdateCustomQuestionDefinitionPayload { + """ + Custom Question Definition Object + """ + customQuestionDefinition: CustomQuestionDefinition + errors: [ValidationError!]! +} + +""" +Attributes for updating a dataset for flexible reporting +""" +input UpdateDatasetAttributes { + """ + The grid config for the dataset + """ + gridConfig: JSON + + """ + The title for the dataset + """ + title: String +} + +""" +Autogenerated return type of UpdateDataset. +""" +type UpdateDatasetPayload { + """ + The updated dataset + """ + dataset: Dataset + errors: [ValidationError!]! +} + +""" +Autogenerated return type of UpdateDevice. +""" +type UpdateDevicePayload { + errors: [ValidationError!]! +} + +""" +Attributes for updating a FlexibleReport +""" +input UpdateFlexibleReportAttributes { + """ + Club ID + """ + clubId: ID! + + """ + CSV Template ID (deprecated: will use a default template for flexible reports) + """ + csvTemplateId: ID + + """ + The end date for the range of + """ + endDate: ISO8601DateOrEmptyString + + """ + The grid config for the dataset + """ + gridConfig: JSON + + """ + The start date for the range of data + """ + startDate: ISO8601DateOrEmptyString + + """ + the report's title + """ + title: String! +} + +""" +Attributes for updating a flexible report chart +""" +input UpdateFlexibleReportChartAttributes { + """ + The configuration for the chart + """ + chartConfig: JSON! + + """ + If chart data labels should be displayed + """ + displayDataLabels: Boolean = false + + """ + The filters for the chart data + """ + filters: JSON! + + """ + The sort config for the chart data + """ + sortConfig: JSON + + """ + The title of the chart + """ + title: String! +} + +""" +Autogenerated return type of UpdateFlexibleReportChart. +""" +type UpdateFlexibleReportChartPayload { + errors: [ValidationError!]! + + """ + The created flexible report chart + """ + reportChart: FlexibleReportChart +} + +""" +Autogenerated return type of UpdateFlexibleReportChartPosition. +""" +type UpdateFlexibleReportChartPositionPayload { + errors: [ValidationError!]! + + """ + The updated flexible report chart + """ + reportChart: FlexibleReportChart +} + +""" +Autogenerated return type of UpdateFlexibleReport. +""" +type UpdateFlexibleReportPayload { + errors: [ValidationError!]! + + """ + the created FlexibleReport + """ + report: FlexibleReport +} + +""" +Attributes for updating a gateway ownership +""" +input UpdateGatewayOwnershipAttributes { + """ + The new name for the gateway ownership + """ + name: String! +} + +""" +Autogenerated return type of UpdateGatewayOwnership. +""" +type UpdateGatewayOwnershipPayload { + errors: [ValidationError!]! + + """ + The updated gateway ownership + """ + gatewayOwnership: GatewayOwnership +} + +""" +Autogenerated return type of UpdateMatchEvent. +""" +type UpdateMatchEventPayload { + errors: [ValidationError!]! + matchEvent: MatchEvent +} + +""" +Autogenerated return type of UpdateMatchEvents. +""" +type UpdateMatchEventsPayload { + errors: [ValidationError!]! + matchEvents: [MatchEvent!] +} + +""" +Attributes for updating a Person and their Identity +""" +input UpdatePersonAttributes { + dateOfBirth: ISO8601Date + email: String + gender: String + name: String + settings: UpdateSettingsAttributes + unitOptions: UnitOptionsInput + unitSystem: UnitSystem +} + +""" +Autogenerated return type of UpdatePersonDetails. +""" +type UpdatePersonDetailsPayload { + errors: [ValidationError!]! + person: Person +} + +""" +Autogenerated return type of UpdatePitch. +""" +type UpdatePitchPayload { + errors: [ValidationError!]! + pitch: Pitch +} + +""" +Autogenerated return type of UpdateSegment. +""" +type UpdateSegmentPayload { + errors: [ValidationError!]! + segment: Segment +} + +""" +Autogenerated return type of UpdateSegments. +""" +type UpdateSegmentsPayload { + errors: [ValidationError!]! + + """ + List of updated session segments + """ + segments: [Segment!] +} + +""" +Autogenerated return type of UpdateSessionBlueprint. +""" +type UpdateSessionBlueprintPayload { + errors: [ValidationError!]! + + """ + Session Blueprint + """ + sessionBlueprint: SessionBlueprint +} + +""" +Autogenerated return type of UpdateSessionParticipations. +""" +type UpdateSessionParticipationsPayload { + errors: [ValidationError!]! + + """ + The updated session participations + """ + sessionParticipations( + """ + The limit of the session participations + """ + limit: Int + + """ + The offset of the session participations + """ + offset: Int + ): [SessionParticipation!] +} + +""" +Autogenerated return type of UpdateSession. +""" +type UpdateSessionPayload { + errors: [ValidationError!]! + + """ + Session + """ + session: Session +} + +""" +Autogenerated return type of UpdateSessionPositions. +""" +type UpdateSessionPositionsPayload { + errors: [ValidationError!]! + session: Session +} + +""" +Autogenerated return type of UpdateSessionTagDefinition. +""" +type UpdateSessionTagDefinitionPayload { + errors: [ValidationError!]! + sessionTagDefinition: SessionTagDefinition +} + +""" +Attributes for updating Settings +""" +input UpdateSettingsAttributes { + autoEdgeAssignment: Boolean @deprecated(reason: "setting no longer used") + labelledSpeedzonesLowerBoundsKph: SpeedzoneLowerBoundsInput + selectEdgesForSync: Boolean + speedzonesLowerBoundsKph: [Float!] @deprecated(reason: "use labelled_speedzones_lower_bounds_kph") +} + +""" +Attributes for updating staff billing detail access +""" +input UpdateStaffBillingAttributes { + canAccessBilling: Boolean! + id: ID! +} + +""" +Autogenerated return type of UpdateStaffBilling. +""" +type UpdateStaffBillingPayload { + errors: [ValidationError!]! + staff: [Staff!]! +} + +""" +Autogenerated return type of UpdateSurvey. +""" +type UpdateSurveyPayload { + errors: [ValidationError!]! + survey: Survey +} + +""" +Autogenerated return type of UpdateSurveyTimerTrigger. +""" +type UpdateSurveyTimerTriggerPayload { + errors: [ValidationError!]! + surveyTimerTrigger: SurveyTimerTrigger +} + +""" +Autogenerated return type of UpdateTagDefinition. +""" +type UpdateTagDefinitionPayload { + errors: [ValidationError!]! + + """ + The tag definition + """ + tagDefinition: TagDefinition +} + +""" +Attributes for updating user preferences +""" +input UpdateUserPreferencesAttributes { + """ + Key of the preference to update + """ + key: String! + + """ + ID of the owner + """ + ownerId: ID! + + """ + Type of the owner + """ + ownerType: OwnerEnum! + + """ + Value of the preference to update + """ + value: String +} + +""" +Autogenerated return type of UpdateUserPreferences. +""" +type UpdateUserPreferencesPayload { + errors: [ValidationError!]! +} + +""" +Autogenerated return type of UpsertChatClubContext. +""" +type UpsertChatClubContextPayload { + """ + The created or updated club context + """ + chatClubContext: ClubContext + errors: [ValidationError!]! +} + +""" +Autogenerated return type of UpsertChatCoachContext. +""" +type UpsertChatCoachContextPayload { + """ + The coach context that was created or updated + """ + chatCoachContext: CoachContext + errors: [ValidationError!]! +} + +""" +Attributes for upserting a data recording +""" +input UpsertDataRecordingsAttributes { + """ + An ID for an athlete + """ + athleteId: ID! + + """ + An Edge ID + """ + edgeId: ID +} + +""" +Autogenerated return type of UpsertDataRecordings. +""" +type UpsertDataRecordingsPayload { + """ + A data recording + """ + dataRecordings: [DataRecording!] + errors: [ValidationError!]! + + """ + A session + """ + session: Session +} + +""" +Autogenerated return type of UpsertSessionPlan. +""" +type UpsertSessionPlanPayload { + errors: [ValidationError!]! + + """ + The created or updated session plan + """ + sessionPlan: SessionPlan +} + +""" +A key-value pair +""" +type UserPreference { + """ + The key of the preference + """ + key: String! + + """ + The value of the preference + """ + value: String! +} + +""" +A validation error +""" +type ValidationError { + """ + Descriptions of the errors, including the field name + """ + fullMessages: [String!]! + + """ + Which input value this error came from + """ + path: [String!]! +} + +""" +A Video Fragment +""" +type VideoFragment implements VideoSourceInterface { + """ + The size of the fragment file in bytes + """ + fileSizeBytes: Int! + + """ + The ID of the video source + """ + id: ID! + + """ + Whether the processing intermediate file is attached + """ + processingIntermediateFileAttached: Boolean! + + """ + The video variants belonging to this video source + """ + videoVariants( + """ + Maximum number of variants to return + """ + limit: Int + + """ + Number of variants to skip + """ + offset: Int + ): [VideoVariant!]! +} + +""" +A Video Recording +""" +type VideoRecording implements VideoSourceInterface { + """ + The encrypted ID of the video recording for the camera + """ + encryptedIdForCamera: String! + + """ + The end time of the video recording + """ + endTime: ISO8601DateTime! + + """ + The ID of the video source + """ + id: ID! + + """ + The start time of the video recording + """ + startTime: ISO8601DateTime! + + """ + The video fragments belonging to this recording + """ + videoFragments( + """ + Maximum number of fragments to return + """ + limit: Int + + """ + Number of fragments to skip + """ + offset: Int + ): [VideoFragment!]! + + """ + The video variants belonging to this video source + """ + videoVariants( + """ + Maximum number of variants to return + """ + limit: Int + + """ + Number of variants to skip + """ + offset: Int + ): [VideoVariant!]! +} + +""" +Attributes for creating a new video recording +""" +input VideoRecordingAttributes { + """ + The ID of the camera ownership + """ + cameraOwnershipId: ID! + + """ + The end time of the video recording + """ + endTime: ISO8601DateTime! + + """ + The start time of the video recording + """ + startTime: ISO8601DateTime! + + """ + The total size of all video fragments in bytes + """ + totalSizeBytes: Int! +} + +""" +Common interface for video sources +""" +interface VideoSourceInterface { + """ + The ID of the video source + """ + id: ID! + + """ + The video variants belonging to this video source + """ + videoVariants( + """ + Maximum number of variants to return + """ + limit: Int + + """ + Number of variants to skip + """ + offset: Int + ): [VideoVariant!]! +} + +""" +A Video Variant +""" +type VideoVariant { + """ + The height of the video variant (e.g., 1080, 1440) + """ + height: Int! + + """ + The ID of the video variant + """ + id: ID! + + """ + The video source (fragment or recording) + """ + videoSource: VideoSourceInterface! +} + +""" +Weekly load data for a club including high/low load athletes and average +""" +type WeeklyLoad { + """ + Average work load across all sessions for the week + """ + avgWeeklyLoad: Float! + + """ + Athletes with highest avg session load for the week + """ + highLoadAthletes: [WeeklyLoadAthlete!]! + + """ + Athletes with lowest avg session load for the week + """ + lowLoadAthletes: [WeeklyLoadAthlete!]! +} + +""" +Athlete data for weekly load analysis +""" +type WeeklyLoadAthlete { + """ + Average work metric per session for this athlete during the week + """ + avgWorkPerSession: Float! + + """ + Athlete's default playing position + """ + defaultPosition: String + + """ + Unique identifier for the athlete + """ + id: ID! + + """ + Athlete's name + """ + name: String! +} diff --git a/scripts/fetch_schema.py b/scripts/fetch_schema.py new file mode 100644 index 0000000..0a65a7f --- /dev/null +++ b/scripts/fetch_schema.py @@ -0,0 +1,16 @@ +import httpx +from pathlib import Path + +SCHEMA_URL = "https://app.playerdata.co.uk/api/schema.graphql" +OUTPUT_PATH = Path(__file__).resolve().parent.parent / "schema.graphql" + + +def main(): + response = httpx.get(SCHEMA_URL) + response.raise_for_status() + OUTPUT_PATH.write_text(response.text) + print(f"Schema written to {OUTPUT_PATH}") + + +if __name__ == "__main__": + main() diff --git a/scripts/fix_imports.py b/scripts/fixup.py similarity index 58% rename from scripts/fix_imports.py rename to scripts/fixup.py index d8f7034..6214385 100644 --- a/scripts/fix_imports.py +++ b/scripts/fixup.py @@ -1,20 +1,42 @@ def add_import_line(path: str, import_line: str): - with open(path, "r") as f: + with open(path, "r+") as f: content = f.read() content = import_line + content - with open(path, "w") as f: f.write(content) def replace_import_line(path: str, import_line: str, new_import_line: str): - with open(path, "r") as f: + with open(path, "r+") as f: content = f.read() content = content.replace(import_line, new_import_line) + f.write(content) + + +def add_playerdata_api_to_init(path: str = "playerdatapy/__init__.py"): + with open(path, "r") as f: + content = f.read() + + import_line = "from .playerdata_api import PlayerDataAPI\n" + if import_line not in content: + content = content.replace( + "__all__ = [", import_line + "\n__all__ = [" + ) + + if '"PlayerDataAPI"' not in content: + content = content.replace( + '__all__ = [', '__all__ = [\n "PlayerDataAPI",' + ) + with open(path, "w") as f: f.write(content) -def fix_imports(): +def fixup(): + """ + Fix all the things that codegen breaks. + """ + add_playerdata_api_to_init() + import_line = "from playerdatapy.enums import *\n" for path in [ "playerdatapy/custom_queries.py", @@ -30,4 +52,4 @@ def fix_imports(): if __name__ == "__main__": - fix_imports() + fixup() diff --git a/scripts/get_auth_token.py b/scripts/get_auth_token.py deleted file mode 100644 index 61a731d..0000000 --- a/scripts/get_auth_token.py +++ /dev/null @@ -1,24 +0,0 @@ -import sys -import os -from playerdatapy.auth.client_credentials_flow import ClientCredentialsFlow - -client_id = os.environ.get("CLIENT_ID") -client_secret = os.environ.get("CLIENT_SECRET") - -if not client_id or not client_secret: - print("Error: CLIENT_ID and CLIENT_SECRET must be set", file=sys.stderr) - sys.exit(1) - -try: - client_credentials_flow = ClientCredentialsFlow( - client_id=client_id, - client_secret=client_secret, - ) - token = client_credentials_flow.authenticate(save_token=False) - auth_string = f"Bearer {token['access_token']}" - with open(os.getenv("GITHUB_ENV"), "a") as f: - f.write(f"AUTH_TOKEN={auth_string}\n") - print("Bearer token obtained and set in AUTH_TOKEN environment variable.") -except Exception as e: - print(f"Error: {e}", file=sys.stderr) - sys.exit(1) diff --git a/uv.lock b/uv.lock index d351ec1..a3f154f 100644 --- a/uv.lock +++ b/uv.lock @@ -655,9 +655,11 @@ dependencies = [ { name = "requests-oauthlib" }, ] -[package.optional-dependencies] -dev = [ +[package.dev-dependencies] +codegen = [ { name = "ariadne-codegen" }, +] +test = [ { name = "ipykernel" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -666,19 +668,22 @@ dev = [ [package.metadata] requires-dist = [ - { name = "ariadne-codegen", marker = "extra == 'dev'", specifier = ">=0.17.0" }, { name = "graphql-core", specifier = ">=3.2.0" }, { name = "httpx", specifier = ">=0.24.0" }, - { name = "ipykernel", marker = "extra == 'dev'", specifier = ">=7.1.0" }, { name = "oauthlib", specifier = ">=3.2.0" }, { name = "polars", specifier = ">=1.37.1" }, { name = "pydantic", specifier = ">=2.0.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.4.2" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.14.14" }, ] -provides-extras = ["dev"] + +[package.metadata.requires-dev] +codegen = [{ name = "ariadne-codegen", specifier = ">=0.17.2" }] +test = [ + { name = "ipykernel", specifier = ">=7.2.0" }, + { name = "pytest", specifier = ">=9.0.2" }, + { name = "pytest-asyncio", specifier = ">=1.3.0" }, + { name = "ruff", specifier = ">=0.15.1" }, +] [[package]] name = "pluggy"