Compare commits

..

7 Commits

Author SHA1 Message Date
e89cabf33e add firstActivityAt field 2026-05-12 10:10:16 -07:00
c586bdf1a6 Merge pull request 'Add username + profileImageUri to PlayerClusterGQL' (#246) from dean/player-cluster-username into master
Reviewed-on: #246
2026-05-12 00:27:06 +00:00
Dean Wenstrand
9250e4c639 Add username + profileImageUri to PlayerClusterGQL
All checks were successful
Tests / Tests (pull_request) Successful in 9s
The labeling UI was falling back to "user N" for any assigned cluster
whose user wasn't the video owner — e.g. an admin re-labels a video
they don't own. With the resolver now resolving usernames for every
confirmed cluster, the FE can render real names regardless of who's
viewing.

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

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:34:25 -07:00
239a143554 Merge pull request 'Regenerate schema + add longestRun to PlayerSummaryFields' (#244) from dean/player-summaries-longest-run-types into master
Reviewed-on: #244
2026-05-11 20:29:39 +00:00
f42579076e Merge pull request 'Add score to PlayerSummaryFields + PlayerClusterFields fragments' (#243) from dean/video-match-score-types into master
Reviewed-on: #243
2026-05-11 17:43:43 +00:00
4 changed files with 46 additions and 0 deletions

View File

@@ -2701,9 +2701,11 @@ export type PlayerClusterGql = {
clusterId: Scalars["Int"]["output"];
confirmed: Scalars["Boolean"]["output"];
nShots: Scalars["Int"]["output"];
profileImageUri?: Maybe<Scalars["String"]["output"]>;
score?: Maybe<Scalars["Int"]["output"]>;
shots: Array<PlayerClusterShotGql>;
userId?: Maybe<Scalars["Int"]["output"]>;
username?: Maybe<Scalars["String"]["output"]>;
videoId: Scalars["Int"]["output"];
};
@@ -2722,6 +2724,8 @@ export type PlayerClusterShotGql = {
export type PlayerSummaryGql = {
__typename?: "PlayerSummaryGQL";
averageDifficulty?: Maybe<Scalars["Float"]["output"]>;
averageTimeBetweenShots?: Maybe<Scalars["Float"]["output"]>;
clusterId: Scalars["Int"]["output"];
longestRun: Scalars["Int"]["output"];
makePercentage: Scalars["Float"]["output"];
@@ -3470,6 +3474,8 @@ export type UserGql = {
createdAt?: Maybe<Scalars["DateTime"]["output"]>;
fargoRating?: Maybe<Scalars["Int"]["output"]>;
firebaseUid?: Maybe<Scalars["String"]["output"]>;
/** Earliest visible non-deleted profile video timestamp with real shot data. */
firstActivityAt?: Maybe<Scalars["DateTime"]["output"]>;
followers?: Maybe<Array<UserGql>>;
following?: Maybe<Array<UserGql>>;
id: Scalars["Int"]["output"];
@@ -4208,6 +4214,8 @@ export type GetFeedQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
@@ -4310,6 +4318,8 @@ export type VideoCardFieldsFragment = {
makePercentage: number;
score?: number | null;
longestRun: number;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
@@ -4426,6 +4436,8 @@ export type GetVideoFeedQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
@@ -5009,6 +5021,8 @@ export type PlayerSummaryFieldsFragment = {
makePercentage: number;
score?: number | null;
longestRun: number;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
};
export type PlayerClusterShotFieldsFragment = {
@@ -5030,6 +5044,8 @@ export type PlayerClusterFieldsFragment = {
clusterId: number;
nShots: number;
userId?: number | null;
username?: string | null;
profileImageUri?: string | null;
confirmed: boolean;
score?: number | null;
shots: Array<{
@@ -5058,6 +5074,8 @@ export type VideoPlayerClustersQuery = {
clusterId: number;
nShots: number;
userId?: number | null;
username?: string | null;
profileImageUri?: string | null;
confirmed: boolean;
score?: number | null;
shots: Array<{
@@ -5087,6 +5105,8 @@ export type FinalizePlayerAssignmentsMutation = {
clusterId: number;
nShots: number;
userId?: number | null;
username?: string | null;
profileImageUri?: string | null;
confirmed: boolean;
score?: number | null;
shots: Array<{
@@ -5655,6 +5675,7 @@ export type EditProfileImageUriMutation = {
fargoRating?: number | null;
activeVideoId?: number | null;
createdAt?: any | null;
firstActivityAt?: any | null;
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
@@ -5675,6 +5696,7 @@ export type GetLoggedInUserQuery = {
fargoRating?: number | null;
activeVideoId?: number | null;
createdAt?: any | null;
firstActivityAt?: any | null;
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
@@ -5697,6 +5719,7 @@ export type GetUserQuery = {
fargoRating?: number | null;
activeVideoId?: number | null;
createdAt?: any | null;
firstActivityAt?: any | null;
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
@@ -5875,6 +5898,7 @@ export type UserFragmentFragment = {
fargoRating?: number | null;
activeVideoId?: number | null;
createdAt?: any | null;
firstActivityAt?: any | null;
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
@@ -5898,6 +5922,7 @@ export type GetUsersMatchingQuery = {
fargoRating?: number | null;
activeVideoId?: number | null;
createdAt?: any | null;
firstActivityAt?: any | null;
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
@@ -6052,6 +6077,8 @@ export type GetVideoDetailsQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
};
};
@@ -6722,6 +6749,8 @@ export const PlayerSummaryFieldsFragmentDoc = gql`
makePercentage
score
longestRun
averageDifficulty
averageTimeBetweenShots
}
`;
export const UserSocialsFieldsFragmentDoc = gql`
@@ -6860,6 +6889,8 @@ export const PlayerClusterFieldsFragmentDoc = gql`
clusterId
nShots
userId
username
profileImageUri
confirmed
score
shots {
@@ -6945,6 +6976,7 @@ export const UserFragmentFragmentDoc = gql`
fargoRating
activeVideoId
createdAt
firstActivityAt
updatedAt
videosPrivateByDefault
agreesToMarketing

View File

@@ -9,6 +9,8 @@ fragment PlayerSummaryFields on PlayerSummaryGQL {
makePercentage
score
longestRun
averageDifficulty
averageTimeBetweenShots
}
fragment PlayerClusterShotFields on PlayerClusterShotGQL {
@@ -28,6 +30,8 @@ fragment PlayerClusterFields on PlayerClusterGQL {
clusterId
nShots
userId
username
profileImageUri
confirmed
score
shots {

View File

@@ -176,6 +176,7 @@ fragment UserFragment on UserGQL {
fargoRating
activeVideoId
createdAt
firstActivityAt
updatedAt
videosPrivateByDefault
agreesToMarketing

View File

@@ -351,6 +351,11 @@ type UserGQL {
agreesToMarketing: Boolean
following: [UserGQL!]
followers: [UserGQL!]
"""
Earliest visible non-deleted profile video timestamp with real shot data.
"""
firstActivityAt: DateTime
isFollowedByCurrentUser: Boolean
}
@@ -677,6 +682,8 @@ type PlayerSummaryGQL {
makePercentage: Float!
score: Int
longestRun: Int!
averageDifficulty: Float
averageTimeBetweenShots: Float
}
type DeployedConfigGQL {
@@ -880,6 +887,8 @@ type PlayerClusterGQL {
clusterId: Int!
nShots: Int!
userId: Int
username: String
profileImageUri: String
confirmed: Boolean!
score: Int
shots: [PlayerClusterShotGQL!]!