-
-
Notifications
You must be signed in to change notification settings - Fork 635
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added supabase database operations and new snippet #1359
Changes from 9 commits
a28e347
5e30af7
e7862a8
f395106
8aa6394
0d13c5b
771581d
4df85b8
eb66e56
8e919f9
113f480
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,197 @@ | ||
--- | ||
title: "Supabase database operations using Trigger.dev" | ||
sidebarTitle: "Supabase database operations" | ||
description: "These examples demonstrate how to run basic CRUD operations on a table in a Supabase database using Trigger.dev." | ||
--- | ||
|
||
import SupabaseDocsCards from "/snippets/supabase-docs-cards.mdx"; | ||
|
||
## Add a new user to a table in a Supabase database | ||
|
||
This is a basic task which inserts a new row into a table from a Trigger.dev task. | ||
|
||
### Key features | ||
|
||
- Shows how to set up a Supabase client using the `@supabase/supabase-js` library | ||
- Shows how to add a new row to a table using `insert` | ||
|
||
### Prerequisites | ||
|
||
- A [Supabase account](https://supabase.com/dashboard/) and a project set up | ||
- In your Supabase project, create a table called `user_subscriptions`. | ||
- In your `user_subscriptions` table, create a new column: | ||
- `user_id`, with the data type: `text` | ||
|
||
### Task code | ||
|
||
```ts trigger/supabase-database-insert.ts | ||
import { createClient } from "@supabase/supabase-js"; | ||
import { task } from "@trigger.dev/sdk/v3"; | ||
// Generate the Typescript types using the Supabase CLI: https://supabase.com/docs/guides/api/rest/generating-types | ||
import { Database } from "database.types"; | ||
|
||
// Create a single Supabase client for interacting with your database | ||
// 'Database' supplies the type definitions to supabase-js | ||
const 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 supabaseDatabaseInsert = task({ | ||
id: "add-new-user", | ||
run: async (payload: { userId: string }) => { | ||
const { userId } = payload; | ||
|
||
// 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}`, | ||
}; | ||
}, | ||
}); | ||
``` | ||
|
||
<Note> | ||
This task uses your service role secret key to bypass Row Level Security. There are different ways | ||
of configuring your [RLS | ||
policies](https://supabase.com/docs/guides/database/postgres/row-level-security), so always make | ||
sure you have the correct permissions set up for your project. | ||
</Note> | ||
|
||
### Testing your task | ||
|
||
To test this task in the [Trigger.dev dashboard](https://cloud.trigger.dev), you can use the following payload: | ||
|
||
```json | ||
{ | ||
"userId": "user_12345" | ||
} | ||
``` | ||
|
||
If the task completes successfully, you will see a new row in your `user_subscriptions` table with the `user_id` set to `user_12345`. | ||
|
||
## 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. | ||
|
||
### Key features | ||
|
||
- Shows how to set up a Supabase client using the `@supabase/supabase-js` library | ||
- Adds a new row to the table if the user doesn't exist using `insert` | ||
- Checks if the user already has a plan, and if they do updates the existing row using `update` | ||
- Demonstrates how to use [AbortTaskRunError](https://trigger.dev/docs/errors-retrying#using-aborttaskrunerror) to stop the task run without retrying if an invalid plan type is provided | ||
|
||
### Prerequisites | ||
|
||
- A [Supabase account](https://supabase.com/dashboard/) and a project set up | ||
- In your Supabase project, create a table called `user_subscriptions` (if you haven't already) | ||
- In your `user_subscriptions` table, create these columns (if they don't already exist): | ||
|
||
- `user_id`, with the data type: `text` | ||
- `plan`, with the data type: `text` | ||
- `updated_at`, with the data type: `timestamptz` | ||
|
||
### Task code | ||
|
||
```ts trigger/supabase-update-user-subscription.ts | ||
import { createClient } from "@supabase/supabase-js"; | ||
import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; | ||
// Generate the Typescript types using the Supabase CLI: https://supabase.com/docs/guides/api/rest/generating-types | ||
import { Database } from "database.types"; | ||
|
||
// Define the allowed plan types | ||
type PlanType = "hobby" | "pro" | "enterprise"; | ||
|
||
// Create a single Supabase client for interacting with your database | ||
// 'Database' supplies the type definitions to supabase-js | ||
const 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, | ||
}; | ||
}, | ||
}); | ||
``` | ||
|
||
<Note> | ||
This task uses your service role secret key to bypass Row Level Security. There are different ways | ||
of configuring your [RLS | ||
policies](https://supabase.com/docs/guides/database/postgres/row-level-security), so always make | ||
sure you have the correct permissions set up for your project. | ||
</Note> | ||
|
||
## Testing your task | ||
|
||
To test this task in the [Trigger.dev dashboard](https://cloud.trigger.dev), you can use the following payload: | ||
|
||
```json | ||
{ | ||
"userId": "user_12345", | ||
"newPlan": "pro" | ||
} | ||
``` | ||
|
||
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. | ||
|
||
<SupabaseDocsCards /> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,9 @@ | ||
--- | ||
title: "Supabase guides" | ||
title: "Supabase overview" | ||
sidebarTitle: "Overview" | ||
description: "Guides for using Supabase with Trigger.dev." | ||
description: "Guides and examples for using Supabase with Trigger.dev." | ||
--- | ||
|
||
<CardGroup cols={2}> | ||
<Card | ||
title="Edge function hello world" | ||
icon="bolt" | ||
href="/guides/frameworks/supabase-edge-functions-basic" | ||
> | ||
Learn how to trigger a task from a Supabase edge function when a URL is visited. | ||
</Card> | ||
<Card | ||
title="Edge function database webhooks" | ||
icon="bolt" | ||
href="/guides/frameworks/supabase-edge-functions-database-webhooks" | ||
> | ||
Learn how to trigger a task from a Supabase edge function when an event occurs in your database. | ||
</Card> | ||
</CardGroup> | ||
import SupabaseDocsCards from "/snippets/supabase-docs-cards.mdx"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Missing The
🔗 Analysis chainModular approach with SupabaseDocsCards import. The introduction of a separate component for Supabase documentation cards is a good practice for maintainability and reusability. This modular approach allows for easier updates and consistency across the documentation. Please verify the existence and correct implementation of the imported file: 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Verify the existence and content of the imported file
if [ -f "snippets/supabase-docs-cards.mdx" ]; then
echo "File exists. Displaying its content:"
cat "snippets/supabase-docs-cards.mdx"
else
echo "Error: File 'snippets/supabase-docs-cards.mdx' does not exist."
fi
Length of output: 292 Script: #!/bin/bash
# Verify the existence and content of the imported file
if [ -f "snippets/supabase-docs-cards.mdx" ]; then
echo "File exists. Displaying its content:"
cat "snippets/supabase-docs-cards.mdx"
else
echo "Error: File 'snippets/supabase-docs-cards.mdx' does not exist."
fi
Length of output: 186 Script: #!/bin/bash
# Search for usages of SupabaseDocsCards in .mdx files
rg "SupabaseDocsCards" --glob "*.mdx" -A 3 -B 1
Length of output: 2519 |
||
|
||
<SupabaseDocsCards /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Update the Import Path for SupabaseDocsCards
The current import path
/snippets/supabase-docs-cards.mdx
may be incorrect since the file is located atdocs/snippets/supabase-docs-cards.mdx
. Consider updating the import to a relative path to ensure it resolves correctly./snippets/supabase-docs-cards.mdx
correctly resolves todocs/snippets/supabase-docs-cards.mdx
.🔗 Analysis chain
Verify the import path for SupabaseDocsCards
The import statement uses an absolute path starting with "/". Ensure that this path is correct and resolves properly in your project structure. Consider using a relative path if it's more appropriate for your project setup.
Further Verify the Import Path for SupabaseDocsCards
The previous attempt to locate
supabase-docs-cards.mdx
in thesnippets
directory failed. Please run the following script to search for the file across the repository:🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 138
Script:
Length of output: 71