Compare commits

..

19 Commits

Author SHA1 Message Date
31f9852f4b Add clientUploadStatus to VideoCardFields stream fragment
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Lets the feed/session card distinguish camera/bridge recordings
(clientUploadStatus UPLOAD_DISABLED, phone never uploads) from phone
uploads, so it can stop showing 'UPLOAD PAUSED' for recordings.

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

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

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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 16:59:15 -07:00
0b6ac787d8 Merge pull request 'Camera claim flow: lease end/extend, claim preferences, inUse' (#282) from dean/camera-claim-flow into master
Reviewed-on: #282
2026-07-05 18:55:01 +00:00
Dean Wenstrand
ac479dc7e4 Camera claim flow: lease end/extend, claim preferences, inUse
All checks were successful
Tests / Tests (pull_request) Successful in 25s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 18:44:01 -07:00
c6a754cc2d Merge pull request 'Add tableSize/pocketSize to pool hall camera schema' (#281) from dean/camera-table-dimensions into master
Reviewed-on: #281
2026-07-05 00:23:56 +00:00
7 changed files with 782 additions and 6 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -7,6 +7,8 @@ query getDeployedConfig {
minimumAllowedAppVersion minimumAllowedAppVersion
subscriptionGatingEnabled subscriptionGatingEnabled
quotaEnforcementEnabled quotaEnforcementEnabled
storageLimitEnforcementEnabled
capabilityEnforcementEnabled
bannerMessages { bannerMessages {
color color
dismissible dismissible

View File

@@ -44,6 +44,7 @@ fragment VideoCardFields on VideoGQL {
streamSegmentType streamSegmentType
isCompleted isCompleted
lastSegmentUploadedAt lastSegmentUploadedAt
clientUploadStatus
} }
tableSize tableSize
pocketSize pocketSize

View File

@@ -49,6 +49,20 @@ query GetAvailableSubscriptionOptions {
proMonthlyProductId proMonthlyProductId
productIds productIds
} }
tierOptions {
tierName
tierDisplayName
billingInterval
platform
isConfigured
isAvailable
stripeProductId
stripePriceId
appleProductId
currency
unitAmount
recurringIntervalCount
}
} }
} }
@@ -67,6 +81,37 @@ query GetSubscriptionStatus {
} }
} }
query GetResolvedTier {
getResolvedTier {
tierName
tierDisplayName
hasActiveSubscription
entitlementSource
entitlementStatus
entitlementStartsAt
entitlementEndsAt
capabilities
}
}
query GetStorageStatus {
getStorageStatus {
userId
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
isUnlimited
policyConfigured
remainingStorageBytes
storageUsageRatio
isNearLimit
isOverLimit
usageCalculated
usageSource
lastCalculatedAt
}
}
query GetAppleAppAccountToken { query GetAppleAppAccountToken {
getAppleAppAccountToken getAppleAppAccountToken
} }

View File

@@ -2,6 +2,8 @@ fragment PoolHallFields on PoolHall {
id id
name name
address address
city
state
latitude latitude
longitude longitude
timezone timezone
@@ -19,6 +21,10 @@ fragment PoolHallCameraFields on PoolHallCamera {
status status
tableSize tableSize
pocketSize pocketSize
allowsPrivateVideos
claimTermsText
claimTermsVersion
inUse
lastPublishedAt lastPublishedAt
lastUnpublishedAt lastUnpublishedAt
createdAt createdAt
@@ -50,6 +56,7 @@ fragment CameraClaimSessionFields on CameraClaimSession {
detectedAt detectedAt
failedAt failedAt
failureReason failureReason
agreedTermsVersion
createdAt createdAt
updatedAt updatedAt
camera { camera {
@@ -141,8 +148,22 @@ mutation RotatePoolHallCameraStreamKey($cameraId: ID!) {
} }
} }
mutation CreateCameraClaimSession($cameraId: ID!) { mutation CreateCameraClaimSession(
createCameraClaimSession(cameraId: $cameraId) { $cameraId: ID!
$durationMinutes: Int
$videoName: String
$videoPrivate: Boolean
$agreedTermsVersion: Int
$tags: [VideoTagInput!]
) {
createCameraClaimSession(
cameraId: $cameraId
durationMinutes: $durationMinutes
videoName: $videoName
videoPrivate: $videoPrivate
agreedTermsVersion: $agreedTermsVersion
tags: $tags
) {
...CameraClaimSessionFields ...CameraClaimSessionFields
} }
} }
@@ -152,3 +173,15 @@ mutation CancelCameraClaimSession($claimSessionId: ID!) {
...CameraClaimSessionFields ...CameraClaimSessionFields
} }
} }
mutation EndCameraLease($leaseId: ID!) {
endCameraLease(leaseId: $leaseId) {
...CameraLeaseFields
}
}
mutation ExtendCameraLease($leaseId: ID!, $additionalMinutes: Int! = 60) {
extendCameraLease(leaseId: $leaseId, additionalMinutes: $additionalMinutes) {
...CameraLeaseFields
}
}

View File

