diff --git a/apps/backend/.env.example b/apps/backend/.env.example index 2cc6ee31..ebecd48f 100644 --- a/apps/backend/.env.example +++ b/apps/backend/.env.example @@ -9,8 +9,10 @@ CLIENT_URL=http://localhost:3000 # Database DATABASE_URL="postgresql://postgres:postgres@localhost:5432" -# Stripe +# Stripe STRIPE_SECRET_KEY="" +# Webhook signing secret (whsec_...) – use for constructEvent in production +STRIPE_WEBHOOK_SECRET="" # TMDB TMDB_ACCESS_TOKEN= diff --git a/apps/backend/src/adapters/stripe-subscription-provider.ts b/apps/backend/src/adapters/stripe-subscription-provider.ts new file mode 100644 index 00000000..b8f6813d --- /dev/null +++ b/apps/backend/src/adapters/stripe-subscription-provider.ts @@ -0,0 +1,44 @@ +import { stripe } from '@/adapters/stripe' +import { SubscriptionAlreadyCanceledError } from '@/domain/errors/subscription-already-canceled-error' +import type { SubscriptionProvider } from '@/ports/subscription-provider' + +async function getCurrentPeriodEnd(providerSubscriptionId: string) { + const retrieved = await stripe.subscriptions.retrieve(providerSubscriptionId) + const periodEndTimestamp = ( + retrieved as unknown as { current_period_end: number } + ).current_period_end + return new Date(periodEndTimestamp * 1000) +} + +async function scheduleCancelAtPeriodEnd( + providerSubscriptionId: string, + periodEnd: Date +) { + await stripe.subscriptions.update(providerSubscriptionId, { + cancel_at: Math.floor(periodEnd.getTime() / 1000), + cancel_at_period_end: true, + }) +} + +async function cancelImmediately(providerSubscriptionId: string) { + try { + await stripe.subscriptions.cancel(providerSubscriptionId) + } catch (error: unknown) { + const stripeError = error as { code?: string; message?: string } + const isAlreadyCanceled = + stripeError.code === 'resource_already_canceled' || + /already canceled|cannot cancel.*canceled/i.test( + String(stripeError.message ?? '') + ) + if (isAlreadyCanceled) { + throw new SubscriptionAlreadyCanceledError() + } + throw error + } +} + +export const StripeSubscriptionProvider: SubscriptionProvider = { + getCurrentPeriodEnd, + scheduleCancelAtPeriodEnd, + cancelImmediately, +} diff --git a/apps/backend/src/config.ts b/apps/backend/src/config.ts index a96dfcf0..a83a4b68 100644 --- a/apps/backend/src/config.ts +++ b/apps/backend/src/config.ts @@ -25,6 +25,7 @@ function loadServicesEnvs() { const schema = z.object({ RESEND_API_KEY: z.string().optional().default('re_123'), STRIPE_SECRET_KEY: z.string().optional().default(''), + STRIPE_WEBHOOK_SECRET: z.string().optional().default(''), TMDB_ACCESS_TOKEN: z.string(), }) diff --git a/apps/backend/src/db/migrations/20260130024720_alter_subscriptions_table.sql b/apps/backend/src/db/migrations/20260130024720_alter_subscriptions_table.sql new file mode 100644 index 00000000..246c69b0 --- /dev/null +++ b/apps/backend/src/db/migrations/20260130024720_alter_subscriptions_table.sql @@ -0,0 +1,4 @@ +CREATE TYPE "public"."subscription_provider" AS ENUM('STRIPE', 'APPLE');--> statement-breakpoint +ALTER TABLE "subscriptions" ADD COLUMN "subscription_provider" "subscription_provider" NOT NULL DEFAULT 'STRIPE';--> statement-breakpoint +ALTER TABLE "subscriptions" ADD COLUMN "provider_subscription_id" varchar;--> statement-breakpoint +ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_provider_subscription_id_unique" UNIQUE("provider_subscription_id"); \ No newline at end of file diff --git a/apps/backend/src/db/migrations/meta/20260130024720_snapshot.json b/apps/backend/src/db/migrations/meta/20260130024720_snapshot.json new file mode 100644 index 00000000..96b8d4bf --- /dev/null +++ b/apps/backend/src/db/migrations/meta/20260130024720_snapshot.json @@ -0,0 +1,1603 @@ +{ + "id": "faacd4f0-6266-42dd-834b-b7fc4da105b3", + "prevId": "d8206ef4-3adb-4b26-8e63-dfc5c96b5555", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.followers": { + "name": "followers", + "schema": "", + "columns": { + "follower_id": { + "name": "follower_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "followed_id": { + "name": "followed_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "followers_follower_id_users_id_fk": { + "name": "followers_follower_id_users_id_fk", + "tableFrom": "followers", + "tableTo": "users", + "columnsFrom": [ + "follower_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "followers_followed_id_users_id_fk": { + "name": "followers_followed_id_users_id_fk", + "tableFrom": "followers", + "tableTo": "users", + "columnsFrom": [ + "followed_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "followers_followed_id_follower_id_pk": { + "name": "followers_followed_id_follower_id_pk", + "columns": [ + "followed_id", + "follower_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_movies": { + "name": "import_movies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "import_id": { + "name": "import_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "end_date": { + "name": "end_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "item_status": { + "name": "item_status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "import_status": { + "name": "import_status", + "type": "import_item_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "TMDB_ID": { + "name": "TMDB_ID", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "__metadata": { + "name": "__metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "import_movies_import_id_user_imports_id_fk": { + "name": "import_movies_import_id_user_imports_id_fk", + "tableFrom": "import_movies", + "tableTo": "user_imports", + "columnsFrom": [ + "import_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.import_series": { + "name": "import_series", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "import_id": { + "name": "import_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "start_date": { + "name": "start_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "item_status": { + "name": "item_status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "import_status": { + "name": "import_status", + "type": "import_item_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "TMDB_ID": { + "name": "TMDB_ID", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "watched_episodes": { + "name": "watched_episodes", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "series_episodes": { + "name": "series_episodes", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "__metadata": { + "name": "__metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "import_series_import_id_user_imports_id_fk": { + "name": "import_series_import_id_user_imports_id_fk", + "tableFrom": "import_series", + "tableTo": "user_imports", + "columnsFrom": [ + "import_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.likes": { + "name": "likes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "entity_id": { + "name": "entity_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "entity_type": { + "name": "entity_type", + "type": "like_entity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idx_entity_id": { + "name": "idx_entity_id", + "columns": [ + { + "expression": "entity_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "likes_user_id_users_id_fk": { + "name": "likes_user_id_users_id_fk", + "tableFrom": "likes", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.list_items": { + "name": "list_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "list_id": { + "name": "list_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "media_type": { + "name": "media_type", + "type": "media_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "list_items_list_id_lists_id_fk": { + "name": "list_items_list_id_lists_id_fk", + "tableFrom": "list_items", + "tableTo": "lists", + "columnsFrom": [ + "list_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "list_items_id_list_id_pk": { + "name": "list_items_id_list_id_pk", + "columns": [ + "id", + "list_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.lists": { + "name": "lists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "banner_url": { + "name": "banner_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "visibility": { + "name": "visibility", + "type": "list_visibility", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "lists_user_id_users_id_fk": { + "name": "lists_user_id_users_id_fk", + "tableFrom": "lists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.magic_tokens": { + "name": "magic_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "used": { + "name": "used", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "token_user_id_idx": { + "name": "token_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "token_idx": { + "name": "token_idx", + "columns": [ + { + "expression": "token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "magic_tokens_user_id_users_id_fk": { + "name": "magic_tokens_user_id_users_id_fk", + "tableFrom": "magic_tokens", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.review_replies": { + "name": "review_replies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "reply": { + "name": "reply", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "review_id": { + "name": "review_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "review_replies_user_id_users_id_fk": { + "name": "review_replies_user_id_users_id_fk", + "tableFrom": "review_replies", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "review_replies_review_id_reviews_id_fk": { + "name": "review_replies_review_id_reviews_id_fk", + "tableFrom": "review_replies", + "tableTo": "reviews", + "columnsFrom": [ + "review_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.reviews": { + "name": "reviews", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "media_type": { + "name": "media_type", + "type": "media_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "review": { + "name": "review", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "rating": { + "name": "rating", + "type": "real", + "primaryKey": false, + "notNull": true + }, + "has_spoilers": { + "name": "has_spoilers", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "language": { + "name": "language", + "type": "languages", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "season_number": { + "name": "season_number", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "episode_number": { + "name": "episode_number", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "reviews_user_id_users_id_fk": { + "name": "reviews_user_id_users_id_fk", + "tableFrom": "reviews", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.social_links": { + "name": "social_links", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "social_platforms", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "social_links_user_id_users_id_fk": { + "name": "social_links_user_id_users_id_fk", + "tableFrom": "social_links", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_platform_unique": { + "name": "user_platform_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "platform" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.subscriptions": { + "name": "subscriptions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "subscription_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "subscription_provider": { + "name": "subscription_provider", + "type": "subscription_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "subscription_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'ACTIVE'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "canceled_at": { + "name": "canceled_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "cancellation_reason": { + "name": "cancellation_reason", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "provider_subscription_id": { + "name": "provider_subscription_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "active_subscription_idx": { + "name": "active_subscription_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"subscriptions\".\"status\" = $1", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subscriptions_user_id_users_id_fk": { + "name": "subscriptions_user_id_users_id_fk", + "tableFrom": "subscriptions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "subscriptions_provider_subscription_id_unique": { + "name": "subscriptions_provider_subscription_id_unique", + "nullsNotDistinct": false, + "columns": [ + "provider_subscription_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_activities": { + "name": "user_activities", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "activity_type": { + "name": "activity_type", + "type": "activity_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "entity_id": { + "name": "entity_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "entity_type": { + "name": "entity_type", + "type": "like_entity", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "user_activity_idx": { + "name": "user_activity_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_activities_user_id_users_id_fk": { + "name": "user_activities_user_id_users_id_fk", + "tableFrom": "user_activities", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_episodes": { + "name": "user_episodes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "season_number": { + "name": "season_number", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "episode_number": { + "name": "episode_number", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "watched_at": { + "name": "watched_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "runtime": { + "name": "runtime", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "user_episodes_user_id_users_id_fk": { + "name": "user_episodes_user_id_users_id_fk", + "tableFrom": "user_episodes", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_episode_unique": { + "name": "user_episode_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "tmdb_id", + "season_number", + "episode_number" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_imports": { + "name": "user_imports", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "items_count": { + "name": "items_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "import_status": { + "name": "import_status", + "type": "import_status_enum", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "providers_enum", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_imports_user_id_users_id_fk": { + "name": "user_imports_user_id_users_id_fk", + "tableFrom": "user_imports", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_items": { + "name": "user_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "tmdb_id": { + "name": "tmdb_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "media_type": { + "name": "media_type", + "type": "media_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "added_at": { + "name": "added_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_items_user_id_users_id_fk": { + "name": "user_items_user_id_users_id_fk", + "tableFrom": "user_items", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_items_userid_tmdbid_media_type_unique": { + "name": "user_items_userid_tmdbid_media_type_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "tmdb_id", + "media_type" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "banner_url": { + "name": "banner_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "is_legacy": { + "name": "is_legacy", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "biography": { + "name": "biography", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "username_lower_idx": { + "name": "username_lower_idx", + "columns": [ + { + "expression": "LOWER(\"username\")", + "asc": true, + "isExpression": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "email_lower_idx": { + "name": "email_lower_idx", + "columns": [ + { + "expression": "LOWER(\"email\")", + "asc": true, + "isExpression": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_preferences": { + "name": "user_preferences", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "watch_providers_ids": { + "name": "watch_providers_ids", + "type": "integer[]", + "primaryKey": false, + "notNull": false + }, + "watch_region": { + "name": "watch_region", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_preferences_user_id_users_id_fk": { + "name": "user_preferences_user_id_users_id_fk", + "tableFrom": "user_preferences", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_preferences_user_id_unique": { + "name": "user_preferences_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.activity_type": { + "name": "activity_type", + "schema": "public", + "values": [ + "CREATE_LIST", + "ADD_ITEM", + "DELETE_ITEM", + "LIKE_REVIEW", + "LIKE_REPLY", + "LIKE_LIST", + "CREATE_REVIEW", + "CREATE_REPLY", + "FOLLOW_USER", + "WATCH_EPISODE", + "CHANGE_STATUS", + "CREATE_ACCOUNT" + ] + }, + "public.import_item_status": { + "name": "import_item_status", + "schema": "public", + "values": [ + "COMPLETED", + "FAILED", + "NOT_STARTED" + ] + }, + "public.import_status_enum": { + "name": "import_status_enum", + "schema": "public", + "values": [ + "PARTIAL", + "COMPLETED", + "FAILED", + "NOT_STARTED" + ] + }, + "public.languages": { + "name": "languages", + "schema": "public", + "values": [ + "en-US", + "es-ES", + "fr-FR", + "it-IT", + "de-DE", + "pt-BR", + "ja-JP" + ] + }, + "public.like_entity": { + "name": "like_entity", + "schema": "public", + "values": [ + "REVIEW", + "REPLY", + "LIST" + ] + }, + "public.list_visibility": { + "name": "list_visibility", + "schema": "public", + "values": [ + "PUBLIC", + "NETWORK", + "PRIVATE" + ] + }, + "public.media_type": { + "name": "media_type", + "schema": "public", + "values": [ + "TV_SHOW", + "MOVIE" + ] + }, + "public.providers_enum": { + "name": "providers_enum", + "schema": "public", + "values": [ + "MY_ANIME_LIST", + "LETTERBOXD" + ] + }, + "public.social_platforms": { + "name": "social_platforms", + "schema": "public", + "values": [ + "INSTAGRAM", + "TIKTOK", + "YOUTUBE", + "X" + ] + }, + "public.status": { + "name": "status", + "schema": "public", + "values": [ + "WATCHLIST", + "WATCHED", + "WATCHING", + "DROPPED" + ] + }, + "public.subscription_provider": { + "name": "subscription_provider", + "schema": "public", + "values": [ + "STRIPE", + "APPLE" + ] + }, + "public.subscription_status": { + "name": "subscription_status", + "schema": "public", + "values": [ + "ACTIVE", + "CANCELED", + "EXPIRED", + "PENDING_CANCELLATION" + ] + }, + "public.subscription_type": { + "name": "subscription_type", + "schema": "public", + "values": [ + "MEMBER", + "PRO" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/apps/backend/src/db/migrations/meta/_journal.json b/apps/backend/src/db/migrations/meta/_journal.json index 8692f823..f02f4d31 100644 --- a/apps/backend/src/db/migrations/meta/_journal.json +++ b/apps/backend/src/db/migrations/meta/_journal.json @@ -379,6 +379,13 @@ "when": 1743464364062, "tag": "20250331233924_alter_subscription_table", "breakpoints": true + }, + { + "idx": 54, + "version": "7", + "when": 1769741240595, + "tag": "20260130024720_alter_subscriptions_table", + "breakpoints": true } ] } \ No newline at end of file diff --git a/apps/backend/src/db/repositories/subscription-repository.ts b/apps/backend/src/db/repositories/subscription-repository.ts index 771b6444..53a2932b 100644 --- a/apps/backend/src/db/repositories/subscription-repository.ts +++ b/apps/backend/src/db/repositories/subscription-repository.ts @@ -22,6 +22,42 @@ export async function getSubscriptionById(id: string) { }) } +export async function getSubscriptionByProviderSubscriptionId( + providerSubscriptionId: string +) { + return db.query.subscriptions.findFirst({ + where: eq( + schema.subscriptions.providerSubscriptionId, + providerSubscriptionId + ), + }) +} + +export type UpdateSubscriptionStatusByProviderSubscriptionIdParams = { + status: 'ACTIVE' | 'CANCELED' | 'PENDING_CANCELLATION' + canceledAt: Date | null + cancellationReason: string | null +} + +export async function updateSubscriptionStatusByProviderSubscriptionId( + providerSubscriptionId: string, + params: UpdateSubscriptionStatusByProviderSubscriptionIdParams +) { + const [subscription] = await db + .update(schema.subscriptions) + .set({ + status: params.status, + canceledAt: params.canceledAt, + cancellationReason: params.cancellationReason, + }) + .where( + eq(schema.subscriptions.providerSubscriptionId, providerSubscriptionId) + ) + .returning() + + return subscription +} + export type CancelSubscriptionParams = { id: string userId: string @@ -49,17 +85,6 @@ export async function cancelUserSubscription(params: CancelSubscriptionParams) { return subscription } -export async function updateSubscription( - userId: string, - type: 'PRO' | 'MEMBER' -) { - return db - .update(schema.subscriptions) - .set({ type }) - .where(eq(schema.subscriptions.userId, userId)) - .returning() -} - export async function getLastestActiveSubscription(userId: string) { const [subscription] = await db .select() diff --git a/apps/backend/src/db/schema/index.ts b/apps/backend/src/db/schema/index.ts index 9f14c918..21945cf1 100644 --- a/apps/backend/src/db/schema/index.ts +++ b/apps/backend/src/db/schema/index.ts @@ -538,6 +538,11 @@ export const userActivitiesRelations = relations(userActivities, ({ one }) => ({ }), })) +export const subscriptionProviderEnum = pgEnum('subscription_provider', [ + 'STRIPE', + 'APPLE', +]) + export const subscriptions = pgTable( 'subscriptions', { @@ -548,10 +553,12 @@ export const subscriptions = pgTable( .references(() => users.id, { onDelete: 'cascade' }) .notNull(), type: subscriptionTypeEnum('type').notNull(), + provider: subscriptionProviderEnum('subscription_provider').notNull(), status: subscriptionStatusEnum('status').default('ACTIVE').notNull(), createdAt: timestamp('created_at').defaultNow().notNull(), canceledAt: timestamp('canceled_at'), cancellationReason: varchar('cancellation_reason'), + providerSubscriptionId: varchar('provider_subscription_id').unique(), }, table => ({ activeSubscriptionIdx: uniqueIndex('active_subscription_idx') diff --git a/apps/backend/src/domain/errors/subscription-already-canceled-error.ts b/apps/backend/src/domain/errors/subscription-already-canceled-error.ts new file mode 100644 index 00000000..a4978bae --- /dev/null +++ b/apps/backend/src/domain/errors/subscription-already-canceled-error.ts @@ -0,0 +1,7 @@ +import { DomainError } from './domain-error' + +export class SubscriptionAlreadyCanceledError extends DomainError { + constructor() { + super('Subscription is already canceled', 409) + } +} diff --git a/apps/backend/src/domain/services/imports/publish-import-to-queue.spec.ts b/apps/backend/src/domain/services/imports/publish-import-to-queue.spec.ts index 13d5a693..d7c2640d 100644 --- a/apps/backend/src/domain/services/imports/publish-import-to-queue.spec.ts +++ b/apps/backend/src/domain/services/imports/publish-import-to-queue.spec.ts @@ -1,6 +1,4 @@ -import { DeleteQueueCommand, ReceiveMessageCommand } from '@aws-sdk/client-sqs' -import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { createSqsClient, initializeSQS } from '@/adapters/sqs' +import { describe, expect, it } from 'vitest' import { config } from '@/config' import { makeManyRawImportMovies } from '@/test/factories/make-import-movies' import { makeManyRawImportSeries } from '@/test/factories/make-import-series' @@ -8,30 +6,20 @@ import { makeUser } from '@/test/factories/make-user' import { makeUserImport } from '@/test/factories/make-user-import' import { publishToQueue } from './publish-import-to-queue' -describe('publishToQueue', () => { - let sqsClient: ReturnType - - const queues = [ - config.sqsQueues.IMPORT_MOVIES_QUEUE, - config.sqsQueues.IMPORT_SERIES_QUEUE, - ] +const mockPublish = vi.fn().mockResolvedValue(undefined) - beforeEach(async () => { - sqsClient = createSqsClient() - await initializeSQS(sqsClient) - }) +vi.mock('@/factories/queue-service-factory', () => ({ + queueServiceFactory: () => ({ + publish: mockPublish, + }), +})) - afterEach(async () => { - for (const queue of queues) { - await sqsClient.send( - new DeleteQueueCommand({ - QueueUrl: `http://localhost:4566/000000000000/${queue}`, - }) - ) - } +describe('publishToQueue', () => { + beforeEach(() => { + mockPublish.mockClear() }) - it('should be able to send messages to SQS', async () => { + it('should publish movies and series to their queues', async () => { const { id: userId } = await makeUser({}) const movies = makeManyRawImportMovies(3, {}) @@ -40,104 +28,32 @@ describe('publishToQueue', () => { await publishToQueue(result) - const receiveMovies = { - QueueUrl: config.sqsQueues.IMPORT_MOVIES_QUEUE, - MaxNumberOfMessages: 3, - WaitTimeSeconds: 1, - } - - const receivedMovies = await sqsClient.send( - new ReceiveMessageCommand(receiveMovies) - ) - - expect(receivedMovies.Messages).toHaveLength(3) - - const receiveSeries = { - QueueUrl: config.sqsQueues.IMPORT_SERIES_QUEUE, - MaxNumberOfMessages: 8, - WaitTimeSeconds: 1, - } - - const receivedSeries = await sqsClient.send( - new ReceiveMessageCommand(receiveSeries) + await vi.waitFor(() => { + expect(mockPublish).toHaveBeenCalledTimes(2) + }) + + const [moviesCall, seriesCall] = mockPublish.mock.calls + + expect(moviesCall[0].queueUrl).toBe(config.sqsQueues.IMPORT_MOVIES_QUEUE) + expect(moviesCall[0].messages).toHaveLength(3) + expect(moviesCall[0].messages).toEqual( + result.movies.map(({ id, name }) => ({ + id, + name, + provider: result.provider, + userId, + })) ) - expect(receivedSeries.Messages).toHaveLength(8) - - const firstSerie = result.series[0] - const formattedSeries = { - id: firstSerie.id, - name: firstSerie.name, - provider: result.provider, - userId, - } - - expect(receivedSeries.Messages?.[0].Body).toBe( - JSON.stringify(formattedSeries) + expect(seriesCall[0].queueUrl).toBe(config.sqsQueues.IMPORT_SERIES_QUEUE) + expect(seriesCall[0].messages).toHaveLength(8) + expect(seriesCall[0].messages).toEqual( + result.series.map(({ id, name }) => ({ + id, + name, + provider: result.provider, + userId, + })) ) }) - - // it('should not be able to publish movies when it is empty', async () => { - // const { id: userId } = await makeUser({}) - - // const series = makeManyRawImportSeries(3, {}) - // const result = await makeUserImport({ userId, movies: [], series }) - - // await publishToQueue(result) - - // const receiveMovies = { - // QueueUrl: config.sqsQueues.IMPORT_MOVIES_QUEUE, - // MaxNumberOfMessages: 1, - // WaitTimeSeconds: 1, - // } - - // const receiveSeries = { - // QueueUrl: config.sqsQueues.IMPORT_SERIES_QUEUE, - // MaxNumberOfMessages: 3, - // WaitTimeSeconds: 1, - // } - - // const receivedMovies = await sqsClient.send( - // new ReceiveMessageCommand(receiveMovies) - // ) - - // const receivedSeries = await sqsClient.send( - // new ReceiveMessageCommand(receiveSeries) - // ) - - // expect(receivedMovies.Messages).toBeUndefined() - // expect(receivedSeries.Messages).toHaveLength(3) - // }) - - // it('should not be able to publish series when it is empty', async () => { - // const { id: userId } = await makeUser({}) - - // const movies = makeManyRawImportMovies(3, {}) - // const result = await makeUserImport({ userId, movies, series: [] }) - - // await publishToQueue(result) - - // const receiveMovies = { - // QueueUrl: config.sqsQueues.IMPORT_MOVIES_QUEUE, - // MaxNumberOfMessages: 3, - // WaitTimeSeconds: 1, - // } - - // const receiveSeries = { - // QueueUrl: config.sqsQueues.IMPORT_SERIES_QUEUE, - // MaxNumberOfMessages: 1, - // WaitTimeSeconds: 0.1, - // } - - // const receivedMovies = await sqsClient.send( - // new ReceiveMessageCommand(receiveMovies) - // ) - - // const receivedSeries = await sqsClient.send( - // new ReceiveMessageCommand(receiveSeries) - // ) - - // expect(receivedMovies.Messages).toHaveLength(3) - // expect(receivedSeries.Messages).toBeUndefined() - // }) -}, 10000) +}) diff --git a/apps/backend/src/domain/services/subscriptions/cancel-subscription.spec.ts b/apps/backend/src/domain/services/subscriptions/cancel-subscription.spec.ts index 9b53cb76..13b8b6e2 100644 --- a/apps/backend/src/domain/services/subscriptions/cancel-subscription.spec.ts +++ b/apps/backend/src/domain/services/subscriptions/cancel-subscription.spec.ts @@ -1,26 +1,35 @@ +import { randomUUID } from 'node:crypto' import { faker } from '@faker-js/faker' -import { describe, expect, it, type Mock } from 'vitest' -import { stripe } from '@/adapters/stripe' +import { describe, expect, it } from 'vitest' import { getSubscriptionById } from '@/db/repositories/subscription-repository' import { getUserById } from '@/db/repositories/user-repository' +import { SubscriptionAlreadyCanceledError } from '@/domain/errors/subscription-already-canceled-error' +import type { SubscriptionProvider } from '@/ports/subscription-provider' import { makeSubscription } from '@/test/factories/make-subscription' import { makeUser } from '@/test/factories/make-user' import { cancelSubscription } from './cancel-subscription' -vi.mock('@/adapters/stripe', () => ({ - stripe: { - subscriptions: { - cancel: vi.fn(), - }, - }, -})) +function uniqueProviderSubId() { + return `sub_${randomUUID().replace(/-/g, '')}` +} + +function mockSubscriptionProvider(): SubscriptionProvider { + return { + getCurrentPeriodEnd: vi.fn(), + scheduleCancelAtPeriodEnd: vi.fn(), + cancelImmediately: vi.fn().mockResolvedValue(undefined), + } +} describe('Cancel subscription', () => { it('should cancel the subscription', async () => { + const providerSubId = uniqueProviderSubId() const user = await makeUser() + const provider = mockSubscriptionProvider() const subscription = await makeSubscription({ userId: user.id, + providerSubscriptionId: providerSubId, }) expect(subscription).toMatchObject({ @@ -30,17 +39,11 @@ describe('Cancel subscription', () => { canceledAt: null, }) - const mockStripeResponse = { - id: subscription.id, - status: 'canceled', - } - ;(stripe.subscriptions.cancel as Mock).mockResolvedValue(mockStripeResponse) - const reason = faker.lorem.sentence(5) - await cancelSubscription(subscription, reason) + await cancelSubscription(subscription, reason, provider) - expect(stripe.subscriptions.cancel).toHaveBeenCalledWith(subscription.id) + expect(provider.cancelImmediately).toHaveBeenCalledWith(providerSubId) const updatedSubscription = await getSubscriptionById(subscription.id) @@ -53,23 +56,20 @@ describe('Cancel subscription', () => { }) it('should update user subscription status after cancel', async () => { + const providerSubId = uniqueProviderSubId() const user = await makeUser() + const provider = mockSubscriptionProvider() const subscription = await makeSubscription({ userId: user.id, + providerSubscriptionId: providerSubId, }) - const mockStripeResponse = { - id: subscription.id, - status: 'canceled', - } - ;(stripe.subscriptions.cancel as Mock).mockResolvedValue(mockStripeResponse) - const reason = faker.lorem.sentence(5) - await cancelSubscription(subscription, reason) + await cancelSubscription(subscription, reason, provider) - expect(stripe.subscriptions.cancel).toHaveBeenCalledWith(subscription.id) + expect(provider.cancelImmediately).toHaveBeenCalledWith(providerSubId) await getSubscriptionById(subscription.id) @@ -79,4 +79,42 @@ describe('Cancel subscription', () => { subscriptionType: 'MEMBER', }) }) + + it('should throw when subscription has no provider subscription id', async () => { + const user = await makeUser() + const provider = mockSubscriptionProvider() + + const subscription = await makeSubscription({ + userId: user.id, + providerSubscriptionId: null, + }) + + await expect( + cancelSubscription(subscription, 'reason', provider) + ).rejects.toThrow( + 'Cannot cancel: subscription has no provider subscription id' + ) + + expect(provider.cancelImmediately).not.toHaveBeenCalled() + }) + + it('should still update DB when provider says subscription already canceled (idempotent)', async () => { + const providerSubId = uniqueProviderSubId() + const user = await makeUser() + const provider = mockSubscriptionProvider() + vi.mocked(provider.cancelImmediately).mockRejectedValueOnce( + new SubscriptionAlreadyCanceledError() + ) + + const subscription = await makeSubscription({ + userId: user.id, + providerSubscriptionId: providerSubId, + }) + + const result = await cancelSubscription(subscription, 'reason', provider) + + expect(result).toEqual({ id: subscription.id }) + const updated = await getSubscriptionById(subscription.id) + expect(updated?.status).toBe('CANCELED') + }) }) diff --git a/apps/backend/src/domain/services/subscriptions/cancel-subscription.ts b/apps/backend/src/domain/services/subscriptions/cancel-subscription.ts index 67d8e452..69586286 100644 --- a/apps/backend/src/domain/services/subscriptions/cancel-subscription.ts +++ b/apps/backend/src/domain/services/subscriptions/cancel-subscription.ts @@ -1,38 +1,48 @@ -import { stripe } from '@/adapters/stripe' import { cancelUserSubscription } from '@/db/repositories/subscription-repository' import type { Subscription } from '@/domain/entities/subscription' import { DomainError } from '@/domain/errors/domain-error' +import { SubscriptionAlreadyCanceledError } from '@/domain/errors/subscription-already-canceled-error' +import type { SubscriptionProvider } from '@/ports/subscription-provider' export async function cancelSubscription( - { id, userId }: Subscription, - reason: string | undefined + { id, userId, providerSubscriptionId }: Subscription, + reason: string | undefined, + provider: SubscriptionProvider ) { - try { - const subscription = await stripe.subscriptions.cancel(id) - - if (!subscription || subscription.status !== 'canceled') { - throw new DomainError('Failed to cancel subscription', 500) - } - - await cancelUserSubscription({ - id, - userId, - status: 'CANCELED', - canceledAt: new Date(), - cancellationReason: reason, - }) + if (!providerSubscriptionId) { + throw new DomainError( + 'Cannot cancel: subscription has no provider subscription id', + 400 + ) + } - return { - id, - } + try { + await provider.cancelImmediately(providerSubscriptionId) } catch (error) { - if (error instanceof Error) { - throw new DomainError( - `Failed to cancel subscription, ${error.message}`, - 500 - ) + if (error instanceof SubscriptionAlreadyCanceledError) { + await cancelUserSubscription({ + id, + userId, + status: 'CANCELED', + canceledAt: new Date(), + cancellationReason: reason, + }) + return { id } } - - throw new DomainError('Failed to cancel subscription', 500) + if (error instanceof DomainError) throw error + throw new DomainError( + `Failed to cancel subscription, ${error instanceof Error ? error.message : String(error)}`, + 500 + ) } + + await cancelUserSubscription({ + id, + userId, + status: 'CANCELED', + canceledAt: new Date(), + cancellationReason: reason, + }) + + return { id } } diff --git a/apps/backend/src/domain/services/subscriptions/complete-subscription.spec.ts b/apps/backend/src/domain/services/subscriptions/complete-subscription.spec.ts index 89216037..463b4b63 100644 --- a/apps/backend/src/domain/services/subscriptions/complete-subscription.spec.ts +++ b/apps/backend/src/domain/services/subscriptions/complete-subscription.spec.ts @@ -1,3 +1,4 @@ +import { randomUUID } from 'node:crypto' import { describe, expect, it } from 'vitest' import { UserNotFoundError } from '@/domain/errors/user-not-found' import { makeUser } from '@/test/factories/make-user' @@ -6,7 +7,12 @@ import { completeSubscription } from './complete-subscription' describe('complete subscription', () => { it('should be able to complete subscription', async () => { const user = await makeUser() - const sut = await completeSubscription(user.email) + const sut = await completeSubscription({ + email: user.email, + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), + type: 'PRO', + }) expect(sut).toEqual({ subscription: expect.objectContaining({ @@ -16,7 +22,12 @@ describe('complete subscription', () => { }) it('should not be able to complete subscription with user not found', async () => { - const sut = await completeSubscription('not-found@example.com') + const sut = await completeSubscription({ + email: 'not-found@example.com', + provider: 'STRIPE', + providerSubscriptionId: null, + type: 'PRO', + }) expect(sut).toBeInstanceOf(UserNotFoundError) }) diff --git a/apps/backend/src/domain/services/subscriptions/complete-subscription.ts b/apps/backend/src/domain/services/subscriptions/complete-subscription.ts index 192480cc..dea945c3 100644 --- a/apps/backend/src/domain/services/subscriptions/complete-subscription.ts +++ b/apps/backend/src/domain/services/subscriptions/complete-subscription.ts @@ -3,23 +3,29 @@ import { createSubscription } from '../subscriptions/create-subscription' import { getUserByEmailService } from '../users/get-user-by-email' import { getLastestActiveSubscription } from './get-subscription' -export async function completeSubscription(email: string | null) { - if (!email) return +export type CompleteSubscriptionParams = { + email: string + provider: 'STRIPE' | 'APPLE' + providerSubscriptionId: string | null + type: 'PRO' | 'MEMBER' +} - const result = await getUserByEmailService(email) +export async function completeSubscription(params: CompleteSubscriptionParams) { + const result = await getUserByEmailService(params.email) if (result instanceof DomainError) { return result } - const subscription = await getLastestActiveSubscription(result.user.id) - - if (subscription) { - return { subscription } + const existing = await getLastestActiveSubscription(result.user.id) + if (existing) { + return { subscription: existing } } const createSubscriptionResult = await createSubscription({ - type: 'PRO', + type: params.type, userId: result.user.id, + provider: params.provider, + providerSubscriptionId: params.providerSubscriptionId, }) if (createSubscriptionResult instanceof DomainError) { diff --git a/apps/backend/src/domain/services/subscriptions/create-subscription.spec.ts b/apps/backend/src/domain/services/subscriptions/create-subscription.spec.ts index 5b83020f..7acb0037 100644 --- a/apps/backend/src/domain/services/subscriptions/create-subscription.spec.ts +++ b/apps/backend/src/domain/services/subscriptions/create-subscription.spec.ts @@ -1,3 +1,4 @@ +import { randomUUID } from 'node:crypto' import { faker } from '@faker-js/faker' import { describe, expect, it } from 'vitest' import { AlreadyHaveActiveSubscriptionError } from '@/domain/errors/already-have-active-subscription' @@ -9,7 +10,12 @@ import { createSubscription } from './create-subscription' describe('create subscription', () => { it('should be able to create subscription', async () => { const user = await makeUser() - const sut = await createSubscription({ type: 'PRO', userId: user.id }) + const sut = await createSubscription({ + type: 'PRO', + userId: user.id, + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), + }) expect(sut).toEqual({ subscription: expect.objectContaining({ @@ -20,9 +26,18 @@ describe('create subscription', () => { it('should not be able to generate a new subscription if user already has one', async () => { const user = await makeUser() - await makeSubscription({ userId: user.id }) + await makeSubscription({ + userId: user.id, + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), + }) - const sut = await createSubscription({ type: 'PRO', userId: user.id }) + const sut = await createSubscription({ + type: 'PRO', + userId: user.id, + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), + }) expect(sut).toBeInstanceOf(AlreadyHaveActiveSubscriptionError) }) @@ -31,6 +46,8 @@ describe('create subscription', () => { const sut = await createSubscription({ type: 'PRO', userId: faker.string.uuid(), + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), }) expect(sut).toBeInstanceOf(UserNotFoundError) diff --git a/apps/backend/src/domain/services/subscriptions/get-subscription.spec.ts b/apps/backend/src/domain/services/subscriptions/get-subscription.spec.ts index ebdb7fe1..ab549dd1 100644 --- a/apps/backend/src/domain/services/subscriptions/get-subscription.spec.ts +++ b/apps/backend/src/domain/services/subscriptions/get-subscription.spec.ts @@ -15,6 +15,7 @@ describe('get subscription', () => { const subscription = await createSubscription({ type: 'PRO', userId: user.id, + provider: 'STRIPE', }) expect(subscription).toEqual({ @@ -41,6 +42,7 @@ describe('get lastest active subscription', () => { await createSubscription({ type: 'PRO', userId: user.id, + provider: 'STRIPE', }) const lastestActiveSubscription = await getLastestActiveSubscription( @@ -61,6 +63,7 @@ describe('get lastest active subscription', () => { await createSubscription({ type: 'PRO', userId: user.id, + provider: 'STRIPE', status: 'PENDING_CANCELLATION', canceledAt: new Date(), cancellationReason: 'test', @@ -89,6 +92,7 @@ describe('get lastest active subscription', () => { await createSubscription({ type: 'PRO', userId: user.id, + provider: 'STRIPE', }) const subscription = await getLastestActiveSubscription(user.id) diff --git a/apps/backend/src/domain/services/subscriptions/handle-subscription-webhook.ts b/apps/backend/src/domain/services/subscriptions/handle-subscription-webhook.ts new file mode 100644 index 00000000..d25c5b13 --- /dev/null +++ b/apps/backend/src/domain/services/subscriptions/handle-subscription-webhook.ts @@ -0,0 +1,74 @@ +import type Stripe from 'stripe' +import { + getSubscriptionByProviderSubscriptionId, + updateSubscriptionStatusByProviderSubscriptionId, +} from '@/db/repositories/subscription-repository' + +/** + * Handles customer.subscription.deleted webhook. + * Payload: event.data.object is a Stripe Subscription with id (sub_xxx), status 'canceled', canceled_at (unix). + */ +export async function handleSubscriptionDeleted( + stripeSubscription: Stripe.Subscription +) { + const row = await getSubscriptionByProviderSubscriptionId( + stripeSubscription.id + ) + if (!row) return + + await updateSubscriptionStatusByProviderSubscriptionId( + stripeSubscription.id, + { + status: 'CANCELED', + canceledAt: stripeSubscription.canceled_at + ? new Date(stripeSubscription.canceled_at * 1000) + : new Date(), + cancellationReason: null, + } + ) +} + +type StripeSubscriptionPayload = Stripe.Subscription & { + current_period_end?: number +} + +/** + * Handles customer.subscription.updated webhook. + * Payload: event.data.object is a Stripe Subscription with cancel_at_period_end, cancel_at (unix), current_period_end, status. + * When cancel_at_period_end is true → PENDING_CANCELLATION; when false and status is active → ACTIVE (reactivation). + */ +export async function handleSubscriptionUpdated( + stripeSubscription: StripeSubscriptionPayload +) { + const row = await getSubscriptionByProviderSubscriptionId( + stripeSubscription.id + ) + if (!row) return + + if (stripeSubscription.cancel_at_period_end) { + const canceledAtTimestamp = + stripeSubscription.cancel_at ?? + stripeSubscription.current_period_end ?? + Math.floor(Date.now() / 1000) + await updateSubscriptionStatusByProviderSubscriptionId( + stripeSubscription.id, + { + status: 'PENDING_CANCELLATION', + canceledAt: new Date(canceledAtTimestamp * 1000), + cancellationReason: null, + } + ) + return + } + + if (stripeSubscription.status === 'active') { + await updateSubscriptionStatusByProviderSubscriptionId( + stripeSubscription.id, + { + status: 'ACTIVE', + canceledAt: null, + cancellationReason: null, + } + ) + } +} diff --git a/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.spec.ts b/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.spec.ts index 5ff7448c..18dbf98b 100644 --- a/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.spec.ts +++ b/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.spec.ts @@ -1,36 +1,46 @@ -import { stripe } from '@/adapters/stripe' +import { randomUUID } from 'node:crypto' import { getSubscriptionById } from '@/db/repositories/subscription-repository' +import type { SubscriptionProvider } from '@/ports/subscription-provider' import { makeSubscription } from '@/test/factories/make-subscription' import { makeUser } from '@/test/factories/make-user' import { scheduleCancellation } from './schedule-subscription-cancellation' -vi.mock('@/adapters/stripe', () => ({ - stripe: { - subscriptions: { - update: vi.fn().mockResolvedValue({ - id: 'sub_123', - cancel_at_period_end: true, - status: 'active', - }), - }, - }, -})) +function uniqueProviderSubId() { + return `sub_${randomUUID().replace(/-/g, '')}` +} + +function mockSubscriptionProvider(periodEnd?: Date): SubscriptionProvider { + return { + getCurrentPeriodEnd: vi + .fn() + .mockResolvedValue(periodEnd ?? new Date(Date.now() + 86400 * 30 * 1000)), + scheduleCancelAtPeriodEnd: vi.fn().mockResolvedValue(undefined), + cancelImmediately: vi.fn(), + } +} describe('scheduleSubscriptionCancellation', () => { - it('should schedule subscription cancellation', async () => { + it('should schedule subscription cancellation at period end', async () => { + const providerSubId = uniqueProviderSubId() const user = await makeUser() - const subscription = await makeSubscription({ userId: user.id }) + const provider = mockSubscriptionProvider() + + const subscription = await makeSubscription({ + userId: user.id, + providerSubscriptionId: providerSubId, + }) const scheduledCancellation = await scheduleCancellation( subscription, - 10, - 'test' + 'test', + provider + ) + + expect(provider.getCurrentPeriodEnd).toHaveBeenCalledWith(providerSubId) + expect(provider.scheduleCancelAtPeriodEnd).toHaveBeenCalledWith( + providerSubId, + expect.any(Date) ) - expect(stripe.subscriptions.update).toHaveBeenCalled() - expect(stripe.subscriptions.update).toHaveBeenCalledWith(subscription.id, { - cancel_at_period_end: true, - cancel_at: expect.any(Number), - }) expect(scheduledCancellation.status).toBe('PENDING_CANCELLATION') @@ -38,65 +48,46 @@ describe('scheduleSubscriptionCancellation', () => { expect(subscriptionFromDb?.status).toBe('PENDING_CANCELLATION') }) - it('should be able cancel after the payment day', async () => { - const paymentDay = 10 + it('should set canceledAt from provider getCurrentPeriodEnd', async () => { + const providerSubId = uniqueProviderSubId() + const periodEnd = new Date('2025-04-09T23:59:59.000Z') + const provider = mockSubscriptionProvider(periodEnd) const user = await makeUser() - - const subscription = await makeSubscription({ userId: user.id }) - - const fakeToday = new Date('2025-04-07T00:00:00.000Z') - - vi.setSystemTime(fakeToday) + const subscription = await makeSubscription({ + userId: user.id, + providerSubscriptionId: providerSubId, + }) const scheduledCancellation = await scheduleCancellation( subscription, - paymentDay, - 'test' + 'test', + provider ) - expect(stripe.subscriptions.update).toHaveBeenCalled() - expect(stripe.subscriptions.update).toHaveBeenCalledWith(subscription.id, { - cancel_at_period_end: true, - cancel_at: expect.any(Number), - }) - expect(scheduledCancellation.status).toBe('PENDING_CANCELLATION') + expect(scheduledCancellation.canceledAt).toEqual(periodEnd) const subscriptionFromDb = await getSubscriptionById(subscription.id) - - expect(subscriptionFromDb?.status).toBe('PENDING_CANCELLATION') - expect(subscriptionFromDb?.canceledAt).toEqual(new Date(2025, 3, 9)) + expect(subscriptionFromDb?.canceledAt).toEqual(periodEnd) }) - it('should be able cancel before the payment day', async () => { - const paymentDay = 10 - + it('should throw when subscription has no provider subscription id', async () => { const user = await makeUser() + const provider = mockSubscriptionProvider() - const subscription = await makeSubscription({ userId: user.id }) - - const fakeToday = new Date('2025-04-11T00:00:00.000Z') - - vi.setSystemTime(fakeToday) - - const scheduledCancellation = await scheduleCancellation( - subscription, - paymentDay, - 'test' - ) - - expect(stripe.subscriptions.update).toHaveBeenCalled() - expect(stripe.subscriptions.update).toHaveBeenCalledWith(subscription.id, { - cancel_at_period_end: true, - cancel_at: expect.any(Number), + const subscription = await makeSubscription({ + userId: user.id, + providerSubscriptionId: null, }) - expect(scheduledCancellation.status).toBe('PENDING_CANCELLATION') - - const subscriptionFromDb = await getSubscriptionById(subscription.id) + await expect( + scheduleCancellation(subscription, 'test', provider) + ).rejects.toThrow( + 'Cannot schedule cancellation: subscription has no provider subscription id' + ) - expect(subscriptionFromDb?.status).toBe('PENDING_CANCELLATION') - expect(subscriptionFromDb?.canceledAt).toEqual(new Date(2025, 4, 9)) + expect(provider.getCurrentPeriodEnd).not.toHaveBeenCalled() + expect(provider.scheduleCancelAtPeriodEnd).not.toHaveBeenCalled() }) }) diff --git a/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.ts b/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.ts index ea2f106d..00b26ee2 100644 --- a/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.ts +++ b/apps/backend/src/domain/services/subscriptions/schedule-subscription-cancellation.ts @@ -1,63 +1,40 @@ -import { stripe } from '@/adapters/stripe' import { cancelUserSubscription } from '@/db/repositories/subscription-repository' import type { Subscription } from '@/domain/entities/subscription' import { DomainError } from '@/domain/errors/domain-error' +import type { SubscriptionProvider } from '@/ports/subscription-provider' export async function scheduleCancellation( - { id: subscriptionId, userId }: Subscription, - paymentDay: number, - reason: string | undefined + { id: subscriptionId, userId, providerSubscriptionId }: Subscription, + reason: string | undefined, + provider: SubscriptionProvider ) { - try { - const expirationDate = await calculateSubscriptionExpiration(paymentDay) - - const subscription = await updateSubscription( - subscriptionId, - expirationDate.getTime(), - true + if (!providerSubscriptionId) { + throw new DomainError( + 'Cannot schedule cancellation: subscription has no provider subscription id', + 400 ) + } - if (!subscription) { - throw new DomainError('Failed to schedule subscription cancellation', 500) - } + try { + const canceledAt = await provider.getCurrentPeriodEnd( + providerSubscriptionId + ) + await provider.scheduleCancelAtPeriodEnd(providerSubscriptionId, canceledAt) const scheduledCancellation = await cancelUserSubscription({ id: subscriptionId, userId, status: 'PENDING_CANCELLATION', - canceledAt: expirationDate, + canceledAt, cancellationReason: reason, }) return scheduledCancellation } catch (error) { - return new DomainError( + if (error instanceof DomainError) throw error + throw new DomainError( `Failed to schedule subscription cancellation, ${error instanceof Error ? error.message : String(error)}`, 500 ) } } - -async function updateSubscription( - subscriptionId: string, - date: number | null, - cancelAtPeriodEnd: boolean -) { - const subscription = await stripe.subscriptions.update(subscriptionId, { - cancel_at: date, - cancel_at_period_end: cancelAtPeriodEnd, - }) - - return subscription -} - -async function calculateSubscriptionExpiration(paymentDay: number) { - const currentDate = new Date() - const currentDay = currentDate.getDate() - const currentMonth = - currentDay < paymentDay - ? currentDate.getMonth() - : currentDate.getMonth() + 1 - - return new Date(currentDate.getFullYear(), currentMonth, paymentDay - 1) -} diff --git a/apps/backend/src/domain/services/users/get-by-id.spec.ts b/apps/backend/src/domain/services/users/get-by-id.spec.ts index 2fc99f4b..acc8b62b 100644 --- a/apps/backend/src/domain/services/users/get-by-id.spec.ts +++ b/apps/backend/src/domain/services/users/get-by-id.spec.ts @@ -33,7 +33,12 @@ describe('get user by id', () => { expect(user.user.subscriptionType).toBe('MEMBER') - await completeSubscription(email) + await completeSubscription({ + email, + provider: 'STRIPE', + providerSubscriptionId: randomUUID(), + type: 'PRO', + }) const sut = await getUserById(id) diff --git a/apps/backend/src/http/controllers/stripe-webhook-controller.ts b/apps/backend/src/http/controllers/stripe-webhook-controller.ts index ef7fcb55..69abf068 100644 --- a/apps/backend/src/http/controllers/stripe-webhook-controller.ts +++ b/apps/backend/src/http/controllers/stripe-webhook-controller.ts @@ -1,8 +1,17 @@ import type { FastifyReply, FastifyRequest } from 'fastify' import type Stripe from 'stripe' +import { logger } from '@/adapters/logger' import { stripe } from '@/adapters/stripe' import { config } from '@/config' +import { DomainError } from '@/domain/errors/domain-error' import { completeSubscription } from '@/domain/services/subscriptions/complete-subscription' +import { + handleSubscriptionDeleted, + handleSubscriptionUpdated, +} from '@/domain/services/subscriptions/handle-subscription-webhook' + +const webhookSecret = + config.services.STRIPE_WEBHOOK_SECRET || config.services.STRIPE_SECRET_KEY export async function stripeWebhookController( request: FastifyRequest, @@ -19,20 +28,61 @@ export async function stripeWebhookController( event = stripe.webhooks.constructEvent( request.body as string, stripeSignature, - config.services.STRIPE_SECRET_KEY + webhookSecret ) } catch (error) { return reply.status(400).send(`Webhook Error: ${error}`) } switch (event.type) { - case 'checkout.session.completed': - await completeSubscription(event.data.object.customer_email) + case 'checkout.session.completed': { + const session = event.data.object as Stripe.Checkout.Session + if (session.mode !== 'subscription') break + const params = parseCheckoutSessionCompleted(session) + if (params) { + const result = await completeSubscription({ + email: params.email, + provider: 'STRIPE', + providerSubscriptionId: params.providerSubscriptionId, + type: 'PRO', + }) + if (result instanceof DomainError) { + logger.warn( + { eventId: event.id, error: result.message }, + 'checkout.session.completed: completeSubscription returned error' + ) + } + } break - + } + case 'customer.subscription.deleted': { + const subscription = event.data.object as Stripe.Subscription + await handleSubscriptionDeleted(subscription) + break + } + case 'customer.subscription.updated': { + const subscription = event.data.object as Stripe.Subscription + await handleSubscriptionUpdated(subscription) + break + } default: - console.error(`Unhandled event type ${event.type}`) + logger.info({ eventType: event.type }, 'Unhandled Stripe webhook event') } return reply.status(200).send({ received: true }) } + +function parseCheckoutSessionCompleted( + object: Stripe.Checkout.Session +): { email: string; providerSubscriptionId: string | null } | null { + const email = + typeof object.customer_email === 'string' ? object.customer_email : null + if (!email) return null + + const providerSubscriptionId = + typeof object.subscription === 'string' + ? object.subscription + : (object.subscription?.id ?? null) + + return { email, providerSubscriptionId } +} diff --git a/apps/backend/src/http/controllers/subscriptions-controller.ts b/apps/backend/src/http/controllers/subscriptions-controller.ts index c635ad94..c3ba7340 100644 --- a/apps/backend/src/http/controllers/subscriptions-controller.ts +++ b/apps/backend/src/http/controllers/subscriptions-controller.ts @@ -1,9 +1,13 @@ import type { FastifyReply, FastifyRequest } from 'fastify' +import { StripeSubscriptionProvider } from '@/adapters/stripe-subscription-provider' import { DomainError } from '@/domain/errors/domain-error' import { cancelSubscription } from '@/domain/services/subscriptions/cancel-subscription' import { getSubscription } from '@/domain/services/subscriptions/get-subscription' import { scheduleCancellation } from '@/domain/services/subscriptions/schedule-subscription-cancellation' import { deleteSubscriptionBodySchema } from '../schemas/subscriptions' + +const subscriptionProvider = StripeSubscriptionProvider + export async function deleteSubscriptionController( request: FastifyRequest, reply: FastifyReply @@ -22,11 +26,10 @@ export async function deleteSubscriptionController( switch (when) { case 'now': - await cancelSubscription(subscription, reason) + await cancelSubscription(subscription, reason, subscriptionProvider) break case 'at_end_of_current_period': - // TODO: get the payment day from the subscription - await scheduleCancellation(subscription, 1, reason) + await scheduleCancellation(subscription, reason, subscriptionProvider) break default: return reply.status(400).send({ message: 'Invalid when parameter' }) diff --git a/apps/backend/src/http/routes/subscriptions.ts b/apps/backend/src/http/routes/subscriptions.ts index 70093408..bc098c07 100644 --- a/apps/backend/src/http/routes/subscriptions.ts +++ b/apps/backend/src/http/routes/subscriptions.ts @@ -1,4 +1,5 @@ import type { FastifyInstance } from 'fastify' +import type { ZodTypeProvider } from 'fastify-type-provider-zod' import { deleteSubscriptionController } from '../controllers/subscriptions-controller' import { verifyJwt } from '../middlewares/verify-jwt' import { @@ -6,23 +7,23 @@ import { deleteSubscriptionResponseSchema, } from '../schemas/subscriptions' -export const subscriptionsRoutes = (app: FastifyInstance) => - app.route({ - method: 'DELETE', - url: '/user/subscription', - onRequest: [verifyJwt], - schema: { - description: 'Delete user subscription', - tags: ['subscriptions'], +const SUBSCRIPTIONS_TAG = ['subscriptions'] - body: deleteSubscriptionBodySchema, - response: deleteSubscriptionResponseSchema, - security: [ - { - bearerAuth: [], - }, - ], - }, - - handler: deleteSubscriptionController, - }) +export async function subscriptionsRoutes(app: FastifyInstance) { + app.after(() => + app.withTypeProvider().route({ + method: 'DELETE', + url: '/user/subscription', + onRequest: [verifyJwt], + schema: { + description: 'Delete user subscription', + operationId: 'deleteSubscription', + tags: SUBSCRIPTIONS_TAG, + body: deleteSubscriptionBodySchema, + response: deleteSubscriptionResponseSchema, + security: [{ bearerAuth: [] }], + }, + handler: deleteSubscriptionController, + }) + ) +} diff --git a/apps/backend/src/ports/subscription-provider.ts b/apps/backend/src/ports/subscription-provider.ts new file mode 100644 index 00000000..a637285e --- /dev/null +++ b/apps/backend/src/ports/subscription-provider.ts @@ -0,0 +1,12 @@ +/** + * Port for payment/subscription provider operations (Stripe, Apple, etc.). + * Domain depends on this abstraction; infrastructure implements it. + */ +export interface SubscriptionProvider { + getCurrentPeriodEnd(providerSubscriptionId: string): Promise + scheduleCancelAtPeriodEnd( + providerSubscriptionId: string, + periodEnd: Date + ): Promise + cancelImmediately(providerSubscriptionId: string): Promise +} diff --git a/apps/backend/src/test/factories/make-subscription.ts b/apps/backend/src/test/factories/make-subscription.ts index 08206cd1..1e7c9b43 100644 --- a/apps/backend/src/test/factories/make-subscription.ts +++ b/apps/backend/src/test/factories/make-subscription.ts @@ -14,6 +14,7 @@ export function makeRawSubscription( type: 'MEMBER', userId: faker.string.uuid(), status: 'ACTIVE', + provider: 'STRIPE', ...overrides, } } diff --git a/apps/web/package.json b/apps/web/package.json index e40eabf2..0293af43 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,7 +8,8 @@ "start": "next start", "test": "vitest", "test:ui": "vitest --coverage.enabled=true --ui", - "lint": "next lint" + "lint": "next lint", + "generate:api": "orval" }, "dependencies": { "@dnd-kit/core": "^6.3.1", diff --git a/apps/web/public/dictionaries/de-DE.json b/apps/web/public/dictionaries/de-DE.json index e7bc636c..244f0010 100644 --- a/apps/web/public/dictionaries/de-DE.json +++ b/apps/web/public/dictionaries/de-DE.json @@ -712,6 +712,14 @@ "account_data": "Kontodaten", "social_links": "Soziale Links", "subscription": "Abonnement", + "subscription_plan": "Plan", + "cancel_subscription": "Abonnement kündigen", + "cancel_subscription_confirm_title": "Abonnement kündigen?", + "cancel_subscription_confirm_description": "Wählen Sie, wann gekündigt werden soll. Sie können PRO bis zum Ende des Abrechnungszeitraums behalten.", + "cancel_at_end_of_period": "Am Periodenende", + "cancel_now": "Jetzt kündigen", + "cancel_subscription_success": "Abonnement gekündigt", + "cancel_subscription_error": "Kündigung fehlgeschlagen", "overall_progress": "Gesamtfortschritt", "episodes": "Episoden", "when_you_mark_all_episodes": "Wenn Sie alle Episoden als angesehen markieren, wird die Serie/Anime automatisch auf den Status aktualisiert", diff --git a/apps/web/public/dictionaries/en-US.json b/apps/web/public/dictionaries/en-US.json index b9736979..0999e94b 100644 --- a/apps/web/public/dictionaries/en-US.json +++ b/apps/web/public/dictionaries/en-US.json @@ -713,6 +713,14 @@ "account_data": "Account data", "social_links": "Social links", "subscription": "Subscription", + "subscription_plan": "Plan", + "cancel_subscription": "Cancel subscription", + "cancel_subscription_confirm_title": "Cancel subscription?", + "cancel_subscription_confirm_description": "Choose when to cancel. You can keep PRO until the end of your billing period.", + "cancel_at_end_of_period": "At end of period", + "cancel_now": "Cancel now", + "cancel_subscription_success": "Subscription cancelled", + "cancel_subscription_error": "Failed to cancel subscription", "overall_progress": "Overall Progress", "episodes": "Episodes", "when_you_mark_all_episodes": "When you mark all episodes as watched, the series/anime will automatically be updated to the status of", diff --git a/apps/web/public/dictionaries/es-ES.json b/apps/web/public/dictionaries/es-ES.json index e07256da..f3a6993b 100644 --- a/apps/web/public/dictionaries/es-ES.json +++ b/apps/web/public/dictionaries/es-ES.json @@ -715,6 +715,14 @@ "account_data": "Datos de la cuenta", "social_links": "Enlaces sociales", "subscription": "Suscripción", + "subscription_plan": "Plan", + "cancel_subscription": "Cancelar suscripción", + "cancel_subscription_confirm_title": "¿Cancelar suscripción?", + "cancel_subscription_confirm_description": "Elige cuándo cancelar. Puedes mantener PRO hasta el final del periodo de facturación.", + "cancel_at_end_of_period": "Al final del periodo", + "cancel_now": "Cancelar ahora", + "cancel_subscription_success": "Suscripción cancelada", + "cancel_subscription_error": "Error al cancelar la suscripción", "overall_progress": "Progreso general", "episodes": "Episodios", "when_you_mark_all_episodes": "Al marcar todos los episodios como vistos, la serie/anime se actualizará automáticamente al estado de", diff --git a/apps/web/public/dictionaries/fr-FR.json b/apps/web/public/dictionaries/fr-FR.json index 8928257f..81aeb157 100644 --- a/apps/web/public/dictionaries/fr-FR.json +++ b/apps/web/public/dictionaries/fr-FR.json @@ -718,6 +718,14 @@ "account_data": "Données du compte", "social_links": "Liens sociaux", "subscription": "Abonnement", + "subscription_plan": "Forfait", + "cancel_subscription": "Annuler l'abonnement", + "cancel_subscription_confirm_title": "Annuler l'abonnement ?", + "cancel_subscription_confirm_description": "Choisissez quand annuler. Vous pouvez conserver PRO jusqu'à la fin de la période de facturation.", + "cancel_at_end_of_period": "À la fin de la période", + "cancel_now": "Annuler maintenant", + "cancel_subscription_success": "Abonnement annulé", + "cancel_subscription_error": "Échec de l'annulation", "overall_progress": "Progrès global", "episodes": "Épisodes", "when_you_mark_all_episodes": "Lorsque vous marquez tous les épisodes comme regardés, la série/anime sera automatiquement mise à jour au statut de", diff --git a/apps/web/public/dictionaries/it-IT.json b/apps/web/public/dictionaries/it-IT.json index 692c61ec..27c717df 100644 --- a/apps/web/public/dictionaries/it-IT.json +++ b/apps/web/public/dictionaries/it-IT.json @@ -715,6 +715,14 @@ "account_data": "Dati dell'account", "social_links": "Link sociali", "subscription": "Abbonamento", + "subscription_plan": "Piano", + "cancel_subscription": "Annulla abbonamento", + "cancel_subscription_confirm_title": "Annullare l'abbonamento?", + "cancel_subscription_confirm_description": "Scegli quando annullare. Puoi mantenere PRO fino alla fine del periodo di fatturazione.", + "cancel_at_end_of_period": "Alla fine del periodo", + "cancel_now": "Annulla ora", + "cancel_subscription_success": "Abbonamento annullato", + "cancel_subscription_error": "Annullamento non riuscito", "overall_progress": "Progresso generale", "episodes": "Episodi", "when_you_mark_all_episodes": "Quando contrassegni tutti gli episodi come guardati, la serie/anime verrà automaticamente aggiornata allo stato di", diff --git a/apps/web/public/dictionaries/ja-JP.json b/apps/web/public/dictionaries/ja-JP.json index a6e1c087..7f9183d2 100644 --- a/apps/web/public/dictionaries/ja-JP.json +++ b/apps/web/public/dictionaries/ja-JP.json @@ -718,6 +718,14 @@ "account_data": "アカウントデータ", "social_links": "ソーシャルリンク", "subscription": "サブスクリプション", + "subscription_plan": "プラン", + "cancel_subscription": "サブスクリプションをキャンセル", + "cancel_subscription_confirm_title": "サブスクリプションをキャンセルしますか?", + "cancel_subscription_confirm_description": "キャンセルの時期を選択してください。請求期間の終了までPROを利用できます。", + "cancel_at_end_of_period": "期間終了時", + "cancel_now": "今すぐキャンセル", + "cancel_subscription_success": "サブスクリプションをキャンセルしました", + "cancel_subscription_error": "キャンセルに失敗しました", "overall_progress": "全体の進捗", "episodes": "エピソード", "when_you_mark_all_episodes": "すべてのエピソードを視聴済みにすると、シリーズ/アニメは自動的にステータスに更新されます", diff --git a/apps/web/public/dictionaries/pt-BR.json b/apps/web/public/dictionaries/pt-BR.json index 6d3b7326..60b8e963 100644 --- a/apps/web/public/dictionaries/pt-BR.json +++ b/apps/web/public/dictionaries/pt-BR.json @@ -716,6 +716,14 @@ "account_data": "Dados da conta", "social_links": "Links sociais", "subscription": "Assinatura", + "subscription_plan": "Plano", + "cancel_subscription": "Cancelar assinatura", + "cancel_subscription_confirm_title": "Cancelar assinatura?", + "cancel_subscription_confirm_description": "Escolha quando cancelar. Você pode manter o PRO até o fim do período de cobrança.", + "cancel_at_end_of_period": "No fim do período", + "cancel_now": "Cancelar agora", + "cancel_subscription_success": "Assinatura cancelada", + "cancel_subscription_error": "Falha ao cancelar assinatura", "overall_progress": "Progresso geral", "episodes": "Episódios", "when_you_mark_all_episodes": "Ao marcar todos os episódios como assistidos, a série/anime será atualizada automaticamente para o status de", diff --git a/apps/web/src/api/auth.ts b/apps/web/src/api/auth.ts index ec7a08e0..06cec9d8 100644 --- a/apps/web/src/api/auth.ts +++ b/apps/web/src/api/auth.ts @@ -1,27 +1,31 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 */ import { useMutation -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { MutationFunction, + QueryClient, UseMutationOptions, UseMutationResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { PostLogin200, PostLogin400, PostLoginBody -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * User login with login and password */ @@ -44,7 +48,7 @@ export const postLogin = ( export const getPostLoginMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PostLoginBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostLoginBody}, TContext> => { - + const mutationKey = ['postLogin']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -72,7 +76,7 @@ const {mutation: mutationOptions} = options ? export const usePostLogin = (options?: { mutation?:UseMutationOptions>, TError,{data: PostLoginBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostLoginBody}, @@ -81,6 +85,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostLoginMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/api/default.ts b/apps/web/src/api/default.ts index 873e7191..1fcf87ab 100644 --- a/apps/web/src/api/default.ts +++ b/apps/web/src/api/default.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -7,11 +7,12 @@ import { useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, DefinedUseQueryResult, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -19,12 +20,14 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import { axiosInstance } from '../services/axios-instance'; + export const getHealth = ( signal?: AbortSignal @@ -38,8 +41,12 @@ export const getHealth = ( } + + export const getGetHealthQueryKey = () => { - return [`/health`] as const; + return [ + `/health` + ] as const; } @@ -58,7 +65,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetHealthQueryResult = NonNullable>> @@ -73,8 +80,8 @@ export function useGetHealth>, TErr Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetHealth>, TError = unknown>( options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -83,21 +90,21 @@ export function useGetHealth>, TErr Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetHealth>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetHealth>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetHealthQueryOptions(options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -106,6 +113,7 @@ export function useGetHealth>, TErr + export const getGetHealthSuspenseQueryOptions = >, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } ) => { @@ -121,7 +129,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetHealthSuspenseQueryResult = NonNullable>> @@ -130,25 +138,25 @@ export type GetHealthSuspenseQueryError = unknown export function useGetHealthSuspense>, TError = unknown>( options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetHealthSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetHealthSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetHealthSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetHealthSuspenseQueryOptions(options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -157,3 +165,4 @@ export function useGetHealthSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostFollowBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostFollowBody}, TContext> => { - + const mutationKey = ['postFollow']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -92,7 +96,7 @@ const {mutation: mutationOptions} = options ? export const usePostFollow = (options?: { mutation?:UseMutationOptions>, TError,{data: PostFollowBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostFollowBody}, @@ -101,7 +105,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostFollowMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get follow @@ -120,8 +124,12 @@ export const getFollow = ( } -export const getGetFollowQueryKey = (params: GetFollowParams,) => { - return [`/follow`, ...(params ? [params]: [])] as const; + + +export const getGetFollowQueryKey = (params?: GetFollowParams,) => { + return [ + `/follow`, ...(params ? [params]: []) + ] as const; } @@ -140,7 +148,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetFollowQueryResult = NonNullable>> @@ -155,8 +163,8 @@ export function useGetFollow>, TErr Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetFollow>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -165,21 +173,21 @@ export function useGetFollow>, TErr Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetFollow>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetFollow>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetFollowQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -188,6 +196,7 @@ export function useGetFollow>, TErr + export const getGetFollowSuspenseQueryOptions = >, TError = unknown>(params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -203,7 +212,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetFollowSuspenseQueryResult = NonNullable>> @@ -212,25 +221,25 @@ export type GetFollowSuspenseQueryError = unknown export function useGetFollowSuspense>, TError = unknown>( params: GetFollowParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetFollowSuspense>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetFollowSuspense>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetFollowSuspense>, TError = unknown>( params: GetFollowParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetFollowSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -239,6 +248,7 @@ export function useGetFollowSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: DeleteFollowBody}, TContext>, } ): UseMutationOptions>, TError,{data: DeleteFollowBody}, TContext> => { - + const mutationKey = ['deleteFollow']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -288,7 +298,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteFollow = (options?: { mutation?:UseMutationOptions>, TError,{data: DeleteFollowBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: DeleteFollowBody}, @@ -297,7 +307,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteFollowMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get followers @@ -316,8 +326,18 @@ export const getFollowers = ( } + + +export const getGetFollowersInfiniteQueryKey = (params?: GetFollowersParams,) => { + return [ + 'infinite', `/followers`, ...(params ? [params]: []) + ] as const; + } + export const getGetFollowersQueryKey = (params?: GetFollowersParams,) => { - return [`/followers`, ...(params ? [params]: [])] as const; + return [ + `/followers`, ...(params ? [params]: []) + ] as const; } @@ -326,7 +346,7 @@ export const getGetFollowersInfiniteQueryOptions = >, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseInfiniteQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetFollowersInfiniteQueryResult = NonNullable>> @@ -351,8 +371,8 @@ export function useGetFollowersInfinite> > , 'initialData' >, } - - ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } export function useGetFollowersInfinite>>, TError = unknown>( params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -361,21 +381,21 @@ export function useGetFollowersInfinite> > , 'initialData' >, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetFollowersInfinite>>, TError = unknown>( params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetFollowersInfinite>>, TError = unknown>( params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } { const queryOptions = getGetFollowersInfiniteQueryOptions(params,options) - const query = useInfiniteQuery(queryOptions) as UseInfiniteQueryResult & { queryKey: DataTag }; + const query = useInfiniteQuery(queryOptions, queryClient) as UseInfiniteQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -384,3 +404,120 @@ export function useGetFollowersInfinite>, TError = unknown>(params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetFollowersQueryKey(params); + + + + const queryFn: QueryFunction>> = ({ signal }) => getFollowers(params, signal); + + + + + + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetFollowersQueryResult = NonNullable>> +export type GetFollowersQueryError = unknown + + +export function useGetFollowers>, TError = unknown>( + params: undefined | GetFollowersParams, options: { query:Partial>, TError, TData>> & Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } +export function useGetFollowers>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>> & Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } +export function useGetFollowers>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } + +export function useGetFollowers>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetFollowersQueryOptions(params,options) + + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + +export const getGetFollowersSuspenseQueryOptions = >, TError = unknown>(params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetFollowersQueryKey(params); + + + + const queryFn: QueryFunction>> = ({ signal }) => getFollowers(params, signal); + + + + + + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetFollowersSuspenseQueryResult = NonNullable>> +export type GetFollowersSuspenseQueryError = unknown + + +export function useGetFollowersSuspense>, TError = unknown>( + params: undefined | GetFollowersParams, options: { query:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetFollowersSuspense>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetFollowersSuspense>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } + +export function useGetFollowersSuspense>, TError = unknown>( + params?: GetFollowersParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetFollowersSuspenseQueryOptions(params,options) + + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + diff --git a/apps/web/src/api/images.ts b/apps/web/src/api/images.ts index bc6a9ae2..1800b46d 100644 --- a/apps/web/src/api/images.ts +++ b/apps/web/src/api/images.ts @@ -1,27 +1,31 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 */ import { useMutation -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { MutationFunction, + QueryClient, UseMutationOptions, UseMutationResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { PostImage201, PostImageBody, PostImageParams -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Create image */ @@ -32,7 +36,7 @@ export const postImage = ( ) => { const formData = new FormData(); -formData.append('file', postImageBody.file) +formData.append(`file`, postImageBody.file) return axiosInstance( {url: `/image`, method: 'POST', @@ -48,7 +52,7 @@ formData.append('file', postImageBody.file) export const getPostImageMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PostImageBody;params: PostImageParams}, TContext>, } ): UseMutationOptions>, TError,{data: PostImageBody;params: PostImageParams}, TContext> => { - + const mutationKey = ['postImage']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -76,7 +80,7 @@ const {mutation: mutationOptions} = options ? export const usePostImage = (options?: { mutation?:UseMutationOptions>, TError,{data: PostImageBody;params: PostImageParams}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostImageBody;params: PostImageParams}, @@ -85,6 +89,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostImageMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/api/imports.ts b/apps/web/src/api/imports.ts index 36dbcd7e..20da37d4 100644 --- a/apps/web/src/api/imports.ts +++ b/apps/web/src/api/imports.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -8,12 +8,13 @@ import { useMutation, useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, DefinedUseQueryResult, MutationFunction, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -23,7 +24,8 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { GetImportImportId200, GetImportImportId404, @@ -31,12 +33,14 @@ import type { PostImport422, PostImportBody, PostImportParams -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Save imports to run */ @@ -47,7 +51,7 @@ export const postImport = ( ) => { const formData = new FormData(); -formData.append('file', postImportBody.file) +formData.append(`file`, postImportBody.file) return axiosInstance( {url: `/import`, method: 'POST', @@ -63,7 +67,7 @@ formData.append('file', postImportBody.file) export const getPostImportMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PostImportBody;params: PostImportParams}, TContext>, } ): UseMutationOptions>, TError,{data: PostImportBody;params: PostImportParams}, TContext> => { - + const mutationKey = ['postImport']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -91,7 +95,7 @@ const {mutation: mutationOptions} = options ? export const usePostImport = (options?: { mutation?:UseMutationOptions>, TError,{data: PostImportBody;params: PostImportParams}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostImportBody;params: PostImportParams}, @@ -100,7 +104,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostImportMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get detailed import @@ -118,8 +122,12 @@ export const getImportImportId = ( } -export const getGetImportImportIdQueryKey = (importId: string,) => { - return [`/import/${importId}`] as const; + + +export const getGetImportImportIdQueryKey = (importId?: string,) => { + return [ + `/import/${importId}` + ] as const; } @@ -138,7 +146,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(importId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(importId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetImportImportIdQueryResult = NonNullable>> @@ -153,8 +161,8 @@ export function useGetImportImportId> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetImportImportId>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -163,21 +171,21 @@ export function useGetImportImportId> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetImportImportId>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetImportImportId>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetImportImportIdQueryOptions(importId,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -186,6 +194,7 @@ export function useGetImportImportId>, TError = GetImportImportId404>(importId: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -201,7 +210,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetImportImportIdSuspenseQueryResult = NonNullable>> @@ -210,25 +219,25 @@ export type GetImportImportIdSuspenseQueryError = GetImportImportId404 export function useGetImportImportIdSuspense>, TError = GetImportImportId404>( importId: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetImportImportIdSuspense>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetImportImportIdSuspense>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetImportImportIdSuspense>, TError = GetImportImportId404>( importId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetImportImportIdSuspenseQueryOptions(importId,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -237,3 +246,4 @@ export function useGetImportImportIdSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostLikeBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostLikeBody}, TContext> => { - + const mutationKey = ['postLike']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -84,7 +88,7 @@ const {mutation: mutationOptions} = options ? export const usePostLike = (options?: { mutation?:UseMutationOptions>, TError,{data: PostLikeBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostLikeBody}, @@ -93,7 +97,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostLikeMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Delete like @@ -114,7 +118,7 @@ export const deleteLikeId = ( export const getDeleteLikeIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteLikeId']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -142,7 +146,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteLikeId = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -151,7 +155,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteLikeIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get likes @@ -169,8 +173,12 @@ export const getLikesEntityId = ( } -export const getGetLikesEntityIdQueryKey = (entityId: string,) => { - return [`/likes/${entityId}`] as const; + + +export const getGetLikesEntityIdQueryKey = (entityId?: string,) => { + return [ + `/likes/${entityId}` + ] as const; } @@ -189,7 +197,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(entityId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(entityId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetLikesEntityIdQueryResult = NonNullable>> @@ -204,8 +212,8 @@ export function useGetLikesEntityId> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetLikesEntityId>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -214,21 +222,21 @@ export function useGetLikesEntityId> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetLikesEntityId>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetLikesEntityId>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetLikesEntityIdQueryOptions(entityId,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -237,6 +245,7 @@ export function useGetLikesEntityId>, TError = unknown>(entityId: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -252,7 +261,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetLikesEntityIdSuspenseQueryResult = NonNullable>> @@ -261,25 +270,25 @@ export type GetLikesEntityIdSuspenseQueryError = unknown export function useGetLikesEntityIdSuspense>, TError = unknown>( entityId: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetLikesEntityIdSuspense>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetLikesEntityIdSuspense>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetLikesEntityIdSuspense>, TError = unknown>( entityId: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetLikesEntityIdSuspenseQueryOptions(entityId,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -288,3 +297,4 @@ export function useGetLikesEntityIdSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostListItemBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostListItemBody}, TContext> => { - + const mutationKey = ['postListItem']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -86,7 +90,7 @@ const {mutation: mutationOptions} = options ? export const usePostListItem = (options?: { mutation?:UseMutationOptions>, TError,{data: PostListItemBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostListItemBody}, @@ -95,7 +99,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostListItemMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Create list item @@ -115,9 +119,13 @@ export const getListItemsByListId = ( } -export const getGetListItemsByListIdQueryKey = (listId: string, + + +export const getGetListItemsByListIdQueryKey = (listId?: string, params?: GetListItemsByListIdParams,) => { - return [`/list-items/by/${listId}`, ...(params ? [params]: [])] as const; + return [ + `/list-items/by/${listId}`, ...(params ? [params]: []) + ] as const; } @@ -137,7 +145,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(listId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(listId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListItemsByListIdQueryResult = NonNullable>> @@ -153,8 +161,8 @@ export function useGetListItemsByListId> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetListItemsByListId>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -164,23 +172,23 @@ export function useGetListItemsByListId> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListItemsByListId>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListItemsByListId>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListItemsByListIdQueryOptions(listId,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -189,6 +197,7 @@ export function useGetListItemsByListId>, TError = unknown>(listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -205,7 +214,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListItemsByListIdSuspenseQueryResult = NonNullable>> @@ -215,28 +224,28 @@ export type GetListItemsByListIdSuspenseQueryError = unknown export function useGetListItemsByListIdSuspense>, TError = unknown>( listId: string, params: undefined | GetListItemsByListIdParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListItemsByListIdSuspense>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListItemsByListIdSuspense>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListItemsByListIdSuspense>, TError = unknown>( listId: string, params?: GetListItemsByListIdParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListItemsByListIdSuspenseQueryOptions(listId,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -245,6 +254,7 @@ export function useGetListItemsByListIdSuspense(options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteListItemId']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -292,7 +302,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteListItemId = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -301,7 +311,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteListItemIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update list items position @@ -324,7 +334,7 @@ export const updateListItemsPositions = ( export const getUpdateListItemsPositionsMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateListItemsPositionsBody}, TContext>, } ): UseMutationOptions>, TError,{data: UpdateListItemsPositionsBody}, TContext> => { - + const mutationKey = ['updateListItemsPositions']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -352,7 +362,7 @@ const {mutation: mutationOptions} = options ? export const useUpdateListItemsPositions = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateListItemsPositionsBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: UpdateListItemsPositionsBody}, @@ -361,6 +371,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getUpdateListItemsPositionsMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/api/list.ts b/apps/web/src/api/list.ts index 99f95726..d1eb9c63 100644 --- a/apps/web/src/api/list.ts +++ b/apps/web/src/api/list.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -8,12 +8,13 @@ import { useMutation, useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, DefinedUseQueryResult, MutationFunction, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -23,7 +24,8 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { DeleteListId204, DeleteListId404, @@ -41,12 +43,14 @@ import type { PutListId200, PutListId404, PutListIdBody -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Create a list */ @@ -69,7 +73,7 @@ export const postList = ( export const getPostListMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PostListBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostListBody}, TContext> => { - + const mutationKey = ['postList']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -97,7 +101,7 @@ const {mutation: mutationOptions} = options ? export const usePostList = (options?: { mutation?:UseMutationOptions>, TError,{data: PostListBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostListBody}, @@ -106,7 +110,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostListMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get lists @@ -125,8 +129,12 @@ export const getLists = ( } + + export const getGetListsQueryKey = (params?: GetListsParams,) => { - return [`/lists`, ...(params ? [params]: [])] as const; + return [ + `/lists`, ...(params ? [params]: []) + ] as const; } @@ -145,7 +153,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListsQueryResult = NonNullable>> @@ -160,8 +168,8 @@ export function useGetLists>, TError Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetLists>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -170,21 +178,21 @@ export function useGetLists>, TError Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetLists>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetLists>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListsQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -193,6 +201,7 @@ export function useGetLists>, TError + export const getGetListsSuspenseQueryOptions = >, TError = GetLists404>(params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -208,7 +217,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListsSuspenseQueryResult = NonNullable>> @@ -217,25 +226,25 @@ export type GetListsSuspenseQueryError = GetLists404 export function useGetListsSuspense>, TError = GetLists404>( params: undefined | GetListsParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListsSuspense>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListsSuspense>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListsSuspense>, TError = GetLists404>( params?: GetListsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListsSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -244,6 +253,7 @@ export function useGetListsSuspense> + /** * Delete list */ @@ -263,7 +273,7 @@ export const deleteListId = ( export const getDeleteListIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteListId']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -291,7 +301,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteListId = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -300,7 +310,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteListIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update list @@ -324,7 +334,7 @@ export const putListId = ( export const getPutListIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutListIdBody}, TContext>, } ): UseMutationOptions>, TError,{id: string;data: PutListIdBody}, TContext> => { - + const mutationKey = ['putListId']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -352,7 +362,7 @@ const {mutation: mutationOptions} = options ? export const usePutListId = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutListIdBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string;data: PutListIdBody}, @@ -361,7 +371,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPutListIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get list by ID @@ -379,8 +389,12 @@ export const getListById = ( } -export const getGetListByIdQueryKey = (id: string,) => { - return [`/list/by/${id}`] as const; + + +export const getGetListByIdQueryKey = (id?: string,) => { + return [ + `/list/by/${id}` + ] as const; } @@ -399,7 +413,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListByIdQueryResult = NonNullable>> @@ -414,8 +428,8 @@ export function useGetListById>, Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetListById>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -424,21 +438,21 @@ export function useGetListById>, Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListById>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListById>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListByIdQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -447,6 +461,7 @@ export function useGetListById>, + export const getGetListByIdSuspenseQueryOptions = >, TError = GetListById404>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -462,7 +477,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListByIdSuspenseQueryResult = NonNullable>> @@ -471,25 +486,25 @@ export type GetListByIdSuspenseQueryError = GetListById404 export function useGetListByIdSuspense>, TError = GetListById404>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListByIdSuspense>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListByIdSuspense>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListByIdSuspense>, TError = GetListById404>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListByIdSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -498,6 +513,7 @@ export function useGetListByIdSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PatchListBannerBody}, TContext>, } ): UseMutationOptions>, TError,{data: PatchListBannerBody}, TContext> => { - + const mutationKey = ['patchListBanner']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -547,7 +563,7 @@ const {mutation: mutationOptions} = options ? export const usePatchListBanner = (options?: { mutation?:UseMutationOptions>, TError,{data: PatchListBannerBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PatchListBannerBody}, @@ -556,7 +572,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPatchListBannerMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get list progress @@ -574,8 +590,12 @@ export const getListProgress = ( } -export const getGetListProgressQueryKey = (id: string,) => { - return [`/list/${id}/progress`] as const; + + +export const getGetListProgressQueryKey = (id?: string,) => { + return [ + `/list/${id}/progress` + ] as const; } @@ -594,7 +614,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListProgressQueryResult = NonNullable>> @@ -609,8 +629,8 @@ export function useGetListProgress> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetListProgress>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -619,21 +639,21 @@ export function useGetListProgress> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListProgress>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetListProgress>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListProgressQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -642,6 +662,7 @@ export function useGetListProgress>, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -657,7 +678,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetListProgressSuspenseQueryResult = NonNullable>> @@ -666,25 +687,25 @@ export type GetListProgressSuspenseQueryError = unknown export function useGetListProgressSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListProgressSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListProgressSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetListProgressSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetListProgressSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -693,3 +714,4 @@ export function useGetListProgressSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostReviewReplyBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostReviewReplyBody}, TContext> => { - + const mutationKey = ['postReviewReply']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -88,7 +92,7 @@ const {mutation: mutationOptions} = options ? export const usePostReviewReply = (options?: { mutation?:UseMutationOptions>, TError,{data: PostReviewReplyBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostReviewReplyBody}, @@ -97,7 +101,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostReviewReplyMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get review replies @@ -116,8 +120,12 @@ export const getReviewReplies = ( } -export const getGetReviewRepliesQueryKey = (params: GetReviewRepliesParams,) => { - return [`/review-replies`, ...(params ? [params]: [])] as const; + + +export const getGetReviewRepliesQueryKey = (params?: GetReviewRepliesParams,) => { + return [ + `/review-replies`, ...(params ? [params]: []) + ] as const; } @@ -136,7 +144,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewRepliesQueryResult = NonNullable>> @@ -151,8 +159,8 @@ export function useGetReviewReplies> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetReviewReplies>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -161,21 +169,21 @@ export function useGetReviewReplies> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReviewReplies>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReviewReplies>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewRepliesQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -184,6 +192,7 @@ export function useGetReviewReplies>, TError = unknown>(params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -199,7 +208,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewRepliesSuspenseQueryResult = NonNullable>> @@ -208,25 +217,25 @@ export type GetReviewRepliesSuspenseQueryError = unknown export function useGetReviewRepliesSuspense>, TError = unknown>( params: GetReviewRepliesParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewRepliesSuspense>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewRepliesSuspense>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewRepliesSuspense>, TError = unknown>( params: GetReviewRepliesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewRepliesSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -235,6 +244,7 @@ export function useGetReviewRepliesSuspense(options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteReviewReplyById']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -282,7 +292,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteReviewReplyById = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -291,7 +301,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteReviewReplyByIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update review reply by id @@ -315,7 +325,7 @@ export const putReviewReplyById = ( export const getPutReviewReplyByIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutReviewReplyByIdBody}, TContext>, } ): UseMutationOptions>, TError,{id: string;data: PutReviewReplyByIdBody}, TContext> => { - + const mutationKey = ['putReviewReplyById']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -343,7 +353,7 @@ const {mutation: mutationOptions} = options ? export const usePutReviewReplyById = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutReviewReplyByIdBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string;data: PutReviewReplyByIdBody}, @@ -352,6 +362,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPutReviewReplyByIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/api/reviews.ts b/apps/web/src/api/reviews.ts index 5cfb9ffb..72645621 100644 --- a/apps/web/src/api/reviews.ts +++ b/apps/web/src/api/reviews.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -8,12 +8,13 @@ import { useMutation, useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, DefinedUseQueryResult, MutationFunction, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -23,7 +24,8 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { GetDetailedReviews200, GetDetailedReviewsParams, @@ -36,12 +38,14 @@ import type { PostReviewBody, PutReviewById200, PutReviewByIdBody -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Create a review */ @@ -64,7 +68,7 @@ export const postReview = ( export const getPostReviewMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PostReviewBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostReviewBody}, TContext> => { - + const mutationKey = ['postReview']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -92,7 +96,7 @@ const {mutation: mutationOptions} = options ? export const usePostReview = (options?: { mutation?:UseMutationOptions>, TError,{data: PostReviewBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostReviewBody}, @@ -101,7 +105,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostReviewMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get review @@ -120,8 +124,12 @@ export const getReview = ( } -export const getGetReviewQueryKey = (params: GetReviewParams,) => { - return [`/review`, ...(params ? [params]: [])] as const; + + +export const getGetReviewQueryKey = (params?: GetReviewParams,) => { + return [ + `/review`, ...(params ? [params]: []) + ] as const; } @@ -140,7 +148,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewQueryResult = NonNullable>> @@ -155,8 +163,8 @@ export function useGetReview>, TErr Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetReview>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -165,21 +173,21 @@ export function useGetReview>, TErr Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReview>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReview>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -188,6 +196,7 @@ export function useGetReview>, TErr + export const getGetReviewSuspenseQueryOptions = >, TError = unknown>(params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -203,7 +212,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewSuspenseQueryResult = NonNullable>> @@ -212,25 +221,25 @@ export type GetReviewSuspenseQueryError = unknown export function useGetReviewSuspense>, TError = unknown>( params: GetReviewParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewSuspense>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewSuspense>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewSuspense>, TError = unknown>( params: GetReviewParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -239,6 +248,7 @@ export function useGetReviewSuspense { - return [`/reviews`, ...(params ? [params]: [])] as const; + return [ + `/reviews`, ...(params ? [params]: []) + ] as const; } @@ -276,7 +290,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewsQueryResult = NonNullable>> @@ -291,8 +305,8 @@ export function useGetReviews>, TE Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetReviews>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -301,21 +315,21 @@ export function useGetReviews>, TE Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReviews>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetReviews>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewsQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -324,6 +338,7 @@ export function useGetReviews>, TE + export const getGetReviewsSuspenseQueryOptions = >, TError = unknown>(params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -339,7 +354,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetReviewsSuspenseQueryResult = NonNullable>> @@ -348,25 +363,25 @@ export type GetReviewsSuspenseQueryError = unknown export function useGetReviewsSuspense>, TError = unknown>( params: undefined | GetReviewsParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewsSuspense>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewsSuspense>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetReviewsSuspense>, TError = unknown>( params?: GetReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetReviewsSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -375,6 +390,7 @@ export function useGetReviewsSuspense(options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteReviewById']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -422,7 +438,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteReviewById = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -431,7 +447,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteReviewByIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update review by id @@ -455,7 +471,7 @@ export const putReviewById = ( export const getPutReviewByIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutReviewByIdBody}, TContext>, } ): UseMutationOptions>, TError,{id: string;data: PutReviewByIdBody}, TContext> => { - + const mutationKey = ['putReviewById']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -483,7 +499,7 @@ const {mutation: mutationOptions} = options ? export const usePutReviewById = (options?: { mutation?:UseMutationOptions>, TError,{id: string;data: PutReviewByIdBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string;data: PutReviewByIdBody}, @@ -492,7 +508,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPutReviewByIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get detailed reviews @@ -511,8 +527,12 @@ export const getDetailedReviews = ( } + + export const getGetDetailedReviewsQueryKey = (params?: GetDetailedReviewsParams,) => { - return [`/detailed/reviews`, ...(params ? [params]: [])] as const; + return [ + `/detailed/reviews`, ...(params ? [params]: []) + ] as const; } @@ -531,7 +551,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetDetailedReviewsQueryResult = NonNullable>> @@ -546,8 +566,8 @@ export function useGetDetailedReviews> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetDetailedReviews>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -556,21 +576,21 @@ export function useGetDetailedReviews> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetDetailedReviews>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetDetailedReviews>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetDetailedReviewsQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -579,6 +599,7 @@ export function useGetDetailedReviews>, TError = unknown>(params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -594,7 +615,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetDetailedReviewsSuspenseQueryResult = NonNullable>> @@ -603,25 +624,25 @@ export type GetDetailedReviewsSuspenseQueryError = unknown export function useGetDetailedReviewsSuspense>, TError = unknown>( params: undefined | GetDetailedReviewsParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetDetailedReviewsSuspense>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetDetailedReviewsSuspense>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetDetailedReviewsSuspense>, TError = unknown>( params?: GetDetailedReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetDetailedReviewsSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -630,3 +651,4 @@ export function useGetDetailedReviewsSuspense { - return axiosInstance( + return axiosInstance( {url: `/social-links`, method: 'PUT', headers: {'Content-Type': 'application/json', }, data: putSocialLinksBody @@ -55,7 +59,7 @@ export const putSocialLinks = ( export const getPutSocialLinksMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PutSocialLinksBody}, TContext>, } ): UseMutationOptions>, TError,{data: PutSocialLinksBody}, TContext> => { - + const mutationKey = ['putSocialLinks']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -83,7 +87,7 @@ const {mutation: mutationOptions} = options ? export const usePutSocialLinks = (options?: { mutation?:UseMutationOptions>, TError,{data: PutSocialLinksBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PutSocialLinksBody}, @@ -92,7 +96,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPutSocialLinksMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get social links by userId @@ -111,8 +115,12 @@ export const getSocialLinks = ( } -export const getGetSocialLinksQueryKey = (params: GetSocialLinksParams,) => { - return [`/social-links`, ...(params ? [params]: [])] as const; + + +export const getGetSocialLinksQueryKey = (params?: GetSocialLinksParams,) => { + return [ + `/social-links`, ...(params ? [params]: []) + ] as const; } @@ -131,7 +139,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetSocialLinksQueryResult = NonNullable>> @@ -146,8 +154,8 @@ export function useGetSocialLinks> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetSocialLinks>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -156,21 +164,21 @@ export function useGetSocialLinks> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetSocialLinks>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetSocialLinks>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetSocialLinksQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -179,6 +187,7 @@ export function useGetSocialLinks>, TError = unknown>(params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -194,7 +203,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetSocialLinksSuspenseQueryResult = NonNullable>> @@ -203,25 +212,25 @@ export type GetSocialLinksSuspenseQueryError = unknown export function useGetSocialLinksSuspense>, TError = unknown>( params: GetSocialLinksParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetSocialLinksSuspense>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetSocialLinksSuspense>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetSocialLinksSuspense>, TError = unknown>( params: GetSocialLinksParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetSocialLinksSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -230,3 +239,4 @@ export function useGetSocialLinksSuspense { + + + return axiosInstance( + {url: `/user/subscription`, method: 'DELETE', + headers: {'Content-Type': 'application/json', }, + data: deleteSubscriptionBody + }, + ); + } + + + +export const getDeleteSubscriptionMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: DeleteSubscriptionBody}, TContext>, } +): UseMutationOptions>, TError,{data: DeleteSubscriptionBody}, TContext> => { + +const mutationKey = ['deleteSubscription']; +const {mutation: mutationOptions} = options ? + options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? + options + : {...options, mutation: {...options.mutation, mutationKey}} + : {mutation: { mutationKey, }}; + + + + + const mutationFn: MutationFunction>, {data: DeleteSubscriptionBody}> = (props) => { + const {data} = props ?? {}; + + return deleteSubscription(data,) + } + + + + + return { mutationFn, ...mutationOptions }} + + export type DeleteSubscriptionMutationResult = NonNullable>> + export type DeleteSubscriptionMutationBody = DeleteSubscriptionBody + export type DeleteSubscriptionMutationError = unknown + + export const useDeleteSubscription = (options?: { mutation?:UseMutationOptions>, TError,{data: DeleteSubscriptionBody}, TContext>, } + , queryClient?: QueryClient): UseMutationResult< + Awaited>, + TError, + {data: DeleteSubscriptionBody}, + TContext + > => { + + const mutationOptions = getDeleteSubscriptionMutationOptions(options); + + return useMutation(mutationOptions, queryClient); + } + \ No newline at end of file diff --git a/apps/web/src/api/user-activities.ts b/apps/web/src/api/user-activities.ts index e0d8e1fb..dbed937d 100644 --- a/apps/web/src/api/user-activities.ts +++ b/apps/web/src/api/user-activities.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -9,7 +9,7 @@ import { useMutation, useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, @@ -17,6 +17,7 @@ import type { DefinedUseQueryResult, InfiniteData, MutationFunction, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -28,18 +29,21 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { GetNetworkActivities200, GetNetworkActivitiesParams, GetUserActivities200, GetUserActivitiesParams -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Get user activities */ @@ -58,9 +62,20 @@ export const getUserActivities = ( } -export const getGetUserActivitiesQueryKey = (userId: string, + + +export const getGetUserActivitiesInfiniteQueryKey = (userId?: string, + params?: GetUserActivitiesParams,) => { + return [ + 'infinite', `/user/${userId}/activities`, ...(params ? [params]: []) + ] as const; + } + +export const getGetUserActivitiesQueryKey = (userId?: string, params?: GetUserActivitiesParams,) => { - return [`/user/${userId}/activities`, ...(params ? [params]: [])] as const; + return [ + `/user/${userId}/activities`, ...(params ? [params]: []) + ] as const; } @@ -70,7 +85,7 @@ export const getGetUserActivitiesInfiniteQueryOptions = >, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(userId), ...queryOptions} as UseInfiniteQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserActivitiesInfiniteQueryResult = NonNullable>> @@ -96,8 +111,8 @@ export function useGetUserActivitiesInfinite> > , 'initialData' >, } - - ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserActivitiesInfinite>>, TError = unknown>( userId: string, params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -107,23 +122,149 @@ export function useGetUserActivitiesInfinite> > , 'initialData' >, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserActivitiesInfinite>>, TError = unknown>( userId: string, params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserActivitiesInfinite>>, TError = unknown>( userId: string, params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserActivitiesInfiniteQueryOptions(userId,params,options) - const query = useInfiniteQuery(queryOptions) as UseInfiniteQueryResult & { queryKey: DataTag }; + const query = useInfiniteQuery(queryOptions, queryClient) as UseInfiniteQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + +export const getGetUserActivitiesQueryOptions = >, TError = unknown>(userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetUserActivitiesQueryKey(userId,params); + + + + const queryFn: QueryFunction>> = ({ signal }) => getUserActivities(userId,params, signal); + + + + + + return { queryKey, queryFn, enabled: !!(userId), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetUserActivitiesQueryResult = NonNullable>> +export type GetUserActivitiesQueryError = unknown + + +export function useGetUserActivities>, TError = unknown>( + userId: string, + params: undefined | GetUserActivitiesParams, options: { query:Partial>, TError, TData>> & Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } +export function useGetUserActivities>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>> & Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } +export function useGetUserActivities>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } + +export function useGetUserActivities>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetUserActivitiesQueryOptions(userId,params,options) + + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + +export const getGetUserActivitiesSuspenseQueryOptions = >, TError = unknown>(userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetUserActivitiesQueryKey(userId,params); + + + + const queryFn: QueryFunction>> = ({ signal }) => getUserActivities(userId,params, signal); + + + + + + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetUserActivitiesSuspenseQueryResult = NonNullable>> +export type GetUserActivitiesSuspenseQueryError = unknown + + +export function useGetUserActivitiesSuspense>, TError = unknown>( + userId: string, + params: undefined | GetUserActivitiesParams, options: { query:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetUserActivitiesSuspense>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetUserActivitiesSuspense>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } + +export function useGetUserActivitiesSuspense>, TError = unknown>( + userId: string, + params?: GetUserActivitiesParams, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetUserActivitiesSuspenseQueryOptions(userId,params,options) + + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -132,6 +273,7 @@ export function useGetUserActivitiesInfinite(options?: { mutation?:UseMutationOptions>, TError,{activityId: string}, TContext>, } ): UseMutationOptions>, TError,{activityId: string}, TContext> => { - + const mutationKey = ['deleteUserActivity']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -179,7 +321,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteUserActivity = (options?: { mutation?:UseMutationOptions>, TError,{activityId: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {activityId: string}, @@ -188,7 +330,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteUserActivityMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get network activities @@ -207,8 +349,12 @@ export const getNetworkActivities = ( } -export const getGetNetworkActivitiesQueryKey = (params: GetNetworkActivitiesParams,) => { - return [`/network/activities`, ...(params ? [params]: [])] as const; + + +export const getGetNetworkActivitiesQueryKey = (params?: GetNetworkActivitiesParams,) => { + return [ + `/network/activities`, ...(params ? [params]: []) + ] as const; } @@ -227,7 +373,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetNetworkActivitiesQueryResult = NonNullable>> @@ -242,8 +388,8 @@ export function useGetNetworkActivities> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetNetworkActivities>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -252,21 +398,21 @@ export function useGetNetworkActivities> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetNetworkActivities>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetNetworkActivities>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetNetworkActivitiesQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -275,6 +421,7 @@ export function useGetNetworkActivities>, TError = unknown>(params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -290,7 +437,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetNetworkActivitiesSuspenseQueryResult = NonNullable>> @@ -299,25 +446,25 @@ export type GetNetworkActivitiesSuspenseQueryError = unknown export function useGetNetworkActivitiesSuspense>, TError = unknown>( params: GetNetworkActivitiesParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetNetworkActivitiesSuspense>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetNetworkActivitiesSuspense>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetNetworkActivitiesSuspense>, TError = unknown>( params: GetNetworkActivitiesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetNetworkActivitiesSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -326,3 +473,4 @@ export function useGetNetworkActivitiesSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostUserEpisodesBodyItem[]}, TContext>, } ): UseMutationOptions>, TError,{data: PostUserEpisodesBodyItem[]}, TContext> => { - + const mutationKey = ['postUserEpisodes']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -88,7 +92,7 @@ const {mutation: mutationOptions} = options ? export const usePostUserEpisodes = (options?: { mutation?:UseMutationOptions>, TError,{data: PostUserEpisodesBodyItem[]}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostUserEpisodesBodyItem[]}, @@ -97,7 +101,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostUserEpisodesMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get user episode @@ -116,8 +120,12 @@ export const getUserEpisodes = ( } -export const getGetUserEpisodesQueryKey = (params: GetUserEpisodesParams,) => { - return [`/user/episodes`, ...(params ? [params]: [])] as const; + + +export const getGetUserEpisodesQueryKey = (params?: GetUserEpisodesParams,) => { + return [ + `/user/episodes`, ...(params ? [params]: []) + ] as const; } @@ -136,7 +144,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserEpisodesQueryResult = NonNullable>> @@ -151,8 +159,8 @@ export function useGetUserEpisodes> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserEpisodes>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -161,21 +169,21 @@ export function useGetUserEpisodes> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserEpisodes>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserEpisodes>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserEpisodesQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -184,6 +192,7 @@ export function useGetUserEpisodes>, TError = unknown>(params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -199,7 +208,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserEpisodesSuspenseQueryResult = NonNullable>> @@ -208,25 +217,25 @@ export type GetUserEpisodesSuspenseQueryError = unknown export function useGetUserEpisodesSuspense>, TError = unknown>( params: GetUserEpisodesParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserEpisodesSuspense>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserEpisodesSuspense>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserEpisodesSuspense>, TError = unknown>( params: GetUserEpisodesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserEpisodesSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -235,6 +244,7 @@ export function useGetUserEpisodesSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: DeleteUserEpisodesBody}, TContext>, } ): UseMutationOptions>, TError,{data: DeleteUserEpisodesBody}, TContext> => { - + const mutationKey = ['deleteUserEpisodes']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -284,7 +294,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteUserEpisodes = (options?: { mutation?:UseMutationOptions>, TError,{data: DeleteUserEpisodesBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: DeleteUserEpisodesBody}, @@ -293,6 +303,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteUserEpisodesMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/api/user-items.ts b/apps/web/src/api/user-items.ts index d638233b..2ed2f7d0 100644 --- a/apps/web/src/api/user-items.ts +++ b/apps/web/src/api/user-items.ts @@ -1,5 +1,5 @@ /** - * Generated by orval v7.5.0 🍺 + * Generated by orval v7.17.2 🍺 * Do not edit manually. * Plotwist * OpenAPI spec version: 0.1.0 @@ -9,7 +9,7 @@ import { useMutation, useQuery, useSuspenseQuery -} from '@tanstack/react-query' +} from '@tanstack/react-query'; import type { DataTag, DefinedInitialDataOptions, @@ -17,6 +17,7 @@ import type { DefinedUseQueryResult, InfiniteData, MutationFunction, + QueryClient, QueryFunction, QueryKey, UndefinedInitialDataOptions, @@ -28,7 +29,8 @@ import type { UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult -} from '@tanstack/react-query' +} from '@tanstack/react-query'; + import type { GetAllUserItems200, GetAllUserItemsParams, @@ -38,12 +40,14 @@ import type { GetUserItemsBody, PutUserItem201, PutUserItemBody -} from './endpoints.schemas' +} from './endpoints.schemas'; + import { axiosInstance } from '../services/axios-instance'; + /** * Upsert user item */ @@ -65,7 +69,7 @@ export const putUserItem = ( export const getPutUserItemMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PutUserItemBody}, TContext>, } ): UseMutationOptions>, TError,{data: PutUserItemBody}, TContext> => { - + const mutationKey = ['putUserItem']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -93,7 +97,7 @@ const {mutation: mutationOptions} = options ? export const usePutUserItem = (options?: { mutation?:UseMutationOptions>, TError,{data: PutUserItemBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PutUserItemBody}, @@ -102,7 +106,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPutUserItemMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get user item @@ -121,8 +125,12 @@ export const getUserItem = ( } -export const getGetUserItemQueryKey = (params: GetUserItemParams,) => { - return [`/user/item`, ...(params ? [params]: [])] as const; + + +export const getGetUserItemQueryKey = (params?: GetUserItemParams,) => { + return [ + `/user/item`, ...(params ? [params]: []) + ] as const; } @@ -141,7 +149,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserItemQueryResult = NonNullable>> @@ -156,8 +164,8 @@ export function useGetUserItem>, Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserItem>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -166,21 +174,21 @@ export function useGetUserItem>, Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserItem>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserItem>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserItemQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -189,6 +197,7 @@ export function useGetUserItem>, + export const getGetUserItemSuspenseQueryOptions = >, TError = unknown>(params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -204,7 +213,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserItemSuspenseQueryResult = NonNullable>> @@ -213,25 +222,25 @@ export type GetUserItemSuspenseQueryError = unknown export function useGetUserItemSuspense>, TError = unknown>( params: GetUserItemParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserItemSuspense>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserItemSuspense>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserItemSuspense>, TError = unknown>( params: GetUserItemParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserItemSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -240,6 +249,7 @@ export function useGetUserItemSuspense { - return [`/user/items`, getUserItemsBody] as const; + + +export const getGetUserItemsInfiniteQueryKey = (getUserItemsBody?: GetUserItemsBody,) => { + return [ + 'infinite', `/user/items`, getUserItemsBody + ] as const; + } + +export const getGetUserItemsQueryKey = (getUserItemsBody?: GetUserItemsBody,) => { + return [ + `/user/items`, getUserItemsBody + ] as const; } @@ -268,7 +288,7 @@ export const getGetUserItemsInfiniteQueryOptions = >, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseInfiniteQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserItemsInfiniteQueryResult = NonNullable>> @@ -293,8 +313,8 @@ export function useGetUserItemsInfinite> > , 'initialData' >, } - - ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserItemsInfinite>>, TError = unknown>( getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -303,21 +323,21 @@ export function useGetUserItemsInfinite> > , 'initialData' >, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserItemsInfinite>>, TError = unknown>( getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } export function useGetUserItemsInfinite>>, TError = unknown>( getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } - - ): UseInfiniteQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseInfiniteQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserItemsInfiniteQueryOptions(getUserItemsBody,options) - const query = useInfiniteQuery(queryOptions) as UseInfiniteQueryResult & { queryKey: DataTag }; + const query = useInfiniteQuery(queryOptions, queryClient) as UseInfiniteQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -326,6 +346,123 @@ export function useGetUserItemsInfinite>, TError = unknown>(getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetUserItemsQueryKey(getUserItemsBody); + + + + const queryFn: QueryFunction>> = ({ signal }) => getUserItems(getUserItemsBody, signal); + + + + + + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetUserItemsQueryResult = NonNullable>> +export type GetUserItemsQueryError = unknown + + +export function useGetUserItems>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options: { query:Partial>, TError, TData>> & Pick< + DefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } +export function useGetUserItems>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>> & Pick< + UndefinedInitialDataOptions< + Awaited>, + TError, + Awaited> + > , 'initialData' + >, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } +export function useGetUserItems>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } + +export function useGetUserItems>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetUserItemsQueryOptions(getUserItemsBody,options) + + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + +export const getGetUserItemsSuspenseQueryOptions = >, TError = unknown>(getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } +) => { + +const {query: queryOptions} = options ?? {}; + + const queryKey = queryOptions?.queryKey ?? getGetUserItemsQueryKey(getUserItemsBody); + + + + const queryFn: QueryFunction>> = ({ signal }) => getUserItems(getUserItemsBody, signal); + + + + + + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } +} + +export type GetUserItemsSuspenseQueryResult = NonNullable>> +export type GetUserItemsSuspenseQueryError = unknown + + +export function useGetUserItemsSuspense>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options: { query:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetUserItemsSuspense>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } +export function useGetUserItemsSuspense>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } + +export function useGetUserItemsSuspense>, TError = unknown>( + getUserItemsBody: GetUserItemsBody, options?: { query?:Partial>, TError, TData>>, } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { + + const queryOptions = getGetUserItemsSuspenseQueryOptions(getUserItemsBody,options) + + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; + + query.queryKey = queryOptions.queryKey ; + + return query; +} + + + + /** * Delete user item */ @@ -345,7 +482,7 @@ export const deleteUserItemId = ( export const getDeleteUserItemIdMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } ): UseMutationOptions>, TError,{id: string}, TContext> => { - + const mutationKey = ['deleteUserItemId']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -373,7 +510,7 @@ const {mutation: mutationOptions} = options ? export const useDeleteUserItemId = (options?: { mutation?:UseMutationOptions>, TError,{id: string}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {id: string}, @@ -382,7 +519,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getDeleteUserItemIdMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get user items @@ -401,8 +538,12 @@ export const getAllUserItems = ( } -export const getGetAllUserItemsQueryKey = (params: GetAllUserItemsParams,) => { - return [`/user/items/all`, ...(params ? [params]: [])] as const; + + +export const getGetAllUserItemsQueryKey = (params?: GetAllUserItemsParams,) => { + return [ + `/user/items/all`, ...(params ? [params]: []) + ] as const; } @@ -421,7 +562,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetAllUserItemsQueryResult = NonNullable>> @@ -436,8 +577,8 @@ export function useGetAllUserItems> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetAllUserItems>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -446,21 +587,21 @@ export function useGetAllUserItems> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetAllUserItems>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetAllUserItems>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetAllUserItemsQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -469,6 +610,7 @@ export function useGetAllUserItems>, TError = unknown>(params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -484,7 +626,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetAllUserItemsSuspenseQueryResult = NonNullable>> @@ -493,25 +635,25 @@ export type GetAllUserItemsSuspenseQueryError = unknown export function useGetAllUserItemsSuspense>, TError = unknown>( params: GetAllUserItemsParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetAllUserItemsSuspense>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetAllUserItemsSuspense>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetAllUserItemsSuspense>, TError = unknown>( params: GetAllUserItemsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetAllUserItemsSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -520,3 +662,4 @@ export function useGetAllUserItemsSuspense { - return [`/user/${id}/stats`] as const; + + +export const getGetUserIdStatsQueryKey = (id?: string,) => { + return [ + `/user/${id}/stats` + ] as const; } @@ -77,7 +85,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdStatsQueryResult = NonNullable>> @@ -92,8 +100,8 @@ export function useGetUserIdStats> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdStats>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -102,21 +110,21 @@ export function useGetUserIdStats> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdStats>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdStats>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdStatsQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -125,6 +133,7 @@ export function useGetUserIdStats>, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -140,7 +149,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdStatsSuspenseQueryResult = NonNullable>> @@ -149,25 +158,25 @@ export type GetUserIdStatsSuspenseQueryError = unknown export function useGetUserIdStatsSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdStatsSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdStatsSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdStatsSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdStatsSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -176,6 +185,7 @@ export function useGetUserIdStatsSuspense { - return [`/user/${id}/total-hours`] as const; + + +export const getGetUserIdTotalHoursQueryKey = (id?: string,) => { + return [ + `/user/${id}/total-hours` + ] as const; } @@ -212,7 +226,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdTotalHoursQueryResult = NonNullable>> @@ -227,8 +241,8 @@ export function useGetUserIdTotalHours> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHours>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -237,21 +251,21 @@ export function useGetUserIdTotalHours> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHours>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHours>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdTotalHoursQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -260,6 +274,7 @@ export function useGetUserIdTotalHours>, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -275,7 +290,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdTotalHoursSuspenseQueryResult = NonNullable>> @@ -284,25 +299,25 @@ export type GetUserIdTotalHoursSuspenseQueryError = unknown export function useGetUserIdTotalHoursSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHoursSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHoursSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdTotalHoursSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdTotalHoursSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -311,6 +326,7 @@ export function useGetUserIdTotalHoursSuspense { - return [`/user/${id}/reviews-count`] as const; + + +export const getGetUserIdReviewsCountQueryKey = (id?: string,) => { + return [ + `/user/${id}/reviews-count` + ] as const; } @@ -347,7 +367,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdReviewsCountQueryResult = NonNullable>> @@ -362,8 +382,8 @@ export function useGetUserIdReviewsCount> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCount>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -372,21 +392,21 @@ export function useGetUserIdReviewsCount> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCount>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCount>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdReviewsCountQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -395,6 +415,7 @@ export function useGetUserIdReviewsCount>, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -410,7 +431,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdReviewsCountSuspenseQueryResult = NonNullable>> @@ -419,25 +440,25 @@ export type GetUserIdReviewsCountSuspenseQueryError = unknown export function useGetUserIdReviewsCountSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCountSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCountSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdReviewsCountSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdReviewsCountSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -446,6 +467,7 @@ export function useGetUserIdReviewsCountSuspense { - return [`/user/${id}/most-watched-series`, ...(params ? [params]: [])] as const; + return [ + `/user/${id}/most-watched-series`, ...(params ? [params]: []) + ] as const; } @@ -486,7 +512,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdMostWatchedSeriesQueryResult = NonNullable>> @@ -502,8 +528,8 @@ export function useGetUserIdMostWatchedSeries> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeries>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -513,23 +539,23 @@ export function useGetUserIdMostWatchedSeries> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeries>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeries>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdMostWatchedSeriesQueryOptions(id,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -538,6 +564,7 @@ export function useGetUserIdMostWatchedSeries>, TError = unknown>(id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -554,7 +581,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdMostWatchedSeriesSuspenseQueryResult = NonNullable>> @@ -564,28 +591,28 @@ export type GetUserIdMostWatchedSeriesSuspenseQueryError = unknown export function useGetUserIdMostWatchedSeriesSuspense>, TError = unknown>( id: string, params: undefined | GetUserIdMostWatchedSeriesParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeriesSuspense>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeriesSuspense>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdMostWatchedSeriesSuspense>, TError = unknown>( id: string, params?: GetUserIdMostWatchedSeriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdMostWatchedSeriesSuspenseQueryOptions(id,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -594,6 +621,7 @@ export function useGetUserIdMostWatchedSeriesSuspense { - return [`/user/${id}/watched-genres`, ...(params ? [params]: [])] as const; + return [ + `/user/${id}/watched-genres`, ...(params ? [params]: []) + ] as const; } @@ -634,7 +666,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedGenresQueryResult = NonNullable>> @@ -650,8 +682,8 @@ export function useGetUserIdWatchedGenres> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenres>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -661,23 +693,23 @@ export function useGetUserIdWatchedGenres> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenres>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenres>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedGenresQueryOptions(id,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -686,6 +718,7 @@ export function useGetUserIdWatchedGenres>, TError = unknown>(id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -702,7 +735,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedGenresSuspenseQueryResult = NonNullable>> @@ -712,28 +745,28 @@ export type GetUserIdWatchedGenresSuspenseQueryError = unknown export function useGetUserIdWatchedGenresSuspense>, TError = unknown>( id: string, params: undefined | GetUserIdWatchedGenresParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenresSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenresSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedGenresSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedGenresParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedGenresSuspenseQueryOptions(id,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -742,6 +775,7 @@ export function useGetUserIdWatchedGenresSuspense { - return [`/user/${id}/watched-cast`, ...(params ? [params]: [])] as const; + return [ + `/user/${id}/watched-cast`, ...(params ? [params]: []) + ] as const; } @@ -782,7 +820,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedCastQueryResult = NonNullable>> @@ -798,8 +836,8 @@ export function useGetUserIdWatchedCast> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCast>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -809,23 +847,23 @@ export function useGetUserIdWatchedCast> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCast>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCast>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedCastQueryOptions(id,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -834,6 +872,7 @@ export function useGetUserIdWatchedCast>, TError = unknown>(id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -850,7 +889,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedCastSuspenseQueryResult = NonNullable>> @@ -860,28 +899,28 @@ export type GetUserIdWatchedCastSuspenseQueryError = unknown export function useGetUserIdWatchedCastSuspense>, TError = unknown>( id: string, params: undefined | GetUserIdWatchedCastParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCastSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCastSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCastSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCastParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedCastSuspenseQueryOptions(id,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -890,6 +929,7 @@ export function useGetUserIdWatchedCastSuspense { - return [`/user/${id}/watched-countries`, ...(params ? [params]: [])] as const; + return [ + `/user/${id}/watched-countries`, ...(params ? [params]: []) + ] as const; } @@ -930,7 +974,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedCountriesQueryResult = NonNullable>> @@ -946,8 +990,8 @@ export function useGetUserIdWatchedCountries> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountries>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -957,23 +1001,23 @@ export function useGetUserIdWatchedCountries> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountries>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountries>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedCountriesQueryOptions(id,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -982,6 +1026,7 @@ export function useGetUserIdWatchedCountries>, TError = unknown>(id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -998,7 +1043,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdWatchedCountriesSuspenseQueryResult = NonNullable>> @@ -1008,28 +1053,28 @@ export type GetUserIdWatchedCountriesSuspenseQueryError = unknown export function useGetUserIdWatchedCountriesSuspense>, TError = unknown>( id: string, params: undefined | GetUserIdWatchedCountriesParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountriesSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountriesSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdWatchedCountriesSuspense>, TError = unknown>( id: string, params?: GetUserIdWatchedCountriesParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdWatchedCountriesSuspenseQueryOptions(id,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1038,6 +1083,7 @@ export function useGetUserIdWatchedCountriesSuspense { - return [`/user/${id}/best-reviews`, ...(params ? [params]: [])] as const; + return [ + `/user/${id}/best-reviews`, ...(params ? [params]: []) + ] as const; } @@ -1078,7 +1128,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdBestReviewsQueryResult = NonNullable>> @@ -1094,8 +1144,8 @@ export function useGetUserIdBestReviews> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviews>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>> & Pick< @@ -1105,23 +1155,23 @@ export function useGetUserIdBestReviews> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviews>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviews>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdBestReviewsQueryOptions(id,params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1130,6 +1180,7 @@ export function useGetUserIdBestReviews>, TError = unknown>(id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -1146,7 +1197,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdBestReviewsSuspenseQueryResult = NonNullable>> @@ -1156,28 +1207,28 @@ export type GetUserIdBestReviewsSuspenseQueryError = unknown export function useGetUserIdBestReviewsSuspense>, TError = unknown>( id: string, params: undefined | GetUserIdBestReviewsParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviewsSuspense>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviewsSuspense>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdBestReviewsSuspense>, TError = unknown>( id: string, params?: GetUserIdBestReviewsParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdBestReviewsSuspenseQueryOptions(id,params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1186,6 +1237,7 @@ export function useGetUserIdBestReviewsSuspense { - return [`/user/${id}/items-status`] as const; + + +export const getGetUserIdItemsStatusQueryKey = (id?: string,) => { + return [ + `/user/${id}/items-status` + ] as const; } @@ -1222,7 +1278,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdItemsStatusQueryResult = NonNullable>> @@ -1237,8 +1293,8 @@ export function useGetUserIdItemsStatus> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatus>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -1247,21 +1303,21 @@ export function useGetUserIdItemsStatus> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatus>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatus>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdItemsStatusQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1270,6 +1326,7 @@ export function useGetUserIdItemsStatus>, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -1285,7 +1342,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserIdItemsStatusSuspenseQueryResult = NonNullable>> @@ -1294,25 +1351,25 @@ export type GetUserIdItemsStatusSuspenseQueryError = unknown export function useGetUserIdItemsStatusSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatusSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatusSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserIdItemsStatusSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserIdItemsStatusSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1321,3 +1378,4 @@ export function useGetUserIdItemsStatusSuspense(options?: { mutation?:UseMutationOptions>, TError,{data: PostUsersCreateBody}, TContext>, } ): UseMutationOptions>, TError,{data: PostUsersCreateBody}, TContext> => { - + const mutationKey = ['postUsersCreate']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -103,7 +107,7 @@ const {mutation: mutationOptions} = options ? export const usePostUsersCreate = (options?: { mutation?:UseMutationOptions>, TError,{data: PostUsersCreateBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PostUsersCreateBody}, @@ -112,7 +116,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostUsersCreateMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Check if this username is available @@ -131,8 +135,12 @@ export const getUsersAvailableUsername = ( } -export const getGetUsersAvailableUsernameQueryKey = (params: GetUsersAvailableUsernameParams,) => { - return [`/users/available-username`, ...(params ? [params]: [])] as const; + + +export const getGetUsersAvailableUsernameQueryKey = (params?: GetUsersAvailableUsernameParams,) => { + return [ + `/users/available-username`, ...(params ? [params]: []) + ] as const; } @@ -151,7 +159,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersAvailableUsernameQueryResult = NonNullable>> @@ -166,8 +174,8 @@ export function useGetUsersAvailableUsername> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsername>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -176,21 +184,21 @@ export function useGetUsersAvailableUsername> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsername>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsername>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersAvailableUsernameQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -199,6 +207,7 @@ export function useGetUsersAvailableUsername>, TError = GetUsersAvailableUsername409>(params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -214,7 +223,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersAvailableUsernameSuspenseQueryResult = NonNullable>> @@ -223,25 +232,25 @@ export type GetUsersAvailableUsernameSuspenseQueryError = GetUsersAvailableUsern export function useGetUsersAvailableUsernameSuspense>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsernameSuspense>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsernameSuspense>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableUsernameSuspense>, TError = GetUsersAvailableUsername409>( params: GetUsersAvailableUsernameParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersAvailableUsernameSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -250,6 +259,7 @@ export function useGetUsersAvailableUsernameSuspense { - return [`/users/available-email`, ...(params ? [params]: [])] as const; + + +export const getGetUsersAvailableEmailQueryKey = (params?: GetUsersAvailableEmailParams,) => { + return [ + `/users/available-email`, ...(params ? [params]: []) + ] as const; } @@ -287,7 +301,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersAvailableEmailQueryResult = NonNullable>> @@ -302,8 +316,8 @@ export function useGetUsersAvailableEmail> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmail>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -312,21 +326,21 @@ export function useGetUsersAvailableEmail> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmail>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmail>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersAvailableEmailQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -335,6 +349,7 @@ export function useGetUsersAvailableEmail>, TError = GetUsersAvailableEmail409>(params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -350,7 +365,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersAvailableEmailSuspenseQueryResult = NonNullable>> @@ -359,25 +374,25 @@ export type GetUsersAvailableEmailSuspenseQueryError = GetUsersAvailableEmail409 export function useGetUsersAvailableEmailSuspense>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmailSuspense>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmailSuspense>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersAvailableEmailSuspense>, TError = GetUsersAvailableEmail409>( params: GetUsersAvailableEmailParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersAvailableEmailSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -386,6 +401,7 @@ export function useGetUsersAvailableEmailSuspense { - return [`/users/${username}`] as const; + + +export const getGetUsersUsernameQueryKey = (username?: string,) => { + return [ + `/users/${username}` + ] as const; } @@ -422,7 +442,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(username), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(username), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersUsernameQueryResult = NonNullable>> @@ -437,8 +457,8 @@ export function useGetUsersUsername> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUsersUsername>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -447,21 +467,21 @@ export function useGetUsersUsername> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersUsername>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersUsername>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersUsernameQueryOptions(username,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -470,6 +490,7 @@ export function useGetUsersUsername>, TError = unknown>(username: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -485,7 +506,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersUsernameSuspenseQueryResult = NonNullable>> @@ -494,25 +515,25 @@ export type GetUsersUsernameSuspenseQueryError = unknown export function useGetUsersUsernameSuspense>, TError = unknown>( username: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersUsernameSuspense>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersUsernameSuspense>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersUsernameSuspense>, TError = unknown>( username: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersUsernameSuspenseQueryOptions(username,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -521,6 +542,7 @@ export function useGetUsersUsernameSuspense { - return [`/user/by/${id}`] as const; + + +export const getGetUserByIdQueryKey = (id?: string,) => { + return [ + `/user/by/${id}` + ] as const; } @@ -557,7 +583,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, enabled: !!(id), ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserByIdQueryResult = NonNullable>> @@ -572,8 +598,8 @@ export function useGetUserById>, Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserById>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -582,21 +608,21 @@ export function useGetUserById>, Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserById>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserById>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserByIdQueryOptions(id,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -605,6 +631,7 @@ export function useGetUserById>, + export const getGetUserByIdSuspenseQueryOptions = >, TError = unknown>(id: string, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -620,7 +647,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserByIdSuspenseQueryResult = NonNullable>> @@ -629,25 +656,25 @@ export type GetUserByIdSuspenseQueryError = unknown export function useGetUserByIdSuspense>, TError = unknown>( id: string, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserByIdSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserByIdSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserByIdSuspense>, TError = unknown>( id: string, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserByIdSuspenseQueryOptions(id,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -656,8 +683,9 @@ export function useGetUserByIdSuspense { - return [`/me`] as const; + return [ + `/me` + ] as const; } @@ -692,7 +724,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetMeQueryResult = NonNullable>> @@ -707,8 +739,8 @@ export function useGetMe>, TError = unk Awaited> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetMe>, TError = unknown>( options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -717,21 +749,21 @@ export function useGetMe>, TError = unk Awaited> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetMe>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetMe>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetMeQueryOptions(options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -740,6 +772,7 @@ export function useGetMe>, TError = unk + export const getGetMeSuspenseQueryOptions = >, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } ) => { @@ -755,7 +788,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetMeSuspenseQueryResult = NonNullable>> @@ -764,25 +797,25 @@ export type GetMeSuspenseQueryError = unknown export function useGetMeSuspense>, TError = unknown>( options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetMeSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetMeSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetMeSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetMeSuspenseQueryOptions(options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -791,6 +824,7 @@ export function useGetMeSuspense>, TErr + /** * Update user */ @@ -812,7 +846,7 @@ export const patchUser = ( export const getPatchUserMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PatchUserBody}, TContext>, } ): UseMutationOptions>, TError,{data: PatchUserBody}, TContext> => { - + const mutationKey = ['patchUser']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -840,7 +874,7 @@ const {mutation: mutationOptions} = options ? export const usePatchUser = (options?: { mutation?:UseMutationOptions>, TError,{data: PatchUserBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PatchUserBody}, @@ -849,7 +883,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPatchUserMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update user password @@ -872,7 +906,7 @@ export const patchUserPassword = ( export const getPatchUserPasswordMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: PatchUserPasswordBody}, TContext>, } ): UseMutationOptions>, TError,{data: PatchUserPasswordBody}, TContext> => { - + const mutationKey = ['patchUserPassword']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -900,7 +934,7 @@ const {mutation: mutationOptions} = options ? export const usePatchUserPassword = (options?: { mutation?:UseMutationOptions>, TError,{data: PatchUserPasswordBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: PatchUserPasswordBody}, @@ -909,7 +943,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPatchUserPasswordMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Update user preferences @@ -932,7 +966,7 @@ export const updateUserPreferences = ( export const getUpdateUserPreferencesMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateUserPreferencesBody}, TContext>, } ): UseMutationOptions>, TError,{data: UpdateUserPreferencesBody}, TContext> => { - + const mutationKey = ['updateUserPreferences']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -960,7 +994,7 @@ const {mutation: mutationOptions} = options ? export const useUpdateUserPreferences = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateUserPreferencesBody}, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, {data: UpdateUserPreferencesBody}, @@ -969,7 +1003,7 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getUpdateUserPreferencesMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } /** * Get user preferences @@ -987,8 +1021,12 @@ export const getUserPreferences = ( } + + export const getGetUserPreferencesQueryKey = () => { - return [`/user/preferences`] as const; + return [ + `/user/preferences` + ] as const; } @@ -1007,7 +1045,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserPreferencesQueryResult = NonNullable>> @@ -1022,8 +1060,8 @@ export function useGetUserPreferences> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUserPreferences>, TError = unknown>( options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -1032,21 +1070,21 @@ export function useGetUserPreferences> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserPreferences>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUserPreferences>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserPreferencesQueryOptions(options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1055,6 +1093,7 @@ export function useGetUserPreferences>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } ) => { @@ -1070,7 +1109,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUserPreferencesSuspenseQueryResult = NonNullable>> @@ -1079,25 +1118,25 @@ export type GetUserPreferencesSuspenseQueryError = unknown export function useGetUserPreferencesSuspense>, TError = unknown>( options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserPreferencesSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserPreferencesSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUserPreferencesSuspense>, TError = unknown>( options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUserPreferencesSuspenseQueryOptions(options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1106,6 +1145,7 @@ export function useGetUserPreferencesSuspense { - return [`/users/search`, ...(params ? [params]: [])] as const; + + +export const getGetUsersSearchQueryKey = (params?: GetUsersSearchParams,) => { + return [ + `/users/search`, ...(params ? [params]: []) + ] as const; } @@ -1143,7 +1187,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersSearchQueryResult = NonNullable>> @@ -1158,8 +1202,8 @@ export function useGetUsersSearch> > , 'initialData' >, } - - ): DefinedUseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): DefinedUseQueryResult & { queryKey: DataTag } export function useGetUsersSearch>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>> & Pick< UndefinedInitialDataOptions< @@ -1168,21 +1212,21 @@ export function useGetUsersSearch> > , 'initialData' >, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersSearch>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } export function useGetUsersSearch>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersSearchQueryOptions(params,options) - const query = useQuery(queryOptions) as UseQueryResult & { queryKey: DataTag }; + const query = useQuery(queryOptions, queryClient) as UseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1191,6 +1235,7 @@ export function useGetUsersSearch>, TError = unknown>(params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } ) => { @@ -1206,7 +1251,7 @@ const {query: queryOptions} = options ?? {}; - return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } + return { queryKey, queryFn, ...queryOptions} as UseSuspenseQueryOptions>, TError, TData> & { queryKey: DataTag } } export type GetUsersSearchSuspenseQueryResult = NonNullable>> @@ -1215,25 +1260,25 @@ export type GetUsersSearchSuspenseQueryError = unknown export function useGetUsersSearchSuspense>, TError = unknown>( params: GetUsersSearchParams, options: { query:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersSearchSuspense>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersSearchSuspense>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } export function useGetUsersSearchSuspense>, TError = unknown>( params: GetUsersSearchParams, options?: { query?:Partial>, TError, TData>>, } - - ): UseSuspenseQueryResult & { queryKey: DataTag } { + , queryClient?: QueryClient + ): UseSuspenseQueryResult & { queryKey: DataTag } { const queryOptions = getGetUsersSearchSuspenseQueryOptions(params,options) - const query = useSuspenseQuery(queryOptions) as UseSuspenseQueryResult & { queryKey: DataTag }; + const query = useSuspenseQuery(queryOptions, queryClient) as UseSuspenseQueryResult & { queryKey: DataTag }; query.queryKey = queryOptions.queryKey ; @@ -1242,3 +1287,4 @@ export function useGetUsersSearchSuspense(options?: { mutation?:UseMutationOptions>, TError,void, TContext>, } ): UseMutationOptions>, TError,void, TContext> => { - + const mutationKey = ['postCompleteStripeSubscription']; const {mutation: mutationOptions} = options ? options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? @@ -65,7 +68,7 @@ const {mutation: mutationOptions} = options ? export const usePostCompleteStripeSubscription = (options?: { mutation?:UseMutationOptions>, TError,void, TContext>, } -): UseMutationResult< + , queryClient?: QueryClient): UseMutationResult< Awaited>, TError, void, @@ -74,6 +77,6 @@ const {mutation: mutationOptions} = options ? const mutationOptions = getPostCompleteStripeSubscriptionMutationOptions(options); - return useMutation(mutationOptions); + return useMutation(mutationOptions, queryClient); } \ No newline at end of file diff --git a/apps/web/src/app/[lang]/[username]/_components/subscription-form.tsx b/apps/web/src/app/[lang]/[username]/_components/subscription-form.tsx new file mode 100644 index 00000000..9d4c198b --- /dev/null +++ b/apps/web/src/app/[lang]/[username]/_components/subscription-form.tsx @@ -0,0 +1,104 @@ +'use client' + +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from '@plotwist/ui/components/ui/alert-dialog' +import { Badge } from '@plotwist/ui/components/ui/badge' +import { Button } from '@plotwist/ui/components/ui/button' +import { useMutation } from '@tanstack/react-query' +import { useRouter } from 'next/navigation' +import { toast } from 'sonner' +import type { GetUsersUsername200User } from '@/api/endpoints.schemas' +import { deleteSubscription } from '@/api/subscriptions' +import { useLanguage } from '@/context/language' + +type SubscriptionFormProps = { + user: GetUsersUsername200User +} + +export function SubscriptionForm({ user }: SubscriptionFormProps) { + const { dictionary } = useLanguage() + const router = useRouter() + + const cancelMutation = useMutation({ + mutationFn: (when: 'now' | 'at_end_of_current_period') => + deleteSubscription({ when }), + onSuccess: () => { + toast.success(dictionary.cancel_subscription_success) + router.refresh() + }, + onError: () => { + toast.error(dictionary.cancel_subscription_error) + }, + }) + + const isPro = user.subscriptionType === 'PRO' + + if (!isPro) { + return ( +
+
+ {dictionary.subscription_plan}:{' '} + + {dictionary.home_prices.free_plan.title} + +
+
+ ) + } + + return ( +
+
+ {dictionary.subscription_plan}: PRO +
+ +
+ + + + + + + + {dictionary.cancel_subscription_confirm_title} + + + {dictionary.cancel_subscription_confirm_description} + + + + {dictionary.cancel} + + cancelMutation.mutate('at_end_of_current_period') + } + disabled={cancelMutation.isPending} + className="bg-muted text-muted-foreground hover:bg-muted/90" + > + {dictionary.cancel_at_end_of_period} + + cancelMutation.mutate('now')} + disabled={cancelMutation.isPending} + className="bg-destructive text-destructive-foreground hover:bg-destructive/90" + > + {dictionary.cancel_now} + + + + +
+
+ ) +} diff --git a/apps/web/src/app/[lang]/[username]/_components/user-dialog.tsx b/apps/web/src/app/[lang]/[username]/_components/user-dialog.tsx index de3ef84b..68595df3 100644 --- a/apps/web/src/app/[lang]/[username]/_components/user-dialog.tsx +++ b/apps/web/src/app/[lang]/[username]/_components/user-dialog.tsx @@ -28,6 +28,7 @@ import { useLanguage } from '@/context/language' import { useSession } from '@/context/session' import { useMediaQuery } from '@/hooks/use-media-query' import { SocialLinksForm } from './social-links-form' +import { SubscriptionForm } from './subscription-form' import { UserForm } from './user-form' import { UserPreferences } from './user-preferences' @@ -40,7 +41,9 @@ export function UserDialog({ user, socialLinks, children }: UserDialogProps) { const [tab, setTab] = useQueryState('tab') const [open, setOpen] = useState( - tab ? ['account', 'social-links', 'preferences'].includes(tab) : false + tab + ? ['account', 'social-links', 'preferences', 'subscription'].includes(tab) + : false ) const { dictionary } = useLanguage() @@ -65,7 +68,7 @@ export function UserDialog({ user, socialLinks, children }: UserDialogProps) { {dictionary.preferences} - + {dictionary.subscription} @@ -82,6 +85,10 @@ export function UserDialog({ user, socialLinks, children }: UserDialogProps) { + + + + )