서버에서 실행되는 비동기 함수.
actions/todo-actions.ts
"use server";
import { Database } from "types_db";
import { createServerSupabaseClient } from "utils/supabase/server";
export type TodoRow = Database["public"]["Tables"]["todo"]["Row"];
export type TodoRowInsert = Database["public"]["Tables"]["todo"]["Insert"];
export type TodoRowUpdate = Database["public"]["Tables"]["todo"]["Update"];
// Error
function handleError(error){
console.log(error);
throw new Error(error.message);
}
// Get
export async function getTodos({ searchInput = "" }): Promise<TodoRow[]> {
const supabase = await createServerSupabaseClient();
const { data, error } = await supabase
.from('todo')
.select('*')
.like('title', `%${searchInput}%`)
.order('created_at', { ascending: true});
if(error){
handleError(error)
}
return data;
}
// Create
export async function createTodo(todo: TodoRowInsert){
const supabase = await createServerSupabaseClient();
const { data, error } = await supabase.from('todo').insert({
...todo,
created_at: new Date().toISOString(),
});
if(error){
handleError(error);
}
return data;
}
// Update
export async function updateTodo(todo: TodoRowUpdate){
const supabase = await createServerSupabaseClient();
const { data, error } = await supabase.from('todo').update({
...todo,
updated_at: new Date().toISOString(),
})
.eq('id', todo.id);
if(error){
handleError(error);
}
return data;
}
// Delete
export async function deleteTodo(id: number){
const supabase = await createServerSupabaseClient();
const { data, error } = await supabase
.from('todo').delete().eq('id', id);
if(error){
handleError(error);
}
return data;
}
Next Server Actions: https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations