Compare commits

...

656 Commits

Author SHA1 Message Date
Dean Wenstrand
aa731b85fc Declare taxonomy filter variables on the makes/runs leaderboards
All checks were successful
Tests / Tests (pull_request) Successful in 18s
The backend leaderboard resolvers gained game_type, table size and pocket
size filters, but GetMakesLeaderboard and GetRunsLeaderboard never declared
them — GraphQL silently drops undeclared variables, so anything the client
passed was ignored and both boards stayed global.

Declare and forward the five filter args on both queries, matching the
names the drill run leaderboard already uses.
2026-07-21 09:30:37 -07:00
1a95439ed2 Replace GetRecordedStreams/GetLiveStreams with video-first GetShotLabVideos
All checks were successful
Tests / Tests (pull_request) Successful in 44s
Shot Lab's source picker becomes video-first: one query for recent videos
regardless of stream completion (an in-progress recording with no shots
yet still appears), carrying stream recency fields so the client can hint
"actively updating" without gating on it. Operation-only change; schema
is untouched (the stream fields already exist).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 23:42:43 -07:00
5e14cd2201 Merge pull request 'Regenerate schema for leaderboard taxonomy filters' (#300) from dean/leaderboard-taxonomy into master
Reviewed-on: #300
2026-07-21 04:20:57 +00:00
Dean Wenstrand
9ec52d9d94 Regenerate schema for leaderboard taxonomy filters
All checks were successful
Tests / Tests (pull_request) Successful in 11s
Adds the optional taxonomy args to getLongestRunsLeaderboard and
getMakesLeaderboard (gameType, rankedOnly, excludeDrills, and
table/pocket size bounds) generated from the backend resolvers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 21:19:39 -07:00
4576b25dae Merge pull request 'Regenerate schema with upstream Strawberry' (#299) from codex/strawberry-upgrade into master 2026-07-20 22:08:35 +00:00
650b3bc13c Regenerate schema with upstream Strawberry
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-07-20 14:46:00 -07:00
6d9cb4126e Merge pull request 'Add per-video HomographyBackendGQL selection to VideoMetadataInput' (#298) from colonelpanic/homography-backend-selection into master 2026-07-18 02:12:18 +00:00
feeb5b7038 Add HomographyBackendGQL enum and VideoMetadataInput.homographyBackend
All checks were successful
Tests / Tests (pull_request) Successful in 11s
Regenerated from backend Python: adds the HomographyBackendGQL enum
(CLASSIC/TABLENET) and the optional homographyBackend field on
VideoMetadataInput, for per-video homography backend selection.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:26:53 -07:00
3340314166 Merge pull request 'Add per-session Coach GraphQL contract' (#297) from loewy/session-coach-v1 into master
Reviewed-on: #297
2026-07-17 18:33:58 +00:00
6b8fdd4262 Add per-session Coach GraphQL contract
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-07-16 16:45:55 -07:00
bfaed33c89 Merge pull request 'feed: select uploadCompletionCursor on VideoCardFields stream' (#296) from dean/feed-upload-completion-cursor into master
Reviewed-on: #296
2026-07-14 18:24:54 +00:00
Dean Wenstrand
1ce3aaed1b feed: select uploadCompletionCursor on VideoCardFields stream
All checks were successful
Tests / Tests (pull_request) Successful in 24s
Lets the client distinguish a finalized-but-not-fully-uploaded stream
(is_completed set, but received cursor short of last_intended_segment_bound)
from one that is genuinely processing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:15:41 -07:00
1bd03f2bbe Merge pull request 'dean/unify-shotlab-cohorts' (#295) from dean/unify-shotlab-cohorts into master
Reviewed-on: #295
2026-07-13 01:08:48 +00:00
Dean Wenstrand
4a1c41aae1 Regenerate schema and hooks from backend master
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Union of the cohort funnel, Shot Lab picker queries, and transient
homography IDs — converges the three divergent submodule pointers
(gql master, railbird master, railbird-mobile master).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 18:03:33 -07:00
Dean Wenstrand
4122284bbd Merge Shot Lab queries with cohort funnel 2026-07-12 17:59:33 -07:00
b30dbd01f5 Fetch shot paths and features for the Shot Lab picker
All checks were successful
Tests / Tests (pull_request) Successful in 11s
The recorded-shot picker now renders per-shot table diagrams, so
GetRecordedStreamShots needs serializedShotPaths plus the pocketing and
cue-object features that PlaneShotDiagram consumes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 11:13:17 -07:00
6d13dc3eb1 Merge remote-tracking branch 'origin/master' into colonelpanic/allow-transient-homography-ids 2026-07-12 00:19:46 -07:00
e3524cab97 Merge pull request 'Add weekly cohort funnel to getUsageStats' (#293) from dean/usage-stats-cohorts into master
Reviewed-on: #293
2026-07-12 04:07:43 +00:00
303261f2d7 Add recorded Shot Lab queries 2026-07-11 20:56:47 -07:00
20a70fad2a Allow transient homography IDs 2026-07-11 20:55:53 -07:00
Dean Wenstrand
35c7c23ba9 Add disjoint activated segment to cohorts for stacking
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:45:01 -07:00
Dean Wenstrand
40c4b82a59 Add weekly cohort funnel to getUsageStats
All checks were successful
Tests / Tests (pull_request) Successful in 13s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:40:10 -07:00
9ebe2e61df Merge pull request 'dean/usage-stats' (#292) from dean/usage-stats into master
Reviewed-on: #292
2026-07-11 19:26:13 +00:00
Dean Wenstrand
6f356f9535 Add freemium epoch + era conversion to funnel
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 11:38:20 -07:00
Dean Wenstrand
5c0ff8c31b Add freemium funnel to getUsageStats
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:48:25 -07:00
Dean Wenstrand
582c20170d Add getUsageStats admin query + operation (schema regen on shot-lab tip)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:36:47 -07:00
dc02fd8387 Merge pull request 'Select detected ball colors for Shot Lab' (#291) from colonelpanic/shot-lab-image-colors into master
Reviewed-on: #291
2026-07-10 17:20:37 +00:00
ef4782fc14 Select detected ball colors for Shot Lab
All checks were successful
Tests / Tests (pull_request) Successful in 33s
2026-07-10 00:12:06 -07:00
905a1ca6db Merge pull request 'Add RGBColorGQL and identifierToColor to TableStateGQL' (#290) from shot-lab-ball-colors into master 2026-07-10 03:36:33 +00:00
6f63189703 Add RGBColorGQL and identifierToColor to TableStateGQL
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Regenerated from backend: Shot Lab table-state endpoints now expose a
per-ball dominant color (RGB + hex) index-aligned with ball positions.
2026-07-09 20:35:48 -07:00
958057764c Merge pull request 'Add getLiveTableState query and live-stream operations' (#288) from live-table-state into master 2026-07-10 02:12:31 +00:00
361730cace Merge pull request 'Add per-ball trajectory color to shot serialization proto' (#289) from ball-trajectory-colors into master 2026-07-10 00:07:45 +00:00
a78e793bd6 Add per-ball trajectory color to shot serialization proto
All checks were successful
Tests / Tests (pull_request) Successful in 11s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 14:46:06 -07:00
a150e1a300 Add getLiveTableState query and live-stream operations
All checks were successful
Tests / Tests (pull_request) Successful in 10s
- schema: getLiveTableState(videoId) returning LiveTableStateGQL
  (videoId, frameIndex, tableState)
- operations: GetLiveTableState in shot_simulation.gql, lightweight
  GetLiveStreams listing in live_streams.gql
- regenerated TS client outputs

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:15:33 -07:00
63a376ed35 Merge pull request 'Add clientUploadStatus to VideoCardFields stream fragment' (#287) from dean/recording-feed-badge into master
Reviewed-on: #287
2026-07-08 17:10:32 +00:00
31f9852f4b Add clientUploadStatus to VideoCardFields stream fragment
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Lets the feed/session card distinguish camera/bridge recordings
(clientUploadStatus UPLOAD_DISABLED, phone never uploads) from phone
uploads, so it can stop showing 'UPLOAD PAUSED' for recordings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 09:57:50 -07:00
0b4016c601 Merge pull request 'Add tier-aware subscription options' (#286) from loewy/backend-tier-aware-subscription-options into master
Reviewed-on: #286
2026-07-07 23:57:44 +00:00
8e85fddb0a Merge pull request 'Add capability enforcement config field' (#285) from loewy/mobile-capability-config-field into master
Reviewed-on: #285
2026-07-07 23:27:17 +00:00
338798ea5a Add tier-aware subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-07-07 16:10:43 -07:00
6bd92ae991 Add capability enforcement config field
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-07-07 14:44:27 -07:00
8dd9f6df40 Merge pull request 'Add storage status query' (#274) from loewy/storage-status-card-readiness into master
Reviewed-on: #274
2026-07-07 18:20:58 +00:00
f60950a6f6 Select storage limit fields for upload links
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-07-06 23:51:30 -07:00
739451f250 Select storage limit config flag 2026-07-06 23:51:29 -07:00
146af8d713 Add resolved tier query 2026-07-06 23:51:29 -07:00
43b99c447b Add storage status readiness query fields 2026-07-06 23:51:29 -07:00
cba07aa69e Add storage status query 2026-07-06 23:51:29 -07:00
f626054662 Merge pull request 'Add tags arg to createCameraClaimSession' (#284) from dean/camera-session-tags into master
Reviewed-on: #284
2026-07-07 05:56:05 +00:00
Dean Wenstrand
6bc02ec47c Add tags arg to createCameraClaimSession
All checks were successful
Tests / Tests (pull_request) Successful in 11s
Lets the table-camera claim carry session tags (+ the player-count tag), for
parity with the phone recording flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 22:49:28 -07:00
c92246510b Merge pull request 'Add city/state to PoolHall type + create/update inputs' (#283) from dean/pool-hall-city-state into master
Reviewed-on: #283
2026-07-07 01:33:21 +00:00
Dean Wenstrand
3ce2a7be61 Add per-camera recording policy (terms + private allowance) to schema
All checks were successful
Tests / Tests (pull_request) Successful in 10s
allowsPrivateVideos / claimTermsText / claimTermsVersion on PoolHallCamera,
agreedTermsVersion on CameraClaimSession + the create-claim mutation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 18:21:58 -07:00
Dean Wenstrand
fc921c3ae7 Add city/state to PoolHall type + create/update inputs
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Full address stays on `address`; city/state let the UI show a compact locality.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:59:15 -07:00
0b6ac787d8 Merge pull request 'Camera claim flow: lease end/extend, claim preferences, inUse' (#282) from dean/camera-claim-flow into master
Reviewed-on: #282
2026-07-05 18:55:01 +00:00
Dean Wenstrand
ac479dc7e4 Camera claim flow: lease end/extend, claim preferences, inUse
All checks were successful
Tests / Tests (pull_request) Successful in 25s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 18:44:01 -07:00
c6a754cc2d Merge pull request 'Add tableSize/pocketSize to pool hall camera schema' (#281) from dean/camera-table-dimensions into master
Reviewed-on: #281
2026-07-05 00:23:56 +00:00
Dean Wenstrand
2c047292f0 Add tableSize/pocketSize to pool hall camera schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 17:13:23 -07:00
9267cd8180 Merge pull request 'dean/pool-hall-gql' (#280) from dean/pool-hall-gql into master
Reviewed-on: #280
2026-07-04 16:35:00 +00:00
Dean Wenstrand
fa14becc12 Regenerate schema + client from merged backend
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 09:31:53 -07:00
fea506af1b Add pool hall camera GraphQL operations
Hand-written pool hall camera claim operations (schema.gql + index.tsx are
regenerated from the backend in the following commit).
2026-07-04 09:31:15 -07:00
2f9dc86ad9 Merge pull request 'Add capability enforcement config to schema' (#279) from capability-enforcement-config into master
Reviewed-on: #279
2026-07-03 21:02:11 +00:00
e2fe6cadda Add capability enforcement config to schema
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-07-03 12:01:58 -07:00
aafdab5d4d Merge pull request 'Add computePotAim query and shot-simulation operations' (#278) from compute-pot-aim into master 2026-07-03 17:58:48 +00:00
adf05e3c28 Add computePotAim query and shot-simulation operations
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Schema: computePotAim(simulationInput, targetBallId, pocket) ->
PotAimGQL, the spin/throw-compensated aim solver (regenerated from
backend strawberry definitions; reuses the existing PocketIdentifier
enum). Operations: GetTableState, SimulateShot, and ComputePotAim
documents so both clients get generated hooks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 01:44:02 -07:00
5391466e90 Merge pull request 'Add simulateShot query, cue strike and shot projection types' (#277) from shot-simulation-stubs into master
Reviewed-on: #277
2026-07-02 23:35:30 +00:00
4ff2db1ef4 Add simulateShot query, cue strike and shot projection types
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Generated from backend strawberry definitions for the shot simulation
feature (image -> pooltool scenario -> projected outcome). Backend PR:
shot-simulation-stubs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 16:12:11 -07:00
257dcdc31a Merge pull request 'Add DismissVideoExport mutation (soft-hide exports)' (#276) from dean/export-dismiss-gql into master
Reviewed-on: #276
2026-07-02 22:38:02 +00:00
Dean Wenstrand
b41365e99e Add videoName + videoThumbnailUri to VideoExportJobFields
All checks were successful
Tests / Tests (pull_request) Successful in 13s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 14:41:59 -07:00
Dean Wenstrand
0e8233a5d5 Add DismissVideoExport mutation (soft-hide exports)
All checks were successful
Tests / Tests (pull_request) Successful in 17s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 14:18:55 -07:00
b6adae4949 Merge pull request 'Storage limit enforcement schema' (#275) from storage-limit-enforcement-schema into master
Reviewed-on: #275
2026-07-01 22:29:41 +00:00
459e89d8b8 Select storage limit error fields
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-07-01 14:50:45 -07:00
fa2ff19572 Add storage limit enforcement schema 2026-07-01 14:41:21 -07:00
428286fa5a Merge pull request 'dean/video-export-gql' (#273) from dean/video-export-gql into master
Reviewed-on: #273
2026-06-30 22:48:02 +00:00
Dean Wenstrand
8771350115 Echo shotIds/runId on VideoExportJobGQL for re-export
All checks were successful
Tests / Tests (pull_request) Successful in 13s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:00:04 -07:00
Dean Wenstrand
f1594b8492 Video export client operations + myVideoExports list query
RequestVideoExport mutation, VideoExportJob + MyVideoExports queries (with the
VideoExportJobFields fragment) for the mobile fire-and-list flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 13:54:29 -07:00
Dean Wenstrand
3ec3e3d081 Add EXPORT_READY notification type (video export Phase 1b)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 12:51:39 -07:00
Dean Wenstrand
d2c697e4cb Add video export schema: VideoExportJob + request/query + mode/status enums
Generated from the backend video export resolvers (Phase 1a).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 12:35:34 -07:00
3484af9dde Merge pull request 'Add storage usage readiness fields' (#272) from storage-usage-readiness into master
Reviewed-on: #272
2026-06-30 17:12:00 +00:00
bc62cb5e39 Add storage usage readiness fields
All checks were successful
Tests / Tests (pull_request) Successful in 27s
2026-06-29 10:56:33 -07:00
bc52145a9e Merge pull request 'Add storage status schema' (#270) from pr8-storage-status into master
Reviewed-on: #270
2026-06-26 15:33:19 +00:00
5c286f2bcf Add storage status schema
All checks were successful
Tests / Tests (pull_request) Successful in 24s
2026-06-25 17:34:19 -07:00
d636c298f8 Merge pull request 'Add resolved tier capabilities schema' (#269) from tier-capabilities-schema into master
Reviewed-on: #269
2026-06-24 03:37:17 +00:00
681320c62d Add resolved tier capabilities schema
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2026-06-23 15:51:21 -07:00
49f409f60b Merge pull request 'Add resolved tier schema' (#268) from resolved-tier-contract into master
Reviewed-on: #268
2026-06-23 22:10:10 +00:00
e7fc6c147d Add resolved tier schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-23 14:01:32 -07:00
10c3f6de53 Merge pull request 'Add drill leaderboard run dates to gql' (#267) from dean/add-dates-to-leaderboards-gql into master
Reviewed-on: #267
2026-06-23 15:51:28 +00:00
Dean Wenstrand
d7b1aaee13 Add drill leaderboard run dates to gql
All checks were successful
Tests / Tests (pull_request) Successful in 25s
2026-06-23 08:47:08 -07:00
b477590137 Merge pull request 'VideoCardFields: fetch stream isCompleted + lastSegmentUploadedAt' (#266) from dean/feed-upload-status-fields into master
Reviewed-on: #266
2026-06-20 22:45:07 +00:00
Dean Wenstrand
d428a8caa2 VideoCardFields: fetch stream isCompleted + lastSegmentUploadedAt
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Lets the feed derive upload state (uploading vs paused vs processing) per card.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:16:11 -07:00
48207e12ee Merge pull request 'Add lastSegmentUploadedAt to UploadStreamGQL' (#265) from dean/last-uploaded-chunk into master
Reviewed-on: #265
2026-06-20 21:45:32 +00:00
Dean Wenstrand
1d403f8155 Add lastSegmentUploadedAt to UploadStreamGQL
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Surfaces the timestamp of the most recently uploaded chunk so clients can tell
an actively-uploading stream from a partially-uploaded, stalled/paused one
(combined with isCompleted).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:40:40 -07:00
6758f3e77a Merge pull request 'Add bio field to user (UserFragment + editUser)' (#264) from dean/profile-bio into master
Reviewed-on: #264
2026-06-19 21:27:52 +00:00
Dean Wenstrand
79979b001a Add bio field to user (UserFragment + editUser)
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Expose UserGQL.bio in UserFragment and let editUser set it; regenerated
codegen. Rebased onto current master.
2026-06-19 14:14:24 -07:00
49fbebd0c2 Merge pull request 'Fix duplicate Apple IAP selection' (#263) from loewy/fix-duplicate-apple-iap-selection into master
Reviewed-on: #263
2026-06-18 21:39:20 +00:00
9219451c8d Fix duplicate Apple IAP selection
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-18 14:32:37 -07:00
42601f9587 Merge pull request 'Add Apple subscription mobile operations' (#255) from apple-iap-pr4-mobile-ops into master
Reviewed-on: #255
2026-06-18 20:03:10 +00:00
acfb750265 Merge pull request 'Add Apple IAP product IDs to subscription options' (#262) from loewy/apple-iap-product-options into master
Reviewed-on: #262
2026-06-18 01:59:53 +00:00
ffa96a24c3 Add Apple subscription mobile operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-17 18:39:36 -07:00
5b73dd3a83 Add Apple IAP product IDs to subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-17 18:22:47 -07:00
d1bc29b41b Add Apple IAP product config to subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 18:31:36 -07:00
853769e183 Add Apple subscription mobile operations 2026-06-16 18:31:36 -07:00
84524d165d Merge pull request 'Add followingCount to GetVideoFeed payload' (#261) from dean/feed-following-count into master
Reviewed-on: #261
2026-06-16 23:51:38 +00:00
Dean Wenstrand
f4c5fcedd6 Add followingCount to GetVideoFeed payload
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Surfaces how many leading feed videos come from followed users so the
client can place the 'Trending' section divider in the blended home feed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 16:46:21 -07:00
07ca121a3e Merge pull request 'Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields' (#259) from dean/player-spin-types into master
Reviewed-on: #259
2026-06-16 22:24:19 +00:00
Dean Wenstrand
66fb4d3dcc Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-16 14:36:56 -07:00
5293576947 Merge pull request 'Add runLengths to PlayerSummaryFields (per-player run distribution)' (#258) from dean/player-run-lengths into master
Reviewed-on: #258
2026-06-16 20:57:00 +00:00
Dean Wenstrand
0c1afbcc76 Add runLengths to PlayerSummaryFields (per-player run distribution)
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-16 13:39:04 -07:00
655209e1c6 Merge pull request 'Add Apple IAP subscription options schema' (#256) from loewy/apple-iap-product-config into master
Reviewed-on: #256
2026-06-16 18:10:00 +00:00
c9576cf405 Add Apple IAP subscription options schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 10:47:07 -07:00
0c0cd7a7bb Merge pull request 'dean/my-drill-runs' (#257) from dean/my-drill-runs into master
Reviewed-on: #257
2026-06-16 04:25:03 +00:00
Dean Wenstrand
53fa982bcf GetDrillRunLeaderboard: table/pocket filter vars + setup fields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 21:19:37 -07:00
Dean Wenstrand
7ec6ec9193 GetMyDrillRuns: include run date (video.createdAt)
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 19:42:02 -07:00
Dean Wenstrand
0ce333525c Add GetMyDrillRuns query + generated types
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 19:33:56 -07:00
48b647636e Merge pull request 'Add GetDrillRunLeaderboard query + generated types' (#254) from dean/drill-run-leaderboard into master
Reviewed-on: #254
2026-06-16 00:52:05 +00:00
Dean Wenstrand
d1ed5b308b Add GetDrillRunLeaderboard query + generated types
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 16:42:52 -07:00
079e4e8719 Merge pull request 'Add Apple subscription sync schema' (#253) from apple-iap-pr2-backend-schema into master
Reviewed-on: #253
2026-06-12 04:50:36 +00:00
af68bc3c60 Add Apple subscription sync schema
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-11 18:40:54 -07:00
f12d2c5a1b Merge pull request 'Add Apple entitlement source enum' (#252) from apple-entitlement-source-enum into master
Reviewed-on: #252
2026-06-11 21:55:26 +00:00
4e3f649a2c Add Apple entitlement source enum
All checks were successful
Tests / Tests (pull_request) Successful in 28s
2026-06-11 12:43:03 -07:00
7cef75b2ca Merge pull request 'dean/get-video-card-query' (#250) from dean/get-video-card-query into master
Reviewed-on: #250
2026-06-09 05:05:52 +00:00
Dean Wenstrand
6d5cd9b1ed Add lean GetLastSessionDate + GetShotClipRanges queries
All checks were successful
Tests / Tests (pull_request) Successful in 24s
- GetLastSessionDate: most-recent session startTime only, for the Home
  recency nudge (was pulling the full VideoCardFields payload).
- GetShotClipRanges / ShotClipRange: per-shot frame/time window only, for
  the inline session player's condensed playback (was pulling
  ShotWithAllFeatures — features, serialized paths, annotations — x500).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 14:27:42 -07:00
Dean Wenstrand
d59e21c10e Add GetVideoCard query (single-video VideoCardFields)
Returns the full VideoCardFields fragment for one video id, so the
session-detail meta header can share one source of truth (and the
normalized Apollo cache) with the feed card instead of stitching
together GetVideoDetails + GetVideoSocialDetailsById.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 14:04:33 -07:00
9358205327 Merge pull request 'Add quotaEnforcementEnabled to deployed config' (#249) from loewy/expose-quota-enforcement-config into master
Reviewed-on: #249
2026-05-28 23:18:01 +00:00
88634a32e9 add quotaEnforcementEnabled to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-28 14:52:51 -07:00
f7200a2e9f Merge pull request 'Add upload quota status operation' (#248) from loewy/quota-status-buckets into master
Reviewed-on: #248
2026-05-28 21:46:56 +00:00
7d839c0fa6 Add upload quota status operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-27 16:52:43 -07:00
ab1e604871 Merge pull request 'Add quota bucket status fields' (#247) from loewy/quota-status-buckets into master
Reviewed-on: #247
2026-05-26 02:47:40 +00:00
deb724b430 Add quota bucket status fields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-05-25 16:26:57 -07:00
c586bdf1a6 Merge pull request 'Add username + profileImageUri to PlayerClusterGQL' (#246) from dean/player-cluster-username into master
Reviewed-on: #246
2026-05-12 00:27:06 +00:00
Dean Wenstrand
9250e4c639 Add username + profileImageUri to PlayerClusterGQL
All checks were successful
Tests / Tests (pull_request) Successful in 9s
The labeling UI was falling back to "user N" for any assigned cluster
whose user wasn't the video owner — e.g. an admin re-labels a video
they don't own. With the resolver now resolving usernames for every
confirmed cluster, the FE can render real names regardless of who's
viewing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 17:25:34 -07:00
a12b3e1210 Merge pull request 'Add averageDifficulty to PlayerSummaryFields' (#245) from dean/player-summaries-avg-difficulty-types into master
Reviewed-on: #245
2026-05-11 22:41:52 +00:00
Dean Wenstrand
5cf2dbaf01 Add averageDifficulty to PlayerSummaryFields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Regenerated via `just gql` after BE added average_difficulty to
PlayerSummaryGQL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:34:25 -07:00
239a143554 Merge pull request 'Regenerate schema + add longestRun to PlayerSummaryFields' (#244) from dean/player-summaries-longest-run-types into master
Reviewed-on: #244
2026-05-11 20:29:39 +00:00
Dean Wenstrand
296522afb8 Regenerate schema + add longestRun to PlayerSummaryFields
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Generated by `just gql` after BE added longest_run to PlayerSummaryGQL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 13:21:47 -07:00
f42579076e Merge pull request 'Add score to PlayerSummaryFields + PlayerClusterFields fragments' (#243) from dean/video-match-score-types into master
Reviewed-on: #243
2026-05-11 17:43:43 +00:00
Dean Wenstrand
0c9eb4945a Add score to PlayerSummaryFields + PlayerClusterFields fragments
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Picks up the BE additions in railbird PR dean/video-match-score:
new `score` field on PlayerClusterGQL and PlayerSummaryGQL, and
a new `score` input field on ClusterAssignmentInput.

Generated by `just gql`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 10:22:58 -07:00
1182c15004 Merge pull request 'Add playerSummaries to schema + Video fragments' (#242) from dean/player-summaries-types into master
Reviewed-on: #242
2026-05-09 19:34:40 +00:00
Dean Wenstrand
755336b16a Add playerSummaries to schema + Video fragments
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Backs the multi-player vs UI: feed cards and the detail page both
read `video.playerSummaries`, a per-cluster rollup with username,
profile image, representative full-frame URL, makes/total/percentage.

  - PlayerSummaryFields fragment in shooter.gql
  - VideoCardFields (feed) and GetVideoDetails (detail) include
    playerSummaries via the new fragment
  - VideoCardFields tag selection extended to include tagClasses,
    needed for the FE's player_count detection

Generated by `just gql` from the BE additions in railbird PR
dean/video-player-summaries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 12:02:57 -07:00
c1efe9f5f2 Merge pull request 'Add VideoPlayerClusters query + FinalizePlayerAssignments mutation' (#241) from dean/player-labeling-ops into master
Reviewed-on: #241
2026-05-09 04:46:10 +00:00
Dean Wenstrand
a3460842ac Add VideoPlayerClusters query + FinalizePlayerAssignments mutation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Operation file for the per-video player-labeling UI that consumes the
schema types added in #240.

  - VideoPlayerClusters($videoId): read clusters + crops
  - FinalizePlayerAssignments($input): apply user assignments and
    shot moves in one transaction

Generated by `just gql`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 21:44:42 -07:00
84d3a0252d Merge pull request 'Add player cluster + labeling mutation types' (#240) from dean/labeling-api-types into master
Reviewed-on: #240
2026-05-09 00:38:29 +00:00
Dean Wenstrand
1de4a97cb6 Add player cluster + labeling mutation types
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Schema additions for the per-video player labeling UI:
  * `PlayerClusterGQL` / `PlayerClusterShotGQL` — read shape.
  * `FinalizePlayerAssignmentsInput` + `ClusterAssignmentInput` +
    `ShotMoveInput` — write shape.
  * Query: `videoPlayerClusters(videoId)`.
  * Mutation: `finalizePlayerAssignments(input)`.

Generated by `just gql` from the backend type definitions in
`railbird/datatypes/gql/shooter.py` and resolvers in
`railbird/server/resolvers/shooter.py`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:04:41 -07:00
130314546c Merge pull request 'Add trial days to GetAvailableSubscriptions' (#239) from loewy/add-trial-period-days into master
Reviewed-on: #239
2026-05-04 21:46:45 +00:00
b88f172355 add trial days to return
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-04 14:07:16 -07:00
639fc88b0b Merge pull request 'Add createCustomerPortalSession' (#238) from loewy/create-customer-portal-session into master
Reviewed-on: #238
2026-05-01 22:45:40 +00:00
20f50368c9 remove return url
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-01 13:15:18 -07:00
8367c2d0cd add createCustomerPortalSession
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-04-30 11:44:34 -07:00
b0c62f6e80 Merge pull request 'Trim getFeed query fragment' (#237) from loewy/trim-get-feed-query-fragment into master
Reviewed-on: #237
2026-04-29 20:26:40 +00:00
bc1ff66467 trim uncessary requested fields
All checks were successful
Tests / Tests (pull_request) Successful in 38s
2026-04-28 12:53:25 -07:00
ae37a3d9d9 Merge pull request 'Default getLongestRunsLeaderboard limit to 50' (#236) from dean/leaderboard-default-top-50 into master
Reviewed-on: #236
2026-04-24 00:01:23 +00:00
Dean Wenstrand
114b21400e Default getLongestRunsLeaderboard limit to 50
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:56:56 -07:00
ad9cab4543 Merge pull request 'Get Game Type Tag Operations' (#234) from loewy/get-game-type-tag-metrics-operation into master
Reviewed-on: #234
2026-04-14 20:11:43 +00:00
cd3ecdfba4 Merge pull request 'Add schema getGameTypeTagMetrics' (#232) from loewy/add-get-game-type-tag-metrics into master
Reviewed-on: #232
2026-04-01 23:23:16 +00:00
28ba01c07f operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-30 15:31:24 -07:00
27a0c08cd5 add schema getGameTypeTagMetrics
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-03-30 13:09:18 -07:00
99f0913fd8 Merge pull request 'Add manual entitlement GraphQL schema fields' (#231) from ivan/manual-entitlement-abstraction-gql into master
Reviewed-on: #231
2026-03-22 18:32:22 +00:00
dfb0e02630 Add manual entitlement GraphQL schema fields
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-22 11:23:11 -07:00
c4a2e184fb Merge pull request 'Add lowestUnuploadedSegmentIndex to operation' (#230) from loewy/add-lowest-unuploaded-segment-index-to-stream-monitoring-details into master
Reviewed-on: #230
2026-03-20 23:39:50 +00:00
f14cf3b255 add lowestUnuploadedSegmentIndex to operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-18 16:43:31 -07:00
c46776d417 Merge pull request 'Upload Quota GQL' (#227) from loewy/upload-quota-limit-gql into master
Reviewed-on: #227
2026-03-18 21:33:26 +00:00
6ab5286a49 add expected durations to operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-17 17:22:19 -07:00
cd6a33bfed getQuotaStatus, expectedDurationSeconds in createUploadStream
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2026-03-17 11:21:42 -07:00
07bb45942e Merge pull request 'Add video processing labels to generated schema' (#228) from processing-clone-labels into master
Reviewed-on: #228
2026-03-17 18:08:08 +00:00
9abb533be8 Add video processing labels to generated schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-12 01:11:50 -07:00
c76220b65f Merge pull request 'Lightweight Query Operation - getVideoFeedSessionCount' (#223) from loewy/video-feed-session-count-query into master
Reviewed-on: #223
2026-01-30 22:37:59 +00:00
1218ecdaaa Merge branch 'master' into loewy/video-feed-session-count-query
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-30 22:37:38 +00:00
dfd03a225a Merge pull request 'Include black in flake buildInputs' (#225) from loewy/include-just-black-in-flake-build-inputs into master
Reviewed-on: #225
2026-01-30 22:32:07 +00:00
adbe1c0f2b run black on shot_pb2.pyi
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-30 14:31:23 -08:00
e1cc8b3ee1 include black in buildInput commands
Some checks failed
Tests / Tests (pull_request) Failing after 11s
2026-01-30 14:26:55 -08:00
c3156bac05 leightweight query to get totalshots
Some checks failed
Tests / Tests (pull_request) Failing after 10s
2026-01-30 13:36:37 -08:00
aba0b16a51 Merge pull request 'feat: Add bucketUrl to DeployedConfig' (#222) from feat/dynamic-bucket-url into master
Reviewed-on: #222
Reviewed-by: loewy <loewymalkov@gmail.com>
2026-01-27 00:51:35 +00:00
2a267ce961 chore: Allow protobuf >=4.25.3 for hatchet-sdk v1 compatibility
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 15:21:46 -08:00
dean
82cec7d7cb feat: Add bucketUrl to DeployedConfig
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Add bucketUrl field to schema and query so mobile can get
the bucket URL dynamically from the backend instead of
hardcoding it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 13:06:04 -08:00
bde669a608 fix: Run black on protobuf Python files in CI check
The assert-no-changes.sh script was missing black formatting for
the generated Python protobuf files, causing CI to fail after
commit aa9c561 applied black formatting to those files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 11:42:44 -08:00
aa9c561e9d style: Apply black formatting to protobuf generated files
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 07:42:04 -08:00
3def8c97c8 Merge pull request 'Add android recording format to deployed config' (#221) from loewy/add-recording-format-to-deployed-config into master
Reviewed-on: #221
2026-01-04 00:45:37 +00:00
88de1ef807 add android recording format to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-01-03 10:17:58 -08:00
2bb4fdd08f Merge pull request 'Add cancellation feedback schema and operations' (#220) from loewy/add-cancellation-feedback-schema-and-ops into master
Reviewed-on: #220
2025-12-26 18:17:11 +00:00
8649673f1b add missing field
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-12-16 17:09:18 -08:00
f5e6459882 add schema and operations for submit cancellation feedback, along with associated enum 2025-12-16 16:51:08 -08:00
ced1b153de Merge pull request 'Remove package-lock.json' (#219) from loewy/remove-package-lock-json into master
Reviewed-on: #219
2025-12-17 00:46:30 +00:00
425a8ec103 remove package-lock.json
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-12-16 16:45:06 -08:00
04f408ab5d Merge pull request 'feat: Add following and followers to GetUser query' (#218) from dean/add-followers-to-get-user into master
Reviewed-on: #218
2025-12-16 23:59:17 +00:00
dean
5fbc134c42 feat: Add following and followers to GetUser query
All checks were successful
Tests / Tests (pull_request) Successful in 21s
Adds following and followers arrays to the GetUser query to support
displaying follower/following counts on other users' profiles.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 15:53:59 -08:00
f67288d387 Merge pull request 'feat: Add GetAverageDifficultyForVideo query' (#216) from dean/add-avg-difficulty-for-video-query into master
Reviewed-on: #216
2025-12-16 04:22:56 +00:00
dean
71425a22a6 feat: Add GetAverageDifficultyForVideo query
All checks were successful
Tests / Tests (pull_request) Successful in 10s
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 20:21:22 -08:00
47339caa74 Merge pull request 'Add averageDifficulty to aggregate operation' (#215) from loewy/add-average-difficulty-field into master
Reviewed-on: #215
2025-12-16 04:06:05 +00:00
3c8be1d647 add averageDifficulty to aggregate operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-12-10 11:43:58 -08:00
09267529cd Merge pull request 'dean/add-challenge-feature' (#212) from dean/add-challenge-feature into master
Reviewed-on: #212
2025-12-10 19:11:18 +00:00
2b48ec48d5 Merge pull request 'feat: Add pocketSize to VideoCardFields fragment' (#214) from dean/feed-pocket-size-v2 into master
Reviewed-on: #214
2025-12-10 18:33:30 +00:00
dean
93bf341c0f feat: Add pocketSize to VideoCardFields fragment
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-12-10 10:31:36 -08:00
dean
9f735b61bb chore: Regenerate schema from backend
All checks were successful
Tests / Tests (pull_request) Successful in 9s
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:49:41 -08:00
dean
fda8e4eb9d feat: Add challenge dismissal GQL operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
- Add DismissChallenge/UndismissChallenge mutations
- Add IsChallengeDismissed query
- Add GetMyDismissedChallenges query
- Update schema with dismissal fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:23:27 -08:00
dean
338c45d59b feat: Add challenge invitations fields and fix feed hasFollowing query
- Add invitations query fields with invitee data to GetChallenge
- Add participantCount field to GetChallenge
- Add GetMyChallengeEntries query (was missing)
- Add hasFollowing to GetVideoFeed response (fixes feed ordering)
- Sync schema with backend challenge types

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:50 -08:00
dean
e879c5008f chore: Regenerate GraphQL TypeScript types
Regenerate gql/src/index.tsx to match current schema and fix
codegen hash mismatch in CI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:50 -08:00
dean
2d67e076f7 Add GraphQL queries and mutations for challenge feature
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:49 -08:00
dean
ec534769f3 chore: regenerate schema and types 2025-11-28 08:22:49 -08:00
dean
f8e8c7b7d4 merge: sync gql submodule, keeping local notification fragment 2025-11-28 08:22:49 -08:00
dean
372fd6e26b schema: add challenge notification types 2025-11-28 08:22:49 -08:00
dean
d9ef5ed79a WIP: Add challenges feature schema and operations
- Add Challenge, ChallengeEntry, ChallengeInvitation, RuleSet types
- Add queries: challenges, challenge, challengeLeaderboard, myChallengeInvitations, myChallengeEntries, ruleSets
- Add mutations: createChallenge, createRuleSet, inviteUsersToChallenge, respondToChallengeInvitation, startChallenge, submitChallengeEntry, recalculateChallengeEntry

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 08:22:49 -08:00
f14e117416 Merge pull request 'Add videoId field to playlist in ShotWithAllFeatures fragment' (#210) from loewy/add-video-id-to-playlist-shots-fragment into master
Reviewed-on: #210
2025-11-12 22:16:58 +00:00
3d86c13291 add videoId field to playlist in shot w features fragment
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-12 14:08:49 -08:00
e63f8600aa Merge pull request 'Add pocket size field to GraphQL schema and operations' (#209) from dean/add-pocket-size-clean into master
Reviewed-on: #209
2025-11-11 21:09:28 +00:00
7e822446da Merge branch 'master' into dean/add-pocket-size-clean
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-11-11 20:34:55 +00:00
75ecc5894b Merge pull request 'dean/add-home-feed-option' (#208) from dean/add-home-feed-option into master
Reviewed-on: #208
2025-11-10 22:09:09 +00:00
73c8dd5f57 Merge branch 'master' into dean/add-home-feed-option
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-10 19:55:16 +00:00
dean
ce8d2aaec8 Add pocket size field to GraphQL schema and operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-11-10 10:55:08 -08:00
0f89f97006 Merge pull request 'Add playlist with segment durations to ShotWithAllFeaturesFragment' (#207) from loewy/include-playlist-in-shot-features into master
Reviewed-on: #207
Reviewed-by: dean <deanwenstrand@gmail.com>
2025-11-10 18:15:41 +00:00
dean
e4223a1a17 Add isFollowedByCurrentUser field and hasFollowing to feed query
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Updated GraphQL operations to support efficient follow status checking:
- Added isFollowedByCurrentUser field to UserSocialsFields fragment
- Removed nested followers array from UserSocialsFields (over-fetching)
- Simplified followUser/unfollowUser mutations to return minimal data
- Added hasFollowing field to GetVideoFeed query for feed mode detection
- Updated getUserFollowingFollowers query to include isFollowedByCurrentUser

These changes enable the mobile app to:
- Display correct follow/unfollow button states without client-side lookups
- Differentiate between "Following" and "Popular" feed modes
- Reduce payload size by removing unnecessary nested data

Backend handles efficient resolution via request-scoped caching.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 23:44:39 -08:00
dean
83b7f0d0f6 Add home feed and isFollowedByCurrentUser field
- Add home option to VideoFeedInputGQL for automatic feed selection
- Add hasFollowing field to VideoHistoryGQL response
- Add isFollowedByCurrentUser field to UserGQL to replace followers N+1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 09:15:39 -08:00
dean
a882f98d91 Add home option to VideoFeedInputGQL
The home feed option enables smart feed selection on the backend:
- If user has following: returns FOLLOWING feed
- If user has no following: returns ALL feed
- Always includes hasFollowing flag so frontend knows which feed it got

This allows frontend to make a single query instead of needing to
check following status separately.
2025-11-07 12:16:01 -08:00
cdf438c089 add playlist w/ segment durations in gql return
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-07 11:53:13 -08:00
7dbfadf13a Merge pull request 'Notifications Operation' (#206) from loewy/notifications-operations into master
Reviewed-on: #206
2025-11-07 00:15:28 +00:00
a74a11e789 update notif operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-11-06 16:06:32 -08:00
3b2f88c0e0 update naming of notification fragment 2025-11-06 16:06:32 -08:00
a3ac769cd4 notifications operations 2025-11-06 16:06:32 -08:00
00fc2ab44b Merge pull request 'Notifications schema' (#205) from loewy/notifications-schema into master
Reviewed-on: #205
2025-11-07 00:05:04 +00:00
58ab272289 add follow enum
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-11-06 15:33:41 -08:00
242afae92b notifications schema 2025-11-06 15:33:41 -08:00
6bf597a2ec Merge pull request 'add has follwer to feed query' (#204) from dean/add-has-following-to-feed into master
Reviewed-on: #204
2025-11-06 23:30:07 +00:00
dean
aac9879afc add has follwer to feed query
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-11-06 13:13:54 -08:00
5c62d45068 Merge pull request 'Add marketing opt in to schema' (#203) from loewy/add-agrees-to-marketing-schema into master
Reviewed-on: #203
2025-10-20 20:52:17 +00:00
a7649351b3 add marketing to schema
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-10-10 14:44:45 -07:00
051555f9fc Merge pull request 'Schema + Ops for Content Moderation GQL' (#201) from loewy/add-block-and-reporting-ops into master
Reviewed-on: #201
2025-09-30 15:58:59 -06:00
d7bbe882b7 Merge pull request 'Just schema changes, no operations' (#202) from loewy/blocking-and-reporting into master
Reviewed-on: #202
2025-09-30 15:58:51 -06:00
e783050a02 operations
All checks were successful
Tests / Tests (pull_request) Successful in 22s
2025-09-23 11:02:16 -07:00
d8ee83c627 codegen for reporting, user and content blocking
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-09-17 20:00:25 -07:00
d32cd87a60 Merge pull request 'Add subscriptionGating to config operations file' (#200) from loewy/add-sub-gating-to-config-op into master
Reviewed-on: #200
2025-08-27 21:29:16 -06:00
b956cfe0f9 add sub gating to config operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-08-27 19:27:17 -07:00
3f520a0331 Merge pull request 'Add operations for user subscriptions' (#199) from loewy/get-and-cancel-sub-ops into master
Reviewed-on: #199
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-08-18 17:42:43 -06:00
a563834269 get user sub status and cancel sub
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-08-14 14:02:36 -07:00
80a5bded47 Merge pull request 'Add getUserSubscriptionStatus' (#198) from loewy/subscription-status-resolvers into master
Reviewed-on: #198
2025-08-14 13:22:33 -06:00
16d8510465 add cancel subscription
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-12 13:14:08 -07:00
9b21ce1e3a get subscription resolvers
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2025-08-11 14:23:46 -07:00
dde4cfd99b Merge pull request 'Add subscriptionGatingEnabled prop to deployed config' (#196) from loewy/add-subscription-gating-enabled into master
Reviewed-on: #196
2025-08-08 16:52:30 -06:00
845fb361b9 Merge branch 'master' into loewy/add-subscription-gating-enabled
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-08 16:49:17 -06:00
9f5fcc066e Merge pull request 'Create subscription operations' (#197) from loewy/create-sub-operations into master
Reviewed-on: #197
2025-08-07 13:06:08 -06:00
dfb0361e12 Merge branch 'master' into loewy/create-sub-operations
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-07 12:59:54 -06:00
77477d63db add subscriptionGatingEnabled prop to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 31s
2025-07-29 14:28:36 -07:00
01fb113e1c Merge pull request 'DeleteUser operation' (#195) from loewy/delete-user-operation into master
Reviewed-on: #195
2025-07-11 12:18:31 -06:00
c660ed54cd delete user mutation
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2025-07-11 11:17:25 -07:00
b5fd2e2183 Merge pull request 'Create subscription' (#194) from loewy/add-stripe-stuff into master
Reviewed-on: #194
2025-07-09 12:45:03 -06:00
ddee57f4c2 create sub
All checks were successful
Tests / Tests (pull_request) Successful in 56s
2025-07-09 11:41:57 -07:00
a497abd44d create sub operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-07-09 11:31:26 -07:00
49d43b2703 Merge pull request 'Create delete user' (#192) from kat/delete_user into master
Reviewed-on: #192
2025-07-09 12:04:03 -06:00
99f8968a36 Create delete user
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-07-09 11:37:25 -06:00
76a98aa0c3 Remove subscription stuff for now 2025-07-09 07:59:08 -06:00
f5177a877c Merge pull request 'add createSubscription' (#191) from loewy/create-checkout-session into master
Reviewed-on: #191
2025-07-09 07:57:38 -06:00
6685849cc2 add available subscription
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-07-08 16:40:12 -07:00
567cbc549c add createSubscription
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-07-08 16:20:14 -07:00
2b43493a4f Add processing progress fields 2025-07-08 14:12:15 -06:00
358eee2e16 Merge pull request 'Add getAvailableSubscriptionOptions & associated subscription types' (#190) from loewy/available-sub-options into master
Reviewed-on: #190
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-07-08 12:52:17 -06:00
a1d3d776aa add to schema
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-07-07 14:24:09 -07:00
82af3a3ce9 Merge pull request 'Add operation for ensureStripeCustomerExists' (#189) from loewy/ensure-customer-exists-operations into master
Reviewed-on: #189
2025-07-07 14:27:24 -06:00
7b51c317ca add operation for ensureStripeCustomerExists
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-07-07 13:12:36 -07:00
04f1bb4d74 Remove email param from ensureStripeCustomerExists 2025-07-06 16:20:49 -06:00
fbd7c2020b Merge pull request 'Add ensureStripeCustomerExists to schema' (#188) from loewy/get-stripe-customer-mutation into master
Reviewed-on: #188
2025-07-04 12:06:47 -06:00
c0636a8863 ensure stripe customer rename
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-07-03 19:43:21 -07:00
7302d6b8b6 get stripe customer mutation, add stripe_customer_id to user gql type
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-07-03 15:26:44 -07:00
492178455c Add getUsersMatching 2025-06-25 15:08:19 -07:00
55a2edb042 Merge pull request 'Add bannerMessages to getDeployedConfig operation' (#187) from loewy/banner-on-deployed-config-ops into master
Reviewed-on: #187
2025-06-13 11:19:59 -06:00
31cf492889 add bannerMessages to getDeployedConfig operation
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2025-06-13 10:12:39 -07:00
de7dc675a1 Merge pull request 'Reverting config operation until BE deployed' (#186) from loewy/revert-config-operations into master
Reviewed-on: #186
2025-06-12 15:12:48 -06:00
f8f00d9c24 revert changes
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2025-06-12 14:09:20 -07:00
dc207bce55 Merge pull request 'Add banners to config operations' (#185) from loewy/update-config-operations into master
Reviewed-on: #185
2025-06-12 14:30:17 -06:00
2e5b8d2563 add banners to config operations
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2025-06-12 13:29:24 -07:00
46bcd08ae1 Merge pull request 'Add banner messages to DeployedConfigGql' (#184) from loewy/add-banner-to-config into master
Reviewed-on: #184
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-06-12 14:27:36 -06:00
bd383b1d55 add banner messages to deployedConfigGql
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-06-12 10:21:24 -07:00
2459cb78f8 Merge pull request 'Add comments operations' (#183) from loewy/add-comments-feed-operation into master
Reviewed-on: #183
2025-05-16 18:34:07 -06:00
8859ad8951 add lightweight query to refetch social interractions on comment mutation completion
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-05-16 17:31:58 -07:00
bdc3961e46 add mutations for comments 2025-05-16 14:43:16 -07:00
7c8c932a78 connect gql 2025-05-16 12:25:27 -07:00
ae746ccac0 Add getTableState 2025-05-15 12:26:18 -07:00
98266c7775 Merge pull request 'add comments' (#182) from add-comments into master
Reviewed-on: #182
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-05-13 18:51:51 -06:00
Will Gester
4918720ae3 add comments
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-05-13 17:40:09 -07:00
8463ebf0e7 Merge pull request 'Add streamSegmentType to feed and playlist shot operations' (#181) from loewy/add-stream-type-to-get-shots into master
Reviewed-on: #181
2025-05-08 16:19:06 -06:00
753179ca58 add streamsegmentType to get feed
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-05-08 14:15:57 -07:00
9ee5c721c1 add stream type to get shost for playlist 2025-05-08 13:44:58 -07:00
00cca10cb3 Merge pull request 'Use pocketing intention fragment to prevent cache merge issues' (#180) from loewy/update-runs-operations into master
Reviewed-on: #180
2025-04-30 15:58:46 -06:00
ad704cad75 use entire fragment to prevent cache merge issues
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2025-04-30 14:57:54 -07:00
e2743abb59 Merge pull request 'update runs' (#179) from dean/update-run-gql into master
Reviewed-on: #179
Reviewed-by: loewy <loewymalkov@gmail.com>
2025-04-30 12:39:23 -06:00
e109e89a40 update runs
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-04-30 18:18:40 +00:00
67bad20d24 Merge pull request 'Add limit and countRespectsLimit args' (#178) from loewy/add-limit-args-to-get-runs into master
Reviewed-on: #178
2025-04-24 13:48:12 -06:00
0160455b9f add limit and countRespectsLimit args
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-04-24 12:43:07 -07:00
170ff70b7a Merge pull request 'Add required types to followers in feed operation' (#177) from loewy/add-required-types-to-feed-operation into master
Reviewed-on: #177
2025-04-09 12:48:35 -06:00
8df09b8c93 run just gql
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2025-04-09 11:47:16 -07:00
644ea66e98 add required types to followers in feed operation
Some checks failed
Tests / Tests (pull_request) Failing after 17s
2025-04-09 11:43:27 -07:00
0a5097c5c0 Merge pull request 'Add followers to feed operation for reactions' (#176) from loewy/add-followers-in-reactions into master
Reviewed-on: #176
2025-04-08 18:21:33 -06:00
f4445f7ecb add followers to feed operation for reactions
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-04-08 16:48:12 -07:00
b18fedae8e Merge pull request 'Add reactions gql to feed and react mutation operation' (#175) from loewy/add-react-to-video into master
Reviewed-on: #175
2025-04-07 11:33:55 -06:00
31baa2b096 add profile image uri
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2025-04-04 13:19:42 -07:00
85cd37f70f add gql to fragment
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-04-04 12:30:02 -07:00
b53aa172fa Add reactions mutation to operations 2025-04-04 12:18:20 -07:00
df2e534745 Merge pull request 'add reaction gql' (#174) from add-reactions into master
Reviewed-on: #174
2025-04-03 18:42:46 -06:00
Will Gester
ea4980947f add reaction gql
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-04-03 17:42:20 -07:00
65475bca9b Merge pull request 'Add delete tags operation' (#173) from loewy/delete-tags-operation into master
Reviewed-on: #173
2025-03-31 13:47:46 -06:00
280f5a66bd add delete tags operation"
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2025-03-27 11:38:26 -07:00
84daf2d136 Reintroduce retireTags 2025-03-25 14:31:19 -06:00
6558fb60e9 Add break heuristic 2025-03-25 14:05:12 -06:00
6462a6a464 Merge pull request 'Add delete tags' (#170) from mk/delete-tag into master
Reviewed-on: #170
2025-03-21 18:26:33 -06:00
41a5bb7609 Add delete tags
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-03-21 17:22:24 -07:00
b8aaabea8b Merge pull request 'RetireTags mutation operation' (#169) from loewy/retire-tags-operation into master
Reviewed-on: #169
2025-03-21 15:50:59 -06:00
2745521664 add operations to retire tag
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-03-21 14:38:37 -07:00
8efa2e067c Merge pull request 'Add functionality to retire tags' (#167) from mk/retire-tags-gql into master
Reviewed-on: #167
2025-03-21 14:39:27 -06:00
919fe5ba24 Merge branch 'master' into mk/retire-tags-gql
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-03-19 15:08:46 -06:00
7ff60dc9c5 Merge pull request 'Revert "Merge pull request 'Add functionality for retiring tags' (#165) from mk/retire-tags-gql into master"' (#166) from mk/revert-retire-tags into master
Reviewed-on: #166
2025-03-19 15:08:16 -06:00
7e0d8a84ee Add functionality to retire tags
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2025-03-19 14:07:15 -07:00
9f26b5aa0f Revert "Merge pull request 'Add functionality for retiring tags' (#165) from mk/retire-tags-gql into master"
All checks were successful
Tests / Tests (pull_request) Successful in 8s
This reverts commit 70303b9363, reversing
changes made to 7a9d2545c4.
2025-03-19 14:05:41 -07:00
70303b9363 Merge pull request 'Add functionality for retiring tags' (#165) from mk/retire-tags-gql into master
Reviewed-on: #165
2025-03-17 15:09:54 -06:00
9ee1422d3e Add functionality for retiring tags
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2025-03-17 14:09:19 -07:00
7a9d2545c4 Merge pull request 'Add average time field to video in feed operation' (#164) from loewy/add-average-time-per-shot-in-feed-operation into master
Reviewed-on: #164
2025-03-11 14:42:24 -06:00
c561ea20ab add average difficulty
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2025-03-11 13:41:37 -07:00
7ce0c058b7 add average time field to video in feed operation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-03-11 13:10:34 -07:00
c399edd882 Merge pull request 'Add average difficulty in VideoGql' (#163) from loewy/average-difficulty-in-video-gql into master
Reviewed-on: #163
2025-03-07 17:18:36 -07:00
32d8cb0d41 add average diff in videogql
All checks were successful
Tests / Tests (pull_request) Successful in 20s
2025-03-07 16:16:42 -08:00
9d912ed21e Add time to segment information 2025-02-26 20:30:39 -07:00
0bcfd32b14 Add start segment and end segment client side fields 2025-02-26 19:29:15 -07:00
9b27d288da Merge pull request 'Add shots to runs operation to get the id' (#162) from loewy/add-shots-in-runs into master
Reviewed-on: #162
2025-02-20 15:02:43 -07:00
b0f94f5ea8 add shots to runs to get id
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-02-20 12:37:52 -08:00
de653ba54c Merge pull request 'Add tagClasses to getUserTags operation' (#161) from loewy/getUserTags-operation into master
Reviewed-on: #161
2025-02-05 13:51:14 -07:00
2657628a54 add tagClasses to operation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-02-05 12:48:56 -08:00
cd20cfcb40 Add get runs for highlights 2025-02-04 20:57:22 -07:00
2657a9baf7 Merge pull request 'Return tag classes with tag' (#160) from kat/return-tag-classes-with-tag into master
Reviewed-on: #160
2025-02-04 19:16:15 -07:00
9bb4b7c513 Return tag classes with tag
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2025-02-04 19:14:55 -07:00
a5050ed08d Merge pull request 'Revert previous commit 021cd35278ea74f6971ae021b33ddc1bba020e6d' (#159) from loewy/revert-adding-group into master
Reviewed-on: #159
2025-02-04 15:42:41 -07:00
b9e26243e9 revert
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-02-04 14:41:11 -08:00
021cd35278 Merge pull request 'Add group in return for user tags' (#158) from loewy/add-group-to-get-user-tags into master
Reviewed-on: #158
2025-02-04 14:48:11 -07:00
8dda81236a add group to return for user tags
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2025-02-04 13:44:58 -08:00
c7ff615fe4 Create tags in video metadata (#157)
Reviewed-on: #157
2025-02-03 16:43:25 -07:00
365cbb5f70 Merge pull request 'Create upload stream named fragment' (#156) from kat/named-fragment-mini-video into master
Reviewed-on: #156
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-01-28 21:31:23 -07:00
194d0dcd22 Create upload stream named fragment
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-01-28 21:28:31 -07:00
8fcaa1397a Merge pull request 'Add query to get info for banner component' (#155) from loewy/get-banner-info-by-video-id into master
Reviewed-on: #155
2025-01-21 14:20:42 -07:00
e8e318b919 add query to get info for banner component
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2025-01-20 15:04:23 -08:00
ff0a11ea0d Merge pull request 'Add last intended segment bound in fragment for VideoFeed stream obj' (#154) from loewy/add-last-intended-segment-bound-to-stream into master
Reviewed-on: #154
2025-01-16 23:03:42 -07:00
84192d1387 add last intended segment bound
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2025-01-16 22:01:57 -08:00
f1ae2b62d6 Add limit parameter 2025-01-16 20:16:29 -07:00
4f78cd94ab Add video info to longest runs leaderboard 2025-01-16 17:01:32 -07:00
bfdda67d1a Add run filter and run fields 2025-01-16 15:44:11 -07:00
881350619a Add get longest runs operation 2024-12-23 13:55:14 -07:00
8bc67f75b0 Use RunGQL directly for run leaderboard 2024-12-22 23:30:01 -07:00
df8495df77 Add proportion and total made to leaderboard query 2024-12-22 17:12:24 -07:00
0c45855f7d Add video count 2024-12-22 15:37:06 -07:00
a2e659dfcb Add runs leaderboard 2024-12-22 15:00:19 -07:00
2a36a392ce Merge pull request 'Leaderboards operation' (#153) from loewy/leaderboard-operations into master
Reviewed-on: #153
2024-12-20 14:14:24 -07:00
145c2f9558 leaderboards operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-12-20 13:13:30 -08:00
3f2e5d331f Add makes leaderboard 2024-12-19 17:48:29 -07:00
bf8e851139 Merge pull request 'Add profile image for followers' (#152) from loewy/add-profile-image-for-followers into master
Reviewed-on: #152
2024-12-19 17:36:44 -07:00
eb15f4f3b8 add profile image to user relationship
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-12-19 16:33:48 -08:00
82ff8546d4 add profile image for followers 2024-12-19 16:31:46 -08:00
284334606d Merge pull request 'GetUser operation + fragment' (#151) from loewy/get-user-operation-and-fragment into master
Reviewed-on: #151
2024-12-19 12:47:20 -07:00
a883bc3e2f getUser by user id query
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-12-19 10:28:41 -08:00
b50ea5b573 Merge pull request 'Sync Apollo version w/ mobile to prevent ts errors' (#150) from loewy/sync-apollo-version-w-mobile into master
Reviewed-on: #150
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-12-19 11:28:04 -07:00
de17659dbb sync apollo version w/ mobile to prevent ts errors
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-12-19 10:26:09 -08:00
33886b4e9e Update getFeed operation 2024-12-17 18:07:00 -07:00
9d0ba908dc Generalize getFeed 2024-12-17 17:35:38 -07:00
7b4880a990 Add all videos 2024-12-17 14:12:25 -07:00
8ed177b0f3 Merge pull request 'Add EditShot operation' (#149) from loewy/add-edit-shot-operation into master
Reviewed-on: #149
2024-12-09 14:33:47 -07:00
976cc66ccb add editshot operation
All checks were successful
Tests / Tests (pull_request) Successful in 17s
2024-12-09 14:00:36 -07:00
af461fff00 Merge pull request 'Add Difficulty ShotOrdering' (#148) from mk/shots-ordering-by-difficulty into master
Reviewed-on: #148
2024-12-07 15:27:08 -07:00
7a39b4ca60 Add Difficulty ShotOrdering
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-12-07 14:25:08 -08:00
9befbe3833 Merge pull request 'Add private field to video endpoints' (#147) from loewy/add-private-to-operations into master
Reviewed-on: #147
2024-12-05 16:31:25 -07:00
68a4c064f3 add private field to video endpoints
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-12-05 15:30:16 -08:00
54fd741670 Merge pull request 'Request additional medals in operations' (#146) from loewy/request-new-medals-in-operation into master
Reviewed-on: #146
2024-12-05 14:57:41 -07:00
2f9e630de4 new assets for medals
All checks were successful
Tests / Tests (pull_request) Successful in 17s
2024-12-05 13:47:47 -08:00
5efd8ef8e5 Merge pull request 'Remove distance 60 from operation' (#145) from loewy/remove-distance-60-from-request into master
Reviewed-on: #145
2024-12-04 15:00:27 -07:00
6ad3d449d8 remove distance 60 from operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-12-04 13:59:51 -08:00
8fe20d1c41 Merge pull request 'Add editShotData types' (#144) from mk/edit-shot-data into master
Reviewed-on: #144
2024-12-02 20:01:53 -07:00
e151f39582 Add edit shot data stuff
All checks were successful
Tests / Tests (pull_request) Successful in 5s
2024-12-02 18:57:36 -08:00
f136ddb9ca Merge pull request 'Replaces interval with datetime range' (#143) from mk/fix-medal-time-input into master
Reviewed-on: #143
2024-11-26 14:21:16 -07:00
5d05614e07 Replaces interval with datetime range
All checks were successful
Tests / Tests (pull_request) Successful in 17s
2024-11-26 13:19:33 -08:00
c4c3ccde00 id in homography 2024-11-25 14:53:41 -08:00
e137ce8ad1 Request id in Homography info 2024-11-21 17:59:29 -07:00
bd5bebb747 Merge pull request 'Update medal collection' (#142) from loewy/update-medals-operation into master
Reviewed-on: #142
2024-11-21 15:16:23 -07:00
034facebf3 update medal operation, create fragment
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-21 12:18:17 -08:00
ac1fceb648 Merge pull request 'Add new makes medals' (#141) from mk/extend-makes-medals into master
Reviewed-on: #141
2024-11-21 11:56:49 -07:00
fd87ade629 Add new makes medals
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-21 10:54:06 -08:00
1fab007654 Merge pull request 'Change FilterInput to RunFilterInput' (#140) from mk/use-run-filter-input into master
Reviewed-on: #140
2024-11-19 16:30:20 -07:00
cd2cdb475a Change FilterInput to RunFilterInput
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-11-19 15:29:21 -08:00
c3c74379fb Merge pull request 'Add support for getRuns' (#139) from mk/runs-qb into master
Reviewed-on: #139
2024-11-19 15:06:15 -07:00
da21627f15 Add support for getRuns
All checks were successful
Tests / Tests (pull_request) Successful in 31s
2024-11-19 14:05:21 -08:00
8fabfd67cf Merge pull request 'Add difficulty to pocketingIntentionFeatures in ShotWithAllFeatures' (#138) from loewy/add-difficulty-to-shot-features-fragment into master
Reviewed-on: #138
2024-11-19 00:30:17 -07:00
e6960038f2 add difficulty to pocketingIntentionFeatures in ShotWithAllFeatures
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-18 23:11:47 -08:00
b6ec7ed39d Merge pull request 'Add clientUploadStatus' (#137) from mk/stream-status into master
Reviewed-on: #137
2024-11-18 18:47:30 -07:00
545ba638c2 Add clientUploadStatus
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-18 17:46:48 -08:00
94e4e55558 Merge pull request 'Medals' (#135) from volodymyr/medals into master
Reviewed-on: #135
2024-11-15 17:52:14 -07:00
2536f5db6b add nickname to operation, remove currently unsupported fields from request
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-11-15 16:51:17 -08:00
ffd0814a98 remove dasystreak 2024-11-15 16:44:42 -08:00
55bfe42484 Medals 2024-11-15 16:44:42 -08:00
dabb0d1d9c Merge pull request 'Remove unimplemented dayStreak and add support for nickname' (#136) from mk/add-nickname-to-medals into master
Reviewed-on: #136
2024-11-15 12:50:49 -07:00
a538c1d81c Remove unimplemented dayStreak and add support for nickname
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-11-15 11:50:11 -08:00
872bce3adb Merge pull request 'Add ID to user processing' (#134) from kat/add-id-processing into master
Reviewed-on: #134
2024-11-14 00:20:05 -07:00
457d375bed Add ID to user processing
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-11-14 00:18:57 -07:00
12798e368c Merge pull request 'Get user videos' (#132) from volodymyr/get-user-videos into master
Reviewed-on: #132
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-11-13 15:14:48 -07:00
a3d6e6e19e Merge branch 'master' into volodymyr/get-user-videos
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2024-11-13 15:14:30 -07:00
f7a6e393e7 Merge pull request 'Add excludeVideosWithNoShots filter' (#133) from mk/exclude-no-shots-filter into master
Reviewed-on: #133
2024-11-13 15:13:33 -07:00
ee11e506ed Add excludeVideosWithNoShots filter
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-13 14:12:57 -08:00
90ec47848b Get user videos
All checks were successful
Tests / Tests (pull_request) Successful in 12s
2024-11-13 21:33:50 +01:00
21acb5219d Merge pull request 'Change includeCallersVideos default to True' (#131) from mk/change-caller-video-default into master
Reviewed-on: #131
2024-11-13 12:52:07 -07:00
087d511efc Change includeCallersVideos default to True
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-11-13 11:51:29 -08:00
7cc0dca821 Merge pull request 'Add includeCallersVideos to getFeedVideos' (#130) from mk/make-feed-get-only-theirs into master
Reviewed-on: #130
2024-11-13 11:11:22 -07:00
f826121aa3 Add includeCallersVideos to getFeedVideos
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2024-11-13 10:10:11 -08:00
2aadb8b49b Merge pull request 'Add createdAt filterInput to GetUserPlayTime' (#129) from loewy/update-get-play-time-operation into master
Reviewed-on: #129
2024-11-12 14:28:36 -07:00
5468b7ccda add createdAt dateRangeFilter
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-12 13:00:18 -08:00
08dfafe1a3 Merge pull request 'Privacy' (#128) from volodymyr/privacy into master
Reviewed-on: #128
Reviewed-by: Kat Huang <kkathuang@gmail.com>
2024-11-12 11:27:56 -07:00
36b6804719 Privacy
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-11-12 14:15:19 +01:00
0120c15064 Merge pull request 'Add count to GetShotsWithJustIds operation return' (#127) from loewy/add-count-to-getshots-with-just-ids into master
Reviewed-on: #127
2024-11-11 21:13:19 -07:00
9cc99d956a add countRespectsLimit argument
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-11-11 20:07:58 -08:00
985fa8b8e5 add count to return for get shots with just ids
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-11-11 19:54:10 -08:00
c4868e7ebe Add null default 2024-11-11 19:02:13 -08:00
58e1c18034 Merge pull request 'Add filters for getPlayTime' (#126) from mk/add-filter-for-play-time into master
Reviewed-on: #126
2024-11-11 19:52:36 -07:00
592dea0ca2 Add filters for getPlayTime
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-11-11 18:50:00 -08:00
0e00ae9297 Merge pull request 'Add private to VideoGQL' (#125) from mk/not-clear into master
Reviewed-on: #125
2024-11-07 18:50:34 -07:00
e16812f242 ???
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-07 17:49:36 -08:00
3e9b7a0d16 Merge pull request 'Add private field to user and videos' (#124) from mk/privacy into master
Reviewed-on: #124
2024-11-07 18:19:01 -07:00
309deb9473 Add private field to user and videos
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-11-07 17:16:56 -08:00
d5ba9c2ba5 Merge pull request 'Remove id from HomographyInfo fragment for now, use string instead of base64 for FindPrerecordTableLayout' (#122) from loewy/switch-back-to-string into master
Reviewed-on: #122
2024-11-07 18:09:51 -07:00
73771a263a remove id for now, use string instead of base64
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-07 17:08:35 -08:00
655e59c43c Remove base64 scalar 2024-11-07 17:43:09 -07:00
056120a68a Merge pull request 'Add operation for FindPrerecordTableLayoutMutation + HomographyInfoGql fragment' (#121) from loewy/add-operation-check-homography into master
Reviewed-on: #121
2024-11-07 16:51:16 -07:00
bd7ffa7fdb add operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-11-07 15:45:03 -08:00
ec58923c65 Add id to homography info gql 2024-11-07 16:29:33 -07:00
63869cd7ca Rename checkHomographyIsValid to findPrerecordTableLayout 2024-11-07 15:55:23 -07:00
08ae9611cf Add id to video processing gql 2024-11-07 15:52:07 -07:00
4e610b7df2 Merge pull request 'Return video processing status in feed' (#119) from kat/current-processing into master
Reviewed-on: #119
2024-11-06 22:41:30 -07:00
2d6d3964ad Return video processing status in feed
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-06 22:40:18 -07:00
73a58de36e Merge pull request 'Make check homography mutation' (#118) from mk/make-homography-mutation into master
Reviewed-on: #118
2024-11-06 17:26:27 -07:00
dc6f246489 Make check homography mutation
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-06 16:25:23 -08:00
c0a3aa97dc Merge pull request 'Add getShotsWithJustIds' (#117) from loewy/update-get-shots-with-video-ids into master
Reviewed-on: #117
2024-11-06 16:32:59 -07:00
f4e43b24f2 add getShotsWithJustIds
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-11-06 14:58:32 -08:00
51ab8320d7 Merge pull request 'add checkHomographyIsValid' (#116) from mk/get-homography-valid into master
Reviewed-on: #116
2024-11-05 15:45:49 -07:00
f9a00ad3eb add checkHomographyIsValid
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-05 14:39:23 -08:00
998b2ffc8c Merge pull request 'Create video card fragment' (#115) from kat/video-card-feed into master
Reviewed-on: #115
2024-11-05 14:04:02 -07:00
c7642e6204 Create video card fragment
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-11-05 13:58:31 -07:00
b2ce1c2f96 Create video card fragment
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-11-05 13:56:51 -07:00
d0cf071934 Merge pull request 'Return profile image in feed' (#114) from kat/image-uri-feed into master
Reviewed-on: #114
2024-11-05 12:54:24 -07:00
6b410b3d78 Return profile image in feed
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-11-05 12:53:42 -07:00
607504261c Merge pull request 'Create new get feed operation' (#113) from kat/add-feed into master
Reviewed-on: #113
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-11-04 15:13:56 -07:00
0421be855d Create new get feed operation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-11-04 15:08:21 -07:00
014aab473b Merge pull request 'Add operation for query doesUsernameExist' (#111) from loewy/query-does-username-exist into master
Reviewed-on: #111
2024-10-31 18:39:58 -06:00
353872401e does username exist query
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-31 17:37:08 -07:00
433dfdaf74 Merge pull request 'Add countRespectsLimit to GetShotsWithMetadataFilterResult operation args' (#110) from loewy/add-count-respects-limit-to-get-shots-with-metadata-filter-result into master
Reviewed-on: #110
2024-10-31 16:41:06 -06:00
a2d9e688e9 add countRespectsLimit
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 15:21:54 -07:00
b3259dac1f Merge pull request 'Add countRespectsLimit' (#109) from mk/count-respects-limit into master
Reviewed-on: #109
2024-10-31 14:40:06 -06:00
0982b9e60c Add countRespectsLimit
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 13:37:15 -07:00
1710ae451c Merge pull request 'Return id for cache;' (#107) from kat/use-logged-in-user into master
Reviewed-on: #107
2024-10-31 01:57:38 -06:00
de9e7dea6a Return id for cache;
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-31 01:56:34 -06:00
cfcf1dbcd2 Merge pull request 'Use logged in user for followers' (#106) from kat/use-logged-in-user into master
Reviewed-on: #106
2024-10-30 21:52:42 -06:00
05e3182e8b Use logged in user for followers
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-30 18:20:25 -06:00
baf139aab5 Merge pull request 'Add support for medals' (#105) from mk/medals into master
Reviewed-on: #105
2024-10-30 17:53:33 -06:00
b3b454ef83 Add support for medals
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-30 16:51:35 -07:00
f6e4a1bc0b Merge pull request 'Use getUser for getting followers' (#104) from kat/get-user-followers into master
Reviewed-on: #104
2024-10-30 16:19:53 -06:00
9d8155527d Use getUser for getting followers
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-30 16:18:25 -06:00
8690e81029 Merge pull request 'Add doesUsernameExist' (#103) from mk/does-username-exist into master
Reviewed-on: #103
2024-10-30 13:08:59 -06:00
4ef13a482a Add doesUsernameExist
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-30 12:07:54 -07:00
9db95c4e6c Merge pull request 'Get user following followers' (#101) from kat/get-user-following-followers into master
Reviewed-on: #101
2024-10-29 23:38:48 -06:00
249807c935 Get user following followers
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-29 23:37:37 -06:00
eec79b2dc5 Merge pull request 'Use getOrderedShots when requesting getShotsWithVideoGql' (#100) from loewy/use-ordered-shots-to-get-thumbnail into master
Reviewed-on: #100
2024-10-29 19:44:14 -06:00
464c013095 Merge branch 'master' into loewy/use-ordered-shots-to-get-thumbnail
All checks were successful
Tests / Tests (pull_request) Successful in 1m37s
2024-10-29 19:42:30 -06:00
e2f4995cad use getOrderedShots when requesting getShotsWithVideoGql
All checks were successful
Tests / Tests (pull_request) Successful in 6m32s
2024-10-29 17:59:18 -07:00
a43b286e39 Merge pull request 'Followers and following' (#99) from kat/return-following-followers into master
Reviewed-on: #99
2024-10-29 15:48:34 -06:00
148f5362f0 Followers and following
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-29 15:47:00 -06:00
4d01e9814d Merge pull request 'Remove unused field' (#98) from loewy/remove-ids-from-get-shot-video-gql into master
Reviewed-on: #98
2024-10-29 13:45:52 -06:00
b9e3e1f310 remove uneeded ids
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-10-29 12:44:56 -07:00
b0da48c4fb Merge pull request 'Add fargoRating in getLoggedInUser operations requested fields' (#97) from loewy/fargo-rating-in-returns into master
Reviewed-on: #97
2024-10-28 17:04:08 -06:00
1e53dc21ee add fargoRating in user operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-28 16:00:11 -07:00
5c5014339f Allow python 3.12 2024-10-28 02:24:24 -06:00
84188a6066 Merge pull request 'Return username in follow unfollow' (#96) from kat/return-username into master
Reviewed-on: #96
2024-10-27 19:19:41 -06:00
7c7be319d1 Return username in follow unfollow
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-27 19:18:57 -06:00
79784faba1 Merge pull request 'Follow and unfollow mutation' (#95) from kat/user-relationships-result into master
Reviewed-on: #95
2024-10-27 13:53:22 -06:00
f3ea44755c Follow, unfollow mutation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-27 12:22:22 -06:00
9b6559559c Use clearer names in the fields of GetUserRelationshipsMatching 2024-10-25 16:58:21 -06:00
2398216bf2 Replace GetUsernamesAndRelationships with GetUserRelationshipsMatching 2024-10-25 02:45:07 -06:00
d942b91d17 Merge pull request 'Update get user and following response' (#94) from kat/update-gql-v2 into master
Reviewed-on: #94
2024-10-25 01:28:03 -06:00
24d9b9225e Update get user and following response
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 01:27:14 -06:00
f6f6404302 Merge pull request 'Delete user with ids' (#92) from kat/remove-user-ids into master
Reviewed-on: #92
2024-10-25 01:08:04 -06:00
4609af726b Delete user with ids
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-25 01:07:23 -06:00
c5919c90d0 User UserGQL in response 2024-10-25 00:31:29 -06:00
605adc3293 Merge pull request 'Update get usernames ids' (#90) from kat/update-get-username-ids into master
Reviewed-on: #90
2024-10-25 00:18:19 -06:00
b40554d38d Update get usernames ids
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 00:16:59 -06:00
194d7c66a0 Merge pull request 'Add subfields to usernames and following' (#89) from kat/usernames-following-response into master
Reviewed-on: #89
2024-10-24 23:50:28 -06:00
3adc301935 Add subfields to usernames and following
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 23:49:47 -06:00
9232c673e8 Merge pull request 'Return usernamesAndIds' (#88) from kat/update-usernames-and-following into master
Reviewed-on: #88
2024-10-24 23:46:27 -06:00
c2cb411469 Return usernamesAndIds
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-24 23:41:52 -06:00
44ddc732a1 Fix cache merge (#87)
Co-authored-by: Kat Huang <kkathuang@gmail.com>
Reviewed-on: #87
Co-authored-by: Volodymyr Smolianinov <voidozzer@gmail.com>
Co-committed-by: Volodymyr Smolianinov <voidozzer@gmail.com>
2024-10-24 13:50:52 -06:00
d6ef3e0487 Merge pull request 'Remove error default from operation' (#86) from loewy/remove-error-default into master
Reviewed-on: #86
2024-10-24 12:28:39 -06:00
8c191bdb90 Remove error default from operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 11:27:40 -07:00
8246699915 Merge pull request 'Return ShotGQL w/ updateShotAnnotations' (#84) from loewy/annotations-return into master
Reviewed-on: #84
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-24 10:54:05 -06:00
de9d47c289 Merge branch 'master' into loewy/annotations-return
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-24 10:53:02 -06:00
39b1808cab Merge pull request 'Create get usernames and followers operation' (#85) from kat/add-get-usernames-following-operation into master
Reviewed-on: #85
2024-10-24 09:19:38 -06:00
a78f9e7b9d return shot gql with an annotation update
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-23 16:39:16 -07:00
f573026853 Create get usernames and followers operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-23 17:04:25 -06:00
f98c98ecdd Merge pull request 'Add get usernames and following response' (#83) from kat/add-usernames-response into master
Reviewed-on: #83
2024-10-23 16:53:50 -06:00
3f6314aab7 Add get usernames and following response
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-23 16:53:26 -06:00
3051c155e2 Merge pull request 'Add mutation, logic needs to have better stateful solution' (#82) from loewy/add-annotations-to-operations into master
Reviewed-on: #82
2024-10-22 18:38:25 -06:00
e686be5acd add mutation, logic needs to have better stateful solution
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-22 16:58:35 -07:00
d49f9b213a Merge pull request 'Add following followers to user model' (#81) from kat/following-followers into master
Reviewed-on: #81
2024-10-22 00:12:59 -06:00
8f346d7832 Add runLength ordering and filter 2024-10-21 21:35:19 -06:00
163c6a4e0c Add following followers to user model
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-10-21 12:08:42 -06:00
b9036001aa Remove user id from feed args 2024-10-21 01:12:17 -06:00
b16b36588f Create feed query 2024-10-20 23:35:52 -06:00
efaaeeaad1 Add totalDistance 2024-10-20 14:38:06 -06:00
5d93f7166e Use getOrderedShots 2024-10-19 21:27:57 -06:00
72ac956758 Add get ordered shots 2024-10-19 20:18:23 -06:00
5cb7df174b Merge pull request 'get rid of metadata input' (#80) from mk/alter-metadata-type into master
Reviewed-on: #80
2024-10-18 12:52:21 -06:00
d15dae23c1 get rid of metadata input
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-18 11:51:38 -07:00
c98a65bb6f Merge pull request 'Add fargo filter input' (#79) from mk/fargo-filter into master
Reviewed-on: #79
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-17 16:26:09 -06:00
e701c79469 Add fargo filter input
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-17 15:24:56 -07:00
18cd3efe80 Dumb bug, nuked the schema lol (#78)
Alter fargo type, restore schema :O
Reviewed-on: #78
Co-authored-by: Mike Kalange <countablecloud@gmail.com>
Co-committed-by: Mike Kalange <countablecloud@gmail.com>
2024-10-17 15:15:54 -06:00
d71974d385 Merge pull request 'Add editUser mutation and input' (#77) from mk/edit-user into master
Reviewed-on: #77
2024-10-17 15:11:40 -06:00
0defdf0892 Add editUser mutation and input
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-17 14:10:43 -07:00
8d1f79b8a8 GQL for caching hack 2024-10-17 01:28:14 -06:00
9dc426ea0f Moar fragments! 2024-10-16 23:39:14 -06:00
19a63b9d19 Move segment start times 2024-10-16 18:52:18 -06:00
ae97f956b3 Add segmentDurations and segmentStartFrames 2024-10-16 16:46:29 -06:00
d619751144 Add client side start and end time 2024-10-16 15:24:08 -06:00
e431a1751f Merge pull request 'Create get video for shot time conversion query' (#76) from kat/get-video-metadata into master
Reviewed-on: #76
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-16 00:03:39 -06:00
209f0aa019 Create get video for shot time conversion query
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-15 23:41:04 -06:00
70015a942c Merge pull request 'Add updateAnnotation interfaces' (#75) from mk/update-annotations into master
Reviewed-on: #75
2024-10-14 18:41:08 -06:00
91cfcb28e7 Add updateAnnotation interfaces
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-14 17:27:07 -07:00
b2a09c1b8c Create reserved query for get shots with metadata (#74)
Reviewed-on: #74
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-11 18:46:46 -06:00
59aaf47cbe Merge pull request 'Add a lightweight GQL call to get video header info' (#73) from loewy/add-lightweight-get-video-with-just-header-info into master
Reviewed-on: #73
2024-10-10 18:33:42 -06:00
c426e753cd add lightweigth gql call to get video header info
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-10 17:02:18 -07:00
c8cf97421b Merge pull request 'Add id to shots: video items to prevent cache merge issues' (#72) from loewy/add-id-to-fix-cache-merging-issue into master
Reviewed-on: #72
2024-10-07 22:15:38 -06:00
9718137ad3 add id to prevent cache merge issues
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-07 21:14:47 -07:00
af1fb3fee7 Merge pull request 'Add a lightweight query to get video thumbnail and info from getShotsResultGql' (#71) from loewy/get-shots-with-video into master
Reviewed-on: #71
Reviewed-by: Kat Huang <kkathuang@gmail.com>
2024-10-07 20:19:14 -06:00
025baf257a add a lightweight query to get video thumbnail and info from getShotsResultGql
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-07 16:51:53 -07:00
8239ab6e1b Add a username filter 2024-10-06 13:44:53 -06:00
1f018f954e Add all targetPocketIntention features to shot retrieval 2024-10-06 13:16:39 -06:00
fd78ddf641 Add marginOfErrorInDegrees 2024-10-06 12:52:13 -06:00
7662f1f050 Merge pull request 'Add day back' (#70) from kat/add-day-back into master
Reviewed-on: #70
2024-10-05 14:44:27 -06:00
890bea2571 Add day back
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-10-05 14:33:39 -06:00
f57f6dc32d Merge pull request 'Add day' (#69) from kat/update-gql into master
Reviewed-on: #69
2024-10-04 23:49:52 -06:00
14863e3357 Add day
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-10-04 22:56:58 -06:00
Your Name
58f01c567c Add day alignment 2024-10-03 21:57:07 -06:00
937368c753 GetShotsWithMetadata accepts ids (#68)
Reviewed-on: #68
2024-10-03 12:36:35 -06:00
d8c11875d4 Merge pull request 'Update get shots with metadata' (#67) from kat/update-gql into master
Reviewed-on: #67
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-03 11:47:20 -06:00
bacd9e77f0 Update get shots with metadata
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-10-03 11:42:39 -06:00
69d755ba32 Merge pull request 'Use ShotWithAllFeatures in getAllShots' (#66) from kat/use-fragment-get-shots into master
Reviewed-on: #66
2024-10-02 19:09:50 -06:00
31fb95e3b0 Use ShotWithAllFeatures in getAllShots
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2024-10-02 18:15:00 -06:00
7d0f9870dd Merge pull request 'Delete unused get shots operation' (#65) from kat/delete-unused-get-shots into master
Reviewed-on: #65
2024-10-02 17:46:26 -06:00
4a493b4e8d Delete unused get shots operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-02 17:43:06 -06:00
341dc819a0 Merge pull request 'Use shot fragment in getShots to cache normalized shots' (#64) from kat/create-shot-fragment into master
Reviewed-on: #64
2024-10-02 17:37:59 -06:00
b58aecf7a5 Crate shot with all features fragment (#63)
Reviewed-on: #63
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-01 19:19:39 -06:00
301c017d5e Delete unused varibles
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-10-01 15:28:12 -06:00
1a4b676635 Create shot fragment
Some checks failed
Tests / Tests (pull_request) Failing after 4s
2024-09-30 17:08:11 -06:00
ce54bef0b4 Merge pull request 'Create get shots by ids operation' (#61) from kat/create-get-shots-by-id into master
Reviewed-on: #61
2024-09-29 22:55:34 -06:00
2699d29d7b Create get shots by ids operation
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-09-29 22:53:24 -06:00
63a07d58ca Add get shots by Ids 2024-09-29 22:16:50 -06:00
59fe332fe0 Add ids to GetShotsResult 2024-09-26 21:47:44 -06:00
33723f4ea2 Improve TimeInterval type 2024-09-23 15:13:45 -06:00
c0ee55069e Merge pull request 'Add pocketing intention info' (#60) from volodymyr/pocketing-intention-info into master
Reviewed-on: #60
2024-09-23 11:47:01 -06:00
492ae4a225 Add pocketing intention info
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-23 11:45:03 -06:00
dcdb324391 Add explicit optional scalars to KeyBallIdentifiers 2024-09-21 13:07:20 -06:00
90685cfdbf Make startDatetime and endDatetime optional 2024-09-20 22:29:18 -06:00
ab61894373 Fix multiline comment 2024-09-20 20:34:37 -07:00
662e0ade64 Merge pull request 'Add calendar aligned months' (#59) from mk/calendar-months into master
Reviewed-on: #59
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-20 21:15:46 -06:00
75aa847ae1 Add calendar aligned months
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-09-20 20:14:57 -07:00
c013228f79 Make range filters generic 2024-09-20 13:25:36 -06:00
740daf95ae Merge pull request 'Add Pocketing Intention Info' (#58) from mk/pocketing-intention-info into master
Reviewed-on: #58
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-19 23:19:36 -06:00
768d29f93e Pocketing Intention Info Schema Changes
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-09-19 22:59:36 -06:00
837e084a5a Add miss angle in degrees 2024-09-19 22:03:59 -06:00
caea1b9572 Add pocket angle features 2024-09-19 18:28:18 -06:00
0a255f161a Merge pull request 'Add shot direction counts' (#57) from shot-direction-counts into master
Reviewed-on: #57
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-19 12:02:51 -06:00
85a2da4b5c Add shot direction counts
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-19 10:46:20 -07:00
647ef3049b Add spin type counts 2024-09-18 16:58:46 -06:00
7b48a5b6e2 Merge pull request 'Add DatetimeRangeAggregation' (#56) from mk/datetime-range-aggregation into master
Reviewed-on: #56
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-18 15:31:31 -06:00
ec2e3da513 Add DatetimeRangeAggregation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-09-18 13:48:52 -07:00
72729e410b Merge pull request 'Add serializedShotPaths to GetShots' (#55) from loewy/add-shot-deserialization-to-operation into master
Reviewed-on: #55
2024-09-16 17:56:23 -06:00
5a9205a9b8 was on the wrong gql operation, updated
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-09-16 15:44:22 -07:00
a33601158f add serializedShotPaths to GetShots
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-09-16 11:55:30 -07:00
3c6b37b567 Merge pull request 'Add indices to shot proto' (#54) from mk/fix-shot-indexes into master
Reviewed-on: #54
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-13 18:08:34 -06:00
9b18ada78d Add indices to shot proto
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2024-09-13 16:54:17 -07:00
d57bb607e4 Merge pull request 'Serialization Improvements' (#53) from mk/serialization-improvements into master
Reviewed-on: #53
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-11 16:23:18 -06:00
1f88ee4a0c Add KeyBalls to shot proto
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-09-11 13:46:14 -07:00
a32317e72f Add Collision Info 2024-09-10 13:31:57 -07:00
b60cbe3854 Merge pull request 'Add current homography operation' (#52) from loewy/add-current-homography-in-operation into master
Reviewed-on: #52
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-06 19:04:35 -06:00
e0b150aa2a add current homography operation
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-09-06 19:00:13 -06:00
2bdfcb994e Merge pull request 'Added get shots with metadadata operation' (#51) from add-get-shots-with-metadata-query into master
Reviewed-on: #51
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-05 23:18:37 -06:00
d5c6014548 Merge remote-tracking branch 'origin/master' into add-get-shots-with-metadata-query
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-05 23:17:53 -06:00
de6fcacfd0 Merge pull request 'Added GetUserTagsQuery' (#50) from micah/add-get-tags-query into master
Reviewed-on: #50
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-09-05 20:28:16 -06:00
mattw26239
993f62b6cf Added get shots with metadadata operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-09-05 20:46:25 -05:00
aabd74d7d7 Added GetUserTagsQuery
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-09-05 18:35:08 -07:00
15b307a88f Merge pull request 'Add current homography to VideoGQL' (#49) from loewy/add-current-homography-to-get-video into master
Reviewed-on: #49
2024-09-04 18:28:24 -06:00
72b338bfc2 add current homography to video gql
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-09-04 18:04:55 -06:00
267486774c Add get shots result 2024-09-04 16:12:20 -06:00
b94a568ef1 Merge pull request 'Add error types for init uploading' (#48) from mk/limit-init-upload-links into master
Reviewed-on: #48
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-09-03 16:52:51 -06:00
b773ccfc8f Add error types for init uploading
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-09-03 15:50:02 -07:00
fd5c28e073 Add get shots with metadata 2024-09-01 21:16:44 +00:00
4c232829b6 Merge pull request 'Add spinType and cueBallSpeed to get shots operation' (#47) from loewy/add-spin-type-to-get-shots into master
Reviewed-on: #47
2024-08-29 19:34:19 -06:00
ddf1036009 add spin type and cue ball speed to get shots operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-29 18:32:05 -07:00
9b3e5c23a0 Merge pull request 'Dummy query to resolve shot paths' (#46) from mk/deserialize-and-render into master
Reviewed-on: #46
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-29 12:26:23 -06:00
a7eae9d46b Merge branch 'master' into mk/deserialize-and-render
All checks were successful
Tests / Tests (pull_request) Successful in 5s
2024-08-29 12:24:54 -06:00
8c3e9d6273 Merge pull request 'Add spinType and filter input' (#45) from mk/spin-type into master
Reviewed-on: #45
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-28 17:38:43 -06:00
f306cc6c16 Merge branch 'master' into mk/spin-type
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-28 17:27:58 -06:00
643cdb29e3 Add spinType and filter input
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-28 16:27:21 -07:00
89287a0100 Merge pull request 'Expose frames per second in get videos' (#44) from kat/expose-frames-per-second into master
Reviewed-on: #44
2024-08-27 10:21:38 -06:00
f9b02f65e0 Expose frames per second in get videos
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 20:53:16 -06:00
41169e2848 Dummy query to get it working for now
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 15:54:43 -07:00
ba36bc709c Merge pull request 'Add resolution to getShots operation' (#42) from loewy/add-resolution-in-get-shots into master
Reviewed-on: #42
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
Reviewed-by: countablecloud <countablecloud@gmail.com>
2024-08-26 12:42:15 -06:00
4005416233 Merge branch 'master' into loewy/add-resolution-in-get-shots
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-26 10:23:07 -06:00
db4a6315cd Merge pull request 'Add stream type to get videos' (#43) from kat/add-stream-type-get-videos into master
Reviewed-on: #43
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-26 08:36:44 -06:00
af38fdea64 Add stream type to get videos
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-26 06:56:40 -06:00
172df69340 add resolution to getShots operation
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-23 17:29:40 -07:00
a030a0ef16 Merge pull request 'Error reporting types and Errors for Shot Annotation' (#41) from mk/allow-error-reporting into master
Reviewed-on: #41
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-21 16:59:34 -06:00
7a6cc2739f Error reporting types and Errors
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-21 13:41:24 -07:00
41c9701e18 Merge pull request 'Add separate return to profile image' (#40) from mk/add-separate-return-to-image-upload-link into master
Reviewed-on: #40
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-19 15:58:15 -06:00
16e79ed608 Adds stream to get upload link
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-08-19 14:54:48 -07:00
f401e1879b Add separate return to profile image
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-19 14:44:43 -07:00
72b451d322 remove stream from getUploadLink 2024-08-16 18:47:08 -07:00
5350c46e0a Merge pull request 'Adds proper error return to stuff involving upload links' (#39) from mk/add-error-return-to-upload-links into master
Reviewed-on: #39
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-16 19:02:31 -06:00
1f5c5774e1 Merge branch 'master' into mk/add-error-return-to-upload-links
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-16 17:29:18 -06:00
3b29502e7e Adds proper error return to stuff involving upload links
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2024-08-16 16:28:45 -07:00
abc7e9fd05 Merge pull request 'add minimum app version to get config call' (#38) from loewy/add-operation-minimum-app-version into master
Reviewed-on: #38
2024-08-16 16:40:39 -06:00
dd5ce77102 add minimum app version to get config call
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-16 14:26:24 -07:00
dabaa3d1e1 Add minimum allowed AppVersion to deployed config 2024-08-16 12:21:46 -07:00
a6604a3a6d add tableSize to GetFeed 2024-08-15 19:52:03 -07:00
09a3e0e294 Add table size range filter 2024-08-15 19:42:53 -07:00
f20ca53a2a add tableSize to operations for getVideo
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-08-15 18:51:36 -07:00
a2b912500c Merge pull request 'Add table size to return' (#36) from mk/table-size-non-optional-float into master
Reviewed-on: #36
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-15 19:12:22 -06:00
7de3d196ba Add table size to return
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-08-15 19:11:25 -06:00
6d5669aaf8 Merge pull request 'Make table size nonnullable float' (#35) from mk/table-size-non-optional-float into master
Reviewed-on: #35
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-15 18:19:07 -06:00
2c583509a2 Make table size nonnullable and float
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-15 16:54:07 -07:00
3480637600 Merge pull request 'Add debugJson to getStreamMonitoringDetails' (#34) from loewy/add-debug-json into master
Reviewed-on: #34
2024-08-13 19:09:11 -06:00
f4665f51b1 add debugJson to getStreamMonitoringDetails
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-13 15:30:04 -07:00
810212dc12 Merge pull request 'Make pagination optional' (#33) from loewy/make-pagination-optional into master
Reviewed-on: #33
2024-08-13 14:53:15 -06:00
c3210df517 make pagination optional:
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-08-13 13:49:12 -07:00
9f5c354433 Merge pull request 'Tweaks for Debugging' (#32) from mk/tweeks-for-debugging into master
Reviewed-on: #32
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
Reviewed-by: loewy <loewymalkov@gmail.com>
2024-08-13 14:43:39 -06:00
23d9fef2b1 Add Debugging JSON to input
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-13 13:28:36 -07:00
df3087de7d Add VideoProcessingStatus to VideoProcessing
All checks were successful
Tests / Tests (pull_request) Successful in 6s
2024-08-13 12:42:45 -07:00
5dd8318dab Add status to VideoProcessing 2024-08-13 11:33:31 -07:00
56c8bcce20 Add uploadCompletionCursor to GetUploadLinkReturn
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-08-13 10:33:53 -07:00
1c4961db5b Merge pull request 'add uploadsCompleted to getUploadStreamWithDetails query' (#31) from loewy/add-uploads-completed into master
Reviewed-on: #31
Reviewed-by: countablecloud <countablecloud@gmail.com>
2024-08-13 11:22:09 -06:00
5e0d01ea5b add uploadsCompleted to getUploadStreamWithDetails query
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-08-13 11:21:11 -06:00
e8938621fc Merge pull request 'Support shots pagination' (#30) from kat/paginate-get-shots into master
Reviewed-on: #30
2024-08-09 15:12:51 -06:00
8c8dcdd8e1 Support shots pagination
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-08-09 15:10:36 -06:00
5085c9af90 Add waitFor 2024-08-09 00:59:38 -06:00
85bc743c8e Bump getShots default 2024-08-05 23:36:54 -06:00
b8efa644e3 Merge pull request 'Add frameIndex in operation for getVideo in homographyHistory' (#29) from loewy/add-frame-index-in-homography-history into master
Reviewed-on: #29
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-08-01 19:52:51 -06:00
c18628a4ca Add pagination to getShots 2024-08-01 19:49:57 -06:00
535e24c9c2 add frameindex in operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2024-08-01 14:52:37 -07:00
04308b1003 Merge pull request 'Add addAnnotationToShot' (#28) from mk/add-add-annotation into master
Reviewed-on: #28
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-30 18:10:44 -06:00
43c626141e Add addAnnotationToShot
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-07-30 17:08:05 -07:00
c49266e4c1 Merge pull request 'Expose frames per second on video' (#27) from kat/add-video-duration into master
Reviewed-on: #27
2024-07-30 11:54:34 -06:00
6677b9232f Expose frames per second on video
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-07-30 11:53:34 -06:00
76e792be88 Merge pull request 'Expose stream type on video' (#26) from kat/create-get-video-for-clip-calculation into master
Reviewed-on: #26
2024-07-30 01:02:18 -06:00
5eac3d9d40 Expose stream type
All checks were successful
Tests / Tests (pull_request) Successful in 12s
2024-07-30 01:00:12 -06:00
64593f09b7 Add include_on_none in range filter 2024-07-29 17:21:09 -06:00
e20b68799f Add falsePositiveScore 2024-07-28 02:06:39 -06:00
378878967a Add streamSegmentType to Stream 2024-07-27 20:51:48 -06:00
251ebe7056 Merge pull request 'Add homography and resolution to GetVideo' (#25) from loewy/add-resolution-in-operation into master
Reviewed-on: #25
2024-07-25 19:09:56 -06:00
615e4d5467 add resolution and homography to getVideo
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-07-25 18:07:17 -07:00
a4f602d651 Expose resolution 2024-07-25 18:18:16 -06:00
c48512fc45 Merge pull request 'Fixed get user tags parameters' (#24) from micah/get-user-tags into master
Reviewed-on: #24
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-24 14:28:25 -06:00
d75822c465 Fixed get user tags parameters
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2024-07-24 11:47:57 -07:00
4feeba5150 Merge pull request 'Added user tags' (#23) from micah/get-user-tags into master
Reviewed-on: #23
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-07-23 23:37:05 -06:00
e1237363f0 Removed wrapper type
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2024-07-23 18:53:39 -07:00
b1550b31c5 Added user tags
All checks were successful
Tests / Tests (pull_request) Successful in 7s
2024-07-22 19:43:42 -07:00
81b9fd9f12 Add spin features 2024-07-19 17:18:14 -06:00
37 changed files with 21353 additions and 812 deletions

View File

@@ -9,6 +9,7 @@ for proto in $(find ./rbproto -iname '*.proto'); do
protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto
yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts
done
black rbproto/python
prettier ./rbproto --write
git ls-files | xargs md5sum > after.txt

View File

@@ -1,5 +1,7 @@
overwrite: true
schema: "src/schema.gql"
schema:
- "src/schema.gql"
- "src/client-schema.gql"
documents: "src/**/*.gql"
generates:
src/index.tsx:

View File

@@ -21,7 +21,7 @@
in
with pkgs; {
devShell = mkShell {
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf];
buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf black];
};
});
}

View File

@@ -12,10 +12,10 @@
"author": "Ivan Malison <IvanMalison@gmail.com>",
"license": "MIT",
"dependencies": {
"@apollo/client": "^3.9.2",
"@apollo/client": "^3.11.10",
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/typescript": "^4.0.1",
"@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-operations": "^5.0.4",
"@graphql-codegen/typescript-react-apollo": "^4.2.0",
"graphql": "^16.8.1",
"pbjs": "^0.0.14",

View File

@@ -7,8 +7,8 @@ readme = "README.md"
packages = [{include = "rbproto"}]
[tool.poetry.dependencies]
python = ">=3.10,<3.12"
protobuf = "^4.25.3"
python = ">=3.10,<=3.13"
protobuf = ">=4.25.3"
[build-system]

View File

@@ -6,36 +6,49 @@ from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xe6\x01\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x42\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"I\n\x0c\x43olorCluster\x12\x11\n\tlightness\x18\x01 \x01(\x02\x12\t\n\x01\x61\x18\x02 \x01(\x02\x12\t\n\x01\x62\x18\x03 \x01(\x02\x12\x10\n\x08\x66raction\x18\x04 \x01(\x02"B\n\x0fTrajectoryColor\x12/\n\x08\x63lusters\x18\x01 \x03(\x0b\x32\x1d.serialized_shot.ColorCluster"\x8e\x01\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\x12:\n\x10trajectory_color\x18\x03 \x01(\x0b\x32 .serialized_shot.TrajectoryColor"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3'
)
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "shot_pb2", _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_globals['_BOX']._serialized_start=31
_globals['_BOX']._serialized_end=94
_globals['_POINT']._serialized_start=96
_globals['_POINT']._serialized_end=125
_globals['_BALLDETECTION']._serialized_start=127
_globals['_BALLDETECTION']._serialized_end=254
_globals['_RLEBALLDETECTION']._serialized_start=256
_globals['_RLEBALLDETECTION']._serialized_end=340
_globals['_RLEDETECTIONHISTORY']._serialized_start=342
_globals['_RLEDETECTIONHISTORY']._serialized_end=418
_globals['_DETECTIONHISTORY']._serialized_start=420
_globals['_DETECTIONHISTORY']._serialized_end=490
_globals['_PATH']._serialized_start=493
_globals['_PATH']._serialized_end=723
_globals['_IDENTIFIERHISTORY']._serialized_start=725
_globals['_IDENTIFIERHISTORY']._serialized_end=807
_globals['_SHOT']._serialized_start=809
_globals['_SHOT']._serialized_end=881
DESCRIPTOR._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._options = None
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_options = b"8\001"
_globals["_BOX"]._serialized_start = 31
_globals["_BOX"]._serialized_end = 94
_globals["_POINT"]._serialized_start = 96
_globals["_POINT"]._serialized_end = 125
_globals["_BALLDETECTION"]._serialized_start = 127
_globals["_BALLDETECTION"]._serialized_end = 254
_globals["_RLEBALLDETECTION"]._serialized_start = 256
_globals["_RLEBALLDETECTION"]._serialized_end = 340
_globals["_RLEDETECTIONHISTORY"]._serialized_start = 342
_globals["_RLEDETECTIONHISTORY"]._serialized_end = 418
_globals["_DETECTIONHISTORY"]._serialized_start = 420
_globals["_DETECTIONHISTORY"]._serialized_end = 490
_globals["_COLLISIONINFO"]._serialized_start = 493
_globals["_COLLISIONINFO"]._serialized_end = 745
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_start = 667
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745
_globals["_PATH"]._serialized_start = 748
_globals["_PATH"]._serialized_end = 1080
_globals["_COLORCLUSTER"]._serialized_start = 1082
_globals["_COLORCLUSTER"]._serialized_end = 1155
_globals["_TRAJECTORYCOLOR"]._serialized_start = 1157
_globals["_TRAJECTORYCOLOR"]._serialized_end = 1223
_globals["_IDENTIFIERHISTORY"]._serialized_start = 1226
_globals["_IDENTIFIERHISTORY"]._serialized_end = 1368
_globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1371
_globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1615
_globals["_SHOT"]._serialized_start = 1618
_globals["_SHOT"]._serialized_end = 1786
# @@protoc_insertion_point(module_scope)

View File

@@ -1,7 +1,13 @@
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
from typing import (
ClassVar as _ClassVar,
Iterable as _Iterable,
Mapping as _Mapping,
Optional as _Optional,
Union as _Union,
)
DESCRIPTOR: _descriptor.FileDescriptor
@@ -15,7 +21,13 @@ class Box(_message.Message):
top: float
width: float
height: float
def __init__(self, left: _Optional[float] = ..., top: _Optional[float] = ..., width: _Optional[float] = ..., height: _Optional[float] = ...) -> None: ...
def __init__(
self,
left: _Optional[float] = ...,
top: _Optional[float] = ...,
width: _Optional[float] = ...,
height: _Optional[float] = ...,
) -> None: ...
class Point(_message.Message):
__slots__ = ["x", "y"]
@@ -23,7 +35,9 @@ class Point(_message.Message):
Y_FIELD_NUMBER: _ClassVar[int]
x: float
y: float
def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ...
def __init__(
self, x: _Optional[float] = ..., y: _Optional[float] = ...
) -> None: ...
class BallDetection(_message.Message):
__slots__ = ["plane_position", "annotation", "interpolated"]
@@ -33,7 +47,12 @@ class BallDetection(_message.Message):
plane_position: Point
annotation: Box
interpolated: bool
def __init__(self, plane_position: _Optional[_Union[Point, _Mapping]] = ..., annotation: _Optional[_Union[Box, _Mapping]] = ..., interpolated: bool = ...) -> None: ...
def __init__(
self,
plane_position: _Optional[_Union[Point, _Mapping]] = ...,
annotation: _Optional[_Union[Box, _Mapping]] = ...,
interpolated: bool = ...,
) -> None: ...
class RLEBallDetection(_message.Message):
__slots__ = ["detection", "count"]
@@ -41,46 +60,198 @@ class RLEBallDetection(_message.Message):
COUNT_FIELD_NUMBER: _ClassVar[int]
detection: BallDetection
count: int
def __init__(self, detection: _Optional[_Union[BallDetection, _Mapping]] = ..., count: _Optional[int] = ...) -> None: ...
def __init__(
self,
detection: _Optional[_Union[BallDetection, _Mapping]] = ...,
count: _Optional[int] = ...,
) -> None: ...
class RLEDetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...) -> None: ...
def __init__(
self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...
) -> None: ...
class DetectionHistory(_message.Message):
__slots__ = ["detections"]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
def __init__(
self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...
) -> None: ...
class CollisionInfo(_message.Message):
__slots__ = [
"source",
"ball_identifiers",
"wall_identifier",
"frame_index",
"static",
]
class BallIdentifiersEntry(_message.Message):
__slots__ = ["key", "value"]
KEY_FIELD_NUMBER: _ClassVar[int]
VALUE_FIELD_NUMBER: _ClassVar[int]
key: int
value: Point
def __init__(
self,
key: _Optional[int] = ...,
value: _Optional[_Union[Point, _Mapping]] = ...,
) -> None: ...
SOURCE_FIELD_NUMBER: _ClassVar[int]
BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int]
WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
FRAME_INDEX_FIELD_NUMBER: _ClassVar[int]
STATIC_FIELD_NUMBER: _ClassVar[int]
source: int
ball_identifiers: _containers.MessageMap[int, Point]
wall_identifier: int
frame_index: int
static: bool
def __init__(
self,
source: _Optional[int] = ...,
ball_identifiers: _Optional[_Mapping[int, Point]] = ...,
wall_identifier: _Optional[int] = ...,
frame_index: _Optional[int] = ...,
static: bool = ...,
) -> None: ...
class Path(_message.Message):
__slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"]
__slots__ = [
"start_frame",
"end_frame",
"detections",
"rle_detections",
"not_present",
"is_static",
"start_info",
"end_info",
]
START_FRAME_FIELD_NUMBER: _ClassVar[int]
END_FRAME_FIELD_NUMBER: _ClassVar[int]
DETECTIONS_FIELD_NUMBER: _ClassVar[int]
RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
IS_STATIC_FIELD_NUMBER: _ClassVar[int]
START_INFO_FIELD_NUMBER: _ClassVar[int]
END_INFO_FIELD_NUMBER: _ClassVar[int]
start_frame: int
end_frame: int
detections: DetectionHistory
rle_detections: RLEDetectionHistory
not_present: bool
is_static: bool
def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ...) -> None: ...
start_info: CollisionInfo
end_info: CollisionInfo
def __init__(
self,
start_frame: _Optional[int] = ...,
end_frame: _Optional[int] = ...,
detections: _Optional[_Union[DetectionHistory, _Mapping]] = ...,
rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ...,
not_present: bool = ...,
is_static: bool = ...,
start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...,
end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...,
) -> None: ...
class ColorCluster(_message.Message):
__slots__ = ["lightness", "a", "b", "fraction"]
LIGHTNESS_FIELD_NUMBER: _ClassVar[int]
A_FIELD_NUMBER: _ClassVar[int]
B_FIELD_NUMBER: _ClassVar[int]
FRACTION_FIELD_NUMBER: _ClassVar[int]
lightness: float
a: float
b: float
fraction: float
def __init__(
self,
lightness: _Optional[float] = ...,
a: _Optional[float] = ...,
b: _Optional[float] = ...,
fraction: _Optional[float] = ...,
) -> None: ...
class TrajectoryColor(_message.Message):
__slots__ = ["clusters"]
CLUSTERS_FIELD_NUMBER: _ClassVar[int]
clusters: _containers.RepeatedCompositeFieldContainer[ColorCluster]
def __init__(
self, clusters: _Optional[_Iterable[_Union[ColorCluster, _Mapping]]] = ...
) -> None: ...
class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths"]
__slots__ = ["ball_identifier", "paths", "trajectory_color"]
BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
PATHS_FIELD_NUMBER: _ClassVar[int]
TRAJECTORY_COLOR_FIELD_NUMBER: _ClassVar[int]
ball_identifier: int
paths: _containers.RepeatedCompositeFieldContainer[Path]
def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
trajectory_color: TrajectoryColor
def __init__(
self,
ball_identifier: _Optional[int] = ...,
paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...,
trajectory_color: _Optional[_Union[TrajectoryColor, _Mapping]] = ...,
) -> None: ...
class KeyBallIdentifiers(_message.Message):
__slots__ = [
"cue_ball",
"object_ball",
"target_ball",
"contact_sequence",
"cue_ball_id",
"object_ball_id",
"target_ball_id",
]
CUE_BALL_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_FIELD_NUMBER: _ClassVar[int]
CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int]
CUE_BALL_ID_FIELD_NUMBER: _ClassVar[int]
OBJECT_BALL_ID_FIELD_NUMBER: _ClassVar[int]
TARGET_BALL_ID_FIELD_NUMBER: _ClassVar[int]
cue_ball: int
object_ball: int
target_ball: int
contact_sequence: _containers.RepeatedScalarFieldContainer[int]
cue_ball_id: int
object_ball_id: int
target_ball_id: int
def __init__(
self,
cue_ball: _Optional[int] = ...,
object_ball: _Optional[int] = ...,
target_ball: _Optional[int] = ...,
contact_sequence: _Optional[_Iterable[int]] = ...,
cue_ball_id: _Optional[int] = ...,
object_ball_id: _Optional[int] = ...,
target_ball_id: _Optional[int] = ...,
) -> None: ...
class Shot(_message.Message):
__slots__ = ["identifier_histories"]
__slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"]
IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
KEY_BALLS_FIELD_NUMBER: _ClassVar[int]
START_INDEX_FIELD_NUMBER: _ClassVar[int]
END_INDEX_FIELD_NUMBER: _ClassVar[int]
identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ...
key_balls: KeyBallIdentifiers
start_index: int
end_index: int
def __init__(
self,
identifier_histories: _Optional[
_Iterable[_Union[IdentifierHistory, _Mapping]]
] = ...,
key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ...,
start_index: _Optional[int] = ...,
end_index: _Optional[int] = ...,
) -> None: ...

View File

@@ -3,10 +3,10 @@ syntax = "proto3";
package serialized_shot;
message Box {
float left = 1;
float top = 2;
float width = 3;
float height = 4;
float left = 1;
float top = 2;
float width = 3;
float height = 4;
}
message Point {
@@ -15,40 +15,75 @@ message Point {
}
message BallDetection {
Point plane_position = 1;
Box annotation = 2;
bool interpolated = 3;
Point plane_position = 1;
Box annotation = 2;
bool interpolated = 3;
}
message RLEBallDetection {
BallDetection detection = 1;
uint32 count = 2;
BallDetection detection = 1;
uint32 count = 2;
}
message RLEDetectionHistory {
repeated RLEBallDetection detections = 1;
}
message RLEDetectionHistory { repeated RLEBallDetection detections = 1; }
message DetectionHistory {
repeated BallDetection detections = 1;
message DetectionHistory { repeated BallDetection detections = 1; }
message CollisionInfo {
uint32 source = 1;
map<uint32, Point> ball_identifiers = 2;
uint32 wall_identifier = 3;
uint32 frame_index = 4;
bool static = 5;
}
message Path {
uint32 start_frame = 1;
uint32 end_frame = 2;
oneof detection_history {
DetectionHistory detections = 3;
RLEDetectionHistory rle_detections = 4;
bool not_present = 5;
DetectionHistory detections = 3;
RLEDetectionHistory rle_detections = 4;
bool not_present = 5;
}
bool is_static = 6;
CollisionInfo start_info = 7;
CollisionInfo end_info = 8;
}
message ColorCluster {
// LAB in OpenCV's 0-255 uint8 scale (see railbird LABCV2Color).
float lightness = 1;
float a = 2;
float b = 3;
// Share of this ball's accumulated color pixels in this cluster (0-1).
float fraction = 4;
}
message TrajectoryColor { repeated ColorCluster clusters = 1; }
message IdentifierHistory {
uint32 ball_identifier = 1;
repeated Path paths = 2;
TrajectoryColor trajectory_color = 3;
}
message KeyBallIdentifiers {
uint32 cue_ball = 1;
uint32 object_ball = 2;
uint32 target_ball = 3;
// For now this will just be cue->object/target->target
// Long term this will potentially represent a linked list
// of all balls in a shot.
repeated uint32 contact_sequence = 4;
optional uint32 cue_ball_id = 5;
optional uint32 object_ball_id = 6;
optional uint32 target_ball_id = 7;
}
message Shot {
repeated IdentifierHistory identifier_histories = 3;
KeyBallIdentifiers key_balls = 4;
uint32 start_index = 5;
uint32 end_index = 6;
}

View File

@@ -427,6 +427,150 @@ function _decodeDetectionHistory(bb: ByteBuffer): DetectionHistory {
return message;
}
export interface CollisionInfo {
source?: number;
ball_identifiers?: { [key: number]: Point };
wall_identifier?: number;
frame_index?: number;
static?: boolean;
}
export function encodeCollisionInfo(message: CollisionInfo): Uint8Array {
let bb = popByteBuffer();
_encodeCollisionInfo(message, bb);
return toUint8Array(bb);
}
function _encodeCollisionInfo(message: CollisionInfo, bb: ByteBuffer): void {
// optional uint32 source = 1;
let $source = message.source;
if ($source !== undefined) {
writeVarint32(bb, 8);
writeVarint32(bb, $source);
}
// optional map<uint32, Point> ball_identifiers = 2;
let map$ball_identifiers = message.ball_identifiers;
if (map$ball_identifiers !== undefined) {
for (let key in map$ball_identifiers) {
let nested = popByteBuffer();
let value = map$ball_identifiers[key];
writeVarint32(nested, 8);
writeVarint32(nested, +key);
writeVarint32(nested, 18);
let nestedValue = popByteBuffer();
_encodePoint(value, nestedValue);
writeVarint32(nested, nestedValue.limit);
writeByteBuffer(nested, nestedValue);
pushByteBuffer(nestedValue);
writeVarint32(bb, 18);
writeVarint32(bb, nested.offset);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
// optional uint32 wall_identifier = 3;
let $wall_identifier = message.wall_identifier;
if ($wall_identifier !== undefined) {
writeVarint32(bb, 24);
writeVarint32(bb, $wall_identifier);
}
// optional uint32 frame_index = 4;
let $frame_index = message.frame_index;
if ($frame_index !== undefined) {
writeVarint32(bb, 32);
writeVarint32(bb, $frame_index);
}
// optional bool static = 5;
let $static = message.static;
if ($static !== undefined) {
writeVarint32(bb, 40);
writeByte(bb, $static ? 1 : 0);
}
}
export function decodeCollisionInfo(binary: Uint8Array): CollisionInfo {
return _decodeCollisionInfo(wrapByteBuffer(binary));
}
function _decodeCollisionInfo(bb: ByteBuffer): CollisionInfo {
let message: CollisionInfo = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional uint32 source = 1;
case 1: {
message.source = readVarint32(bb) >>> 0;
break;
}
// optional map<uint32, Point> ball_identifiers = 2;
case 2: {
let values =
message.ball_identifiers || (message.ball_identifiers = {});
let outerLimit = pushTemporaryLength(bb);
let key: number | undefined;
let value: Point | undefined;
end_of_entry: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_entry;
case 1: {
key = readVarint32(bb) >>> 0;
break;
}
case 2: {
let valueLimit = pushTemporaryLength(bb);
value = _decodePoint(bb);
bb.limit = valueLimit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
if (key === undefined || value === undefined)
throw new Error("Invalid data for map: ball_identifiers");
values[key] = value;
bb.limit = outerLimit;
break;
}
// optional uint32 wall_identifier = 3;
case 3: {
message.wall_identifier = readVarint32(bb) >>> 0;
break;
}
// optional uint32 frame_index = 4;
case 4: {
message.frame_index = readVarint32(bb) >>> 0;
break;
}
// optional bool static = 5;
case 5: {
message.static = !!readByte(bb);
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface Path {
start_frame?: number;
end_frame?: number;
@@ -434,6 +578,8 @@ export interface Path {
rle_detections?: RLEDetectionHistory;
not_present?: boolean;
is_static?: boolean;
start_info?: CollisionInfo;
end_info?: CollisionInfo;
}
export function encodePath(message: Path): Uint8Array {
@@ -492,6 +638,28 @@ function _encodePath(message: Path, bb: ByteBuffer): void {
writeVarint32(bb, 48);
writeByte(bb, $is_static ? 1 : 0);
}
// optional CollisionInfo start_info = 7;
let $start_info = message.start_info;
if ($start_info !== undefined) {
writeVarint32(bb, 58);
let nested = popByteBuffer();
_encodeCollisionInfo($start_info, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
// optional CollisionInfo end_info = 8;
let $end_info = message.end_info;
if ($end_info !== undefined) {
writeVarint32(bb, 66);
let nested = popByteBuffer();
_encodeCollisionInfo($end_info, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
export function decodePath(binary: Uint8Array): Path {
@@ -548,6 +716,170 @@ function _decodePath(bb: ByteBuffer): Path {
break;
}
// optional CollisionInfo start_info = 7;
case 7: {
let limit = pushTemporaryLength(bb);
message.start_info = _decodeCollisionInfo(bb);
bb.limit = limit;
break;
}
// optional CollisionInfo end_info = 8;
case 8: {
let limit = pushTemporaryLength(bb);
message.end_info = _decodeCollisionInfo(bb);
bb.limit = limit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface ColorCluster {
lightness?: number;
a?: number;
b?: number;
fraction?: number;
}
export function encodeColorCluster(message: ColorCluster): Uint8Array {
let bb = popByteBuffer();
_encodeColorCluster(message, bb);
return toUint8Array(bb);
}
function _encodeColorCluster(message: ColorCluster, bb: ByteBuffer): void {
// optional float lightness = 1;
let $lightness = message.lightness;
if ($lightness !== undefined) {
writeVarint32(bb, 13);
writeFloat(bb, $lightness);
}
// optional float a = 2;
let $a = message.a;
if ($a !== undefined) {
writeVarint32(bb, 21);
writeFloat(bb, $a);
}
// optional float b = 3;
let $b = message.b;
if ($b !== undefined) {
writeVarint32(bb, 29);
writeFloat(bb, $b);
}
// optional float fraction = 4;
let $fraction = message.fraction;
if ($fraction !== undefined) {
writeVarint32(bb, 37);
writeFloat(bb, $fraction);
}
}
export function decodeColorCluster(binary: Uint8Array): ColorCluster {
return _decodeColorCluster(wrapByteBuffer(binary));
}
function _decodeColorCluster(bb: ByteBuffer): ColorCluster {
let message: ColorCluster = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional float lightness = 1;
case 1: {
message.lightness = readFloat(bb);
break;
}
// optional float a = 2;
case 2: {
message.a = readFloat(bb);
break;
}
// optional float b = 3;
case 3: {
message.b = readFloat(bb);
break;
}
// optional float fraction = 4;
case 4: {
message.fraction = readFloat(bb);
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface TrajectoryColor {
clusters?: ColorCluster[];
}
export function encodeTrajectoryColor(message: TrajectoryColor): Uint8Array {
let bb = popByteBuffer();
_encodeTrajectoryColor(message, bb);
return toUint8Array(bb);
}
function _encodeTrajectoryColor(
message: TrajectoryColor,
bb: ByteBuffer,
): void {
// repeated ColorCluster clusters = 1;
let array$clusters = message.clusters;
if (array$clusters !== undefined) {
for (let value of array$clusters) {
writeVarint32(bb, 10);
let nested = popByteBuffer();
_encodeColorCluster(value, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
}
export function decodeTrajectoryColor(binary: Uint8Array): TrajectoryColor {
return _decodeTrajectoryColor(wrapByteBuffer(binary));
}
function _decodeTrajectoryColor(bb: ByteBuffer): TrajectoryColor {
let message: TrajectoryColor = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// repeated ColorCluster clusters = 1;
case 1: {
let limit = pushTemporaryLength(bb);
let values = message.clusters || (message.clusters = []);
values.push(_decodeColorCluster(bb));
bb.limit = limit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
@@ -559,6 +891,7 @@ function _decodePath(bb: ByteBuffer): Path {
export interface IdentifierHistory {
ball_identifier?: number;
paths?: Path[];
trajectory_color?: TrajectoryColor;
}
export function encodeIdentifierHistory(
@@ -592,6 +925,17 @@ function _encodeIdentifierHistory(
pushByteBuffer(nested);
}
}
// optional TrajectoryColor trajectory_color = 3;
let $trajectory_color = message.trajectory_color;
if ($trajectory_color !== undefined) {
writeVarint32(bb, 26);
let nested = popByteBuffer();
_encodeTrajectoryColor($trajectory_color, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
export function decodeIdentifierHistory(binary: Uint8Array): IdentifierHistory {
@@ -623,6 +967,168 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory {
break;
}
// optional TrajectoryColor trajectory_color = 3;
case 3: {
let limit = pushTemporaryLength(bb);
message.trajectory_color = _decodeTrajectoryColor(bb);
bb.limit = limit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface KeyBallIdentifiers {
cue_ball?: number;
object_ball?: number;
target_ball?: number;
contact_sequence?: number[];
cue_ball_id?: number;
object_ball_id?: number;
target_ball_id?: number;
}
export function encodeKeyBallIdentifiers(
message: KeyBallIdentifiers,
): Uint8Array {
let bb = popByteBuffer();
_encodeKeyBallIdentifiers(message, bb);
return toUint8Array(bb);
}
function _encodeKeyBallIdentifiers(
message: KeyBallIdentifiers,
bb: ByteBuffer,
): void {
// optional uint32 cue_ball = 1;
let $cue_ball = message.cue_ball;
if ($cue_ball !== undefined) {
writeVarint32(bb, 8);
writeVarint32(bb, $cue_ball);
}
// optional uint32 object_ball = 2;
let $object_ball = message.object_ball;
if ($object_ball !== undefined) {
writeVarint32(bb, 16);
writeVarint32(bb, $object_ball);
}
// optional uint32 target_ball = 3;
let $target_ball = message.target_ball;
if ($target_ball !== undefined) {
writeVarint32(bb, 24);
writeVarint32(bb, $target_ball);
}
// repeated uint32 contact_sequence = 4;
let array$contact_sequence = message.contact_sequence;
if (array$contact_sequence !== undefined) {
let packed = popByteBuffer();
for (let value of array$contact_sequence) {
writeVarint32(packed, value);
}
writeVarint32(bb, 34);
writeVarint32(bb, packed.offset);
writeByteBuffer(bb, packed);
pushByteBuffer(packed);
}
// optional uint32 cue_ball_id = 5;
let $cue_ball_id = message.cue_ball_id;
if ($cue_ball_id !== undefined) {
writeVarint32(bb, 40);
writeVarint32(bb, $cue_ball_id);
}
// optional uint32 object_ball_id = 6;
let $object_ball_id = message.object_ball_id;
if ($object_ball_id !== undefined) {
writeVarint32(bb, 48);
writeVarint32(bb, $object_ball_id);
}
// optional uint32 target_ball_id = 7;
let $target_ball_id = message.target_ball_id;
if ($target_ball_id !== undefined) {
writeVarint32(bb, 56);
writeVarint32(bb, $target_ball_id);
}
}
export function decodeKeyBallIdentifiers(
binary: Uint8Array,
): KeyBallIdentifiers {
return _decodeKeyBallIdentifiers(wrapByteBuffer(binary));
}
function _decodeKeyBallIdentifiers(bb: ByteBuffer): KeyBallIdentifiers {
let message: KeyBallIdentifiers = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional uint32 cue_ball = 1;
case 1: {
message.cue_ball = readVarint32(bb) >>> 0;
break;
}
// optional uint32 object_ball = 2;
case 2: {
message.object_ball = readVarint32(bb) >>> 0;
break;
}
// optional uint32 target_ball = 3;
case 3: {
message.target_ball = readVarint32(bb) >>> 0;
break;
}
// repeated uint32 contact_sequence = 4;
case 4: {
let values =
message.contact_sequence || (message.contact_sequence = []);
if ((tag & 7) === 2) {
let outerLimit = pushTemporaryLength(bb);
while (!isAtEnd(bb)) {
values.push(readVarint32(bb) >>> 0);
}
bb.limit = outerLimit;
} else {
values.push(readVarint32(bb) >>> 0);
}
break;
}
// optional uint32 cue_ball_id = 5;
case 5: {
message.cue_ball_id = readVarint32(bb) >>> 0;
break;
}
// optional uint32 object_ball_id = 6;
case 6: {
message.object_ball_id = readVarint32(bb) >>> 0;
break;
}
// optional uint32 target_ball_id = 7;
case 7: {
message.target_ball_id = readVarint32(bb) >>> 0;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
@@ -633,6 +1139,9 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory {
export interface Shot {
identifier_histories?: IdentifierHistory[];
key_balls?: KeyBallIdentifiers;
start_index?: number;
end_index?: number;
}
export function encodeShot(message: Shot): Uint8Array {
@@ -654,6 +1163,31 @@ function _encodeShot(message: Shot, bb: ByteBuffer): void {
pushByteBuffer(nested);
}
}
// optional KeyBallIdentifiers key_balls = 4;
let $key_balls = message.key_balls;
if ($key_balls !== undefined) {
writeVarint32(bb, 34);
let nested = popByteBuffer();
_encodeKeyBallIdentifiers($key_balls, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
// optional uint32 start_index = 5;
let $start_index = message.start_index;
if ($start_index !== undefined) {
writeVarint32(bb, 40);
writeVarint32(bb, $start_index);
}
// optional uint32 end_index = 6;
let $end_index = message.end_index;
if ($end_index !== undefined) {
writeVarint32(bb, 48);
writeVarint32(bb, $end_index);
}
}
export function decodeShot(binary: Uint8Array): Shot {
@@ -680,6 +1214,26 @@ function _decodeShot(bb: ByteBuffer): Shot {
break;
}
// optional KeyBallIdentifiers key_balls = 4;
case 4: {
let limit = pushTemporaryLength(bb);
message.key_balls = _decodeKeyBallIdentifiers(bb);
bb.limit = limit;
break;
}
// optional uint32 start_index = 5;
case 5: {
message.start_index = readVarint32(bb) >>> 0;
break;
}
// optional uint32 end_index = 6;
case 6: {
message.end_index = readVarint32(bb) >>> 0;
break;
}
default:
skipUnknownField(bb, tag & 7);
}

32
src/client-schema.gql Normal file
View File

@@ -0,0 +1,32 @@
# see: https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/
directive @client on FIELD
type SegmentInfo {
index: Int!
time: Float!
}
extend type ShotGQL {
startTime: Float!
endTime: Float!
startSegment: SegmentInfo!
endSegment: SegmentInfo!
}
extend type UploadStreamGQL {
segmentEndFrames: [Int!]!
}
extend type HLSPlaylistGQL {
segmentStartTimes: [Float!]!
}
type SegmentEndFramesGQL {
id: Int!
segmentEndFrames: [Int!]!
}
type SegmentStartTimesGQL {
id: Int!
segmentStartTimes: [Float!]!
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,6 +7,7 @@ query GetAggregatedShotMetrics($aggregateInput: AggregateInputGQL!) {
targetMetrics {
count
makePercentage
averageDifficulty
}
}
}

View File

@@ -0,0 +1,282 @@
query GetChallenges {
challenges {
id
name
description
minimumShots
startDate
endDate
createdAt
updatedAt
requiredTableSize
requiredPocketSize
isPublic
maxAttempts
ruleSet {
id
name
description
}
createdBy {
id
username
profileImageUri
}
}
}
query GetMyDismissedChallenges {
myDismissedChallenges {
id
name
description
minimumShots
startDate
endDate
createdAt
updatedAt
requiredTableSize
requiredPocketSize
isPublic
maxAttempts
ruleSet {
id
name
description
}
createdBy {
id
username
profileImageUri
}
}
}
query GetChallenge($id: ID!) {
challenge(id: $id) {
id
name
description
minimumShots
startDate
endDate
createdAt
updatedAt
requiredTableSize
requiredPocketSize
isPublic
maxAttempts
participantCount
ruleSet {
id
name
description
}
createdBy {
id
username
profileImageUri
}
invitations {
id
status
createdAt
invitee {
id
username
profileImageUri
}
inviter {
id
username
profileImageUri
}
}
}
}
query GetRuleSets {
ruleSets {
id
name
description
}
}
query GetChallengeLeaderboard($challengeId: ID!, $limit: Int) {
challengeLeaderboard(challengeId: $challengeId, limit: $limit) {
id
status
shotsCount
makesCount
makeRate
qualified
createdAt
attemptCount
user {
id
username
profileImageUri
}
video {
id
createdAt
}
}
}
query GetMyChallengeInvitations {
myChallengeInvitations {
id
status
createdAt
challenge {
id
name
description
startDate
endDate
createdBy {
id
username
profileImageUri
}
}
inviter {
id
username
profileImageUri
}
}
}
query GetMyChallengeEntries {
myChallengeEntries {
id
status
shotsCount
makesCount
makeRate
qualified
createdAt
challenge {
id
name
}
video {
id
}
}
}
mutation CreateRuleSet($name: String!, $description: String) {
createRuleSet(name: $name, description: $description) {
id
name
description
}
}
mutation CreateChallenge(
$name: String!
$ruleSetId: ID!
$minimumShots: Int!
$startDate: DateTime!
$endDate: DateTime!
$description: String
$requiredTableSize: Float
$requiredPocketSize: Float
$isPublic: Boolean! = false
$maxAttempts: Int
) {
createChallenge(
name: $name
ruleSetId: $ruleSetId
minimumShots: $minimumShots
startDate: $startDate
endDate: $endDate
description: $description
requiredTableSize: $requiredTableSize
requiredPocketSize: $requiredPocketSize
isPublic: $isPublic
maxAttempts: $maxAttempts
) {
id
name
description
requiredTableSize
requiredPocketSize
isPublic
maxAttempts
}
}
mutation InviteUsersToChallenge($challengeId: ID!, $userIds: [ID!]!) {
inviteUsersToChallenge(challengeId: $challengeId, userIds: $userIds) {
id
status
inviter {
id
username
}
}
}
mutation RespondToChallengeInvitation($invitationId: ID!, $accept: Boolean!) {
respondToChallengeInvitation(invitationId: $invitationId, accept: $accept) {
id
status
challenge {
id
}
}
}
mutation StartChallenge($challengeId: ID!) {
startChallenge(challengeId: $challengeId) {
id
status
createdAt
challenge {
id
name
}
}
}
mutation SubmitChallengeEntry($entryId: ID!, $videoId: ID!) {
submitChallengeEntry(entryId: $entryId, videoId: $videoId) {
id
status
qualified
makeRate
shotsCount
makesCount
video {
id
}
}
}
mutation RecalculateChallengeEntry($entryId: ID!) {
recalculateChallengeEntry(entryId: $entryId) {
id
status
qualified
makeRate
shotsCount
makesCount
}
}
query IsChallengeDismissed($challengeId: ID!) {
isChallengeDismissed(challengeId: $challengeId)
}
mutation DismissChallenge($challengeId: ID!) {
dismissChallenge(challengeId: $challengeId)
}
mutation UndismissChallenge($challengeId: ID!) {
undismissChallenge(challengeId: $challengeId)
}

View File

@@ -0,0 +1,19 @@
mutation CommentOnVideo(
$videoId: Int!
$message: String!
$parentCommentId: Int
) {
commentOnVideo(
videoId: $videoId
message: $message
parentCommentId: $parentCommentId
)
}
mutation EditComment($videoId: Int!, $commentId: Int!, $newMessage: String!) {
editComment(videoId: $videoId, commentId: $commentId, newMessage: $newMessage)
}
mutation DeleteComment($videoId: Int!, $commentId: Int!) {
deleteComment(videoId: $videoId, commentId: $commentId)
}

View File

@@ -4,5 +4,20 @@ query getDeployedConfig {
devMode
environment
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
quotaEnforcementEnabled
storageLimitEnforcementEnabled
capabilityEnforcementEnabled
bannerMessages {
color
dismissible
id
kind
message
priority
}
defaultAndroidRecordingFormat
bucketUrl
}
}

View File

@@ -0,0 +1,15 @@
mutation blockContent($videoId: Int!) {
blockContent(videoId: $videoId)
}
mutation blockUser($userId: Int!) {
blockUser(userId: $userId)
}
mutation reportContent(
$videoId: Int!
$reason: ReportReasonEnum!
$customReason: String = null
) {
reportContent(videoId: $videoId, reason: $reason, customReason: $customReason)
}

View File

@@ -1,3 +1,4 @@
# DO NOT USE: use getVideoFeed instead
query GetFeed(
$limit: Int! = 5
$after: String = null
@@ -5,30 +6,7 @@ query GetFeed(
) {
getUserVideos(limit: $limit, after: $after, filters: $filters) {
videos {
id
owner {
username
}
name
screenshotUri
totalShotsMade
totalShots
makePercentage
createdAt
updatedAt
startTime
endTime
elapsedTime
screenshotUri
stream {
isCompleted
}
tags {
tagClasses {
name
}
name
}
...VideoCardFields
}
pageInfo {
hasNextPage
@@ -36,3 +14,142 @@ query GetFeed(
}
}
}
fragment UserSocialsFields on UserGQL {
id
username
profileImageUri
isFollowedByCurrentUser
}
fragment VideoCardFields on VideoGQL {
id
owner {
id
username
profileImageUri
}
name
screenshotUri
totalShots
makePercentage
averageTimeBetweenShots
averageDifficulty
startTime
private
elapsedTime
stream {
id
lastIntendedSegmentBound
uploadCompletionCursor
streamSegmentType
isCompleted
lastSegmentUploadedAt
clientUploadStatus
}
tableSize
pocketSize
tags {
name
tagClasses {
name
}
}
playerSummaries {
...PlayerSummaryFields
}
currentProcessing {
id
status
}
reactions {
videoId
user {
...UserSocialsFields
}
reaction
}
comments {
id
message
user {
...UserSocialsFields
}
replies {
id
message
user {
...UserSocialsFields
}
}
}
}
# Lightweight version of GetVideoFeed for counting sessions only
query GetVideoFeedSessionCount(
$limit: Int! = 100
$filters: VideoFilterInput = null
$includePrivate: IncludePrivateEnum = MINE
$feedInput: VideoFeedInputGQL = null
) {
getFeedVideos(
limit: $limit
filters: $filters
includePrivate: $includePrivate
feedInput: $feedInput
) {
videos {
id
totalShots
}
}
}
# Minimal query for the Home recency nudge ("you haven't recorded in N days").
# Only the most recent session's start time — avoids pulling the full
# VideoCardFields payload (reactions, comments, player summaries, etc.).
query GetLastSessionDate(
$filters: VideoFilterInput = null
$includePrivate: IncludePrivateEnum = MINE
$feedInput: VideoFeedInputGQL = null
) {
getFeedVideos(
limit: 1
filters: $filters
includePrivate: $includePrivate
feedInput: $feedInput
) {
videos {
id
startTime
}
}
}
query GetVideoFeed(
$limit: Int! = 5
$after: String = null
$filters: VideoFilterInput = null
$includeCallersVideos: Boolean = null
$includePrivate: IncludePrivateEnum = MINE
$feedInput: VideoFeedInputGQL = null
) {
getFeedVideos(
limit: $limit
after: $after
filters: $filters
includeCallersVideos: $includeCallersVideos
includePrivate: $includePrivate
feedInput: $feedInput
) {
videos {
...VideoCardFields
}
pageInfo {
hasNextPage
endCursor
}
hasFollowing
followingCount
}
}

View File

@@ -0,0 +1,118 @@
query GetMakesLeaderboard(
$interval: TimeInterval
$when: DateTime
$gameType: String
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getMakesLeaderboard(
interval: $interval
when: $when
gameType: $gameType
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
user {
id
username
profileImageUri
}
value
proportionMade
total
}
}
}
query GetRunsLeaderboard(
$interval: TimeInterval
$when: DateTime
$gameType: String
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getLongestRunsLeaderboard(
interval: $interval
when: $when
gameType: $gameType
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
id
runLength
video {
name
createdAt
}
user {
id
username
profileImageUri
}
}
}
}
query GetDrillRunLeaderboard(
$drillTag: String!
$interval: TimeInterval
$limit: Int = 50
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getDrillRunLeaderboard(
drillTag: $drillTag
interval: $interval
limit: $limit
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
id
runLength
videoId
video {
tableSize
pocketSize
createdAt
}
user {
id
username
profileImageUri
}
}
youRun {
id
runLength
videoId
}
youRank
totalPlayers
}
}
query GetMyDrillRuns($drillTag: String!, $limit: Int = 50) {
getMyDrillRuns(drillTag: $drillTag, limit: $limit) {
id
runLength
videoId
video {
createdAt
}
}
}

75
src/operations/medals.gql Normal file
View File

@@ -0,0 +1,75 @@
fragment MedalFields on MedalGQL {
count
nickname
}
query getMedals($scope: MedalScope!, $userId: Int) {
getMedals(scope: $scope, userId: $userId) {
distanceOver78 {
...MedalFields
}
distanceOver90 {
...MedalFields
}
runLength3 {
...MedalFields
}
runLength5 {
...MedalFields
}
runLength8 {
...MedalFields
}
runLength10 {
...MedalFields
}
runLength15 {
...MedalFields
}
runLength20 {
...MedalFields
}
runLength25 {
...MedalFields
}
runLength30 {
...MedalFields
}
runLength40 {
...MedalFields
}
runLength50 {
...MedalFields
}
totalMakes100 {
...MedalFields
}
totalMakes500 {
...MedalFields
}
totalMakes1000 {
...MedalFields
}
totalMakes5000 {
...MedalFields
}
totalMakes10000 {
...MedalFields
}
dailyMakes50 {
...MedalFields
}
dailyMakes100 {
...MedalFields
}
dailyMakes150 {
...MedalFields
}
dailyMakes200 {
...MedalFields
}
dailyMakes250 {
...MedalFields
}
}
}

View File

@@ -0,0 +1,63 @@
query GetNotifications(
$limit: Int! = 20
$offset: Int! = 0
$filters: NotificationFilters = null
) {
notifications(limit: $limit, offset: $offset, filters: $filters) {
notifications {
...Notification
}
totalCount
unreadCount
hasMore
}
}
query GetUnreadNotificationCount {
unreadNotificationCount
}
mutation MarkNotificationAsRead($notificationId: Int!) {
markNotificationAsRead(notificationId: $notificationId)
}
mutation MarkNotificationsAsRead($notificationIds: [Int!]!) {
markNotificationsAsRead(notificationIds: $notificationIds)
}
mutation MarkAllNotificationsAsRead {
markAllNotificationsAsRead
}
mutation DeleteNotification($notificationId: Int!) {
deleteNotification(notificationId: $notificationId)
}
fragment Notification on NotificationGQL {
id
notificationType
actor {
id
username
profileImageUri
}
videoId
challengeId
challenge {
id
name
}
comment {
id
message
user {
id
username
profileImageUri
}
}
reactionType
isRead
createdAt
readAt
}

162
src/operations/payments.gql Normal file
View File

@@ -0,0 +1,162 @@
mutation EnsureStripeCustomerExists {
ensureStripeCustomerExists {
id
firebaseUid
username
stripeCustomerId
profileImageUri
isAdmin
fargoRating
videosPrivateByDefault
createdAt
updatedAt
}
}
mutation CreateSubscription($priceId: String!) {
createSubscription(priceId: $priceId) {
checkoutUrl
sessionId
}
}
mutation CreateCustomerPortalSession {
createCustomerPortalSession {
portalUrl
}
}
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
trialPeriodDays
products {
id
name
description
active
prices {
id
currency
unitAmount
recurringInterval
recurringIntervalCount
type
active
}
}
appleIap {
enabled
proMonthlyProductId
productIds
}
tierOptions {
tierName
tierDisplayName
billingInterval
platform
isConfigured
isAvailable
stripeProductId
stripePriceId
appleProductId
currency
unitAmount
recurringIntervalCount
}
}
}
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}
query GetResolvedTier {
getResolvedTier {
tierName
tierDisplayName
hasActiveSubscription
entitlementSource
entitlementStatus
entitlementStartsAt
entitlementEndsAt
capabilities
}
}
query GetStorageStatus {
getStorageStatus {
userId
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
isUnlimited
policyConfigured
remainingStorageBytes
storageUsageRatio
isNearLimit
isOverLimit
usageCalculated
usageSource
lastCalculatedAt
}
}
query GetAppleAppAccountToken {
getAppleAppAccountToken
}
mutation SyncAppleSubscription($signedTransactionInfo: String!) {
syncAppleSubscription(
input: { signedTransactionInfo: $signedTransactionInfo }
) {
ok
errorCode
errorMessage
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
appleStatus
originalTransactionId
latestTransactionId
productId
expiresAt
}
}
mutation CancelSubscription {
cancelSubscription {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}
mutation SubmitCancellationFeedback(
$reasons: [CancellationReasonEnum!]
$feedback: String
$metadata: CancellationFeedbackMetadataInput
) {
submitCancellationFeedback(
reasons: $reasons
feedback: $feedback
metadata: $metadata
)
}

View File

@@ -0,0 +1,187 @@
fragment PoolHallFields on PoolHall {
id
name
address
city
state
latitude
longitude
timezone
status
createdAt
updatedAt
}
fragment PoolHallCameraFields on PoolHallCamera {
id
poolHallId
name
tableLabel
streamPath
status
tableSize
pocketSize
allowsPrivateVideos
claimTermsText
claimTermsVersion
inUse
lastPublishedAt
lastUnpublishedAt
createdAt
updatedAt
}
fragment PoolHallCameraWithHallFields on PoolHallCamera {
...PoolHallCameraFields
poolHall {
...PoolHallFields
}
}
fragment PoolHallCameraStreamCredentialsFields on PoolHallCameraStreamCredentials {
streamKey
rtmpPath
camera {
...PoolHallCameraWithHallFields
}
}
fragment CameraClaimSessionFields on CameraClaimSession {
id
cameraId
userId
challengeCode
status
expiresAt
detectedAt
failedAt
failureReason
agreedTermsVersion
createdAt
updatedAt
camera {
...PoolHallCameraWithHallFields
}
}
fragment CameraLeaseFields on CameraLease {
id
cameraId
claimSessionId
userId
videoId
status
startedAt
endedAt
expiresAt
endReason
createdAt
updatedAt
camera {
...PoolHallCameraWithHallFields
}
}
query GetPoolHalls {
poolHalls {
...PoolHallFields
}
}
query GetClaimablePoolHalls {
claimablePoolHalls {
...PoolHallFields
}
}
query GetPoolHallCameras($poolHallId: ID!) {
poolHallCameras(poolHallId: $poolHallId) {
...PoolHallCameraWithHallFields
}
}
query GetClaimableCameras($poolHallId: ID!) {
claimableCameras(poolHallId: $poolHallId) {
...PoolHallCameraWithHallFields
}
}
query GetCameraClaimSession($id: ID!) {
cameraClaimSession(id: $id) {
...CameraClaimSessionFields
}
}
query GetActiveCameraLease {
activeCameraLease {
...CameraLeaseFields
}
}
mutation CreatePoolHall($input: CreatePoolHallInput!) {
createPoolHall(input: $input) {
...PoolHallFields
}
}
mutation UpdatePoolHall($input: UpdatePoolHallInput!) {
updatePoolHall(input: $input) {
...PoolHallFields
}
}
mutation CreatePoolHallCamera($input: CreatePoolHallCameraInput!) {
createPoolHallCamera(input: $input) {
...PoolHallCameraStreamCredentialsFields
}
}
mutation UpdatePoolHallCamera($input: UpdatePoolHallCameraInput!) {
updatePoolHallCamera(input: $input) {
...PoolHallCameraWithHallFields
}
}
mutation RotatePoolHallCameraStreamKey($cameraId: ID!) {
rotatePoolHallCameraStreamKey(cameraId: $cameraId) {
...PoolHallCameraStreamCredentialsFields
}
}
mutation CreateCameraClaimSession(
$cameraId: ID!
$durationMinutes: Int
$videoName: String
$videoPrivate: Boolean
$agreedTermsVersion: Int
$tags: [VideoTagInput!]
) {
createCameraClaimSession(
cameraId: $cameraId
durationMinutes: $durationMinutes
videoName: $videoName
videoPrivate: $videoPrivate
agreedTermsVersion: $agreedTermsVersion
tags: $tags
) {
...CameraClaimSessionFields
}
}
mutation CancelCameraClaimSession($claimSessionId: ID!) {
cancelCameraClaimSession(claimSessionId: $claimSessionId) {
...CameraClaimSessionFields
}
}
mutation EndCameraLease($leaseId: ID!) {
endCameraLease(leaseId: $leaseId) {
...CameraLeaseFields
}
}
mutation ExtendCameraLease($leaseId: ID!, $additionalMinutes: Int! = 60) {
extendCameraLease(leaseId: $leaseId, additionalMinutes: $additionalMinutes) {
...CameraLeaseFields
}
}

View File

@@ -0,0 +1,3 @@
mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
reactToVideo(videoId: $videoId, reaction: $reaction)
}

View File

@@ -0,0 +1,69 @@
# Lightweight two-step picker data for Shot Lab's video-first source: recent
# videos (completed or still uploading — no completion gate, so an in-progress
# recording with no shots yet still appears), then that video's shots. The
# stream fields let the client hint at "actively updating" without gating.
query GetShotLabVideos($limit: Int! = 25) {
getFeedVideos(
limit: $limit
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
stream {
id
isCompleted
lastSegmentUploadedAt
}
}
}
}
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
getOrderedShots(
filterInput: { videoId: [$videoId] }
shotsOrdering: { orderings: [{ startFrame: { descending: false } }] }
limit: $limit
) {
shots {
id
videoId
startFrame
endFrame
serializedShotPaths {
b64EncodedBuffer
}
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
}
}
}

67
src/operations/runs.gql Normal file
View File

@@ -0,0 +1,67 @@
query GetRunsForHighlights(
$filterInput: RunFilterInput!
$runIds: [Int!] = null
$runsOrdering: GetRunsOrdering
$limit: Int! = 500
$countRespectsLimit: Boolean! = false
) {
getRuns(
filterInput: $filterInput
runIds: $runIds
runsOrdering: $runsOrdering
limit: $limit
countRespectsLimit: $countRespectsLimit
) {
count
runs {
id
runLength
userId
videoId
shots {
videoId
id
}
}
runIds
}
}
fragment PocketingIntentionFragment on PocketingIntentionFeaturesGQL {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
query GetRunsWithTimestamps(
$filterInput: RunFilterInput!
$runIds: [Int!] = null
$runsOrdering: GetRunsOrdering
) {
getRuns(
filterInput: $filterInput
runIds: $runIds
runsOrdering: $runsOrdering
) {
count
runs {
id
runLength
userId
videoId
shots {
videoId
id
createdAt
pocketingIntentionFeatures {
...PocketingIntentionFragment
}
}
}
runIds
}
}

View File

@@ -0,0 +1,51 @@
query GetSessionCoach($videoId: Int!) {
getSessionCoach(videoId: $videoId) {
videoId
processingId
analysisVersion
state
generatedAt
processingStatus
ineligibilityReason
summary
shotCount
madeCount
missedCount
unknownOutcomeCount
analyzedShotCount
makePercentage
primaryCandidate {
...SessionCoachCandidateFields
}
candidates {
...SessionCoachCandidateFields
}
}
}
fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
id
rank
family
kind
title
body
action
supportingShotIds
drillId
limitations
evidence {
bucketKey
bucketLabel
attemptCount
madeCount
missedCount
makePercentage
comparisonAttemptCount
comparisonMadeCount
comparisonMakePercentage
patternShotCount
score
rankReason
}
}

View File

@@ -0,0 +1,58 @@
fragment PlayerSummaryFields on PlayerSummaryGQL {
clusterId
userId
username
profileImageUri
representativeFullFrameUrl
totalShots
totalShotsMade
makePercentage
score
longestRun
runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty
averageTimeBetweenShots
}
fragment PlayerClusterShotFields on PlayerClusterShotGQL {
shotId
bboxX1
bboxY1
bboxX2
bboxY2
confidence
isConfirmed
cropUrl
fullFrameUrl
}
fragment PlayerClusterFields on PlayerClusterGQL {
videoId
clusterId
nShots
userId
username
profileImageUri
confirmed
score
shots {
...PlayerClusterShotFields
}
}
query VideoPlayerClusters($videoId: Int!) {
videoPlayerClusters(videoId: $videoId) {
...PlayerClusterFields
}
}
mutation FinalizePlayerAssignments($input: FinalizePlayerAssignmentsInput!) {
finalizePlayerAssignments(input: $input) {
...PlayerClusterFields
}
}

View File

@@ -0,0 +1,87 @@
query GetTableState(
$b64Image: String!
$tableSize: Float
$useHomography: HomographyInputGQL
) {
getTableState(
b64Image: $b64Image
tableSize: $tableSize
useHomography: $useHomography
) {
identifierToPosition
identifierToColor {
hex
}
}
}
query GetLiveTableState($videoId: Int!) {
getLiveTableState(videoId: $videoId) {
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
query GetShotTableState($shotId: Int!) {
getShotTableState(shotId: $shotId) {
shotId
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
query SimulateShot($simulationInput: SimulateShotInputGQL!) {
simulateShot(simulationInput: $simulationInput) {
trajectories {
ballId
points {
time
position
}
}
events {
eventType
time
ballIds
position
}
finalState {
ballId
position
}
pottedBallIds
}
}
query ComputePotAim(
$simulationInput: SimulateShotInputGQL!
$targetBallId: Int!
$pocket: PocketIdentifier!
) {
computePotAim(
simulationInput: $simulationInput
targetBallId: $targetBallId
pocket: $pocket
) {
phi
geometricPhi
cutAngle
requiredPrecision
feasible
potted
converged
occludingBallIds
}
}

View File

@@ -1,38 +1,11 @@
query GetShots(
$filterInput: FilterInput!
$includeCreatedAt: Boolean! = false
$includeUpdatedAt: Boolean! = false
$includeCueObjectFeatures: Boolean! = false
$includePocketingIntentionFeatures: Boolean! = false
$includeCueObjectDistance: Boolean! = false
$includeCueObjectAngle: Boolean! = false
$includeCueBallSpeed: Boolean! = false
$includeShotDirection: Boolean! = false
$includeTargetPocketDistance: Boolean! = false
$includeMake: Boolean! = false
$includeIntendedPocketType: Boolean! = false
) {
query GetSerializedShotPaths($filterInput: FilterInput!) {
getShots(filterInput: $filterInput) {
id
videoId
startFrame
endFrame
user {
id
}
createdAt @include(if: $includeCreatedAt)
updatedAt @include(if: $includeUpdatedAt)
cueObjectFeatures @include(if: $includeCueObjectFeatures) {
cueObjectDistance @include(if: $includeCueObjectDistance)
cueObjectAngle @include(if: $includeCueObjectAngle)
cueBallSpeed @include(if: $includeCueBallSpeed)
shotDirection @include(if: $includeShotDirection)
}
pocketingIntentionFeatures
@include(if: $includePocketingIntentionFeatures) {
targetPocketDistance @include(if: $includeTargetPocketDistance)
make @include(if: $includeMake)
intendedPocketType @include(if: $includeIntendedPocketType)
serializedShotPaths {
b64EncodedBuffer
}
}
}
@@ -43,3 +16,228 @@ query GetShotAnnotationTypes {
name
}
}
mutation UpdateShotAnnotations(
$shotId: Int!
$annotations: [UpdateAnnotationInputGQL!]!
) {
updateShotAnnotations(shotId: $shotId, annotations: $annotations) {
shot {
id
annotations {
shotId
type {
id
name
}
notes
}
}
error {
shotId
msg
}
}
}
## Should be deprecated
query GetShotsWithVideoGql(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
) {
shots {
id
videoId
video {
screenshotUri
endTime
}
}
}
}
query GetShotsWithJustIds(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
$countRespectsLimit: Boolean
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
countRespectsLimit: $countRespectsLimit
) {
count
shots {
id
videoId
}
}
}
## Reserved for playlists (which are created from a filter)
query GetShotsWithMetadataFilterResult(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
$ids: [Int!]
$countRespectsLimit: Boolean
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
ids: $ids
countRespectsLimit: $countRespectsLimit
) {
count
shots {
...ShotWithAllFeatures
}
ids
}
}
# TODO: Delete
query GetShotsWithMetadata(
$filterInput: FilterInput!
$shotsPagination: GetShotsPagination
$limit: Int
$ids: [Int!]
) {
getShotsWithMetadata(
filterInput: $filterInput
shotsPagination: $shotsPagination
limit: $limit
ids: $ids
) {
count
shots {
...ShotWithAllFeatures
}
ids
}
}
query GetShotsByIds($ids: [Int!]!) {
getShotsByIds(ids: $ids) {
...ShotWithAllFeatures
}
}
# Lightweight clip boundaries for condensed session playback. The inline
# session player only needs each shot's frame/time window to seek between
# shots — this skips the heavy ShotWithAllFeatures payload (cue/pocketing
# features, serialized shot paths, annotations, nested video/playlist). The
# startTime/endTime @client resolvers derive their values from the frame
# fields + the video (looked up internally), so this is all they require.
fragment ShotClipRange on ShotGQL {
id
videoId
startFrame
endFrame
startTime @client
endTime @client
}
query GetShotClipRanges(
$filterInput: FilterInput!
$shotsOrdering: GetShotsOrdering
$limit: Int
) {
getOrderedShots(
filterInput: $filterInput
shotsOrdering: $shotsOrdering
limit: $limit
) {
count
shots {
...ShotClipRange
}
}
}
fragment ShotWithAllFeatures on ShotGQL {
id
videoId
startFrame
endFrame
startTime @client
endTime @client
startSegment @client {
index
time
}
endSegment @client {
index
time
}
user {
id
}
falsePositiveScore
createdAt
updatedAt
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
serializedShotPaths {
b64EncodedBuffer
}
annotations {
shotId
type {
id
name
}
notes
}
video {
id
stream {
id
streamSegmentType
}
playlist {
videoId
segmentDurations
}
}
}
mutation EditShot($shotId: Int!, $fieldsToEdit: EditableShotFieldInputGQL!) {
editShot(shotId: $shotId, fieldsToEdit: $fieldsToEdit) {
error {
shotId
msg
}
shot {
...ShotWithAllFeatures
}
}
}

7
src/operations/tags.gql Normal file
View File

@@ -0,0 +1,7 @@
mutation RetireTags($tagIds: [Int!]!) {
retireTags(tagIds: $tagIds)
}
mutation DeleteTags($videoId: Int!, $tagsToDelete: [VideoTagInput!]!) {
deleteTags(videoId: $videoId, tagsToDelete: $tagsToDelete)
}

View File

@@ -0,0 +1,45 @@
query getUsageStats($days: Int! = 30) {
getUsageStats(days: $days) {
funnel {
freemiumEpoch
eraSignups
eraPaying
activationCohort
activationActivated
payingUsers
newPaid7d
newPaid30d
retentionPrevActive
retentionReturned
}
cohorts {
weekStart
signups
activated7d
paid7d
activatedNotPaid7d
}
totalUsers
totalVideos
totalShots
totalRuns
windows {
label
newUsers
activeUsers
sessions
shots
}
daily {
day
newUsers
activeUsers
sessions
shots
}
processingLast24h {
status
count
}
}
}

View File

@@ -1,43 +1,87 @@
mutation getProfileImageUploadLink($fileExt: String = ".png") {
getProfileImageUploadLink(fileExt: $fileExt) {
uploadUrl
headers {
key
value
value {
... on UploadLink {
uploadUrl
headers {
key
value
}
}
... on GetProfileUploadLinkErrors {
error {
... on TooManyProfileImageUploadsErr {
linksRequested
}
}
}
}
}
}
mutation editProfileImageUri($profileImageUri: String!) {
editProfileImageUri(profileImageUri: $profileImageUri) {
id
firebaseUid
username
profileImageUri
createdAt
updatedAt
...UserFragment
}
}
query getLoggedInUser {
getLoggedInUser {
id
firebaseUid
username
isAdmin
profileImageUri
activeVideoId
createdAt
updatedAt
...UserFragment
}
}
query GetUserPlayTime($userId: Int!) {
getPlayTime(userId: $userId) {
query GetUser($userId: Int!) {
getUser(userId: $userId) {
...UserFragment
following {
id
}
followers {
id
}
}
}
query GetUserPlayTime($userId: Int!, $filters: VideoFilterInput) {
getPlayTime(userId: $userId, filters: $filters) {
totalSeconds
}
}
query GetUploadQuotaStatus {
getQuotaStatus {
tierName
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
maxVideoDurationSeconds
durationRemainingSeconds
canUpload
importQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
recordingQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
}
}
query getUsernames(
$matchString: String!
$limit: Int = null
@@ -45,3 +89,141 @@ query getUsernames(
) {
getUsernames(matchString: $matchString, limit: $limit, after: $after)
}
query getUserRelationshipsMatching(
$userId: Int!
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUserRelationshipsMatching(
userId: $userId
matchString: $matchString
limit: $limit
after: $after
) {
relationships {
toUser {
username
profileImageUri
id
}
toUserFollows
toUserIsFollowedBy
}
}
}
query GetUserTags {
getUserTags {
id
name
tagClasses {
id
name
}
}
}
query GetGameTypeTagMetrics($input: GameTypeTagMetricsInput!) {
getGameTypeTagMetrics(input: $input) {
tagName
tagLabel
tableSize
shotCount
madeShots
makeRate
}
}
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
id
username
}
}
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
id
username
}
}
query getUserFollowingFollowers {
getLoggedInUser {
id
following {
id
username
profileImageUri
isFollowedByCurrentUser
}
followers {
id
username
profileImageUri
isFollowedByCurrentUser
}
}
}
query doesUsernameExist($candidateUsername: String!) {
doesUsernameExist(candidateUsername: $candidateUsername)
}
mutation editUser(
$username: String
$fargoRating: Int
$videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean
$bio: String
) {
editUser(
input: {
username: $username
fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing
bio: $bio
}
) {
id
firebaseUid
username
fargoRating
updatedAt
videosPrivateByDefault
agreesToMarketing
bio
}
}
mutation deleteUser {
deleteUser
}
fragment UserFragment on UserGQL {
id
firebaseUid
username
isAdmin
profileImageUri
bio
fargoRating
activeVideoId
createdAt
updatedAt
videosPrivateByDefault
agreesToMarketing
}
query GetUsersMatching(
$matchString: String = null
$limit: Int = null
$after: String = null
) {
getUsersMatching(matchString: $matchString, limit: $limit, after: $after) {
...UserFragment
}
}

View File

@@ -1,51 +1,16 @@
query GetStreamMonitoringDetails($videoId: Int!) {
getVideo(videoId: $videoId) {
query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
getVideo(videoId: $videoId, debuggingJson: $debuggingJson) {
id
totalShots
makePercentage
elapsedTime
homographyHistory {
crop {
left
top
width
height
}
pockets {
left
top
width
height
}
sourcePoints {
topLeft {
x
y
}
topSide {
x
y
}
topRight {
x
y
}
bottomLeft {
x
y
}
bottomSide {
x
y
}
bottomRight {
x
y
}
}
currentHomography {
...HomographyInfo
}
stream {
id
linksRequested
lowestUnuploadedSegmentIndex
uploadsCompleted
segmentProcessingCursor
isCompleted
@@ -54,6 +19,7 @@ query GetStreamMonitoringDetails($videoId: Int!) {
initPlaylistUploadStatus
}
currentProcessing {
id
errors {
message
startSegmentIndex
@@ -70,6 +36,9 @@ query GetVideoUpdatePageDetails($videoId: Int!) {
totalShots
makePercentage
elapsedTime
tableSize
pocketSize
private
tags {
tagClasses {
name
@@ -93,11 +62,15 @@ query GetVideoDetails($videoId: Int!) {
endTime
makePercentage
medianRun
averageDifficulty
startTime
totalShots
totalShotsMade
createdAt
updatedAt
tableSize
pocketSize
private
owner {
id
firebaseUid
@@ -110,26 +83,100 @@ query GetVideoDetails($videoId: Int!) {
}
name
}
playerSummaries {
...PlayerSummaryFields
}
}
}
fragment UserSocialsFields on UserGQL {
id
username
profileImageUri
isFollowedByCurrentUser
}
query GetVideoSocialDetailsById($videoId: Int!) {
getVideo(videoId: $videoId) {
id
name
screenshotUri
makePercentage
totalShots
owner {
id
firebaseUid
username
profileImageUri
}
tags {
tagClasses {
name
}
name
}
reactions {
videoId
user {
...UserSocialsFields
}
reaction
}
comments {
id
message
user {
...UserSocialsFields
}
replies {
id
message
user {
...UserSocialsFields
}
}
}
}
}
# Full card payload for a single video — reuses the same VideoCardFields
# fragment the feed list uses, so the session-detail meta header shares one
# source of truth (and the normalized Apollo cache) with the feed card.
query GetVideoCard($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoCardFields
}
}
query GetVideos($videoIds: [Int!]!) {
getVideos(videoIds: $videoIds) {
...VideoStreamMetadata
}
}
fragment VideoStreamMetadata on VideoGQL {
id
framesPerSecond
stream {
id
playlist {
segmentDurations
}
stream {
id
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
streamSegmentType
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
}
playlist {
segmentDurations
}
}
query GetVideoForShotTime($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoStreamMetadata
}
}
query GetVideo($videoId: Int!) {
@@ -138,12 +185,21 @@ query GetVideo($videoId: Int!) {
playlist {
segmentDurations
}
homographyHistory {
...HomographyInfo
}
stream {
id
streamSegmentType
segments {
segmentIndex
endFrameIndex
framesPerSecond
}
resolution {
width
height
}
}
}
}
@@ -154,15 +210,148 @@ query GetAverageTimePerShotForVideo($videoId: Int!) {
averageTimeBetweenShots
}
}
query GetElapsedTimeForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
elapsedTime
}
}
query GetMedianRunForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
medianRun
}
}
query GetAverageDifficultyForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageDifficulty
}
}
fragment StreamWithEndFrames on UploadStreamGQL {
id
streamSegmentType
segmentEndFrames @client
resolution {
width
height
}
segments {
uploaded
valid
segmentIndex
endFrameIndex
framesPerSecond
}
}
fragment SegmentEndFrames on SegmentEndFramesGQL {
id
segmentEndFrames
}
fragment SegmentStartTimes on SegmentStartTimesGQL {
id
segmentStartTimes
}
fragment PlaylistWithSegmentStartTimes on HLSPlaylistGQL {
videoId
segmentDurations
segmentStartTimes @client
}
fragment VideoDurationData on VideoGQL {
id
framesPerSecond
playlist {
...PlaylistWithSegmentStartTimes
}
stream {
...StreamWithEndFrames
}
}
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {
...VideoDurationData
}
}
query GetHeaderInfoByVideoId($videoId: Int!) {
getVideo(videoId: $videoId) {
id
name
startTime
}
}
query GetBannerInfoByVideoId($videoId: Int!) {
getVideo(videoId: $videoId) {
id
name
stream {
id
lastIntendedSegmentBound
}
owner {
id
}
currentProcessing {
id
status
}
}
}
mutation FindPrerecordTableLayout($b64Image: String!, $videoId: Int!) {
findPrerecordTableLayout(b64Image: $b64Image, videoId: $videoId) {
...HomographyInfo
}
}
fragment HomographyInfo on HomographyInfoGQL {
id
frameIndex
crop {
left
top
width
height
}
pockets {
left
top
width
height
}
sourcePoints {
topLeft {
x
y
}
topSide {
x
y
}
topRight {
x
y
}
bottomLeft {
x
y
}
bottomSide {
x
y
}
bottomRight {
x
y
}
}
}

View File

@@ -0,0 +1,36 @@
fragment VideoExportJobFields on VideoExportJobGQL {
id
videoId
mode
status
videoName
videoThumbnailUri
shotIds
runId
downloadUrl
fileSizeBytes
expiresAt
createdAt
}
mutation RequestVideoExport($input: RequestVideoExportInput!) {
requestVideoExport(input: $input) {
...VideoExportJobFields
}
}
mutation DismissVideoExport($jobId: Int!) {
dismissVideoExport(jobId: $jobId)
}
query VideoExportJob($jobId: Int!) {
videoExportJob(jobId: $jobId) {
...VideoExportJobFields
}
}
query MyVideoExports($limit: Int = 30, $offset: Int = 0) {
myVideoExports(limit: $limit, offset: $offset) {
...VideoExportJobFields
}
}

View File

@@ -1,25 +1,88 @@
mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
createUploadStream(videoMetadata: $videoMetadataInput) {
mutation CreateUploadStream(
$videoMetadataInput: VideoMetadataInput!
$expectedDurationSeconds: Float = null
) {
createUploadStream(
videoMetadata: $videoMetadataInput
expectedDurationSeconds: $expectedDurationSeconds
) {
videoId
}
}
mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) {
uploadUrl
headers {
key
value
value {
... on UploadLink {
uploadUrl
headers {
key
value
}
}
... on GetUploadLinkErrors {
error {
... on MustHaveSetForUploadLinkErr {
resolution
framesPerSecond
}
... on SegmentAlreadyUploadedErr {
segmentId
}
... on ProcessingFailedErr {
processing {
status
errors {
message
}
}
}
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
}
}
}
stream {
uploadCompletionCursor
}
}
}
mutation GetHlsInitUploadLink($videoId: Int!) {
getHlsInitUploadLink(videoId: $videoId) {
uploadUrl
headers {
key
value
value {
... on UploadLink {
uploadUrl
headers {
key
value
}
}
... on GetUploadLinkErrors {
error {
... on NoInitForChunkedUploadErr {
segmentType
}
... on InitUploadAlreadyCompletedErr {
segmentType
}
... on TooManyInitUploadsErr {
linksRequested
}
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
}
}
}
}
}
@@ -58,6 +121,19 @@ query GetUploadStreams(
}
}
}
fragment UploadStreamWithDetails on VideoGQL {
id
name
startTime
stream {
isCompleted
lastIntendedSegmentBound
uploadCompletionCursor
uploadsCompleted
}
}
query GetUploadStreamsWithDetails(
$limit: Int! = 5
$after: String = null
@@ -65,14 +141,7 @@ query GetUploadStreamsWithDetails(
) {
getUserVideos(limit: $limit, after: $after, filters: $filters) {
videos {
id
name
startTime
stream {
isCompleted
lastIntendedSegmentBound
uploadCompletionCursor
}
...UploadStreamWithDetails
}
pageInfo {
hasNextPage

File diff suppressed because it is too large Load Diff

View File

@@ -10,10 +10,10 @@
"@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9"
"@apollo/client@^3.9.2":
version "3.9.2"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.9.2.tgz#96edf2c212f828bad1ef3d84234fa473c5a27ff8"
integrity sha512-Zw9WvXjqhpbgkvAvnj52vstOWwM0iedKWtn1hSq1cODQyoe1CF2uFwMYFI7l56BrAY9CzLi6MQA0AhxpgJgvxw==
"@apollo/client@^3.11.10":
version "3.12.3"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.12.3.tgz#0d252749baad8328e06883fe118dc7e73e3bbb1f"
integrity sha512-KZ5zymRdb8bMbGUb1wP2U04ff7qIGgaC1BCdCVC+IPFiXkxEhHBc5fDEQOwAUT+vUo9KbBh3g7QK/JCOswn59w==
dependencies:
"@graphql-typed-document-node/core" "^3.1.1"
"@wry/caches" "^1.0.0"
@@ -23,7 +23,7 @@
hoist-non-react-statics "^3.3.2"
optimism "^0.18.0"
prop-types "^15.7.2"
rehackt "0.0.3"
rehackt "^0.1.0"
response-iterator "^0.2.6"
symbol-observable "^4.0.0"
ts-invariant "^0.10.3"
@@ -603,6 +603,18 @@
lodash "~4.17.0"
tslib "~2.5.0"
"@graphql-codegen/plugin-helpers@^6.0.0":
version "6.0.0"
resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-6.0.0.tgz#8a913c82a95b9ff36b2180f7c56611cc56268625"
integrity sha512-Z7P89vViJvQakRyMbq/JF2iPLruRFOwOB6IXsuSvV/BptuuEd7fsGPuEf8bdjjDxUY0pJZnFN8oC7jIQ8p9GKA==
dependencies:
"@graphql-tools/utils" "^10.0.0"
change-case-all "1.0.15"
common-tags "1.8.2"
import-from "4.0.0"
lodash "~4.17.0"
tslib "~2.6.0"
"@graphql-codegen/schema-ast@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.0.tgz#5d60996c87b64f81847da8fcb2d8ef50ede89755"
@@ -612,16 +624,25 @@
"@graphql-tools/utils" "^10.0.0"
tslib "~2.5.0"
"@graphql-codegen/typescript-operations@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.0.1.tgz#930af3e2d2ae8ff06de696291be28fe7046a2fef"
integrity sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw==
"@graphql-codegen/schema-ast@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-5.0.0.tgz#9708d7484a01bb3a502685126708d7b139fd0721"
integrity sha512-jn7Q3PKQc0FxXjbpo9trxzlz/GSFQWxL042l0iC8iSbM/Ar+M7uyBwMtXPsev/3Razk+osQyreghIz0d2+6F7Q==
dependencies:
"@graphql-codegen/plugin-helpers" "^5.0.0"
"@graphql-codegen/typescript" "^4.0.1"
"@graphql-codegen/visitor-plugin-common" "4.0.1"
"@graphql-codegen/plugin-helpers" "^6.0.0"
"@graphql-tools/utils" "^10.0.0"
tslib "~2.6.0"
"@graphql-codegen/typescript-operations@^5.0.4":
version "5.0.4"
resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-5.0.4.tgz#052680d41f4bab3bb85af8e906c43bde29239e7b"
integrity sha512-5Bu/BTmyNjdSfSLLBKjC0+4XWcY01uotVcnVIWIxxRdIHoRxnTW6PUkT5CoPHP5r/Uoo3OvIJxh+0LYSH5suwA==
dependencies:
"@graphql-codegen/plugin-helpers" "^6.0.0"
"@graphql-codegen/typescript" "^5.0.4"
"@graphql-codegen/visitor-plugin-common" "6.1.2"
auto-bind "~4.0.0"
tslib "~2.5.0"
tslib "~2.6.0"
"@graphql-codegen/typescript-react-apollo@^4.2.0":
version "4.2.0"
@@ -645,6 +666,17 @@
auto-bind "~4.0.0"
tslib "~2.5.0"
"@graphql-codegen/typescript@^5.0.4":
version "5.0.4"
resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-5.0.4.tgz#a7f51505445568fd737b01ce7fad515c2b89897f"
integrity sha512-q6S8hX+aR4BzeGgolac4gp22rBnXbLhedmOwT1UBT9e3lGNmNpYC7WJUEzAPjWf6z1lRSNmojLlwEjTnffhKNA==
dependencies:
"@graphql-codegen/plugin-helpers" "^6.0.0"
"@graphql-codegen/schema-ast" "^5.0.0"
"@graphql-codegen/visitor-plugin-common" "6.1.2"
auto-bind "~4.0.0"
tslib "~2.6.0"
"@graphql-codegen/visitor-plugin-common@2.13.1":
version "2.13.1"
resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz#2228660f6692bcdb96b1f6d91a0661624266b76b"
@@ -677,6 +709,22 @@
parse-filepath "^1.0.2"
tslib "~2.5.0"
"@graphql-codegen/visitor-plugin-common@6.1.2":
version "6.1.2"
resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-6.1.2.tgz#e614d6606402a152686d6f90e6363150a7a55bde"
integrity sha512-zYdrhJKgk8kqE1Xz5/m/Ua42zk+rIvYB/FHh3dE1AhZ6b1IDqgKjF3LnkT+K2qenf9EfT4yNjXd5CEKMeXfHyg==
dependencies:
"@graphql-codegen/plugin-helpers" "^6.0.0"
"@graphql-tools/optimize" "^2.0.0"
"@graphql-tools/relay-operation-optimizer" "^7.0.0"
"@graphql-tools/utils" "^10.0.0"
auto-bind "~4.0.0"
change-case-all "1.0.15"
dependency-graph "^1.0.0"
graphql-tag "^2.11.0"
parse-filepath "^1.0.2"
tslib "~2.6.0"
"@graphql-tools/apollo-engine-loader@^8.0.0":
version "8.0.0"
resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489"
@@ -1649,6 +1697,11 @@ dependency-graph@^0.11.0:
resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27"
integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==
dependency-graph@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-1.0.0.tgz#bb5e85aec1310bc13b22dbd76e3196c4ee4c10d2"
integrity sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==
detect-indent@^6.0.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
@@ -2633,10 +2686,10 @@ regenerator-runtime@^0.14.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
rehackt@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.0.3.tgz#1ea454620d4641db8342e2db44595cf0e7ac6aa0"
integrity sha512-aBRHudKhOWwsTvCbSoinzq+Lej/7R8e8UoPvLZo5HirZIIBLGAgdG7SL9QpdcBoQ7+3QYPi3lRLknAzXBlhZ7g==
rehackt@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b"
integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==
relay-runtime@12.0.0:
version "12.0.0"