Compare commits

..

11 Commits

Author SHA1 Message Date
Dean Wenstrand
998be2ed3b Add bio field to user (UserFragment + editUser)
Expose the new UserGQL.bio field in UserFragment and let the editUser
mutation set it; regenerated schema + codegen.
2026-06-18 12:45:34 -07:00
84524d165d Merge pull request 'Add followingCount to GetVideoFeed payload' (#261) from dean/feed-following-count into master
Reviewed-on: #261
2026-06-16 23:51:38 +00:00
Dean Wenstrand
f4c5fcedd6 Add followingCount to GetVideoFeed payload
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Surfaces how many leading feed videos come from followed users so the
client can place the 'Trending' section divider in the blended home feed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 16:46:21 -07:00
07ca121a3e Merge pull request 'Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields' (#259) from dean/player-spin-types into master
Reviewed-on: #259
2026-06-16 22:24:19 +00:00
Dean Wenstrand
66fb4d3dcc Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-16 14:36:56 -07:00
5293576947 Merge pull request 'Add runLengths to PlayerSummaryFields (per-player run distribution)' (#258) from dean/player-run-lengths into master
Reviewed-on: #258
2026-06-16 20:57:00 +00:00
655209e1c6 Merge pull request 'Add Apple IAP subscription options schema' (#256) from loewy/apple-iap-product-config into master
Reviewed-on: #256
2026-06-16 18:10:00 +00:00
c9576cf405 Add Apple IAP subscription options schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 10:47:07 -07:00
0c0cd7a7bb Merge pull request 'dean/my-drill-runs' (#257) from dean/my-drill-runs into master
Reviewed-on: #257
2026-06-16 04:25:03 +00:00
48b647636e Merge pull request 'Add GetDrillRunLeaderboard query + generated types' (#254) from dean/drill-run-leaderboard into master
Reviewed-on: #254
2026-06-16 00:52:05 +00:00
079e4e8719 Merge pull request 'Add Apple subscription sync schema' (#253) from apple-iap-pr2-backend-schema into master
Reviewed-on: #253
2026-06-12 04:50:36 +00:00
5 changed files with 86 additions and 0 deletions

View File

@@ -326,6 +326,7 @@ export type EditShotReturn = {
export type EditUserInputGql = { export type EditUserInputGql = {
agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>; agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>;
bio?: InputMaybe<Scalars["String"]["input"]>;
fargoRating?: InputMaybe<Scalars["Int"]["input"]>; fargoRating?: InputMaybe<Scalars["Int"]["input"]>;
username?: InputMaybe<Scalars["String"]["input"]>; username?: InputMaybe<Scalars["String"]["input"]>;
videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>; videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>;
@@ -2754,6 +2755,7 @@ export type PlayerSummaryGql = {
representativeFullFrameUrl?: Maybe<Scalars["String"]["output"]>; representativeFullFrameUrl?: Maybe<Scalars["String"]["output"]>;
runLengths: Array<Scalars["Int"]["output"]>; runLengths: Array<Scalars["Int"]["output"]>;
score?: Maybe<Scalars["Int"]["output"]>; score?: Maybe<Scalars["Int"]["output"]>;
spinTypeBreakdown: SpinTypeBreakdownGql;
totalShots: Scalars["Int"]["output"]; totalShots: Scalars["Int"]["output"];
totalShotsMade: Scalars["Int"]["output"]; totalShotsMade: Scalars["Int"]["output"];
userId?: Maybe<Scalars["Int"]["output"]>; userId?: Maybe<Scalars["Int"]["output"]>;
@@ -3345,6 +3347,13 @@ export type ShotsOrderingComponent =
videoId: IntOrdering; videoId: IntOrdering;
}; };
export type SpinTypeBreakdownGql = {
__typename?: "SpinTypeBreakdownGQL";
center: Scalars["Int"]["output"];
draw: Scalars["Int"]["output"];
follow: Scalars["Int"]["output"];
};
export type SpinTypeCountsGql = { export type SpinTypeCountsGql = {
__typename?: "SpinTypeCountsGQL"; __typename?: "SpinTypeCountsGQL";
center: Scalars["Int"]["output"]; center: Scalars["Int"]["output"];
@@ -3547,6 +3556,7 @@ export type UserGql = {
__typename?: "UserGQL"; __typename?: "UserGQL";
activeVideoId?: Maybe<Scalars["Int"]["output"]>; activeVideoId?: Maybe<Scalars["Int"]["output"]>;
agreesToMarketing?: Maybe<Scalars["Boolean"]["output"]>; agreesToMarketing?: Maybe<Scalars["Boolean"]["output"]>;
bio?: Maybe<Scalars["String"]["output"]>;
createdAt?: Maybe<Scalars["DateTime"]["output"]>; createdAt?: Maybe<Scalars["DateTime"]["output"]>;
fargoRating?: Maybe<Scalars["Int"]["output"]>; fargoRating?: Maybe<Scalars["Int"]["output"]>;
firebaseUid?: Maybe<Scalars["String"]["output"]>; firebaseUid?: Maybe<Scalars["String"]["output"]>;
@@ -3671,6 +3681,7 @@ export type VideoGql = {
export type VideoHistoryGql = { export type VideoHistoryGql = {
__typename?: "VideoHistoryGQL"; __typename?: "VideoHistoryGQL";
followingCount: Scalars["Int"]["output"];
hasFollowing: Scalars["Boolean"]["output"]; hasFollowing: Scalars["Boolean"]["output"];
pageInfo: PageInfoGql; pageInfo: PageInfoGql;
videos: Array<VideoGql>; videos: Array<VideoGql>;
@@ -4292,6 +4303,12 @@ export type GetFeedQuery = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -4397,6 +4414,12 @@ export type VideoCardFieldsFragment = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -4488,6 +4511,7 @@ export type GetVideoFeedQuery = {
getFeedVideos: { getFeedVideos: {
__typename?: "VideoHistoryGQL"; __typename?: "VideoHistoryGQL";
hasFollowing: boolean; hasFollowing: boolean;
followingCount: number;
videos: Array<{ videos: Array<{
__typename?: "VideoGQL"; __typename?: "VideoGQL";
id: number; id: number;
@@ -4534,6 +4558,12 @@ export type GetVideoFeedQuery = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -5178,6 +5208,12 @@ export type PlayerSummaryFieldsFragment = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}; };
export type PlayerClusterShotFieldsFragment = { export type PlayerClusterShotFieldsFragment = {
@@ -5860,6 +5896,7 @@ export type EditProfileImageUriMutation = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -5880,6 +5917,7 @@ export type GetLoggedInUserQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -5902,6 +5940,7 @@ export type GetUserQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6091,6 +6130,7 @@ export type EditUserMutationVariables = Exact<{
fargoRating?: InputMaybe<Scalars["Int"]["input"]>; fargoRating?: InputMaybe<Scalars["Int"]["input"]>;
videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>; videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>;
agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>; agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>;
bio?: InputMaybe<Scalars["String"]["input"]>;
}>; }>;
export type EditUserMutation = { export type EditUserMutation = {
@@ -6104,6 +6144,7 @@ export type EditUserMutation = {
updatedAt?: any | null; updatedAt?: any | null;
videosPrivateByDefault?: boolean | null; videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null; agreesToMarketing?: boolean | null;
bio?: string | null;
}; };
}; };
@@ -6121,6 +6162,7 @@ export type UserFragmentFragment = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6144,6 +6186,7 @@ export type GetUsersMatchingQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6304,6 +6347,12 @@ export type GetVideoDetailsQuery = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
}; };
}; };
@@ -6424,6 +6473,12 @@ export type GetVideoCardQuery = {
runLengths: Array<number>; runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -7072,6 +7127,11 @@ export const PlayerSummaryFieldsFragmentDoc = gql`
score score
longestRun longestRun
runLengths runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }
@@ -7306,6 +7366,7 @@ export const UserFragmentFragmentDoc = gql`
username username
isAdmin isAdmin
profileImageUri profileImageUri
bio
fargoRating fargoRating
activeVideoId activeVideoId
createdAt createdAt
@@ -9429,6 +9490,7 @@ export const GetVideoFeedDocument = gql`
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }
${VideoCardFieldsFragmentDoc} ${VideoCardFieldsFragmentDoc}
@@ -13163,6 +13225,7 @@ export const EditUserDocument = gql`
$fargoRating: Int $fargoRating: Int
$videosPrivateByDefault: Boolean $videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean $agreesToMarketing: Boolean
$bio: String
) { ) {
editUser( editUser(
input: { input: {
@@ -13170,6 +13233,7 @@ export const EditUserDocument = gql`
fargoRating: $fargoRating fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing agreesToMarketing: $agreesToMarketing
bio: $bio
} }
) { ) {
id id
@@ -13179,6 +13243,7 @@ export const EditUserDocument = gql`
updatedAt updatedAt
videosPrivateByDefault videosPrivateByDefault
agreesToMarketing agreesToMarketing
bio
} }
} }
`; `;
@@ -13204,6 +13269,7 @@ export type EditUserMutationFn = Apollo.MutationFunction<
* fargoRating: // value for 'fargoRating' * fargoRating: // value for 'fargoRating'
* videosPrivateByDefault: // value for 'videosPrivateByDefault' * videosPrivateByDefault: // value for 'videosPrivateByDefault'
* agreesToMarketing: // value for 'agreesToMarketing' * agreesToMarketing: // value for 'agreesToMarketing'
* bio: // value for 'bio'
* }, * },
* }); * });
*/ */

View File

@@ -146,5 +146,6 @@ query GetVideoFeed(
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }

View File

@@ -10,6 +10,11 @@ fragment PlayerSummaryFields on PlayerSummaryGQL {
score score
longestRun longestRun
runLengths runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }

View File

@@ -177,6 +177,7 @@ mutation editUser(
$fargoRating: Int $fargoRating: Int
$videosPrivateByDefault: Boolean $videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean $agreesToMarketing: Boolean
$bio: String
) { ) {
editUser( editUser(
input: { input: {
@@ -184,6 +185,7 @@ mutation editUser(
fargoRating: $fargoRating fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing agreesToMarketing: $agreesToMarketing
bio: $bio
} }
) { ) {
id id
@@ -193,6 +195,7 @@ mutation editUser(
updatedAt updatedAt
videosPrivateByDefault videosPrivateByDefault
agreesToMarketing agreesToMarketing
bio
} }
} }
@@ -206,6 +209,7 @@ fragment UserFragment on UserGQL {
username username
isAdmin isAdmin
profileImageUri profileImageUri
bio
fargoRating fargoRating
activeVideoId activeVideoId
createdAt createdAt

View File

@@ -356,6 +356,7 @@ type UserGQL {
activeVideoId: Int activeVideoId: Int
stripeCustomerId: String stripeCustomerId: String
profileImageUri: String profileImageUri: String
bio: String
createdAt: DateTime createdAt: DateTime
updatedAt: DateTime updatedAt: DateTime
videosPrivateByDefault: Boolean videosPrivateByDefault: Boolean
@@ -689,10 +690,17 @@ type PlayerSummaryGQL {
score: Int score: Int
longestRun: Int! longestRun: Int!
runLengths: [Int!]! runLengths: [Int!]!
spinTypeBreakdown: SpinTypeBreakdownGQL!
averageDifficulty: Float averageDifficulty: Float
averageTimeBetweenShots: Float averageTimeBetweenShots: Float
} }
type SpinTypeBreakdownGQL {
draw: Int!
center: Int!
follow: Int!
}
type DeployedConfigGQL { type DeployedConfigGQL {
allowNewUsers: Boolean! allowNewUsers: Boolean!
firebase: Boolean! firebase: Boolean!
@@ -725,6 +733,7 @@ type VideoHistoryGQL {
videos: [VideoGQL!]! videos: [VideoGQL!]!
pageInfo: PageInfoGQL! pageInfo: PageInfoGQL!
hasFollowing: Boolean! hasFollowing: Boolean!
followingCount: Int!
} }
type PageInfoGQL { type PageInfoGQL {
@@ -1355,6 +1364,7 @@ input EditUserInputGQL {
fargoRating: Int = null fargoRating: Int = null
videosPrivateByDefault: Boolean = null videosPrivateByDefault: Boolean = null
agreesToMarketing: Boolean = null agreesToMarketing: Boolean = null
bio: String = null
} }
type SyncAppleSubscriptionResultGQL { type SyncAppleSubscriptionResultGQL {