Compare commits
	
		
			336 Commits
		
	
	
		
			993f62b6cf
			...
			kat/delete
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 99f8968a36 | |||
| 76a98aa0c3 | |||
| f5177a877c | |||
| 6685849cc2 | |||
| 567cbc549c | |||
| 2b43493a4f | |||
| 358eee2e16 | |||
| a1d3d776aa | |||
| 82af3a3ce9 | |||
| 7b51c317ca | |||
| 04f1bb4d74 | |||
| fbd7c2020b | |||
| c0636a8863 | |||
| 7302d6b8b6 | |||
| 492178455c | |||
| 55a2edb042 | |||
| 31cf492889 | |||
| de7dc675a1 | |||
| f8f00d9c24 | |||
| dc207bce55 | |||
| 2e5b8d2563 | |||
| 46bcd08ae1 | |||
| bd383b1d55 | |||
| 2459cb78f8 | |||
| 8859ad8951 | |||
| bdc3961e46 | |||
| 7c8c932a78 | |||
| ae746ccac0 | |||
| 98266c7775 | |||
|  | 4918720ae3 | ||
| 8463ebf0e7 | |||
| 753179ca58 | |||
| 9ee5c721c1 | |||
| 00cca10cb3 | |||
| ad704cad75 | |||
| e2743abb59 | |||
| e109e89a40 | |||
| 67bad20d24 | |||
| 0160455b9f | |||
| 170ff70b7a | |||
| 8df09b8c93 | |||
| 644ea66e98 | |||
| 0a5097c5c0 | |||
| f4445f7ecb | |||
| b18fedae8e | |||
| 31baa2b096 | |||
| 85cd37f70f | |||
| b53aa172fa | |||
| df2e534745 | |||
|  | ea4980947f | ||
| 65475bca9b | |||
| 280f5a66bd | |||
| 84daf2d136 | |||
| 6558fb60e9 | |||
| 6462a6a464 | |||
| 41a5bb7609 | |||
| b8aaabea8b | |||
| 2745521664 | |||
| 8efa2e067c | |||
| 919fe5ba24 | |||
| 7ff60dc9c5 | |||
| 7e0d8a84ee | |||
| 9f26b5aa0f | |||
| 70303b9363 | |||
| 9ee1422d3e | |||
| 7a9d2545c4 | |||
| c561ea20ab | |||
| 7ce0c058b7 | |||
| c399edd882 | |||
| 32d8cb0d41 | |||
| 9d912ed21e | |||
| 0bcfd32b14 | |||
| 9b27d288da | |||
| b0f94f5ea8 | |||
| de653ba54c | |||
| 2657628a54 | |||
| cd20cfcb40 | |||
| 2657a9baf7 | |||
| 9bb4b7c513 | |||
| a5050ed08d | |||
| b9e26243e9 | |||
| 021cd35278 | |||
| 8dda81236a | |||
| c7ff615fe4 | |||
| 365cbb5f70 | |||
| 194d0dcd22 | |||
| 8fcaa1397a | |||
| e8e318b919 | |||
| ff0a11ea0d | |||
| 84192d1387 | |||
| f1ae2b62d6 | |||
| 4f78cd94ab | |||
| bfdda67d1a | |||
| 881350619a | |||
| 8bc67f75b0 | |||
| df8495df77 | |||
| 0c45855f7d | |||
| a2e659dfcb | |||
| 2a36a392ce | |||
| 145c2f9558 | |||
| 3f2e5d331f | |||
| bf8e851139 | |||
| eb15f4f3b8 | |||
| 82ff8546d4 | |||
| 284334606d | |||
| a883bc3e2f | |||
| b50ea5b573 | |||
| de17659dbb | |||
| 33886b4e9e | |||
| 9d0ba908dc | |||
| 7b4880a990 | |||
| 8ed177b0f3 | |||
| 976cc66ccb | |||
| af461fff00 | |||
| 7a39b4ca60 | |||
| 9befbe3833 | |||
| 68a4c064f3 | |||
| 54fd741670 | |||
| 2f9e630de4 | |||
| 5efd8ef8e5 | |||
| 6ad3d449d8 | |||
| 8fe20d1c41 | |||
| e151f39582 | |||
| f136ddb9ca | |||
| 5d05614e07 | |||
| c4c3ccde00 | |||
| e137ce8ad1 | |||
| bd5bebb747 | |||
| 034facebf3 | |||
| ac1fceb648 | |||
| fd87ade629 | |||
| 1fab007654 | |||
| cd2cdb475a | |||
| c3c74379fb | |||
| da21627f15 | |||
| 8fabfd67cf | |||
| e6960038f2 | |||
| b6ec7ed39d | |||
| 545ba638c2 | |||
| 94e4e55558 | |||
| 2536f5db6b | |||
| ffd0814a98 | |||
| 55bfe42484 | |||
| dabb0d1d9c | |||
| a538c1d81c | |||
| 872bce3adb | |||
| 457d375bed | |||
| 12798e368c | |||
| a3d6e6e19e | |||
| f7a6e393e7 | |||
| ee11e506ed | |||
| 90ec47848b | |||
| 21acb5219d | |||
| 087d511efc | |||
| 7cc0dca821 | |||
| f826121aa3 | |||
| 2aadb8b49b | |||
| 5468b7ccda | |||
| 08dfafe1a3 | |||
| 36b6804719 | |||
| 0120c15064 | |||
| 9cc99d956a | |||
| 985fa8b8e5 | |||
| c4868e7ebe | |||
| 58e1c18034 | |||
| 592dea0ca2 | |||
| 0e00ae9297 | |||
| e16812f242 | |||
| 3e9b7a0d16 | |||
| 309deb9473 | |||
| d5ba9c2ba5 | |||
| 73771a263a | |||
| 655e59c43c | |||
| 056120a68a | |||
| bd7ffa7fdb | |||
| ec58923c65 | |||
| 63869cd7ca | |||
| 08ae9611cf | |||
| 4e610b7df2 | |||
| 2d6d3964ad | |||
| 73a58de36e | |||
| dc6f246489 | |||
| c0a3aa97dc | |||
| f4e43b24f2 | |||
| 51ab8320d7 | |||
| f9a00ad3eb | |||
| 998b2ffc8c | |||
| c7642e6204 | |||
| b2ce1c2f96 | |||
| d0cf071934 | |||
| 6b410b3d78 | |||
| 607504261c | |||
| 0421be855d | |||
| 014aab473b | |||
| 353872401e | |||
| 433dfdaf74 | |||
| a2d9e688e9 | |||
| b3259dac1f | |||
| 0982b9e60c | |||
| 1710ae451c | |||
| de9e7dea6a | |||
| cfcf1dbcd2 | |||
| 05e3182e8b | |||
| baf139aab5 | |||
| b3b454ef83 | |||
| f6e4a1bc0b | |||
| 9d8155527d | |||
| 8690e81029 | |||
| 4ef13a482a | |||
| 9db95c4e6c | |||
| 249807c935 | |||
| eec79b2dc5 | |||
| 464c013095 | |||
| e2f4995cad | |||
| a43b286e39 | |||
| 148f5362f0 | |||
| 4d01e9814d | |||
| b9e3e1f310 | |||
| b0da48c4fb | |||
| 1e53dc21ee | |||
| 5c5014339f | |||
| 84188a6066 | |||
| 7c7be319d1 | |||
| 79784faba1 | |||
| f3ea44755c | |||
| 9b6559559c | |||
| 2398216bf2 | |||
| d942b91d17 | |||
| 24d9b9225e | |||
| f6f6404302 | |||
| 4609af726b | |||
| c5919c90d0 | |||
| 605adc3293 | |||
| b40554d38d | |||
| 194d7c66a0 | |||
| 3adc301935 | |||
| 9232c673e8 | |||
| c2cb411469 | |||
| 44ddc732a1 | |||
| d6ef3e0487 | |||
| 8c191bdb90 | |||
| 8246699915 | |||
| de9d47c289 | |||
| 39b1808cab | |||
| a78f9e7b9d | |||
| f573026853 | |||
| f98c98ecdd | |||
| 3f6314aab7 | |||
| 3051c155e2 | |||
| e686be5acd | |||
| d49f9b213a | |||
| 8f346d7832 | |||
| 163c6a4e0c | |||
| b9036001aa | |||
| b16b36588f | |||
| efaaeeaad1 | |||
| 5d93f7166e | |||
| 72ac956758 | |||
| 5cb7df174b | |||
| d15dae23c1 | |||
| c98a65bb6f | |||
| e701c79469 | |||
| 18cd3efe80 | |||
| d71974d385 | |||
| 0defdf0892 | |||
| 8d1f79b8a8 | |||
| 9dc426ea0f | |||
| 19a63b9d19 | |||
| ae97f956b3 | |||
| d619751144 | |||
| e431a1751f | |||
| 209f0aa019 | |||
| 70015a942c | |||
| 91cfcb28e7 | |||
| b2a09c1b8c | |||
| 59aaf47cbe | |||
| c426e753cd | |||
| c8cf97421b | |||
| 9718137ad3 | |||
| af1fb3fee7 | |||
| 025baf257a | |||
| 8239ab6e1b | |||
| 1f018f954e | |||
| fd78ddf641 | |||
| 7662f1f050 | |||
| 890bea2571 | |||
| f57f6dc32d | |||
| 14863e3357 | |||
|  | 58f01c567c | ||
| 937368c753 | |||
| d8c11875d4 | |||
| bacd9e77f0 | |||
| 69d755ba32 | |||
| 31fb95e3b0 | |||
| 7d0f9870dd | |||
| 4a493b4e8d | |||
| 341dc819a0 | |||
| b58aecf7a5 | |||
| 301c017d5e | |||
| 1a4b676635 | |||
| ce54bef0b4 | |||
| 2699d29d7b | |||
| 63a07d58ca | |||
| 59fe332fe0 | |||
| 33723f4ea2 | |||
| c0ee55069e | |||
| 492ae4a225 | |||
| dcdb324391 | |||
| 90685cfdbf | |||
| ab61894373 | |||
| 662e0ade64 | |||
| 75aa847ae1 | |||
| c013228f79 | |||
| 740daf95ae | |||
| 768d29f93e | |||
| 837e084a5a | |||
| caea1b9572 | |||
| 0a255f161a | |||
| 85a2da4b5c | |||
| 647ef3049b | |||
| 7b48a5b6e2 | |||
| ec2e3da513 | |||
| 72729e410b | |||
| 5a9205a9b8 | |||
| a33601158f | |||
| 3c6b37b567 | |||
| 9b18ada78d | |||
| d57bb607e4 | |||
| 1f88ee4a0c | |||
| a32317e72f | |||
| b60cbe3854 | |||
| e0b150aa2a | |||
| 2bdfcb994e | |||
| d5c6014548 | |||
| de6fcacfd0 | |||
| aabd74d7d7 | 
| @@ -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: | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|   "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", | ||||
|   | ||||
| @@ -7,7 +7,7 @@ readme = "README.md" | ||||
| packages = [{include = "rbproto"}] | ||||
|  | ||||
| [tool.poetry.dependencies] | ||||
| python = ">=3.10,<3.12" | ||||
| python = ">=3.10,<=3.13" | ||||
| protobuf = "^4.25.3" | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -13,13 +13,15 @@ _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\"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\"\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) | ||||
| if _descriptor._USE_C_DESCRIPTORS == False: | ||||
|   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 | ||||
| @@ -32,10 +34,16 @@ if _descriptor._USE_C_DESCRIPTORS == False: | ||||
|   _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 | ||||
|   _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['_IDENTIFIERHISTORY']._serialized_start=1082 | ||||
|   _globals['_IDENTIFIERHISTORY']._serialized_end=1164 | ||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167 | ||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411 | ||||
|   _globals['_SHOT']._serialized_start=1414 | ||||
|   _globals['_SHOT']._serialized_end=1582 | ||||
| # @@protoc_insertion_point(module_scope) | ||||
|   | ||||
| @@ -55,21 +55,46 @@ class DetectionHistory(_message.Message): | ||||
|     detections: _containers.RepeatedCompositeFieldContainer[BallDetection] | ||||
|     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 IdentifierHistory(_message.Message): | ||||
|     __slots__ = ["ball_identifier", "paths"] | ||||
| @@ -79,8 +104,32 @@ class IdentifierHistory(_message.Message): | ||||
|     paths: _containers.RepeatedCompositeFieldContainer[Path] | ||||
|     def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _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: ... | ||||
|   | ||||
| @@ -25,12 +25,16 @@ message RLEBallDetection { | ||||
|   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 { | ||||
| @@ -42,13 +46,32 @@ message Path { | ||||
|     bool not_present = 5; | ||||
|   } | ||||
|   bool is_static = 6; | ||||
|   CollisionInfo start_info = 7; | ||||
|   CollisionInfo end_info = 8; | ||||
| } | ||||
|  | ||||
| message IdentifierHistory { | ||||
|   uint32 ball_identifier = 1; | ||||
|   repeated Path paths = 2; | ||||
| } | ||||
| 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; | ||||
| } | ||||
|   | ||||
| @@ -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,22 @@ 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); | ||||
|     } | ||||
| @@ -631,8 +815,165 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory { | ||||
|   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); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return message; | ||||
| } | ||||
|  | ||||
| export interface Shot { | ||||
|   identifier_histories?: IdentifierHistory[]; | ||||
|   key_balls?: KeyBallIdentifiers; | ||||
|   start_index?: number; | ||||
|   end_index?: number; | ||||
| } | ||||
|  | ||||
| export function encodeShot(message: Shot): Uint8Array { | ||||
| @@ -654,6 +995,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 +1046,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
									
								
							
							
						
						
									
										32
									
								
								src/client-schema.gql
									
									
									
									
									
										Normal 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!]! | ||||
