serverless-functions
The following serverless functions invoked using react components within the application.
These functions must be written in Typescript.
add-user
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
import { corsHeaders } from "../_shared/cors.ts";
serve(async (req: Request) => {
// This is needed if you're planning to invoke your function from a browser.
if (req.method === "OPTIONS") {
return new Response("ok", { headers: corsHeaders });
}
try {
// Create a Supabase client with the Auth context of the logged in user.
const supabaseClient = createClient(
// Supabase API URL - env var exported by default.
Deno.env.get("SUPABASE_URL") ?? "",
// Supabase API SUPABASE_SERVICE_ROLE_KEY
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? ""
);
const { entry } = await req.json();
// create user
const { data: user, error } = await supabaseClient.auth.admin.createUser({
phone: entry,
password: "password",
});
if (error) throw error;
return new Response(JSON.stringify({ user }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 200,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 400,
});
}
});
delete-user
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
import { corsHeaders } from "../_shared/cors.ts";
console.log("Delete user function");
serve(async (req: Request) => {
// This is needed if you're planning to invoke your function from a browser.
if (req.method === "OPTIONS") {
return new Response("ok", { headers: corsHeaders });
}
try {
// Create a Supabase client with the Auth context of the logged in user.
const supabaseClient = createClient(
// Supabase API URL - env var exported by default.
Deno.env.get("SUPABASE_URL") ?? "",
// Supabase API SUPABASE_SERVICE_ROLE_KEY
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? ""
);
const { entry } = await req.json();
// delete user
const { data, error } = await supabaseClient.auth.admin.deleteUser(entry);
if (error) throw error;
return new Response(JSON.stringify({ data }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 200,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 400,
});
}
});
add-admin-user
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
import { corsHeaders } from "../_shared/cors.ts";
console.log("Add user function");
serve(async (req: Request) => {
// This is needed if you're planning to invoke your function from a browser.
if (req.method === "OPTIONS") {
return new Response("ok", { headers: corsHeaders });
}
try {
// Create a Supabase client with the Auth context of the logged in user.
const supabaseClient = createClient(
// Supabase API URL - env var exported by default.
Deno.env.get("SUPABASE_URL") ?? "",
// Supabase API SUPABASE_SERVICE_ROLE_KEY
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? ""
);
const { entry } = await req.json();
// create user
const { data: user, error } = await supabaseClient.auth.admin.createUser({
email: entry,
password: "password",
});
if (error) throw error;
return new Response(JSON.stringify({ user }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 200,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
headers: { ...corsHeaders, "Content-Type": "application/json" },
status: 400,
});
}
});
push
import { createClient } from 'npm:@supabase/supabase-js@2'
import { JWT } from 'npm:google-auth-library@9'
import serviceAccount from '../service-account.json' with { type: 'json' }
interface Notification {
id: string
user_id: string
body: string
title: string
}
interface WebhookPayload {
type: 'INSERT'
table: string
record: Notification
schema: 'public'
}
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
)
Deno.serve(async (req) => {
const payload: WebhookPayload = await req.json()
const { data } = await supabase
.from('profiles')
.select('fcm_token')
.eq('id', payload.record.user_id)
.single()
const fcmToken = data!.fcm_token as string
const accessToken = await getAccessToken({
clientEmail: serviceAccount.client_email,
privateKey: serviceAccount.private_key,
})
const res = await fetch(
`https://fcm.googleapis.com/v1/projects/${serviceAccount.project_id}/messages:send`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({
message: {
token: fcmToken,
notification: {
title: payload.record.title,
body: payload.record.body,
},
},
}),
}
)
const resData = await res.json()
if (res.status < 200 || 299 < res.status) {
throw resData
}
return new Response(JSON.stringify(resData), {
headers: { 'Content-Type': 'application/json' },
})
})
const getAccessToken = ({
clientEmail,
privateKey,
}: {
clientEmail: string
privateKey: string
}): Promise<string> => {
return new Promise((resolve, reject) => {
const jwtClient = new JWT({
email: clientEmail,
key: privateKey,
scopes: ['https://www.googleapis.com/auth/firebase.messaging'],
})
jwtClient.authorize((err, tokens) => {
if (err) {
reject(err)
return
}
resolve(tokens!.access_token!)
})
})
}