import { createClient } from "@supabase/supabase-js";import { task } from "@trigger.dev/sdk";import jwt from "jsonwebtoken";// Generate the Typescript types using the Supabase CLI: https://supabase.com/docs/guides/api/rest/generating-typesimport { Database } from "database.types";export const supabaseDatabaseInsert = task({ id: "add-new-user", run: async (payload: { userId: string }) => { const { userId } = payload; // Get JWT secret from env vars const jwtSecret = process.env.SUPABASE_JWT_SECRET; if (!jwtSecret) { throw new Error("SUPABASE_JWT_SECRET is not defined in environment variables"); } // Create JWT token for the user const token = jwt.sign({ sub: userId }, jwtSecret, { expiresIn: "1h" }); // Initialize Supabase client with JWT const supabase = createClient<Database>( process.env.SUPABASE_URL as string, process.env.SUPABASE_ANON_KEY as string, { global: { headers: { Authorization: `Bearer ${token}`, }, }, } ); // Insert a new row into the user_subscriptions table with the provided userId const { error } = await supabase.from("user_subscriptions").insert({ user_id: userId, }); // If there was an error inserting the new user, throw an error if (error) { throw new Error(`Failed to insert new user: ${error.message}`); } return { message: `New user added successfully: ${userId}`, }; },});
To learn more about how to properly configure Supabase auth for Trigger.dev tasks, please refer to
our Supabase Authentication guide. It demonstrates
how to use JWT authentication for user-specific operations or your service role key for
admin-level access.
Update a user’s subscription on a table in a Supabase database
This task shows how to update a user’s subscription on a table. It checks if the user already has a subscription and either inserts a new row or updates an existing row with the new plan.This type of task is useful for managing user subscriptions, updating user details, or performing other operations you might need to do on a database table.
import { createClient } from "@supabase/supabase-js";import { AbortTaskRunError, task } from "@trigger.dev/sdk";// Generate the Typescript types using the Supabase CLI: https://supabase.com/docs/guides/api/rest/generating-typesimport { Database } from "database.types";// Define the allowed plan typestype PlanType = "hobby" | "pro" | "enterprise";// Create a single Supabase client for interacting with your database// 'Database' supplies the type definitions to supabase-jsconst supabase = createClient<Database>( // These details can be found in your Supabase project settings under `API` process.env.SUPABASE_PROJECT_URL as string, // e.g. https://abc123.supabase.co - replace 'abc123' with your project ID process.env.SUPABASE_SERVICE_ROLE_KEY as string // Your service role secret key);export const supabaseUpdateUserSubscription = task({ id: "update-user-subscription", run: async (payload: { userId: string; newPlan: PlanType }) => { const { userId, newPlan } = payload; // Abort the task run without retrying if the new plan type is invalid if (!["hobby", "pro", "enterprise"].includes(newPlan)) { throw new AbortTaskRunError( `Invalid plan type: ${newPlan}. Allowed types are 'hobby', 'pro', or 'enterprise'.` ); } // Query the user_subscriptions table to check if the user already has a subscription const { data: existingSubscriptions } = await supabase .from("user_subscriptions") .select("user_id") .eq("user_id", userId); if (!existingSubscriptions || existingSubscriptions.length === 0) { // If there are no existing users with the provided userId and plan, insert a new row const { error: insertError } = await supabase.from("user_subscriptions").insert({ user_id: userId, plan: newPlan, updated_at: new Date().toISOString(), }); // If there was an error inserting the new subscription, throw an error if (insertError) { throw new Error(`Failed to insert user subscription: ${insertError.message}`); } } else { // If the user already has a subscription, update their existing row const { error: updateError } = await supabase .from("user_subscriptions") // Set the plan to the new plan and update the timestamp .update({ plan: newPlan, updated_at: new Date().toISOString() }) .eq("user_id", userId); // If there was an error updating the subscription, throw an error if (updateError) { throw new Error(`Failed to update user subscription: ${updateError.message}`); } } // Return an object with the userId and newPlan return { userId, newPlan, }; },});
This task uses your service role secret key to bypass Row Level Security. There are different ways
of configuring your RLS
policies, so always make
sure you have the correct permissions set up for your project.
If the task completes successfully, you will see a new row in your user_subscriptions table with the user_id set to user_12345, the plan set to pro, and the updated_at timestamp updated to the current time.