Compare commits

...

13 Commits

Author SHA1 Message Date
d32cd87a60 Merge pull request 'Add subscriptionGating to config operations file' (#200) from loewy/add-sub-gating-to-config-op into master
Reviewed-on: #200
2025-08-27 21:29:16 -06:00
b956cfe0f9 add sub gating to config operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-08-27 19:27:17 -07:00
3f520a0331 Merge pull request 'Add operations for user subscriptions' (#199) from loewy/get-and-cancel-sub-ops into master
Reviewed-on: #199
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2025-08-18 17:42:43 -06:00
a563834269 get user sub status and cancel sub
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-08-14 14:02:36 -07:00
80a5bded47 Merge pull request 'Add getUserSubscriptionStatus' (#198) from loewy/subscription-status-resolvers into master
Reviewed-on: #198
2025-08-14 13:22:33 -06:00
16d8510465 add cancel subscription
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-12 13:14:08 -07:00
9b21ce1e3a get subscription resolvers
All checks were successful
Tests / Tests (pull_request) Successful in 14s
2025-08-11 14:23:46 -07:00
dde4cfd99b Merge pull request 'Add subscriptionGatingEnabled prop to deployed config' (#196) from loewy/add-subscription-gating-enabled into master
Reviewed-on: #196
2025-08-08 16:52:30 -06:00
845fb361b9 Merge branch 'master' into loewy/add-subscription-gating-enabled
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-08 16:49:17 -06:00
9f5fcc066e Merge pull request 'Create subscription operations' (#197) from loewy/create-sub-operations into master
Reviewed-on: #197
2025-08-07 13:06:08 -06:00
dfb0361e12 Merge branch 'master' into loewy/create-sub-operations
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2025-08-07 12:59:54 -06:00
77477d63db add subscriptionGatingEnabled prop to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 31s
2025-07-29 14:28:36 -07:00
a497abd44d create sub operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-07-09 11:31:26 -07:00
4 changed files with 450 additions and 0 deletions

View File

@@ -217,6 +217,7 @@ export type DeployedConfigGql = {
environment: Scalars["String"]["output"];
firebase: Scalars["Boolean"]["output"];
minimumAllowedAppVersion: Scalars["String"]["output"];
subscriptionGatingEnabled: Scalars["Boolean"]["output"];
};
export type DoesNotOwnShotErr = {
@@ -2276,6 +2277,7 @@ export type MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailed
export type Mutation = {
__typename?: "Mutation";
addAnnotationToShot: AddShotAnnotationReturn;
cancelSubscription: UserSubscriptionStatusGql;
commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql;
createSubscription: CreateSubscriptionResultGql;
@@ -2522,6 +2524,7 @@ export type Query = {
getTableState: TableStateGql;
getUser?: Maybe<UserGql>;
getUserRelationshipsMatching: UserRelationshipsResult;
getUserSubscriptionStatus: UserSubscriptionStatusGql;
getUserTags: Array<TagGql>;
getUserVideos: VideoHistoryGql;
getUsernames: Array<Scalars["String"]["output"]>;
@@ -2955,6 +2958,17 @@ export type StripeSubscriptionOptionsGql = {
products: Array<StripeProductGql>;
};
export enum StripeSubscriptionStatusEnum {
Active = "ACTIVE",
Canceled = "CANCELED",
Incomplete = "INCOMPLETE",
IncompleteExpired = "INCOMPLETE_EXPIRED",
PastDue = "PAST_DUE",
Paused = "PAUSED",
Trialing = "TRIALING",
Unpaid = "UNPAID",
}
export type SuccessfulAdd = {
__typename?: "SuccessfulAdd";
value: Scalars["Boolean"]["output"];
@@ -3113,6 +3127,17 @@ export type UserShotCountEntry = {
videos: Scalars["Int"]["output"];
};
export type UserSubscriptionStatusGql = {
__typename?: "UserSubscriptionStatusGQL";
currentPeriodEnd?: Maybe<Scalars["DateTime"]["output"]>;
currentPeriodStart?: Maybe<Scalars["DateTime"]["output"]>;
hasActiveSubscription: Scalars["Boolean"]["output"];
stripePriceId?: Maybe<Scalars["String"]["output"]>;
stripeSubscriptionId?: Maybe<Scalars["String"]["output"]>;
subscriptionStatus?: Maybe<StripeSubscriptionStatusEnum>;
validUntil?: Maybe<Scalars["DateTime"]["output"]>;
};
export type VideoFeedInputGql =
| {
allUsers: Scalars["Boolean"]["input"];
@@ -3319,6 +3344,7 @@ export type GetDeployedConfigQuery = {
environment: string;
firebase: boolean;
minimumAllowedAppVersion: string;
subscriptionGatingEnabled: boolean;
bannerMessages: Array<{
__typename?: "BannerGQL";
color: string;
@@ -3896,6 +3922,83 @@ export type EnsureStripeCustomerExistsMutation = {
};
};
export type CreateSubscriptionMutationVariables = Exact<{
priceId: Scalars["String"]["input"];
}>;
export type CreateSubscriptionMutation = {
__typename?: "Mutation";
createSubscription: {
__typename?: "CreateSubscriptionResultGQL";
checkoutUrl: string;
sessionId: string;
};
};
export type GetAvailableSubscriptionOptionsQueryVariables = Exact<{
[key: string]: never;
}>;
export type GetAvailableSubscriptionOptionsQuery = {
__typename?: "Query";
getAvailableSubscriptionOptions: {
__typename?: "StripeSubscriptionOptionsGQL";
products: Array<{
__typename?: "StripeProductGQL";
id: string;
name: string;
description?: string | null;
active: boolean;
prices: Array<{
__typename?: "StripePriceGQL";
id: string;
currency: string;
unitAmount?: number | null;
recurringInterval?: string | null;
recurringIntervalCount?: number | null;
type: string;
active: boolean;
}>;
}>;
};
};
export type GetSubscriptionStatusQueryVariables = Exact<{
[key: string]: never;
}>;
export type GetSubscriptionStatusQuery = {
__typename?: "Query";
getUserSubscriptionStatus: {
__typename?: "UserSubscriptionStatusGQL";
hasActiveSubscription: boolean;
subscriptionStatus?: StripeSubscriptionStatusEnum | null;
currentPeriodStart?: any | null;
currentPeriodEnd?: any | null;
validUntil?: any | null;
stripePriceId?: string | null;
stripeSubscriptionId?: string | null;
};
};
export type CancelSubscriptionMutationVariables = Exact<{
[key: string]: never;
}>;
export type CancelSubscriptionMutation = {
__typename?: "Mutation";
cancelSubscription: {
__typename?: "UserSubscriptionStatusGQL";
hasActiveSubscription: boolean;
subscriptionStatus?: StripeSubscriptionStatusEnum | null;
currentPeriodStart?: any | null;
currentPeriodEnd?: any | null;
validUntil?: any | null;
stripePriceId?: string | null;
stripeSubscriptionId?: string | null;
};
};
export type ReactToVideoMutationVariables = Exact<{
videoId: Scalars["Int"]["input"];
reaction?: InputMaybe<ReactionEnum>;
@@ -6071,6 +6174,7 @@ export const GetDeployedConfigDocument = gql`
environment
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
bannerMessages {
color
dismissible
@@ -6769,6 +6873,276 @@ export type EnsureStripeCustomerExistsMutationOptions =
EnsureStripeCustomerExistsMutation,
EnsureStripeCustomerExistsMutationVariables
>;
export const CreateSubscriptionDocument = gql`
mutation CreateSubscription($priceId: String!) {
createSubscription(priceId: $priceId) {
checkoutUrl
sessionId
}
}
`;
export type CreateSubscriptionMutationFn = Apollo.MutationFunction<
CreateSubscriptionMutation,
CreateSubscriptionMutationVariables
>;
/**
* __useCreateSubscriptionMutation__
*
* To run a mutation, you first call `useCreateSubscriptionMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCreateSubscriptionMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [createSubscriptionMutation, { data, loading, error }] = useCreateSubscriptionMutation({
* variables: {
* priceId: // value for 'priceId'
* },
* });
*/
export function useCreateSubscriptionMutation(
baseOptions?: Apollo.MutationHookOptions<
CreateSubscriptionMutation,
CreateSubscriptionMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CreateSubscriptionMutation,
CreateSubscriptionMutationVariables
>(CreateSubscriptionDocument, options);
}
export type CreateSubscriptionMutationHookResult = ReturnType<
typeof useCreateSubscriptionMutation
>;
export type CreateSubscriptionMutationResult =
Apollo.MutationResult<CreateSubscriptionMutation>;
export type CreateSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CreateSubscriptionMutation,
CreateSubscriptionMutationVariables
>;
export const GetAvailableSubscriptionOptionsDocument = gql`
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
products {
id
name
description
active
prices {
id
currency
unitAmount
recurringInterval
recurringIntervalCount
type
active
}
}
}
}
`;
/**
* __useGetAvailableSubscriptionOptionsQuery__
*
* To run a query within a React component, call `useGetAvailableSubscriptionOptionsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAvailableSubscriptionOptionsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetAvailableSubscriptionOptionsQuery({
* variables: {
* },
* });
*/
export function useGetAvailableSubscriptionOptionsQuery(
baseOptions?: Apollo.QueryHookOptions<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>(GetAvailableSubscriptionOptionsDocument, options);
}
export function useGetAvailableSubscriptionOptionsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>(GetAvailableSubscriptionOptionsDocument, options);
}
export function useGetAvailableSubscriptionOptionsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>(GetAvailableSubscriptionOptionsDocument, options);
}
export type GetAvailableSubscriptionOptionsQueryHookResult = ReturnType<
typeof useGetAvailableSubscriptionOptionsQuery
>;
export type GetAvailableSubscriptionOptionsLazyQueryHookResult = ReturnType<
typeof useGetAvailableSubscriptionOptionsLazyQuery
>;
export type GetAvailableSubscriptionOptionsSuspenseQueryHookResult = ReturnType<
typeof useGetAvailableSubscriptionOptionsSuspenseQuery
>;
export type GetAvailableSubscriptionOptionsQueryResult = Apollo.QueryResult<
GetAvailableSubscriptionOptionsQuery,
GetAvailableSubscriptionOptionsQueryVariables
>;
export const GetSubscriptionStatusDocument = gql`
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}
`;
/**
* __useGetSubscriptionStatusQuery__
*
* To run a query within a React component, call `useGetSubscriptionStatusQuery` and pass it any options that fit your needs.
* When your component renders, `useGetSubscriptionStatusQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetSubscriptionStatusQuery({
* variables: {
* },
* });
*/
export function useGetSubscriptionStatusQuery(
baseOptions?: Apollo.QueryHookOptions<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>(GetSubscriptionStatusDocument, options);
}
export function useGetSubscriptionStatusLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>(GetSubscriptionStatusDocument, options);
}
export function useGetSubscriptionStatusSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>(GetSubscriptionStatusDocument, options);
}
export type GetSubscriptionStatusQueryHookResult = ReturnType<
typeof useGetSubscriptionStatusQuery
>;
export type GetSubscriptionStatusLazyQueryHookResult = ReturnType<
typeof useGetSubscriptionStatusLazyQuery
>;
export type GetSubscriptionStatusSuspenseQueryHookResult = ReturnType<
typeof useGetSubscriptionStatusSuspenseQuery
>;
export type GetSubscriptionStatusQueryResult = Apollo.QueryResult<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>;
export const CancelSubscriptionDocument = gql`
mutation CancelSubscription {
cancelSubscription {
hasActiveSubscription
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}
`;
export type CancelSubscriptionMutationFn = Apollo.MutationFunction<
CancelSubscriptionMutation,
CancelSubscriptionMutationVariables
>;
/**
* __useCancelSubscriptionMutation__
*
* To run a mutation, you first call `useCancelSubscriptionMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCancelSubscriptionMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [cancelSubscriptionMutation, { data, loading, error }] = useCancelSubscriptionMutation({
* variables: {
* },
* });
*/
export function useCancelSubscriptionMutation(
baseOptions?: Apollo.MutationHookOptions<
CancelSubscriptionMutation,
CancelSubscriptionMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CancelSubscriptionMutation,
CancelSubscriptionMutationVariables
>(CancelSubscriptionDocument, options);
}
export type CancelSubscriptionMutationHookResult = ReturnType<
typeof useCancelSubscriptionMutation
>;
export type CancelSubscriptionMutationResult =
Apollo.MutationResult<CancelSubscriptionMutation>;
export type CancelSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CancelSubscriptionMutation,
CancelSubscriptionMutationVariables
>;
export const ReactToVideoDocument = gql`
mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
reactToVideo(videoId: $videoId, reaction: $reaction)

View File

@@ -5,6 +5,7 @@ query getDeployedConfig {
environment
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
bannerMessages {
color
dismissible

View File

@@ -12,3 +12,54 @@ mutation EnsureStripeCustomerExists {
updatedAt
}
}
mutation CreateSubscription($priceId: String!) {
createSubscription(priceId: $priceId) {
checkoutUrl
sessionId
}
}
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
products {
id
name
description
active
prices {
id
currency
unitAmount
recurringInterval
recurringIntervalCount
type
active
}
}
}
}
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}
mutation CancelSubscription {
cancelSubscription {
hasActiveSubscription
subscriptionStatus
currentPeriodStart
currentPeriodEnd
validUntil
stripePriceId
stripeSubscriptionId
}
}

View File

@@ -82,6 +82,7 @@ type Query {
after: String = null
): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos(
userId: Int = null
@@ -297,6 +298,7 @@ type DeployedConfigGQL {
devMode: Boolean!
environment: String!
minimumAllowedAppVersion: String!
subscriptionGatingEnabled: Boolean!
bannerMessages: [BannerGQL!]!
}
@@ -849,6 +851,27 @@ type StripePriceGQL {
active: Boolean!
}
type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean!
subscriptionStatus: StripeSubscriptionStatusEnum
currentPeriodStart: DateTime
currentPeriodEnd: DateTime
validUntil: DateTime
stripePriceId: String
stripeSubscriptionId: String
}
enum StripeSubscriptionStatusEnum {
INCOMPLETE
INCOMPLETE_EXPIRED
TRIALING
ACTIVE
PAST_DUE
CANCELED
UNPAID
PAUSED
}
type UserPlayTimeGQL {
totalSeconds: Float!
}
@@ -908,6 +931,7 @@ type Mutation {
ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean!
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream(
videoMetadata: VideoMetadataInput!