Skip to main content

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!)
})
})
}