Demo using Slices Network GraphQL Relay API to make a teal.fm client

fix artists field query to include subfields

The artists field changed from a scalar to an object type (FmTealAlphaFeedDefsArtist) requiring subfield selection. Updated TrackItem and TopTracks queries to properly request artistName and artistMbId.

+449 -33
schema.graphql
··· 16 16 } 17 17 18 18 type AppBskyActorProfile { 19 + id: ID! 19 20 uri: String! 20 21 cid: String! 21 22 did: String! ··· 29 30 joinedViaStarterPack: JSON 30 31 labels: JSON 31 32 pinnedPost: JSON 32 - appBskyActorProfile: AppBskyActorProfile 33 33 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 34 34 appBskyFeedPostgatesCount: Int! 35 35 appBskyFeedThreadgates(limit: Int): [AppBskyFeedThreadgate!]! ··· 81 81 interval: DateInterval 82 82 } 83 83 84 + input AppBskyActorProfileInput { 85 + avatar: JSON 86 + banner: JSON 87 + createdAt: String 88 + description: String 89 + displayName: String 90 + joinedViaStarterPack: JSON 91 + labels: JSON 92 + pinnedPost: JSON 93 + } 94 + 84 95 input AppBskyActorProfileSortFieldInput { 85 96 field: AppBskyActorProfileGroupByField! 86 97 direction: SortDirection ··· 101 112 joinedViaStarterPack: StringFilter 102 113 labels: StringFilter 103 114 pinnedPost: StringFilter 115 + json: StringFilter 116 + and: [AppBskyActorProfileWhereInput] 117 + or: [AppBskyActorProfileWhereInput] 118 + } 119 + 120 + type AppBskyEmbedDefsAspectRatio { 121 + height: Int 122 + width: Int 104 123 } 105 124 106 125 type AppBskyEmbedExternal { 126 + id: ID! 107 127 uri: String! 108 128 cid: String! 109 129 did: String! 110 130 indexedAt: String! 111 131 actorHandle: String 112 - external: JSON! 132 + external: AppBskyEmbedExternalExternal! 113 133 appBskyActorProfile: AppBskyActorProfile 114 134 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 115 135 appBskyFeedPostgatesCount: Int! ··· 136 156 type AppBskyEmbedExternalEdge { 137 157 node: AppBskyEmbedExternal! 138 158 cursor: String! 159 + } 160 + 161 + type AppBskyEmbedExternalExternal { 162 + description: String 163 + thumb: Blob 164 + title: String 165 + uri: String 139 166 } 140 167 141 168 enum AppBskyEmbedExternalGroupByField { ··· 148 175 interval: DateInterval 149 176 } 150 177 178 + input AppBskyEmbedExternalInput { 179 + external: JSON! 180 + } 181 + 151 182 input AppBskyEmbedExternalSortFieldInput { 152 183 field: AppBskyEmbedExternalGroupByField! 153 184 direction: SortDirection ··· 161 192 collection: StringFilter 162 193 actorHandle: StringFilter 163 194 external: StringFilter 195 + json: StringFilter 196 + and: [AppBskyEmbedExternalWhereInput] 197 + or: [AppBskyEmbedExternalWhereInput] 164 198 } 165 199 166 200 type AppBskyEmbedImages { 201 + id: ID! 167 202 uri: String! 168 203 cid: String! 169 204 did: String! 170 205 indexedAt: String! 171 206 actorHandle: String 172 - images: JSON! 207 + images: [AppBskyEmbedImagesImage!] 173 208 appBskyActorProfile: AppBskyActorProfile 174 209 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 175 210 appBskyFeedPostgatesCount: Int! ··· 208 243 interval: DateInterval 209 244 } 210 245 246 + type AppBskyEmbedImagesImage { 247 + alt: String 248 + aspectRatio: JSON 249 + image: Blob 250 + } 251 + 252 + input AppBskyEmbedImagesInput { 253 + images: JSON! 254 + } 255 + 211 256 input AppBskyEmbedImagesSortFieldInput { 212 257 field: AppBskyEmbedImagesGroupByField! 213 258 direction: SortDirection ··· 221 266 collection: StringFilter 222 267 actorHandle: StringFilter 223 268 images: StringFilter 269 + json: StringFilter 270 + and: [AppBskyEmbedImagesWhereInput] 271 + or: [AppBskyEmbedImagesWhereInput] 224 272 } 225 273 226 274 type AppBskyEmbedRecord { 227 - uri: String! 228 - cid: String! 229 - did: String! 230 - indexedAt: String! 231 - actorHandle: String 232 - record: JSON! 233 - appBskyActorProfile: AppBskyActorProfile 234 - appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 235 - appBskyFeedPostgatesCount: Int! 236 - appBskyFeedThreadgates(limit: Int): [AppBskyFeedThreadgate!]! 237 - appBskyFeedThreadgatesCount: Int! 238 - appBskyActorProfiles(limit: Int): [AppBskyActorProfile!]! 239 - appBskyActorProfilesCount: Int! 240 - fmTealAlphaFeedPlays(limit: Int): [FmTealAlphaFeedPlay!]! 241 - fmTealAlphaFeedPlaysCount: Int! 275 + record: JSON 242 276 } 243 277 244 278 type AppBskyEmbedRecordAggregated { ··· 268 302 interval: DateInterval 269 303 } 270 304 305 + input AppBskyEmbedRecordInput { 306 + record: JSON! 307 + } 308 + 271 309 input AppBskyEmbedRecordSortFieldInput { 272 310 field: AppBskyEmbedRecordGroupByField! 273 311 direction: SortDirection ··· 281 319 collection: StringFilter 282 320 actorHandle: StringFilter 283 321 record: StringFilter 322 + json: StringFilter 323 + and: [AppBskyEmbedRecordWhereInput] 324 + or: [AppBskyEmbedRecordWhereInput] 284 325 } 285 326 286 327 type AppBskyEmbedRecordWithMedia { 328 + id: ID! 287 329 uri: String! 288 330 cid: String! 289 331 did: String! 290 332 indexedAt: String! 291 333 actorHandle: String 292 334 media: JSON! 293 - record: JSON! 335 + record: AppBskyEmbedRecord! 294 336 appBskyActorProfile: AppBskyActorProfile 295 337 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 296 338 appBskyFeedPostgatesCount: Int! ··· 331 373 interval: DateInterval 332 374 } 333 375 376 + input AppBskyEmbedRecordWithMediaInput { 377 + media: JSON! 378 + record: JSON! 379 + } 380 + 334 381 input AppBskyEmbedRecordWithMediaSortFieldInput { 335 382 field: AppBskyEmbedRecordWithMediaGroupByField! 336 383 direction: SortDirection ··· 345 392 actorHandle: StringFilter 346 393 media: StringFilter 347 394 record: StringFilter 395 + json: StringFilter 396 + and: [AppBskyEmbedRecordWithMediaWhereInput] 397 + or: [AppBskyEmbedRecordWithMediaWhereInput] 348 398 } 349 399 350 400 type AppBskyEmbedVideo { 401 + id: ID! 351 402 uri: String! 352 403 cid: String! 353 404 did: String! 354 405 indexedAt: String! 355 406 actorHandle: String 356 407 alt: String 357 - aspectRatio: JSON 358 - captions: JSON 408 + aspectRatio: AppBskyEmbedDefsAspectRatio 409 + captions: [AppBskyEmbedVideoCaption] 359 410 video: Blob 360 411 appBskyActorProfile: AppBskyActorProfile 361 412 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! ··· 374 425 captions: JSON 375 426 video: JSON 376 427 count: Int! 428 + } 429 + 430 + type AppBskyEmbedVideoCaption { 431 + file: Blob 432 + lang: String 377 433 } 378 434 379 435 type AppBskyEmbedVideoConnection { ··· 401 457 interval: DateInterval 402 458 } 403 459 460 + input AppBskyEmbedVideoInput { 461 + alt: String 462 + aspectRatio: JSON 463 + captions: JSON 464 + video: JSON! 465 + } 466 + 404 467 input AppBskyEmbedVideoSortFieldInput { 405 468 field: AppBskyEmbedVideoGroupByField! 406 469 direction: SortDirection ··· 417 480 aspectRatio: StringFilter 418 481 captions: StringFilter 419 482 video: StringFilter 483 + json: StringFilter 484 + and: [AppBskyEmbedVideoWhereInput] 485 + or: [AppBskyEmbedVideoWhereInput] 420 486 } 421 487 422 488 type AppBskyFeedPostgate { 489 + id: ID! 423 490 uri: String! 424 491 cid: String! 425 492 did: String! ··· 429 496 detachedEmbeddingUris: [String] 430 497 embeddingRules: JSON 431 498 post: String! 432 - appBskyFeedPostgate: AppBskyFeedPostgate 433 499 appBskyFeedThreadgate: AppBskyFeedThreadgate 434 500 appBskyActorProfile: AppBskyActorProfile 435 501 fmTealAlphaFeedPlay: FmTealAlphaFeedPlay ··· 476 542 interval: DateInterval 477 543 } 478 544 545 + input AppBskyFeedPostgateInput { 546 + createdAt: String! 547 + detachedEmbeddingUris: [String] 548 + embeddingRules: JSON 549 + post: String! 550 + } 551 + 479 552 input AppBskyFeedPostgateSortFieldInput { 480 553 field: AppBskyFeedPostgateGroupByField! 481 554 direction: SortDirection ··· 492 565 detachedEmbeddingUris: StringFilter 493 566 embeddingRules: StringFilter 494 567 post: StringFilter 568 + json: StringFilter 569 + and: [AppBskyFeedPostgateWhereInput] 570 + or: [AppBskyFeedPostgateWhereInput] 495 571 } 496 572 497 573 type AppBskyFeedThreadgate { 574 + id: ID! 498 575 uri: String! 499 576 cid: String! 500 577 did: String! ··· 505 582 hiddenReplies: [String] 506 583 post: String! 507 584 appBskyFeedPostgate: AppBskyFeedPostgate 508 - appBskyFeedThreadgate: AppBskyFeedThreadgate 509 585 appBskyActorProfile: AppBskyActorProfile 510 586 fmTealAlphaFeedPlay: FmTealAlphaFeedPlay 511 587 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! ··· 549 625 input AppBskyFeedThreadgateGroupByFieldInput { 550 626 field: AppBskyFeedThreadgateGroupByField! 551 627 interval: DateInterval 628 + } 629 + 630 + input AppBskyFeedThreadgateInput { 631 + allow: JSON 632 + createdAt: String! 633 + hiddenReplies: [String] 634 + post: String! 552 635 } 553 636 554 637 input AppBskyFeedThreadgateSortFieldInput { ··· 567 650 createdAt: StringFilter 568 651 hiddenReplies: StringFilter 569 652 post: StringFilter 653 + json: StringFilter 654 + and: [AppBskyFeedThreadgateWhereInput] 655 + or: [AppBskyFeedThreadgateWhereInput] 570 656 } 571 657 572 658 type AppBskyRichtextFacet { 659 + id: ID! 573 660 uri: String! 574 661 cid: String! 575 662 did: String! 576 663 indexedAt: String! 577 664 actorHandle: String 578 665 features: JSON! 579 - index: JSON! 666 + index: AppBskyRichtextFacetByteSlice! 580 667 appBskyActorProfile: AppBskyActorProfile 581 668 appBskyFeedPostgates(limit: Int): [AppBskyFeedPostgate!]! 582 669 appBskyFeedPostgatesCount: Int! ··· 594 681 count: Int! 595 682 } 596 683 684 + type AppBskyRichtextFacetByteSlice { 685 + byteEnd: Int 686 + byteStart: Int 687 + } 688 + 597 689 type AppBskyRichtextFacetConnection { 598 690 totalCount: Int! 599 691 pageInfo: PageInfo! ··· 617 709 interval: DateInterval 618 710 } 619 711 712 + input AppBskyRichtextFacetInput { 713 + features: JSON! 714 + index: JSON! 715 + } 716 + 620 717 input AppBskyRichtextFacetSortFieldInput { 621 718 field: AppBskyRichtextFacetGroupByField! 622 719 direction: SortDirection ··· 631 728 actorHandle: StringFilter 632 729 features: StringFilter 633 730 index: StringFilter 731 + json: StringFilter 732 + and: [AppBskyRichtextFacetWhereInput] 733 + or: [AppBskyRichtextFacetWhereInput] 634 734 } 635 735 636 736 type Blob { ··· 644 744 url(preset: String): String! 645 745 } 646 746 747 + type BlobUploadResponse { 748 + blob: Blob! 749 + } 750 + 751 + type CollectionSummary { 752 + collection: String! 753 + estimatedRepos: Int! 754 + isExternal: Boolean! 755 + } 756 + 647 757 type ComAtprotoRepoStrongRef { 758 + id: ID! 648 759 did: String! 649 760 indexedAt: String! 650 761 actorHandle: String ··· 693 804 interval: DateInterval 694 805 } 695 806 807 + input ComAtprotoRepoStrongRefInput { 808 + cid: String! 809 + uri: String! 810 + } 811 + 696 812 input ComAtprotoRepoStrongRefSortFieldInput { 697 813 field: ComAtprotoRepoStrongRefGroupByField! 698 814 direction: SortDirection ··· 705 821 actorHandle: StringFilter 706 822 cid: StringFilter 707 823 uri: StringFilter 824 + json: StringFilter 825 + and: [ComAtprotoRepoStrongRefWhereInput] 826 + or: [ComAtprotoRepoStrongRefWhereInput] 708 827 } 709 828 710 829 enum DateInterval { ··· 726 845 lte: String 727 846 } 728 847 848 + type DeleteSliceRecordsOutput { 849 + message: String! 850 + recordsDeleted: Int! 851 + actorsDeleted: Int! 852 + } 853 + 854 + type FmTealAlphaFeedDefsArtist { 855 + artistMbId: String 856 + artistName: String 857 + } 858 + 729 859 type FmTealAlphaFeedPlay { 860 + id: ID! 730 861 uri: String! 731 862 cid: String! 732 863 did: String! ··· 734 865 actorHandle: String 735 866 artistMbIds: [String] 736 867 artistNames: [String] 737 - artists: JSON 868 + artists: [FmTealAlphaFeedDefsArtist] 738 869 duration: Int 739 870 isrc: String 740 871 musicServiceBaseDomain: String ··· 810 941 interval: DateInterval 811 942 } 812 943 944 + input FmTealAlphaFeedPlayInput { 945 + artistMbIds: [String] 946 + artistNames: [String] 947 + artists: JSON 948 + duration: Int 949 + isrc: String 950 + musicServiceBaseDomain: String 951 + originUrl: String 952 + playedTime: String 953 + recordingMbId: String 954 + releaseMbId: String 955 + releaseName: String 956 + submissionClientAgent: String 957 + trackMbId: String 958 + trackName: String! 959 + } 960 + 813 961 input FmTealAlphaFeedPlaySortFieldInput { 814 962 field: FmTealAlphaFeedPlayGroupByField! 815 963 direction: SortDirection ··· 836 984 submissionClientAgent: StringFilter 837 985 trackMbId: StringFilter 838 986 trackName: StringFilter 987 + json: StringFilter 988 + and: [FmTealAlphaFeedPlayWhereInput] 989 + or: [FmTealAlphaFeedPlayWhereInput] 839 990 } 840 991 841 992 input IntFilter { ··· 847 998 lte: Int 848 999 } 849 1000 1001 + type JetstreamLogEntry { 1002 + id: String! 1003 + createdAt: String! 1004 + logType: String! 1005 + jobId: String 1006 + userDid: String 1007 + sliceUri: String 1008 + level: String! 1009 + message: String! 1010 + metadata: JSON 1011 + } 1012 + 850 1013 scalar JSON 851 1014 852 1015 type Mutation { 853 1016 """Sync user collections for a given DID""" 854 1017 syncUserCollections(did: String!): SyncResult! 1018 + 1019 + """Create a new app.bsky.embed.record record""" 1020 + createAppBskyEmbedRecord(input: AppBskyEmbedRecordInput!, rkey: String): AppBskyEmbedRecord! 1021 + 1022 + """Update a app.bsky.embed.record record""" 1023 + updateAppBskyEmbedRecord(rkey: String!, input: AppBskyEmbedRecordInput!): AppBskyEmbedRecord! 1024 + 1025 + """Delete a app.bsky.embed.record record""" 1026 + deleteAppBskyEmbedRecord(rkey: String!): AppBskyEmbedRecord! 1027 + 1028 + """Create a new app.bsky.embed.images record""" 1029 + createAppBskyEmbedImages(input: AppBskyEmbedImagesInput!, rkey: String): AppBskyEmbedImages! 1030 + 1031 + """Update a app.bsky.embed.images record""" 1032 + updateAppBskyEmbedImages(rkey: String!, input: AppBskyEmbedImagesInput!): AppBskyEmbedImages! 1033 + 1034 + """Delete a app.bsky.embed.images record""" 1035 + deleteAppBskyEmbedImages(rkey: String!): AppBskyEmbedImages! 1036 + 1037 + """Create a new app.bsky.embed.recordWithMedia record""" 1038 + createAppBskyEmbedRecordWithMedia(input: AppBskyEmbedRecordWithMediaInput!, rkey: String): AppBskyEmbedRecordWithMedia! 1039 + 1040 + """Update a app.bsky.embed.recordWithMedia record""" 1041 + updateAppBskyEmbedRecordWithMedia(rkey: String!, input: AppBskyEmbedRecordWithMediaInput!): AppBskyEmbedRecordWithMedia! 1042 + 1043 + """Delete a app.bsky.embed.recordWithMedia record""" 1044 + deleteAppBskyEmbedRecordWithMedia(rkey: String!): AppBskyEmbedRecordWithMedia! 1045 + 1046 + """Create a new app.bsky.embed.video record""" 1047 + createAppBskyEmbedVideo(input: AppBskyEmbedVideoInput!, rkey: String): AppBskyEmbedVideo! 1048 + 1049 + """Update a app.bsky.embed.video record""" 1050 + updateAppBskyEmbedVideo(rkey: String!, input: AppBskyEmbedVideoInput!): AppBskyEmbedVideo! 1051 + 1052 + """Delete a app.bsky.embed.video record""" 1053 + deleteAppBskyEmbedVideo(rkey: String!): AppBskyEmbedVideo! 1054 + 1055 + """Create a new app.bsky.embed.external record""" 1056 + createAppBskyEmbedExternal(input: AppBskyEmbedExternalInput!, rkey: String): AppBskyEmbedExternal! 1057 + 1058 + """Update a app.bsky.embed.external record""" 1059 + updateAppBskyEmbedExternal(rkey: String!, input: AppBskyEmbedExternalInput!): AppBskyEmbedExternal! 1060 + 1061 + """Delete a app.bsky.embed.external record""" 1062 + deleteAppBskyEmbedExternal(rkey: String!): AppBskyEmbedExternal! 1063 + 1064 + """Create a new app.bsky.feed.postgate record""" 1065 + createAppBskyFeedPostgate(input: AppBskyFeedPostgateInput!, rkey: String): AppBskyFeedPostgate! 1066 + 1067 + """Update a app.bsky.feed.postgate record""" 1068 + updateAppBskyFeedPostgate(rkey: String!, input: AppBskyFeedPostgateInput!): AppBskyFeedPostgate! 1069 + 1070 + """Delete a app.bsky.feed.postgate record""" 1071 + deleteAppBskyFeedPostgate(rkey: String!): AppBskyFeedPostgate! 1072 + 1073 + """Create a new app.bsky.feed.threadgate record""" 1074 + createAppBskyFeedThreadgate(input: AppBskyFeedThreadgateInput!, rkey: String): AppBskyFeedThreadgate! 1075 + 1076 + """Update a app.bsky.feed.threadgate record""" 1077 + updateAppBskyFeedThreadgate(rkey: String!, input: AppBskyFeedThreadgateInput!): AppBskyFeedThreadgate! 1078 + 1079 + """Delete a app.bsky.feed.threadgate record""" 1080 + deleteAppBskyFeedThreadgate(rkey: String!): AppBskyFeedThreadgate! 1081 + 1082 + """Create a new app.bsky.richtext.facet record""" 1083 + createAppBskyRichtextFacet(input: AppBskyRichtextFacetInput!, rkey: String): AppBskyRichtextFacet! 1084 + 1085 + """Update a app.bsky.richtext.facet record""" 1086 + updateAppBskyRichtextFacet(rkey: String!, input: AppBskyRichtextFacetInput!): AppBskyRichtextFacet! 1087 + 1088 + """Delete a app.bsky.richtext.facet record""" 1089 + deleteAppBskyRichtextFacet(rkey: String!): AppBskyRichtextFacet! 1090 + 1091 + """Create a new app.bsky.actor.profile record""" 1092 + createAppBskyActorProfile(input: AppBskyActorProfileInput!, rkey: String): AppBskyActorProfile! 1093 + 1094 + """Update a app.bsky.actor.profile record""" 1095 + updateAppBskyActorProfile(rkey: String!, input: AppBskyActorProfileInput!): AppBskyActorProfile! 1096 + 1097 + """Delete a app.bsky.actor.profile record""" 1098 + deleteAppBskyActorProfile(rkey: String!): AppBskyActorProfile! 1099 + 1100 + """Create a new com.atproto.repo.strongRef record""" 1101 + createComAtprotoRepoStrongRef(input: ComAtprotoRepoStrongRefInput!, rkey: String): ComAtprotoRepoStrongRef! 1102 + 1103 + """Update a com.atproto.repo.strongRef record""" 1104 + updateComAtprotoRepoStrongRef(rkey: String!, input: ComAtprotoRepoStrongRefInput!): ComAtprotoRepoStrongRef! 1105 + 1106 + """Delete a com.atproto.repo.strongRef record""" 1107 + deleteComAtprotoRepoStrongRef(rkey: String!): ComAtprotoRepoStrongRef! 1108 + 1109 + """Create a new fm.teal.alpha.feed.play record""" 1110 + createFmTealAlphaFeedPlay(input: FmTealAlphaFeedPlayInput!, rkey: String): FmTealAlphaFeedPlay! 1111 + 1112 + """Update a fm.teal.alpha.feed.play record""" 1113 + updateFmTealAlphaFeedPlay(rkey: String!, input: FmTealAlphaFeedPlayInput!): FmTealAlphaFeedPlay! 1114 + 1115 + """Delete a fm.teal.alpha.feed.play record""" 1116 + deleteFmTealAlphaFeedPlay(rkey: String!): FmTealAlphaFeedPlay! 1117 + 1118 + """Start a sync job to backfill collections from the ATProto relay""" 1119 + startSync(slice: String, collections: [String], externalCollections: [String], repos: [String], limitPerRepo: Int, skipValidation: Boolean, maxRepos: Int): StartSyncOutput! 1120 + 1121 + """Cancel a pending or running sync job""" 1122 + cancelJob(jobId: String!): Boolean! 1123 + 1124 + """Delete a sync job from the database""" 1125 + deleteJob(id: ID!): ID 1126 + 1127 + """Upload a blob to the user's AT Protocol repository""" 1128 + uploadBlob(data: String!, mimeType: String!): BlobUploadResponse! 1129 + 1130 + """Register a new OAuth client for a slice""" 1131 + createOAuthClient(sliceUri: String!, clientName: String!, redirectUris: [String!]!, scope: String!, clientUri: String, logoUri: String, tosUri: String, policyUri: String): OAuthClient! 1132 + 1133 + """Update an OAuth client""" 1134 + updateOAuthClient(clientId: String!, clientName: String, redirectUris: [String], scope: String, clientUri: String, logoUri: String, tosUri: String, policyUri: String): OAuthClient! 1135 + 1136 + """Delete an OAuth client""" 1137 + deleteOAuthClient(clientId: String!): Boolean! 1138 + 1139 + """ 1140 + Delete all records and actors from a slice index. Requires authentication and slice ownership. 1141 + """ 1142 + deleteSliceRecords(slice: String): DeleteSliceRecordsOutput! 1143 + } 1144 + 1145 + type OAuthClient { 1146 + clientId: String! 1147 + clientSecret: String 1148 + clientName: String! 1149 + redirectUris: [String!]! 1150 + grantTypes: [String!]! 1151 + responseTypes: [String!]! 1152 + scope: String 1153 + clientUri: String 1154 + logoUri: String 1155 + tosUri: String 1156 + policyUri: String 1157 + createdAt: String! 1158 + createdByDid: String! 855 1159 } 856 1160 857 1161 type PageInfo { ··· 877 1181 Aggregated query for app.bsky.embed.images records with GROUP BY support 878 1182 """ 879 1183 appBskyEmbedImagesesAggregated(groupBy: [AppBskyEmbedImagesGroupByFieldInput!], where: AppBskyEmbedImagesWhereInput, orderBy: AggregationOrderBy, limit: Int): [AppBskyEmbedImagesAggregated!]! 1184 + 1185 + """Query app.bsky.embed.recordWithMedia records""" 1186 + appBskyEmbedRecordWithMedias(first: Int, after: String, last: Int, before: String, sortBy: [AppBskyEmbedRecordWithMediaSortFieldInput], where: AppBskyEmbedRecordWithMediaWhereInput): AppBskyEmbedRecordWithMediaConnection! 1187 + 1188 + """ 1189 + Aggregated query for app.bsky.embed.recordWithMedia records with GROUP BY support 1190 + """ 1191 + appBskyEmbedRecordWithMediasAggregated(groupBy: [AppBskyEmbedRecordWithMediaGroupByFieldInput!], where: AppBskyEmbedRecordWithMediaWhereInput, orderBy: AggregationOrderBy, limit: Int): [AppBskyEmbedRecordWithMediaAggregated!]! 880 1192 881 1193 """Query app.bsky.embed.video records""" 882 1194 appBskyEmbedVideos(first: Int, after: String, last: Int, before: String, sortBy: [AppBskyEmbedVideoSortFieldInput], where: AppBskyEmbedVideoWhereInput): AppBskyEmbedVideoConnection! ··· 886 1198 """ 887 1199 appBskyEmbedVideosAggregated(groupBy: [AppBskyEmbedVideoGroupByFieldInput!], where: AppBskyEmbedVideoWhereInput, orderBy: AggregationOrderBy, limit: Int): [AppBskyEmbedVideoAggregated!]! 888 1200 889 - """Query app.bsky.embed.recordWithMedia records""" 890 - appBskyEmbedRecordWithMedias(first: Int, after: String, last: Int, before: String, sortBy: [AppBskyEmbedRecordWithMediaSortFieldInput], where: AppBskyEmbedRecordWithMediaWhereInput): AppBskyEmbedRecordWithMediaConnection! 891 - 892 - """ 893 - Aggregated query for app.bsky.embed.recordWithMedia records with GROUP BY support 894 - """ 895 - appBskyEmbedRecordWithMediasAggregated(groupBy: [AppBskyEmbedRecordWithMediaGroupByFieldInput!], where: AppBskyEmbedRecordWithMediaWhereInput, orderBy: AggregationOrderBy, limit: Int): [AppBskyEmbedRecordWithMediaAggregated!]! 896 - 897 1201 """Query app.bsky.embed.external records""" 898 1202 appBskyEmbedExternals(first: Int, after: String, last: Int, before: String, sortBy: [AppBskyEmbedExternalSortFieldInput], where: AppBskyEmbedExternalWhereInput): AppBskyEmbedExternalConnection! 899 1203 ··· 949 1253 Aggregated query for fm.teal.alpha.feed.play records with GROUP BY support 950 1254 """ 951 1255 fmTealAlphaFeedPlaysAggregated(groupBy: [FmTealAlphaFeedPlayGroupByFieldInput!], where: FmTealAlphaFeedPlayWhereInput, orderBy: AggregationOrderBy, limit: Int): [FmTealAlphaFeedPlayAggregated!]! 1256 + 1257 + """ 1258 + Get logs from the Jetstream real-time indexing service, optionally filtered by slice 1259 + """ 1260 + jetstreamLogs(slice: String, limit: Int): [JetstreamLogEntry!]! 1261 + 1262 + """Get status of a specific sync job""" 1263 + syncJob(jobId: String!): SyncJob 1264 + 1265 + """Get sync job history for a slice""" 1266 + syncJobs(slice: String, limit: Int): [SyncJob!]! 1267 + 1268 + """Get logs for a specific sync job""" 1269 + syncJobLogs(jobId: String!, limit: Int): [JetstreamLogEntry!]! 1270 + 1271 + """Get summary of repos that would be synced based on collection filters""" 1272 + getSyncSummary(slice: String!, collections: [String], externalCollections: [String], repos: [String]): SyncSummary! 1273 + 1274 + """ 1275 + Get sparkline data for multiple slices showing record indexing activity over time 1276 + """ 1277 + sparklines(slices: [String!]!, interval: String, duration: String): [SliceSparkline!]! 1278 + 1279 + """ 1280 + Query records across all collections in a slice with filtering and pagination. 1281 + Provide either sliceUri or both actorHandle and rkey. 1282 + """ 1283 + sliceRecords(sliceUri: String, actorHandle: String, rkey: String, first: Int, after: String, where: SliceRecordsWhereInput): SliceRecordsConnection! 1284 + 1285 + """Get all OAuth clients for a slice""" 1286 + oauthClients(slice: String): [OAuthClient!]! 1287 + } 1288 + 1289 + type SliceRecord { 1290 + uri: String! 1291 + cid: String! 1292 + did: String! 1293 + collection: String! 1294 + value: String! 1295 + indexedAt: String! 1296 + } 1297 + 1298 + type SliceRecordEdge { 1299 + node: SliceRecord! 1300 + cursor: String! 1301 + } 1302 + 1303 + type SliceRecordsConnection { 1304 + totalCount: Int! 1305 + edges: [SliceRecordEdge!]! 1306 + pageInfo: PageInfo! 1307 + } 1308 + 1309 + input SliceRecordsWhereInput { 1310 + collection: StringFilter 1311 + did: StringFilter 1312 + uri: StringFilter 1313 + cid: StringFilter 1314 + indexedAt: DateTimeFilter 1315 + json: StringFilter 1316 + or: [SliceRecordsWhereInput] 1317 + } 1318 + 1319 + type SliceSparkline { 1320 + sliceUri: String! 1321 + points: [SparklinePoint!]! 952 1322 } 953 1323 954 1324 enum SortDirection { ··· 956 1326 desc 957 1327 } 958 1328 1329 + type SparklinePoint { 1330 + timestamp: String! 1331 + count: Int! 1332 + } 1333 + 1334 + type StartSyncOutput { 1335 + jobId: String! 1336 + message: String! 1337 + } 1338 + 959 1339 input StringFilter { 960 1340 eq: String 961 1341 in: [String] 962 1342 contains: String 1343 + fuzzy: String 963 1344 gt: String 964 1345 gte: String 965 1346 lt: String ··· 1010 1391 Subscribe to fm.teal.alpha.feed.play record deletion events. Returns the URI of deleted records. 1011 1392 """ 1012 1393 fmTealAlphaFeedPlayDeleted: String! 1394 + 1395 + """Subscribe to new Jetstream log entries, optionally filtered by slice""" 1396 + jetstreamLogsCreated(slice: String): JetstreamLogEntry! 1397 + 1398 + """Subscribe to sync job status updates""" 1399 + syncJobUpdated(jobId: String, slice: String): SyncJob! 1400 + } 1401 + 1402 + type SyncJob { 1403 + id: ID! 1404 + jobId: String! 1405 + sliceUri: String! 1406 + status: String! 1407 + createdAt: String! 1408 + startedAt: String 1409 + completedAt: String 1410 + result: SyncJobResult 1411 + error: String 1412 + retryCount: Int! 1413 + } 1414 + 1415 + type SyncJobResult { 1416 + success: Boolean! 1417 + totalRecords: Int! 1418 + collectionsSynced: [String!]! 1419 + reposProcessed: Int! 1420 + message: String! 1013 1421 } 1014 1422 1015 1423 type SyncResult { ··· 1020 1428 message: String! 1021 1429 } 1022 1430 1431 + type SyncSummary { 1432 + totalRepos: Int! 1433 + cappedRepos: Int! 1434 + wouldBeCapped: Boolean! 1435 + appliedLimit: Int! 1436 + collectionsSummary: [CollectionSummary!]! 1437 + } 1438 +
+1 -1
src/TopTracks.tsx
··· 26 26 } 27 27 `, 28 28 queryVariables, 29 - { fetchKey: period || "all", fetchPolicy: "store-or-network" } 29 + { fetchKey: period || "all", fetchPolicy: "store-or-network" }, 30 30 ); 31 31 32 32 const tracks = data.fmTealAlphaFeedPlaysAggregated || [];
+4 -1
src/TrackItem.tsx
··· 13 13 fragment TrackItem_play on FmTealAlphaFeedPlay { 14 14 trackName 15 15 playedTime 16 - artists 16 + artists { 17 + artistName 18 + artistMbId 19 + } 17 20 releaseName 18 21 releaseMbId 19 22 actorHandle
+33 -6
src/__generated__/AppPaginationQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<38f32c1e1448eb48251113a07e781789>> 2 + * @generated SignedSource<<4144e88e9b03430408917b25e498a033>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 56 56 } 57 57 ] 58 58 } 59 - ]; 59 + ], 60 + v2 = { 61 + "alias": null, 62 + "args": null, 63 + "kind": "ScalarField", 64 + "name": "id", 65 + "storageKey": null 66 + }; 60 67 return { 61 68 "fragment": { 62 69 "argumentDefinitions": (v0/*: any*/), ··· 138 145 { 139 146 "alias": null, 140 147 "args": null, 141 - "kind": "ScalarField", 148 + "concreteType": "FmTealAlphaFeedDefsArtist", 149 + "kind": "LinkedField", 142 150 "name": "artists", 151 + "plural": true, 152 + "selections": [ 153 + { 154 + "alias": null, 155 + "args": null, 156 + "kind": "ScalarField", 157 + "name": "artistName", 158 + "storageKey": null 159 + }, 160 + { 161 + "alias": null, 162 + "args": null, 163 + "kind": "ScalarField", 164 + "name": "artistMbId", 165 + "storageKey": null 166 + } 167 + ], 143 168 "storageKey": null 144 169 }, 145 170 { ··· 184 209 "kind": "ScalarField", 185 210 "name": "displayName", 186 211 "storageKey": null 187 - } 212 + }, 213 + (v2/*: any*/) 188 214 ], 189 215 "storageKey": null 190 216 }, 217 + (v2/*: any*/), 191 218 { 192 219 "alias": null, 193 220 "args": null, ··· 250 277 ] 251 278 }, 252 279 "params": { 253 - "cacheID": "cb24b99f8b849bdfc642275cfd4df3fe", 280 + "cacheID": "d41913a8ba0cde3255c03b34e36f4baf", 254 281 "id": null, 255 282 "metadata": {}, 256 283 "name": "AppPaginationQuery", 257 284 "operationKind": "query", 258 - "text": "query AppPaginationQuery(\n $count: Int = 20\n $cursor: String\n) {\n ...App_plays_1G22uz\n}\n\nfragment App_plays_1G22uz on Query {\n fmTealAlphaFeedPlays(first: $count, after: $cursor, sortBy: [{field: playedTime, direction: desc}]) {\n totalCount\n edges {\n node {\n playedTime\n ...TrackItem_play\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n }\n}\n" 285 + "text": "query AppPaginationQuery(\n $count: Int = 20\n $cursor: String\n) {\n ...App_plays_1G22uz\n}\n\nfragment App_plays_1G22uz on Query {\n fmTealAlphaFeedPlays(first: $count, after: $cursor, sortBy: [{field: playedTime, direction: desc}]) {\n totalCount\n edges {\n node {\n playedTime\n ...TrackItem_play\n id\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists {\n artistName\n artistMbId\n }\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n id\n }\n}\n" 259 286 } 260 287 }; 261 288 })();
+36 -5
src/__generated__/AppQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<bd4d57eff6a192efe2535389231fe37e>> 2 + * @generated SignedSource<<4eadb1b67651fecb72943df792f91938>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 12 12 import { FragmentRefs } from "relay-runtime"; 13 13 export type FmTealAlphaFeedPlayWhereInput = { 14 14 actorHandle?: StringFilter | null | undefined; 15 + and?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 15 16 artistMbIds?: StringFilter | null | undefined; 16 17 artistNames?: StringFilter | null | undefined; 17 18 artists?: StringFilter | null | undefined; ··· 21 22 duration?: IntFilter | null | undefined; 22 23 indexedAt?: DateTimeFilter | null | undefined; 23 24 isrc?: StringFilter | null | undefined; 25 + json?: StringFilter | null | undefined; 24 26 musicServiceBaseDomain?: StringFilter | null | undefined; 27 + or?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 25 28 originUrl?: StringFilter | null | undefined; 26 29 playedTime?: StringFilter | null | undefined; 27 30 recordingMbId?: StringFilter | null | undefined; ··· 42 45 export type StringFilter = { 43 46 contains?: string | null | undefined; 44 47 eq?: string | null | undefined; 48 + fuzzy?: string | null | undefined; 45 49 gt?: string | null | undefined; 46 50 gte?: string | null | undefined; 47 51 in?: ReadonlyArray<string | null | undefined> | null | undefined; ··· 98 102 "kind": "ScalarField", 99 103 "name": "playedTime", 100 104 "storageKey": null 105 + }, 106 + v3 = { 107 + "alias": null, 108 + "args": null, 109 + "kind": "ScalarField", 110 + "name": "id", 111 + "storageKey": null 101 112 }; 102 113 return { 103 114 "fragment": { ··· 168 179 { 169 180 "alias": null, 170 181 "args": null, 171 - "kind": "ScalarField", 182 + "concreteType": "FmTealAlphaFeedDefsArtist", 183 + "kind": "LinkedField", 172 184 "name": "artists", 185 + "plural": true, 186 + "selections": [ 187 + { 188 + "alias": null, 189 + "args": null, 190 + "kind": "ScalarField", 191 + "name": "artistName", 192 + "storageKey": null 193 + }, 194 + { 195 + "alias": null, 196 + "args": null, 197 + "kind": "ScalarField", 198 + "name": "artistMbId", 199 + "storageKey": null 200 + } 201 + ], 173 202 "storageKey": null 174 203 }, 175 204 { ··· 214 243 "kind": "ScalarField", 215 244 "name": "displayName", 216 245 "storageKey": null 217 - } 246 + }, 247 + (v3/*: any*/) 218 248 ], 219 249 "storageKey": null 220 250 }, 251 + (v3/*: any*/), 221 252 { 222 253 "alias": null, 223 254 "args": null, ··· 320 351 ] 321 352 }, 322 353 "params": { 323 - "cacheID": "038b79e3af13c34df9bfca055c5f7829", 354 + "cacheID": "ab3827e5716f65074a802ddb36f66d2b", 324 355 "id": null, 325 356 "metadata": {}, 326 357 "name": "AppQuery", 327 358 "operationKind": "query", 328 - "text": "query AppQuery(\n $chartWhere: FmTealAlphaFeedPlayWhereInput!\n) {\n ...App_plays\n ...ScrobbleChart_data\n}\n\nfragment App_plays on Query {\n fmTealAlphaFeedPlays(first: 20, sortBy: [{field: playedTime, direction: desc}]) {\n totalCount\n edges {\n node {\n playedTime\n ...TrackItem_play\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment ScrobbleChart_data on Query {\n chartData: fmTealAlphaFeedPlaysAggregated(groupBy: [{field: playedTime, interval: day}], where: $chartWhere, limit: 90) {\n playedTime\n count\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n }\n}\n" 359 + "text": "query AppQuery(\n $chartWhere: FmTealAlphaFeedPlayWhereInput!\n) {\n ...App_plays\n ...ScrobbleChart_data\n}\n\nfragment App_plays on Query {\n fmTealAlphaFeedPlays(first: 20, sortBy: [{field: playedTime, direction: desc}]) {\n totalCount\n edges {\n node {\n playedTime\n ...TrackItem_play\n id\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment ScrobbleChart_data on Query {\n chartData: fmTealAlphaFeedPlaysAggregated(groupBy: [{field: playedTime, interval: day}], where: $chartWhere, limit: 90) {\n playedTime\n count\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists {\n artistName\n artistMbId\n }\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n id\n }\n}\n" 329 360 } 330 361 }; 331 362 })();
+33 -6
src/__generated__/AppSubscription.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<0e4c25e0e4257b2c7042e374f3568241>> 2 + * @generated SignedSource<<f0666e46fa4693a3d7869f9de0266bab>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 36 36 "args": null, 37 37 "kind": "ScalarField", 38 38 "name": "playedTime", 39 + "storageKey": null 40 + }, 41 + v2 = { 42 + "alias": null, 43 + "args": null, 44 + "kind": "ScalarField", 45 + "name": "id", 39 46 "storageKey": null 40 47 }; 41 48 return { ··· 93 100 { 94 101 "alias": null, 95 102 "args": null, 96 - "kind": "ScalarField", 103 + "concreteType": "FmTealAlphaFeedDefsArtist", 104 + "kind": "LinkedField", 97 105 "name": "artists", 106 + "plural": true, 107 + "selections": [ 108 + { 109 + "alias": null, 110 + "args": null, 111 + "kind": "ScalarField", 112 + "name": "artistName", 113 + "storageKey": null 114 + }, 115 + { 116 + "alias": null, 117 + "args": null, 118 + "kind": "ScalarField", 119 + "name": "artistMbId", 120 + "storageKey": null 121 + } 122 + ], 98 123 "storageKey": null 99 124 }, 100 125 { ··· 139 164 "kind": "ScalarField", 140 165 "name": "displayName", 141 166 "storageKey": null 142 - } 167 + }, 168 + (v2/*: any*/) 143 169 ], 144 170 "storageKey": null 145 - } 171 + }, 172 + (v2/*: any*/) 146 173 ], 147 174 "storageKey": null 148 175 } 149 176 ] 150 177 }, 151 178 "params": { 152 - "cacheID": "d2419c5bef1474c19f75ee5b97062013", 179 + "cacheID": "f547109f04ecd8d1a8679dbf0b7f98b4", 153 180 "id": null, 154 181 "metadata": {}, 155 182 "name": "AppSubscription", 156 183 "operationKind": "subscription", 157 - "text": "subscription AppSubscription {\n fmTealAlphaFeedPlayCreated {\n uri\n playedTime\n ...TrackItem_play\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n }\n}\n" 184 + "text": "subscription AppSubscription {\n fmTealAlphaFeedPlayCreated {\n uri\n playedTime\n ...TrackItem_play\n id\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists {\n artistName\n artistMbId\n }\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n id\n }\n}\n" 158 185 } 159 186 }; 160 187 })();
+36 -5
src/__generated__/ProfilePaginationQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<05e7a8d8804cbbe062ff7dce37522623>> 2 + * @generated SignedSource<<ebf74750639e18cbf2425bae6cf23f69>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 12 12 import { FragmentRefs } from "relay-runtime"; 13 13 export type FmTealAlphaFeedPlayWhereInput = { 14 14 actorHandle?: StringFilter | null | undefined; 15 + and?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 15 16 artistMbIds?: StringFilter | null | undefined; 16 17 artistNames?: StringFilter | null | undefined; 17 18 artists?: StringFilter | null | undefined; ··· 21 22 duration?: IntFilter | null | undefined; 22 23 indexedAt?: DateTimeFilter | null | undefined; 23 24 isrc?: StringFilter | null | undefined; 25 + json?: StringFilter | null | undefined; 24 26 musicServiceBaseDomain?: StringFilter | null | undefined; 27 + or?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 25 28 originUrl?: StringFilter | null | undefined; 26 29 playedTime?: StringFilter | null | undefined; 27 30 recordingMbId?: StringFilter | null | undefined; ··· 42 45 export type StringFilter = { 43 46 contains?: string | null | undefined; 44 47 eq?: string | null | undefined; 48 + fuzzy?: string | null | undefined; 45 49 gt?: string | null | undefined; 46 50 gte?: string | null | undefined; 47 51 in?: ReadonlyArray<string | null | undefined> | null | undefined; ··· 114 118 ] 115 119 }, 116 120 (v1/*: any*/) 117 - ]; 121 + ], 122 + v3 = { 123 + "alias": null, 124 + "args": null, 125 + "kind": "ScalarField", 126 + "name": "id", 127 + "storageKey": null 128 + }; 118 129 return { 119 130 "fragment": { 120 131 "argumentDefinitions": (v0/*: any*/), ··· 197 208 { 198 209 "alias": null, 199 210 "args": null, 200 - "kind": "ScalarField", 211 + "concreteType": "FmTealAlphaFeedDefsArtist", 212 + "kind": "LinkedField", 201 213 "name": "artists", 214 + "plural": true, 215 + "selections": [ 216 + { 217 + "alias": null, 218 + "args": null, 219 + "kind": "ScalarField", 220 + "name": "artistName", 221 + "storageKey": null 222 + }, 223 + { 224 + "alias": null, 225 + "args": null, 226 + "kind": "ScalarField", 227 + "name": "artistMbId", 228 + "storageKey": null 229 + } 230 + ], 202 231 "storageKey": null 203 232 }, 204 233 { ··· 244 273 "name": "displayName", 245 274 "storageKey": null 246 275 }, 276 + (v3/*: any*/), 247 277 { 248 278 "alias": null, 249 279 "args": null, ··· 278 308 ], 279 309 "storageKey": null 280 310 }, 311 + (v3/*: any*/), 281 312 { 282 313 "alias": null, 283 314 "args": null, ··· 341 372 ] 342 373 }, 343 374 "params": { 344 - "cacheID": "72ce84bf8cc8ac016e19ca462a2f7b70", 375 + "cacheID": "776562076929c2efa168256be3868659", 345 376 "id": null, 346 377 "metadata": {}, 347 378 "name": "ProfilePaginationQuery", 348 379 "operationKind": "query", 349 - "text": "query ProfilePaginationQuery(\n $count: Int = 20\n $cursor: String\n $where: FmTealAlphaFeedPlayWhereInput!\n) {\n ...Profile_plays_mjR8k\n}\n\nfragment Profile_plays_mjR8k on Query {\n fmTealAlphaFeedPlays(first: $count, after: $cursor, sortBy: [{field: playedTime, direction: desc}], where: $where) {\n totalCount\n edges {\n node {\n ...TrackItem_play\n actorHandle\n appBskyActorProfile {\n displayName\n description\n avatar {\n url(preset: \"avatar\")\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n }\n}\n" 380 + "text": "query ProfilePaginationQuery(\n $count: Int = 20\n $cursor: String\n $where: FmTealAlphaFeedPlayWhereInput!\n) {\n ...Profile_plays_mjR8k\n}\n\nfragment Profile_plays_mjR8k on Query {\n fmTealAlphaFeedPlays(first: $count, after: $cursor, sortBy: [{field: playedTime, direction: desc}], where: $where) {\n totalCount\n edges {\n node {\n ...TrackItem_play\n actorHandle\n appBskyActorProfile {\n displayName\n description\n avatar {\n url(preset: \"avatar\")\n }\n id\n }\n id\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists {\n artistName\n artistMbId\n }\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n id\n }\n}\n" 350 381 } 351 382 }; 352 383 })();
+35 -4
src/__generated__/ProfileQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<8d62f515b7652094345304e43124aa72>> 2 + * @generated SignedSource<<0e53ec9fb8aaac689644785adae05957>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 12 12 import { FragmentRefs } from "relay-runtime"; 13 13 export type FmTealAlphaFeedPlayWhereInput = { 14 14 actorHandle?: StringFilter | null | undefined; 15 + and?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 15 16 artistMbIds?: StringFilter | null | undefined; 16 17 artistNames?: StringFilter | null | undefined; 17 18 artists?: StringFilter | null | undefined; ··· 21 22 duration?: IntFilter | null | undefined; 22 23 indexedAt?: DateTimeFilter | null | undefined; 23 24 isrc?: StringFilter | null | undefined; 25 + json?: StringFilter | null | undefined; 24 26 musicServiceBaseDomain?: StringFilter | null | undefined; 27 + or?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 25 28 originUrl?: StringFilter | null | undefined; 26 29 playedTime?: StringFilter | null | undefined; 27 30 recordingMbId?: StringFilter | null | undefined; ··· 42 45 export type StringFilter = { 43 46 contains?: string | null | undefined; 44 47 eq?: string | null | undefined; 48 + fuzzy?: string | null | undefined; 45 49 gt?: string | null | undefined; 46 50 gte?: string | null | undefined; 47 51 in?: ReadonlyArray<string | null | undefined> | null | undefined; ··· 108 112 "kind": "ScalarField", 109 113 "name": "playedTime", 110 114 "storageKey": null 115 + }, 116 + v5 = { 117 + "alias": null, 118 + "args": null, 119 + "kind": "ScalarField", 120 + "name": "id", 121 + "storageKey": null 111 122 }; 112 123 return { 113 124 "fragment": { ··· 186 197 { 187 198 "alias": null, 188 199 "args": null, 189 - "kind": "ScalarField", 200 + "concreteType": "FmTealAlphaFeedDefsArtist", 201 + "kind": "LinkedField", 190 202 "name": "artists", 203 + "plural": true, 204 + "selections": [ 205 + { 206 + "alias": null, 207 + "args": null, 208 + "kind": "ScalarField", 209 + "name": "artistName", 210 + "storageKey": null 211 + }, 212 + { 213 + "alias": null, 214 + "args": null, 215 + "kind": "ScalarField", 216 + "name": "artistMbId", 217 + "storageKey": null 218 + } 219 + ], 191 220 "storageKey": null 192 221 }, 193 222 { ··· 233 262 "name": "displayName", 234 263 "storageKey": null 235 264 }, 265 + (v5/*: any*/), 236 266 { 237 267 "alias": null, 238 268 "args": null, ··· 267 297 ], 268 298 "storageKey": null 269 299 }, 300 + (v5/*: any*/), 270 301 { 271 302 "alias": null, 272 303 "args": null, ··· 370 401 ] 371 402 }, 372 403 "params": { 373 - "cacheID": "083f03714f183a8e68ff0a6d15f0d757", 404 + "cacheID": "6555ddce48917a1e1a522f5b4800192b", 374 405 "id": null, 375 406 "metadata": {}, 376 407 "name": "ProfileQuery", 377 408 "operationKind": "query", 378 - "text": "query ProfileQuery(\n $where: FmTealAlphaFeedPlayWhereInput!\n $chartWhere: FmTealAlphaFeedPlayWhereInput!\n) {\n ...Profile_plays_3FC4Qo\n ...ScrobbleChart_data\n}\n\nfragment Profile_plays_3FC4Qo on Query {\n fmTealAlphaFeedPlays(first: 20, sortBy: [{field: playedTime, direction: desc}], where: $where) {\n totalCount\n edges {\n node {\n ...TrackItem_play\n actorHandle\n appBskyActorProfile {\n displayName\n description\n avatar {\n url(preset: \"avatar\")\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment ScrobbleChart_data on Query {\n chartData: fmTealAlphaFeedPlaysAggregated(groupBy: [{field: playedTime, interval: day}], where: $chartWhere, limit: 90) {\n playedTime\n count\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n }\n}\n" 409 + "text": "query ProfileQuery(\n $where: FmTealAlphaFeedPlayWhereInput!\n $chartWhere: FmTealAlphaFeedPlayWhereInput!\n) {\n ...Profile_plays_3FC4Qo\n ...ScrobbleChart_data\n}\n\nfragment Profile_plays_3FC4Qo on Query {\n fmTealAlphaFeedPlays(first: 20, sortBy: [{field: playedTime, direction: desc}], where: $where) {\n totalCount\n edges {\n node {\n ...TrackItem_play\n actorHandle\n appBskyActorProfile {\n displayName\n description\n avatar {\n url(preset: \"avatar\")\n }\n id\n }\n id\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment ScrobbleChart_data on Query {\n chartData: fmTealAlphaFeedPlaysAggregated(groupBy: [{field: playedTime, interval: day}], where: $chartWhere, limit: 90) {\n playedTime\n count\n }\n}\n\nfragment TrackItem_play on FmTealAlphaFeedPlay {\n trackName\n playedTime\n artists {\n artistName\n artistMbId\n }\n releaseName\n releaseMbId\n actorHandle\n musicServiceBaseDomain\n appBskyActorProfile {\n displayName\n id\n }\n}\n" 379 410 } 380 411 }; 381 412 })();
+5 -1
src/__generated__/TopAlbumsQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<ba0a977fd251b8099185f84ffca5fe7f>> 2 + * @generated SignedSource<<5b4069c82e72c33b75aaff1d16f1421f>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 11 11 import { ConcreteRequest } from 'relay-runtime'; 12 12 export type FmTealAlphaFeedPlayWhereInput = { 13 13 actorHandle?: StringFilter | null | undefined; 14 + and?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 14 15 artistMbIds?: StringFilter | null | undefined; 15 16 artistNames?: StringFilter | null | undefined; 16 17 artists?: StringFilter | null | undefined; ··· 20 21 duration?: IntFilter | null | undefined; 21 22 indexedAt?: DateTimeFilter | null | undefined; 22 23 isrc?: StringFilter | null | undefined; 24 + json?: StringFilter | null | undefined; 23 25 musicServiceBaseDomain?: StringFilter | null | undefined; 26 + or?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 24 27 originUrl?: StringFilter | null | undefined; 25 28 playedTime?: StringFilter | null | undefined; 26 29 recordingMbId?: StringFilter | null | undefined; ··· 41 44 export type StringFilter = { 42 45 contains?: string | null | undefined; 43 46 eq?: string | null | undefined; 47 + fuzzy?: string | null | undefined; 44 48 gt?: string | null | undefined; 45 49 gte?: string | null | undefined; 46 50 in?: ReadonlyArray<string | null | undefined> | null | undefined;
+5 -1
src/__generated__/TopTracksQuery.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<d82ad2bc23a12ef33ba6bce1df9620f3>> 2 + * @generated SignedSource<<28bfcfbaf324e20bbfc524afcc9ed549>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 11 11 import { ConcreteRequest } from 'relay-runtime'; 12 12 export type FmTealAlphaFeedPlayWhereInput = { 13 13 actorHandle?: StringFilter | null | undefined; 14 + and?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 14 15 artistMbIds?: StringFilter | null | undefined; 15 16 artistNames?: StringFilter | null | undefined; 16 17 artists?: StringFilter | null | undefined; ··· 20 21 duration?: IntFilter | null | undefined; 21 22 indexedAt?: DateTimeFilter | null | undefined; 22 23 isrc?: StringFilter | null | undefined; 24 + json?: StringFilter | null | undefined; 23 25 musicServiceBaseDomain?: StringFilter | null | undefined; 26 + or?: ReadonlyArray<FmTealAlphaFeedPlayWhereInput | null | undefined> | null | undefined; 24 27 originUrl?: StringFilter | null | undefined; 25 28 playedTime?: StringFilter | null | undefined; 26 29 recordingMbId?: StringFilter | null | undefined; ··· 41 44 export type StringFilter = { 42 45 contains?: string | null | undefined; 43 46 eq?: string | null | undefined; 47 + fuzzy?: string | null | undefined; 44 48 gt?: string | null | undefined; 45 49 gte?: string | null | undefined; 46 50 in?: ReadonlyArray<string | null | undefined> | null | undefined;
+25 -4
src/__generated__/TrackItem_play.graphql.ts
··· 1 1 /** 2 - * @generated SignedSource<<8d4b2dad137cc86578e0230225cde09f>> 2 + * @generated SignedSource<<b5b4d3bdca427eb13381e978bf98d7b9>> 3 3 * @lightSyntaxTransform 4 4 * @nogrep 5 5 */ ··· 15 15 readonly appBskyActorProfile: { 16 16 readonly displayName: string | null | undefined; 17 17 } | null | undefined; 18 - readonly artists: any | null | undefined; 18 + readonly artists: ReadonlyArray<{ 19 + readonly artistMbId: string | null | undefined; 20 + readonly artistName: string | null | undefined; 21 + } | null | undefined> | null | undefined; 19 22 readonly musicServiceBaseDomain: string | null | undefined; 20 23 readonly playedTime: string | null | undefined; 21 24 readonly releaseMbId: string | null | undefined; ··· 51 54 { 52 55 "alias": null, 53 56 "args": null, 54 - "kind": "ScalarField", 57 + "concreteType": "FmTealAlphaFeedDefsArtist", 58 + "kind": "LinkedField", 55 59 "name": "artists", 60 + "plural": true, 61 + "selections": [ 62 + { 63 + "alias": null, 64 + "args": null, 65 + "kind": "ScalarField", 66 + "name": "artistName", 67 + "storageKey": null 68 + }, 69 + { 70 + "alias": null, 71 + "args": null, 72 + "kind": "ScalarField", 73 + "name": "artistMbId", 74 + "storageKey": null 75 + } 76 + ], 56 77 "storageKey": null 57 78 }, 58 79 { ··· 106 127 "abstractKey": null 107 128 }; 108 129 109 - (node as any).hash = "ff1bb5f1d370a2aa9ee45a6db4320f83"; 130 + (node as any).hash = "9a70dada54e50e27bdd19183f1b16e35"; 110 131 111 132 export default node;