| } | ||||
							
								
								
									
										6296
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										6296
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										19
									
								
								src/operations/comments.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/operations/comments.gql
									
									
									
									
									
										Normal 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) | ||||
| } | ||||
| @@ -5,5 +5,13 @@ query getDeployedConfig { | ||||
|     environment | ||||
|     firebase | ||||
|     minimumAllowedAppVersion | ||||
|     bannerMessages { | ||||
|       color | ||||
|       dismissible | ||||
|       id | ||||
|       kind | ||||
|       message | ||||
|       priority | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| # DO NOT USE: use getVideoFeed instead | ||||
| query GetFeed( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
| @@ -5,23 +6,52 @@ query GetFeed( | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       ...VideoCardFields | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment UserSocialsFields on UserGQL { | ||||
|   id | ||||
|   username | ||||
|   profileImageUri | ||||
|   followers { | ||||
|     id | ||||
|     username | ||||
|     profileImageUri | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment VideoCardFields on VideoGQL { | ||||
|   id | ||||
|   owner { | ||||
|     id | ||||
|     username | ||||
|     profileImageUri | ||||
|   } | ||||
|   name | ||||
|   screenshotUri | ||||
|   totalShotsMade | ||||
|   totalShots | ||||
|   makePercentage | ||||
|   averageTimeBetweenShots | ||||
|   averageDifficulty | ||||
|   createdAt | ||||
|   updatedAt | ||||
|   startTime | ||||
|   endTime | ||||
|   private | ||||
|   elapsedTime | ||||
|   screenshotUri | ||||
|   stream { | ||||
|     id | ||||
|     lastIntendedSegmentBound | ||||
|     isCompleted | ||||
|     streamSegmentType | ||||
|   } | ||||
|   tableSize | ||||
|   tags { | ||||
| @@ -30,6 +60,57 @@ query GetFeed( | ||||
|     } | ||||
|     name | ||||
|   } | ||||
|   currentProcessing { | ||||
|     id | ||||
|     errors { | ||||
|       message | ||||
|     } | ||||
|     status | ||||
|     statuses { | ||||
|       status | ||||
|     } | ||||
|   } | ||||
|   reactions { | ||||
|     videoId | ||||
|     user { | ||||
|       ...UserSocialsFields | ||||
|     } | ||||
|     reaction | ||||
|   } | ||||
|   comments { | ||||
|     id | ||||
|     message | ||||
|     user { | ||||
|       ...UserSocialsFields | ||||
|     } | ||||
|     replies { | ||||
|       id | ||||
|       message | ||||
|       user { | ||||
|         ...UserSocialsFields | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										32
									
								
								src/operations/leaderboards.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/operations/leaderboards.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| query GetMakesLeaderboard($interval: TimeInterval, $when: DateTime) { | ||||
|   getMakesLeaderboard(interval: $interval, when: $when) { | ||||
|     entries { | ||||
|       user { | ||||
|         id | ||||
|         username | ||||
|         profileImageUri | ||||
|       } | ||||
|       value | ||||
|       proportionMade | ||||
|       total | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetRunsLeaderboard($interval: TimeInterval, $when: DateTime) { | ||||
|   getLongestRunsLeaderboard(interval: $interval, when: $when) { | ||||
|     entries { | ||||
|       id | ||||
|       runLength | ||||
|       video { | ||||
|         name | ||||
|         createdAt | ||||
|       } | ||||
|       user { | ||||
|         id | ||||
|         username | ||||
|         profileImageUri | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										75
									
								
								src/operations/medals.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/operations/medals.gql
									
									
									
									
									
										Normal 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 | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										14
									
								
								src/operations/payments.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/operations/payments.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| mutation EnsureStripeCustomerExists { | ||||
|   ensureStripeCustomerExists { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     stripeCustomerId | ||||
|     profileImageUri | ||||
|     isAdmin | ||||
|     fargoRating | ||||
|     videosPrivateByDefault | ||||
|     createdAt | ||||
|     updatedAt | ||||
|   } | ||||
| } | ||||
							
								
								
									
										3
									
								
								src/operations/reactions.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/operations/reactions.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) { | ||||
|   reactToVideo(videoId: $videoId, reaction: $reaction) | ||||
| } | ||||
							
								
								
									
										67
									
								
								src/operations/runs.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/operations/runs.gql
									
									
									
									
									
										Normal 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 | ||||
|   } | ||||
| } | ||||
| @@ -1,59 +1,3 @@ | ||||
| query GetShots( | ||||
|   $filterInput: FilterInput! | ||||
|   $shotsPagination: GetShotsPagination | ||||
|   $limit: Int | ||||
|   $includeCreatedAt: Boolean! = false | ||||
|   $includeUpdatedAt: Boolean! = false | ||||
|   $includeCueObjectFeatures: Boolean! = false | ||||
|   $includePocketingIntentionFeatures: Boolean! = false | ||||
|   $includeCueObjectDistance: Boolean! = false | ||||
|   $includeCueObjectAngle: Boolean! = false | ||||
|   $includeCueBallSpeed: Boolean! = false | ||||
|   $includeSpinType: Boolean! = false | ||||
|   $includeShotDirection: Boolean! = false | ||||
|   $includeTargetPocketDistance: Boolean! = false | ||||
|   $includeMake: Boolean! = false | ||||
|   $includeIntendedPocketType: Boolean! = false | ||||
| ) { | ||||
|   getShots( | ||||
|     filterInput: $filterInput | ||||
|     shotsPagination: $shotsPagination | ||||
|     limit: $limit | ||||
|   ) { | ||||
|     id | ||||
|     videoId | ||||
|     startFrame | ||||
|     endFrame | ||||
|     user { | ||||
|       id | ||||
|     } | ||||
|     falsePositiveScore | ||||
|     video { | ||||
|       stream { | ||||
|         resolution { | ||||
|           width | ||||
|           height | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     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) | ||||
|       spinType @include(if: $includeSpinType) | ||||
|     } | ||||
|     pocketingIntentionFeatures | ||||
|       @include(if: $includePocketingIntentionFeatures) { | ||||
|       targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||
|       make @include(if: $includeMake) | ||||
|       intendedPocketType @include(if: $includeIntendedPocketType) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetSerializedShotPaths($filterInput: FilterInput!) { | ||||
|   getShots(filterInput: $filterInput) { | ||||
|     id | ||||
| @@ -73,61 +17,191 @@ query GetShotAnnotationTypes { | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetShotsWithMetadata( | ||||
|   $filterInput: FilterInput! | ||||
|   $shotsPagination: GetShotsPagination | ||||
|   $limit: Int | ||||
|   $includeCreatedAt: Boolean! = false | ||||
|   $includeUpdatedAt: Boolean! = false | ||||
|   $includeCueObjectFeatures: Boolean! = false | ||||
|   $includePocketingIntentionFeatures: Boolean! = false | ||||
|   $includeCueObjectDistance: Boolean! = false | ||||
|   $includeCueObjectAngle: Boolean! = false | ||||
|   $includeCueBallSpeed: Boolean! = false | ||||
|   $includeSpinType: Boolean! = false | ||||
|   $includeShotDirection: Boolean! = false | ||||
|   $includeTargetPocketDistance: Boolean! = false | ||||
|   $includeMake: Boolean! = false | ||||
|   $includeIntendedPocketType: Boolean! = false | ||||
| mutation UpdateShotAnnotations( | ||||
|   $shotId: Int! | ||||
|   $annotations: [UpdateAnnotationInputGQL!]! | ||||
| ) { | ||||
|   getShotsWithMetadata( | ||||
|   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 | ||||
|     shotsPagination: $shotsPagination | ||||
|     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 | ||||
|   } | ||||
| } | ||||
|  | ||||
| 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 { | ||||
|           resolution { | ||||
|             width | ||||
|             height | ||||
|       id | ||||
|       streamSegmentType | ||||
|     } | ||||
|   } | ||||
| } | ||||
|       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) | ||||
|         spinType @include(if: $includeSpinType) | ||||
|       } | ||||
|       pocketingIntentionFeatures | ||||
|         @include(if: $includePocketingIntentionFeatures) { | ||||
|         targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||
|         make @include(if: $includeMake) | ||||
|         intendedPocketType @include(if: $includeIntendedPocketType) | ||||
|  | ||||
| mutation EditShot($shotId: Int!, $fieldsToEdit: EditableShotFieldInputGQL!) { | ||||
|   editShot(shotId: $shotId, fieldsToEdit: $fieldsToEdit) { | ||||
|     error { | ||||
|       shotId | ||||
|       msg | ||||
|     } | ||||
|     shot { | ||||
|       ...ShotWithAllFeatures | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										7
									
								
								src/operations/tags.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/operations/tags.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| mutation RetireTags($tagIds: [Int!]!) { | ||||
|   retireTags(tagIds: $tagIds) | ||||
| } | ||||
|  | ||||
| mutation DeleteTags($videoId: Int!, $tagsToDelete: [VideoTagInput!]!) { | ||||
|   deleteTags(videoId: $videoId, tagsToDelete: $tagsToDelete) | ||||
| } | ||||
| @@ -21,30 +21,24 @@ mutation getProfileImageUploadLink($fileExt: String = ".png") { | ||||
|  | ||||
| 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 | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetUserPlayTime($userId: Int!, $filters: VideoFilterInput) { | ||||
|   getPlayTime(userId: $userId, filters: $filters) { | ||||
|     totalSeconds | ||||
|   } | ||||
| } | ||||
| @@ -56,3 +50,122 @@ 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 | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation followUser($followedUserId: Int!) { | ||||
|   followUser(followedUserId: $followedUserId) { | ||||
|     username | ||||
|     id | ||||
|     following { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation unfollowUser($followedUserId: Int!) { | ||||
|   unfollowUser(followedUserId: $followedUserId) { | ||||
|     username | ||||
|     id | ||||
|     following { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getUserFollowingFollowers { | ||||
|   getLoggedInUser { | ||||
|     id | ||||
|     following { | ||||
|       id | ||||
|       username | ||||
|       profileImageUri | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|       username | ||||
|       profileImageUri | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query doesUsernameExist($candidateUsername: String!) { | ||||
|   doesUsernameExist(candidateUsername: $candidateUsername) | ||||
| } | ||||
|  | ||||
| mutation editUser( | ||||
|   $username: String | ||||
|   $fargoRating: Int | ||||
|   $videosPrivateByDefault: Boolean | ||||
| ) { | ||||
|   editUser( | ||||
|     input: { | ||||
|       username: $username | ||||
|       fargoRating: $fargoRating | ||||
|       videosPrivateByDefault: $videosPrivateByDefault | ||||
|     } | ||||
|   ) { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     fargoRating | ||||
|     updatedAt | ||||
|     videosPrivateByDefault | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment UserFragment on UserGQL { | ||||
|   id | ||||
|   firebaseUid | ||||
|   username | ||||
|   isAdmin | ||||
|   profileImageUri | ||||
|   fargoRating | ||||
|   activeVideoId | ||||
|   createdAt | ||||
|   updatedAt | ||||
|   videosPrivateByDefault | ||||
| } | ||||
|   | ||||
| @@ -4,47 +4,11 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | ||||
|     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 | ||||
|       uploadsCompleted | ||||
|       segmentProcessingCursor | ||||
| @@ -54,6 +18,7 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | ||||
|       initPlaylistUploadStatus | ||||
|     } | ||||
|     currentProcessing { | ||||
|       id | ||||
|       errors { | ||||
|         message | ||||
|         startSegmentIndex | ||||
| @@ -71,6 +36,7 @@ query GetVideoUpdatePageDetails($videoId: Int!) { | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|     tableSize | ||||
|     private | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
| @@ -100,6 +66,7 @@ query GetVideoDetails($videoId: Int!) { | ||||
|     createdAt | ||||
|     updatedAt | ||||
|     tableSize | ||||
|     private | ||||
|     owner { | ||||
|       id | ||||
|       firebaseUid | ||||
| @@ -115,8 +82,64 @@ query GetVideoDetails($videoId: Int!) { | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment UserSocialsFields on UserGQL { | ||||
|   id | ||||
|   username | ||||
|   profileImageUri | ||||
|   followers { | ||||
|     id | ||||
|     username | ||||
|     profileImageUri | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoSocialDetailsById($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     owner { | ||||
|       id | ||||
|       firebaseUid | ||||
|       username | ||||
|       profileImageUri | ||||
|     } | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
|       } | ||||
|       name | ||||
|     } | ||||
|     reactions { | ||||
|       videoId | ||||
|       user { | ||||
|         ...UserSocialsFields | ||||
|       } | ||||
|       reaction | ||||
|     } | ||||
|     comments { | ||||
|       id | ||||
|       message | ||||
|       user { | ||||
|         ...UserSocialsFields | ||||
|       } | ||||
|       replies { | ||||
|         id | ||||
|         message | ||||
|         user { | ||||
|           ...UserSocialsFields | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideos($videoIds: [Int!]!) { | ||||
|   getVideos(videoIds: $videoIds) { | ||||
|     ...VideoStreamMetadata | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment VideoStreamMetadata on VideoGQL { | ||||
|   id | ||||
|   framesPerSecond | ||||
|   stream { | ||||
| @@ -134,6 +157,11 @@ query GetVideos($videoIds: [Int!]!) { | ||||
|     segmentDurations | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoForShotTime($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     ...VideoStreamMetadata | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideo($videoId: Int!) { | ||||
| @@ -143,6 +171,128 @@ query GetVideo($videoId: Int!) { | ||||
|       segmentDurations | ||||
|     } | ||||
|     homographyHistory { | ||||
|       ...HomographyInfo | ||||
|     } | ||||
|     stream { | ||||
|       id | ||||
|       streamSegmentType | ||||
|       segments { | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         framesPerSecond | ||||
|       } | ||||
|       resolution { | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetAverageTimePerShotForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     averageTimeBetweenShots | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetElapsedTimeForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     elapsedTime | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetMedianRunForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     medianRun | ||||
|   } | ||||
| } | ||||
|  | ||||
| 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 | ||||
| @@ -183,57 +333,3 @@ query GetVideo($videoId: Int!) { | ||||
|     } | ||||
|   } | ||||
| } | ||||
|     stream { | ||||
|       streamSegmentType | ||||
|       segments { | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         framesPerSecond | ||||
|       } | ||||
|       resolution { | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetAverageTimePerShotForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     averageTimeBetweenShots | ||||
|   } | ||||
| } | ||||
| query GetElapsedTimeForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     elapsedTime | ||||
|   } | ||||
| } | ||||
| query GetMedianRunForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     medianRun | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoForClipTimes($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     framesPerSecond | ||||
|     playlist { | ||||
|       segmentDurations | ||||
|     } | ||||
|     stream { | ||||
|       id | ||||
|       streamSegmentType | ||||
|       segments { | ||||
|         uploaded | ||||
|         valid | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         framesPerSecond | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -101,13 +101,8 @@ query GetUploadStreams( | ||||
|     } | ||||
|   } | ||||
| } | ||||
| query GetUploadStreamsWithDetails( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|  | ||||
| fragment UploadStreamWithDetails on VideoGQL { | ||||
|   id | ||||
|   name | ||||
|   startTime | ||||
| @@ -118,6 +113,16 @@ query GetUploadStreamsWithDetails( | ||||
|     uploadsCompleted | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetUploadStreamsWithDetails( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       ...UploadStreamWithDetails | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|   | ||||
							
								
								
									
										659
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										659
									
								
								src/schema.gql
									
									
									
									
									
								
							| @@ -5,36 +5,91 @@ type Query { | ||||
|   getBucketSet(keyName: String!): BucketSetGQL | ||||
|   getDeployedConfig: DeployedConfigGQL! | ||||
|   waitFor(duration: Float!): Float! | ||||
|   getFeedVideos( | ||||
|     limit: Int! = 5 | ||||
|     after: String = null | ||||
|     includePrivate: IncludePrivateEnum! = MINE | ||||
|     includeCallersVideos: Boolean = true | ||||
|     filters: VideoFilterInput = null | ||||
|     feedInput: VideoFeedInputGQL = null | ||||
|   ): VideoHistoryGQL! | ||||
|   getVideoMakePercentageIntervals( | ||||
|     videoId: ID! | ||||
|     intervalDuration: Int! = 300 | ||||
|   ): [MakePercentageIntervalGQL!]! | ||||
|   getLongestRunsLeaderboard( | ||||
|     interval: TimeInterval = null | ||||
|     when: DateTime = null | ||||
|     limit: Int! = 100 | ||||
|     requiredTags: [String!] = null | ||||
|   ): RunLeaderboardGQL! | ||||
|   getMakesLeaderboard( | ||||
|     interval: TimeInterval = null | ||||
|     when: DateTime = null | ||||
|   ): CountLeaderboardGQL! | ||||
|   getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL! | ||||
|   getRuns( | ||||
|     filterInput: RunFilterInput! | ||||
|     runIds: [Int!] = null | ||||
|     runsOrdering: GetRunsOrdering = null | ||||
|     limit: Int! = 500 | ||||
|     countRespectsLimit: Boolean! = false | ||||
|   ): GetRunsResult! | ||||
|   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! | ||||
|   getTableState( | ||||
|     b64Image: String! | ||||
|     tableSize: Float = 100 | ||||
|     useHomography: HomographyInputGQL = null | ||||
|   ): TableStateGQL! | ||||
|   getOrderedShots( | ||||
|     filterInput: FilterInput! | ||||
|     ids: [Int!] = null | ||||
|     shotsOrdering: GetShotsOrdering = null | ||||
|     limit: Int! = 500 | ||||
|     countRespectsLimit: Boolean! = false | ||||
|   ): GetShotsResult! | ||||
|   getShotsWithMetadata( | ||||
|     filterInput: FilterInput! | ||||
|     ids: [Int!] = null | ||||
|     shotsPagination: GetShotsPagination = null | ||||
|     limit: Int! = 500 | ||||
|     countRespectsLimit: Boolean! = false | ||||
|   ): GetShotsResult! | ||||
|   getShots( | ||||
|     filterInput: FilterInput! | ||||
|     shotsPagination: GetShotsPagination = null | ||||
|     limit: Int! = 500 | ||||
|     countRespectsLimit: Boolean! = false | ||||
|   ): [ShotGQL!]! | ||||
|   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! | ||||
|   getShotsByIds(ids: [Int!]!): [ShotGQL!]! | ||||
|   getUser(userId: Int!): UserGQL | ||||
|   doesUsernameExist(candidateUsername: String!): Boolean! | ||||
|   getLoggedInUser: UserGQL | ||||
|   getUsernames( | ||||
|     matchString: String = null | ||||
|     limit: Int = null | ||||
|     after: String = null | ||||
|   ): [String!]! | ||||
|   getPlayTime(userId: Int!): UserPlayTimeGQL! | ||||
|   getUsersMatching( | ||||
|     matchString: String = null | ||||
|     limit: Int = null | ||||
|     after: String = null | ||||
|   ): [UserGQL!]! | ||||
|   getUserRelationshipsMatching( | ||||
|     userId: Int! | ||||
|     matchString: String = null | ||||
|     limit: Int = 100 | ||||
|     after: String = null | ||||
|   ): UserRelationshipsResult! | ||||
|   getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL! | ||||
|   getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL! | ||||
|   getUserVideos( | ||||
|     userId: Int = null | ||||
|     limit: Int! = 5 | ||||
|     after: String = null | ||||
|     filters: VideoFilterInput = null | ||||
|   ): VideoHistoryGQL! | ||||
|   getUserTags: [TagGQL!]! | ||||
|   getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]! | ||||
|   getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL! | ||||
|   getVideos(videoIds: [Int!]!): [VideoGQL!]! | ||||
| } | ||||
| @@ -53,6 +108,21 @@ type TargetMetricsGQL { | ||||
|   count: Int! | ||||
|   makePercentage: Float | ||||
|   averageDifficulty: Float | ||||
|   spinTypeCounts: SpinTypeCountsGQL | ||||
|   shotDirectionCounts: ShotDirectionCountsGQL | ||||
| } | ||||
|  | ||||
| type SpinTypeCountsGQL { | ||||
|   follow: Int! | ||||
|   draw: Int! | ||||
|   center: Int! | ||||
|   unknown: Int! | ||||
| } | ||||
|  | ||||
| type ShotDirectionCountsGQL { | ||||
|   left: Int! | ||||
|   right: Int! | ||||
|   straight: Int! | ||||
| } | ||||
|  | ||||
| input AggregateInputGQL { | ||||
| @@ -63,6 +133,7 @@ input AggregateInputGQL { | ||||
| input AggregationInput @oneOf { | ||||
|   bucketSet: BucketSetInputGQL | ||||
|   enum: EnumAggregation | ||||
|   datetimeRange: DatetimeRangeAggregationInput | ||||
| } | ||||
|  | ||||
| input BucketSetInputGQL { | ||||
| @@ -79,19 +150,53 @@ input EnumAggregation { | ||||
|   feature: String! | ||||
| } | ||||
|  | ||||
| input DatetimeRangeAggregationInput { | ||||
|   startDatetime: DateTime = null | ||||
|   endDatetime: DateTime = null | ||||
|   interval: TimeInterval! | ||||
|   feature: String! = "created_at" | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date with time (isoformat) | ||||
| """ | ||||
| scalar DateTime | ||||
|  | ||||
| input TimeInterval @oneOf { | ||||
|   timedelta: TimeDeltaGQL | ||||
|   aligned: AlignedIntervalEnum | ||||
| } | ||||
|  | ||||
| input TimeDeltaGQL { | ||||
|   days: Int = 0 | ||||
|   weeks: Int = 0 | ||||
|   months: Int = 0 | ||||
|   years: Int = 0 | ||||
| } | ||||
|  | ||||
| enum AlignedIntervalEnum { | ||||
|   MONTH | ||||
|   YEAR | ||||
|   WEEK | ||||
|   DAY | ||||
| } | ||||
|  | ||||
| input FilterInput @oneOf { | ||||
|   andFilters: [FilterInput!] | ||||
|   orFilters: [FilterInput!] | ||||
|   notFilter: FilterInput | ||||
|   cueObjectDistance: RangeFilter | ||||
|   targetPocketDistance: RangeFilter | ||||
|   cueObjectAngle: RangeFilter | ||||
|   cueBallSpeed: RangeFilter | ||||
|   difficulty: RangeFilter | ||||
|   cueObjectDistance: FloatRangeFilter | ||||
|   targetPocketDistance: FloatRangeFilter | ||||
|   cueObjectAngle: FloatRangeFilter | ||||
|   cueBallSpeed: FloatRangeFilter | ||||
|   difficulty: FloatRangeFilter | ||||
|   intendedPocketType: [PocketEnum!] | ||||
|   shotDirection: [ShotDirectionEnum!] | ||||
|   videoId: [Int!] | ||||
|   userId: [Int!] | ||||
|   runId: [Int!] | ||||
|   username: [String!] | ||||
|   fargoRating: FloatRangeFilter | ||||
|   make: [Boolean!] | ||||
|   tags: [VideoTagInput!] | ||||
|   annotations: [ShotAnnotationInput!] | ||||
| @@ -101,18 +206,27 @@ input FilterInput @oneOf { | ||||
|   isLeftMiss: [Boolean!] | ||||
|   isRightMiss: [Boolean!] | ||||
|   isDirect: [Boolean!] | ||||
|   tableSize: RangeFilter | ||||
|   bankAngle: RangeFilter | ||||
|   bankDistance: RangeFilter | ||||
|   kickAngle: RangeFilter | ||||
|   kickDistance: RangeFilter | ||||
|   cueAngleAfterObject: RangeFilter | ||||
|   isBreakHeuristic: [Boolean!] | ||||
|   tableSize: FloatRangeFilter | ||||
|   bankAngle: FloatRangeFilter | ||||
|   bankDistance: FloatRangeFilter | ||||
|   kickAngle: FloatRangeFilter | ||||
|   kickDistance: FloatRangeFilter | ||||
|   cueAngleAfterObject: FloatRangeFilter | ||||
|   spinType: [SpinTypeEnum!] | ||||
|   cueSpeedAfterObject: RangeFilter | ||||
|   falsePositiveScore: RangeFilter | ||||
|   cueSpeedAfterObject: FloatRangeFilter | ||||
|   falsePositiveScore: FloatRangeFilter | ||||
|   backcut: [Boolean!] | ||||
|   targetPocketAngleDirection: [ShotDirectionEnum!] | ||||
|   targetPocketAngle: FloatRangeFilter | ||||
|   missAngleInDegrees: FloatRangeFilter | ||||
|   marginOfErrorInDegrees: FloatRangeFilter | ||||
|   createdAt: DateRangeFilter | ||||
|   totalDistance: FloatRangeFilter | ||||
|   runLength: FloatRangeFilter | ||||
| } | ||||
|  | ||||
| input RangeFilter { | ||||
| input FloatRangeFilter { | ||||
|   lessThan: Float = null | ||||
|   greaterThanEqualTo: Float = null | ||||
|   greaterThan: Float = null | ||||
| @@ -152,6 +266,20 @@ enum SpinTypeEnum { | ||||
|   UNKNOWN | ||||
| } | ||||
|  | ||||
| input DateRangeFilter { | ||||
|   lessThan: Date = null | ||||
|   greaterThanEqualTo: Date = null | ||||
|   greaterThan: Date = null | ||||
|   includeOnNone: Boolean! = false | ||||
|   lessThanInclusive: Boolean! = false | ||||
|   greaterThanInclusive: Boolean! = true | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date (isoformat) | ||||
| """ | ||||
| scalar Date | ||||
|  | ||||
| type BucketSetGQL { | ||||
|   keyName: String! | ||||
|   feature: String! | ||||
| @@ -169,16 +297,73 @@ type DeployedConfigGQL { | ||||
|   devMode: Boolean! | ||||
|   environment: String! | ||||
|   minimumAllowedAppVersion: String! | ||||
|   bannerMessages: [BannerGQL!]! | ||||
| } | ||||
|  | ||||
| type MakePercentageIntervalGQL { | ||||
| type BannerGQL { | ||||
|   id: Int! | ||||
|   message: String! | ||||
|   color: String! | ||||
|   kind: BannerKindEnum! | ||||
|   dismissible: Boolean! | ||||
|   priority: Int! | ||||
| } | ||||
|  | ||||
| enum BannerKindEnum { | ||||
|   INFO | ||||
|   WARNING | ||||
|   ERROR | ||||
| } | ||||
|  | ||||
| type VideoHistoryGQL { | ||||
|   videos: [VideoGQL!]! | ||||
|   pageInfo: PageInfoGQL! | ||||
| } | ||||
|  | ||||
| type VideoGQL { | ||||
|   id: Int! | ||||
|   owner: UserGQL | ||||
|   name: String | ||||
|   screenshotUri: String | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Float! | ||||
|   elapsedTime: Float! | ||||
|   medianRun: Float | ||||
|   averageTimeBetweenShots: Float | ||||
|   averageDifficulty: Float | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime | ||||
|   endTime: DateTime | ||||
|   elapsedTime: Float | ||||
|   framesPerSecond: Float! | ||||
|   tableSize: Float! | ||||
|   private: Boolean! | ||||
|   stream: UploadStreamGQL | ||||
|   playlist: HLSPlaylistGQL | ||||
|   tags: [VideoTag!]! | ||||
|   currentHomography: HomographyInfoGQL | ||||
|   homographyHistory: [HomographyInfoGQL!]! | ||||
|   currentProcessing: VideoProcessingGQL | ||||
|   reactions: [ReactionGQL!]! | ||||
|   comments: [CommentGQL!]! | ||||
| } | ||||
|  | ||||
| type GetShotsResult { | ||||
|   shots: [ShotGQL!]! | ||||
|   count: Int | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   firebaseUid: String | ||||
|   username: String! | ||||
|   isAdmin: Boolean | ||||
|   fargoRating: Int | ||||
|   activeVideoId: Int | ||||
|   stripeCustomerId: String | ||||
|   profileImageUri: String | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   videosPrivateByDefault: Boolean | ||||
|   following: [UserGQL!] | ||||
|   followers: [UserGQL!] | ||||
| } | ||||
|  | ||||
| type ShotGQL { | ||||
| @@ -190,19 +375,17 @@ type ShotGQL { | ||||
|   updatedAt: DateTime | ||||
|   cueObjectFeatures: CueObjectFeaturesGQL | ||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||
|   pocketingIntentionInfo: PocketingIntentionInfoGQL | ||||
|   bankFeatures: BankFeaturesGQL | ||||
|   serializedShotPaths: SerializedShotPathsGQL | ||||
|   user: UserGQL | ||||
|   annotations: [ShotAnnotationGQL!]! | ||||
|   falsePositiveScore: Float | ||||
|   video: VideoGQL | ||||
|   run: RunGQL | ||||
|   runFeatures: RunFeaturesGQL | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date with time (isoformat) | ||||
| """ | ||||
| scalar DateTime | ||||
|  | ||||
| type CueObjectFeaturesGQL { | ||||
|   cueObjectDistance: Float | ||||
|   cueObjectAngle: Float | ||||
| @@ -216,6 +399,25 @@ type PocketingIntentionFeaturesGQL { | ||||
|   make: Boolean | ||||
|   intendedPocketType: PocketEnum | ||||
|   difficulty: Float | ||||
|   targetPocketAngle: Float | ||||
|   targetPocketAngleDirection: ShotDirectionEnum | ||||
|   marginOfErrorInDegrees: Float | ||||
|   backcut: Boolean | ||||
| } | ||||
|  | ||||
| type PocketingIntentionInfoGQL { | ||||
|   ballId: Int! | ||||
|   pocketId: PocketIdentifier! | ||||
|   pathMetadataIndex: Int! | ||||
| } | ||||
|  | ||||
| enum PocketIdentifier { | ||||
|   TOP_LEFT | ||||
|   TOP_SIDE | ||||
|   TOP_RIGHT | ||||
|   BOTTOM_LEFT | ||||
|   BOTTOM_SIDE | ||||
|   BOTTOM_RIGHT | ||||
| } | ||||
|  | ||||
| type BankFeaturesGQL { | ||||
| @@ -233,17 +435,6 @@ type SerializedShotPathsGQL { | ||||
|   b64EncodedBuffer: String | ||||
| } | ||||
|  | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   firebaseUid: String! | ||||
|   username: String! | ||||
|   isAdmin: Boolean! | ||||
|   activeVideoId: Int | ||||
|   profileImageUri: String | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| type ShotAnnotationGQL { | ||||
|   shotId: Int! | ||||
|   type: ShotAnnotationTypeGQL! | ||||
| @@ -259,30 +450,19 @@ type ShotAnnotationTypeGQL { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| type VideoGQL { | ||||
| type RunGQL { | ||||
|   id: Int! | ||||
|   owner: UserGQL | ||||
|   name: String | ||||
|   screenshotUri: String | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Float! | ||||
|   medianRun: Float | ||||
|   averageTimeBetweenShots: Float | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   runLength: Int! | ||||
|   videoId: Int! | ||||
|   userId: Int! | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime | ||||
|   endTime: DateTime | ||||
|   elapsedTime: Float | ||||
|   framesPerSecond: Float! | ||||
|   tableSize: Float! | ||||
|   stream: UploadStreamGQL | ||||
|   playlist: HLSPlaylistGQL | ||||
|   tags: [VideoTag!]! | ||||
|   currentHomography: HomographyInfoGQL | ||||
|   homographyHistory: [HomographyInfoGQL!]! | ||||
|   currentProcessing: VideoProcessingGQL | ||||
|   video: VideoGQL! | ||||
|   user: UserGQL! | ||||
| } | ||||
|  | ||||
| type RunFeaturesGQL { | ||||
|   runId: Int! | ||||
|   indexInRun: Int! | ||||
| } | ||||
|  | ||||
| type UploadStreamGQL { | ||||
| @@ -299,6 +479,7 @@ type UploadStreamGQL { | ||||
|   createdAt: DateTime! | ||||
|   updatedAt: DateTime! | ||||
|   segments: [UploadSegmentGQL!]! | ||||
|   clientUploadStatus: ClientUploadStatusEnum | ||||
|   resolution: VideoResolutionGQL! | ||||
|   streamSegmentType: StreamSegmentTypeEnum! | ||||
| } | ||||
| @@ -323,6 +504,11 @@ type UploadSegmentGQL { | ||||
|   linksRequested: Int! | ||||
| } | ||||
|  | ||||
| enum ClientUploadStatusEnum { | ||||
|   UPLOAD_ENABLED | ||||
|   UPLOAD_DISABLED | ||||
| } | ||||
|  | ||||
| type VideoResolutionGQL { | ||||
|   width: Int | ||||
|   height: Int | ||||
| @@ -349,6 +535,7 @@ type VideoTagClass { | ||||
| } | ||||
|  | ||||
| type HomographyInfoGQL { | ||||
|   id: Int! | ||||
|   frameIndex: Int! | ||||
|   crop: BoundingBoxGQL! | ||||
|   pockets: [BoundingBoxGQL!]! | ||||
| @@ -378,9 +565,13 @@ type IntPoint2D { | ||||
| } | ||||
|  | ||||
| type VideoProcessingGQL { | ||||
|   id: Int! | ||||
|   errors: [VideoProcessingErrorGQL!]! | ||||
|   status: ProcessingStatusEnum! | ||||
|   statuses: [VideoProcessingStatusGQL!]! | ||||
|   framesProcessed: Int | ||||
|   currentSegment: Int | ||||
|   progressPercentage: Float | ||||
| } | ||||
|  | ||||
| type VideoProcessingErrorGQL { | ||||
| @@ -408,6 +599,213 @@ type VideoProcessingStatusGQL { | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| type ReactionGQL { | ||||
|   videoId: Int! | ||||
|   user: UserGQL! | ||||
|   reaction: ReactionEnum! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| enum ReactionEnum { | ||||
|   LIKE | ||||
|   HEART | ||||
|   BULLSEYE | ||||
|   HUNDRED | ||||
| } | ||||
|  | ||||
| type CommentGQL { | ||||
|   id: Int! | ||||
|   user: UserGQL! | ||||
|   message: String! | ||||
|   replies: [CommentGQL!]! | ||||
| } | ||||
|  | ||||
| type PageInfoGQL { | ||||
|   hasNextPage: Boolean! | ||||
|   endCursor: String | ||||
| } | ||||
|  | ||||
| enum IncludePrivateEnum { | ||||
|   ALL | ||||
|   MINE | ||||
|   NONE | ||||
| } | ||||
|  | ||||
| input VideoFilterInput { | ||||
|   isStreamCompleted: Boolean = null | ||||
|   requireCursorCompletion: Boolean! = true | ||||
|   createdAt: DateRangeFilter = null | ||||
|   excludeVideosWithNoShots: Boolean = null | ||||
| } | ||||
|  | ||||
| input VideoFeedInputGQL @oneOf { | ||||
|   followedByUserId: Int | ||||
|   userId: Int | ||||
|   allUsers: Boolean | ||||
| } | ||||
|  | ||||
| type MakePercentageIntervalGQL { | ||||
|   makePercentage: Float! | ||||
|   elapsedTime: Float! | ||||
| } | ||||
|  | ||||
| type RunLeaderboardGQL { | ||||
|   entries: [RunGQL!]! | ||||
| } | ||||
|  | ||||
| type CountLeaderboardGQL { | ||||
|   entries: [UserShotCountEntry!]! | ||||
| } | ||||
|  | ||||
| type UserShotCountEntry { | ||||
|   user: UserGQL! | ||||
|   value: Int! | ||||
|   total: Int! | ||||
|   proportionMade: Float! | ||||
|   videos: Int! | ||||
| } | ||||
|  | ||||
| type RequestedMedalsGQL { | ||||
|   distanceOver66: MedalGQL | ||||
|   distanceOver78: MedalGQL | ||||
|   distanceOver90: MedalGQL | ||||
|   runLength3: MedalGQL | ||||
|   runLength5: MedalGQL | ||||
|   runLength8: MedalGQL | ||||
|   runLength10: MedalGQL | ||||
|   runLength15: MedalGQL | ||||
|   runLength20: MedalGQL | ||||
|   runLength25: MedalGQL | ||||
|   runLength30: MedalGQL | ||||
|   runLength40: MedalGQL | ||||
|   runLength50: MedalGQL | ||||
|   totalMakes25: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes50: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes75: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes200: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes300: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes400: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes750: MedalGQL @deprecated(reason: "no longer supported") | ||||
|   totalMakes100: MedalGQL | ||||
|   totalMakes500: MedalGQL | ||||
|   totalMakes1000: MedalGQL | ||||
|   totalMakes5000: MedalGQL | ||||
|   totalMakes10000: MedalGQL | ||||
|   dailyMakes50: MedalGQL | ||||
|   dailyMakes100: MedalGQL | ||||
|   dailyMakes150: MedalGQL | ||||
|   dailyMakes200: MedalGQL | ||||
|   dailyMakes250: MedalGQL | ||||
| } | ||||
|  | ||||
| type MedalGQL { | ||||
|   count: Int! | ||||
|   nickname: String | ||||
| } | ||||
|  | ||||
| input MedalScope @oneOf { | ||||
|   videoId: Int | ||||
|   interval: TimeInterval | ||||
|     @deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE") | ||||
|   datetimeRange: DatetimeRangeAggregationInput | ||||
| } | ||||
|  | ||||
| type GetRunsResult { | ||||
|   runs: [RunGQL!]! | ||||
|   count: Int | ||||
|   runIds: [Int!]! | ||||
| } | ||||
|  | ||||
| input RunFilterInput { | ||||
|   videoId: [Int!] | ||||
|   userId: [Int!] | ||||
|   username: [String!] | ||||
|   andFilters: [RunFilterInput!] | ||||
|   orFilters: [RunFilterInput!] | ||||
|   notFilter: RunFilterInput | ||||
|   tableSize: FloatRangeFilter | ||||
|   createdAt: DateRangeFilter | ||||
|   runLength: FloatRangeFilter | ||||
| } | ||||
|  | ||||
| input GetRunsOrdering { | ||||
|   orderings: [RunsOrderingComponent!]! | ||||
| } | ||||
|  | ||||
| input RunsOrderingComponent @oneOf { | ||||
|   runLength: IntOrdering | ||||
|   videoId: IntOrdering | ||||
|   videoCreation: DatetimeOrdering | ||||
| } | ||||
|  | ||||
| input IntOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: Int = null | ||||
| } | ||||
|  | ||||
| input DatetimeOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: DateTime = null | ||||
| } | ||||
|  | ||||
| type TableStateGQL { | ||||
|   identifierToPosition: [[Float!]!]! | ||||
|   homography: HomographyInfoGQL | ||||
| } | ||||
|  | ||||
| input HomographyInputGQL { | ||||
|   crop: BoundingBoxInputGQL! | ||||
|   pockets: [BoundingBoxInputGQL!]! | ||||
|   sourcePoints: PocketPointsInputGQL! | ||||
|   destPoints: PocketPointsInputGQL! | ||||
| } | ||||
|  | ||||
| input BoundingBoxInputGQL { | ||||
|   left: Float! | ||||
|   top: Float! | ||||
|   width: Float! | ||||
|   height: Float! | ||||
| } | ||||
|  | ||||
| input PocketPointsInputGQL { | ||||
|   topLeft: IntPoint2DInput! | ||||
|   topSide: IntPoint2DInput! | ||||
|   topRight: IntPoint2DInput! | ||||
|   bottomLeft: IntPoint2DInput! | ||||
|   bottomSide: IntPoint2DInput! | ||||
|   bottomRight: IntPoint2DInput! | ||||
| } | ||||
|  | ||||
| input IntPoint2DInput { | ||||
|   x: Int! | ||||
|   y: Int! | ||||
| } | ||||
|  | ||||
| type GetShotsResult { | ||||
|   shots: [ShotGQL!]! | ||||
|   count: Int | ||||
|   ids: [Int!]! | ||||
| } | ||||
|  | ||||
| input GetShotsOrdering { | ||||
|   orderings: [ShotsOrderingComponent!]! | ||||
| } | ||||
|  | ||||
| input ShotsOrderingComponent @oneOf { | ||||
|   videoCreation: DatetimeOrdering | ||||
|   marginOfError: FloatOrdering | ||||
|   difficulty: FloatOrdering | ||||
|   videoId: IntOrdering | ||||
|   startFrame: IntOrdering | ||||
|   runLength: IntOrdering | ||||
| } | ||||
|  | ||||
| input FloatOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: Float = null | ||||
| } | ||||
|  | ||||
| input GetShotsPagination { | ||||
|   createdAfter: CreatedAfter! | ||||
|   startFrameAfter: Int! | ||||
| @@ -418,29 +816,53 @@ input CreatedAfter @oneOf { | ||||
|   createdAt: DateTime | ||||
| } | ||||
|  | ||||
| type UserRelationshipsResult { | ||||
|   inquiringUser: UserGQL! | ||||
|   relationships: [UserRelationship!]! | ||||
| } | ||||
|  | ||||
| type UserRelationship { | ||||
|   toUser: UserGQL! | ||||
|   toUserFollows: Boolean! | ||||
|   toUserIsFollowedBy: Boolean! | ||||
| } | ||||
|  | ||||
| type StripeSubscriptionOptionsGQL { | ||||
|   products: [StripeProductGQL!]! | ||||
| } | ||||
|  | ||||
| type StripeProductGQL { | ||||
|   id: String! | ||||
|   name: String! | ||||
|   description: String | ||||
|   active: Boolean! | ||||
|   prices: [StripePriceGQL!]! | ||||
| } | ||||
|  | ||||
| type StripePriceGQL { | ||||
|   id: String! | ||||
|   currency: String! | ||||
|   unitAmount: Int | ||||
|   recurringInterval: String | ||||
|   recurringIntervalCount: Int | ||||
|   type: String! | ||||
|   active: Boolean! | ||||
| } | ||||
|  | ||||
| type UserPlayTimeGQL { | ||||
|   totalSeconds: Float! | ||||
| } | ||||
|  | ||||
| type VideoHistoryGQL { | ||||
|   videos: [VideoGQL!]! | ||||
|   pageInfo: PageInfoGQL! | ||||
| } | ||||
|  | ||||
| type PageInfoGQL { | ||||
|   hasNextPage: Boolean! | ||||
|   endCursor: String | ||||
| } | ||||
|  | ||||
| input VideoFilterInput { | ||||
|   isStreamCompleted: Boolean = null | ||||
|   requireCursorCompletion: Boolean! = true | ||||
| } | ||||
|  | ||||
| type TagGQL { | ||||
|   name: String! | ||||
|   id: Int! | ||||
|   group: String | ||||
|   name: String! | ||||
|   tagClasses: [TagClassGQL!] | ||||
|   retired: Boolean! | ||||
| } | ||||
|  | ||||
| type TagClassGQL { | ||||
|   id: Int! | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| """ | ||||
| @@ -454,15 +876,38 @@ scalar JSON | ||||
| type Mutation { | ||||
|   createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! | ||||
|   setLoggerLevel(path: String!, level: String!): Boolean! | ||||
|   reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean! | ||||
|   commentOnVideo( | ||||
|     videoId: Int! | ||||
|     message: String! | ||||
|     parentCommentId: Int | ||||
|   ): Boolean! | ||||
|   editComment(videoId: Int!, commentId: Int!, newMessage: String!): Boolean! | ||||
|   deleteComment(videoId: Int!, commentId: Int!): Boolean! | ||||
|   addAnnotationToShot( | ||||
|     shotId: Int! | ||||
|     annotationName: String! | ||||
|     notes: String = null | ||||
|   ): AddShotAnnotationReturn! | ||||
|   updateShotAnnotations( | ||||
|     shotId: Int! | ||||
|     annotations: [UpdateAnnotationInputGQL!]! | ||||
|   ): UpdateShotAnnotationReturn! | ||||
|   editShot( | ||||
|     shotId: Int! | ||||
|     fieldsToEdit: EditableShotFieldInputGQL! | ||||
|   ): EditShotReturn! | ||||
|   getProfileImageUploadLink( | ||||
|     fileExt: String = ".png" | ||||
|   ): GetProfileUploadLinkReturn! | ||||
|   editProfileImageUri(profileImageUri: String!): UserGQL! | ||||
|   editUser(input: EditUserInputGQL!): UserGQL! | ||||
|   followUser(followedUserId: Int!): UserGQL! | ||||
|   unfollowUser(followedUserId: Int!): UserGQL! | ||||
|   retireTags(tagIds: [Int!]!): Boolean! | ||||
|   ensureStripeCustomerExists: UserGQL! | ||||
|   deleteUser: Boolean! | ||||
|   findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL | ||||
|   createUploadStream( | ||||
|     videoMetadata: VideoMetadataInput! | ||||
|   ): CreateUploadStreamReturn! | ||||
| @@ -475,6 +920,7 @@ type Mutation { | ||||
|   ): Boolean! | ||||
|   editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean! | ||||
|   deleteVideo(videoId: Int!): Boolean! | ||||
|   deleteTags(videoId: Int!, tagsToDelete: [VideoTagInput!]!): Boolean! | ||||
| } | ||||
|  | ||||
| input CreateBucketSetInput { | ||||
| @@ -512,6 +958,32 @@ type OtherErrorNeedsNote { | ||||
|   msg: String | ||||
| } | ||||
|  | ||||
| type UpdateShotAnnotationReturn { | ||||
|   shot: ShotGQL | ||||
|   error: DoesNotOwnShotErr | ||||
| } | ||||
|  | ||||
| input UpdateAnnotationInputGQL { | ||||
|   name: String! | ||||
|   notes: String = null | ||||
| } | ||||
|  | ||||
| type EditShotReturn { | ||||
|   shot: ShotGQL | ||||
|   error: DoesNotOwnShotErr | ||||
| } | ||||
|  | ||||
| input EditableShotFieldInputGQL { | ||||
|   intendedPocketType: PocketEnum | ||||
|   shotDirection: ShotDirectionEnum | ||||
|   spinType: SpinTypeEnum | ||||
|   targetPocketAngleDirection: ShotDirectionEnum | ||||
|   make: Boolean | ||||
|   backcut: Boolean | ||||
|   excludeFromStats: Boolean | ||||
|   notes: String | ||||
| } | ||||
|  | ||||
| type GetProfileUploadLinkReturn { | ||||
|   value: UploadLinkGetProfileUploadLinkErrors! | ||||
| } | ||||
| @@ -538,6 +1010,12 @@ type TooManyProfileImageUploadsErr { | ||||
|   linksRequested: Int! | ||||
| } | ||||
|  | ||||
| input EditUserInputGQL { | ||||
|   username: String = null | ||||
|   fargoRating: Int = null | ||||
|   videosPrivateByDefault: Boolean = null | ||||
| } | ||||
|  | ||||
| type CreateUploadStreamReturn { | ||||
|   videoId: Int! | ||||
| } | ||||
| @@ -547,33 +1025,22 @@ input VideoMetadataInput { | ||||
|   startTime: DateTime = null | ||||
|   endTime: DateTime = null | ||||
|   gameType: String = null | ||||
|     @deprecated(reason: "`game_type` is deprecated. Use `tags` instead.") | ||||
|  | ||||
|   """ | ||||
|   A list of tags associated with the video. Replace `game_type` | ||||
|   """ | ||||
|   tags: [VideoTagInput!] = null | ||||
|   tableSize: Float = null | ||||
|   uploadStreamMetadataInput: UploadStreamMetadataInput = null | ||||
|   lastIntendedSegmentBound: Int = null | ||||
|   streamSegmentType: StreamSegmentTypeEnum = null | ||||
|   private: Boolean = null | ||||
|   endStream: Boolean! = false | ||||
|   clientUploadStatus: ClientUploadStatusEnum = null | ||||
|   resolution: VideoResolution = null | ||||
|   framesPerSecond: Float = null | ||||
| } | ||||
|  | ||||
| input UploadStreamMetadataInput { | ||||
|   deviceType: DeviceTypeEnum = null | ||||
|   osVersion: String = null | ||||
|   appVersion: String = null | ||||
|   browserName: String = null | ||||
|   browserVersion: String = null | ||||
|   locale: String = null | ||||
|   timezone: String = null | ||||
|   networkType: String = null | ||||
|   ipAddress: String = null | ||||
| } | ||||
|  | ||||
| enum DeviceTypeEnum { | ||||
|   IOS | ||||
|   ANDROID | ||||
|   BROWSER | ||||
| } | ||||
|  | ||||
| input VideoResolution { | ||||
|   width: Int! | ||||
|   height: Int! | ||||
|   | ||||
							
								
								
									
										18
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -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" | ||||
| @@ -2633,10 +2633,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" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user