@@ -37,6 +37,13 @@ mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
} }
} }
} }
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
} }
} }
} }

View File

@@ -892,6 +892,8 @@ type PoolHall {
id: ID! id: ID!
name: String! name: String!
address: String address: String
city: String
state: String
latitude: Float latitude: Float
longitude: Float longitude: Float
timezone: String timezone: String
@@ -909,10 +911,14 @@ type PoolHallCamera {
status: String! status: String!
tableSize: Float tableSize: Float
pocketSize: Float pocketSize: Float
allowsPrivateVideos: Boolean!
claimTermsText: String
claimTermsVersion: Int
lastPublishedAt: DateTime lastPublishedAt: DateTime
lastUnpublishedAt: DateTime lastUnpublishedAt: DateTime
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime! updatedAt: DateTime!
inUse: Boolean!
poolHall: PoolHall! poolHall: PoolHall!
} }
@@ -926,6 +932,7 @@ type CameraClaimSession {
detectedAt: DateTime detectedAt: DateTime
failedAt: DateTime failedAt: DateTime
failureReason: String failureReason: String
agreedTermsVersion: Int
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime! updatedAt: DateTime!
camera: PoolHallCamera! camera: PoolHallCamera!
@@ -1161,6 +1168,7 @@ type StripeSubscriptionOptionsGQL {
products: [StripeProductGQL!]! products: [StripeProductGQL!]!
trialPeriodDays: Int trialPeriodDays: Int
appleIap: AppleIapSubscriptionOptionsGQL! appleIap: AppleIapSubscriptionOptionsGQL!
tierOptions: [SubscriptionTierPurchaseOptionGQL!]!
} }
type StripeProductGQL { type StripeProductGQL {
@@ -1187,6 +1195,21 @@ type AppleIapSubscriptionOptionsGQL {
productIds: [String!]! productIds: [String!]!
} }
type SubscriptionTierPurchaseOptionGQL {
tierName: String!
tierDisplayName: String!
billingInterval: String!
platform: String!
isConfigured: Boolean!
isAvailable: Boolean!
stripeProductId: String
stripePriceId: String
appleProductId: String
currency: String
unitAmount: Int
recurringIntervalCount: Int
}
type UserSubscriptionStatusGQL { type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean! hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum entitlementSource: EntitlementSourceTypeEnum
@@ -1403,8 +1426,17 @@ type Mutation {
): PoolHallCameraStreamCredentials! ): PoolHallCameraStreamCredentials!
updatePoolHallCamera(input: UpdatePoolHallCameraInput!): PoolHallCamera! updatePoolHallCamera(input: UpdatePoolHallCameraInput!): PoolHallCamera!
rotatePoolHallCameraStreamKey(cameraId: ID!): PoolHallCameraStreamCredentials! rotatePoolHallCameraStreamKey(cameraId: ID!): PoolHallCameraStreamCredentials!
createCameraClaimSession(cameraId: ID!): CameraClaimSession! createCameraClaimSession(
cameraId: ID!
durationMinutes: Int = null
videoName: String = null
videoPrivate: Boolean = null
agreedTermsVersion: Int = null
tags: [VideoTagInput!] = null
): CameraClaimSession!
cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession! cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession!
endCameraLease(leaseId: ID!): CameraLease!
extendCameraLease(leaseId: ID!, additionalMinutes: Int! = 60): CameraLease!
finalizePlayerAssignments( finalizePlayerAssignments(
input: FinalizePlayerAssignmentsInput! input: FinalizePlayerAssignmentsInput!
): [PlayerClusterGQL!]! ): [PlayerClusterGQL!]!
@@ -1487,6 +1519,8 @@ enum ReportReasonEnum {
input CreatePoolHallInput { input CreatePoolHallInput {
name: String! name: String!
address: String = null address: String = null
city: String = null
state: String = null
latitude: Float = null latitude: Float = null
longitude: Float = null longitude: Float = null
timezone: String = null timezone: String = null
@@ -1496,6 +1530,8 @@ input UpdatePoolHallInput {
id: ID! id: ID!
name: String = null name: String = null
address: String = null address: String = null
city: String = null
state: String = null
latitude: Float = null latitude: Float = null
longitude: Float = null longitude: Float = null
timezone: String = null timezone: String = null
@@ -1515,6 +1551,8 @@ input CreatePoolHallCameraInput {
streamPath: String = null streamPath: String = null
tableSize: Float = null tableSize: Float = null
pocketSize: Float = null pocketSize: Float = null
allowsPrivateVideos: Boolean = null
claimTermsText: String = null
} }
input UpdatePoolHallCameraInput { input UpdatePoolHallCameraInput {
@@ -1524,6 +1562,8 @@ input UpdatePoolHallCameraInput {
status: String = null status: String = null
tableSize: Float = null tableSize: Float = null
pocketSize: Float = null pocketSize: Float = null
allowsPrivateVideos: Boolean = null
claimTermsText: String = null
} }
input FinalizePlayerAssignmentsInput { input FinalizePlayerAssignmentsInput {