Send Push Notifications with OneSignal + Supabase

Integrations

I did a test to send notifications in my application with OneSignal and I put a sound in the FlutterFlow "assets/audio" folder, but it's not sending the audio, I put it in the edge function, I think it would be correct, can anyone help me?

What have you tried so far?
my code here: import { createClient } from 'npm:@supabase/supabase-js@2';

// Interface que corresponde Ơ estrutura da tabela de notificaƧƵes
interface Notification {
  id: number;
  id_usuario: number;  // id do usuÔrio que recebe a notificação
  mensagem: string | null;  // mensagem do corpo da notificação
  enviado: boolean | null;  // status se foi enviado
  id_pedido: number | null;  // ID de pedido relacionado
  titulo: string | null;  // título dinâmico da notificação
  uuid: string | null;  // UUID associado à notificação
}

// Interface do payload do webhook
interface WebhookPayload {
  type: 'INSERT';
  table: string;
  record: Notification;
  schema: 'public';
}

// Inicializando o cliente Supabase
const supabase = createClient(
  Deno.env.get('SUPABASE_URL')!,
  Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
);

// Configurando a API do OneSignal
const oneSignalUrl = "https://onesignal.com/api/v1/notifications";
const oneSignalAppId = Deno.env.get('oneSignalAppId');
const oneSignalApiKey = Deno.env.get('oneSignalApiKey ');

// Função para enviar notificações via OneSignal
async function sendPushNotification(externalUserId: string, title: string, message: string) {
  console.log("Enviando notificação...");
  console.log("externalUserId:", externalUserId);
  console.log("app_id:", oneSignalAppId);
  console.log("title:", title);
  console.log("message:", message);

  const headers = new Headers();
  headers.append("Authorization", "Basic oneSignalApiKey ");
  headers.append("Content-Type", "application/json");


  const bodyData = {
    include_external_user_ids: [externalUserId],  // lista de usuÔrios para enviar a notificação
    app_id: "app_id",
    headings: { en: title },
    contents: { en: message },
    android_sound: "caixa-som",  // Nome do arquivo de som para Android (sem extensão)
    ios_sound: "assets/audio/caixa-som.wav",  // Caminho completo do arquivo para iOS
  };

  console.log("Dados enviados na requisição:", bodyData);
  
  const response = await fetch(oneSignalUrl, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(bodyData),
  });

  console.log("Resposta da OneSignal:", response.status, response.statusText);

  if (!response.ok) {
    const responseData = await response.json();
    console.error("Erro ao enviar notificação via OneSignal:", responseData);
    throw new Error(`Erro ao enviar notificação via OneSignal: ${response.statusText}`);
  }

  const responseData = await response.json();
  console.log("Dados da resposta:", responseData);
  
  return responseData;
}

// Servindo a função que serÔ chamada pelo webhook
Deno.serve(async (req) => {
  const payload: WebhookPayload = await req.json();
  console.log("Payload recebido:", payload);

  // Verificar se a notificação jÔ foi enviada
  if (payload.record.enviado) {
    console.log("Notificação jÔ foi enviada.");
    return new Response(
      JSON.stringify({ message: 'Notificação jÔ foi enviada.' }),
      { headers: { 'Content-Type': 'application/json' } }
    );
  }

  // Buscando o UUID do usuƔrio na tabela de usuƔrios
  const { data, error } = await supabase
    .from('usuarios')
    .select('uuid_auth_user')  // Nome da coluna onde o UUID estĆ” armazenado
    .eq('uuid_auth_user', payload.record.uuid)
    .single();

  if (error) {
    console.error("Erro ao buscar UUID:", error.message);
    throw new Error(`Erro ao buscar UUID: ${error.message}`);
  }

  const uuid = data!.uuid_auth_user;
  console.log("UUID do usuƔrio encontrado:", uuid);

  // Enviando a notificação via OneSignal
  const title = payload.record.titulo || 'Nova Notificação';
  const message = payload.record.mensagem || 'Você tem uma nova notificação.';

  try {
    await sendPushNotification(uuid, title, message);

    // Atualizando o campo 'enviado' da notificação para TRUE
    const { error: updateError } = await supabase
      .from('notification')  // Nome da tabela de notificaƧƵes
      .update({ enviado: true })
      .eq('id', payload.record.id);

    if (updateError) {
      console.error("Erro ao atualizar o campo 'enviado':", updateError.message);
      throw new Error(`Erro ao atualizar o campo 'enviado': ${updateError.message}`);
    }

    console.log("Notificação enviada com sucesso.");
    return new Response(
      JSON.stringify({ message: 'Notificação enviada com sucesso.' }),
      { headers: { 'Content-Type': 'application/json' } }
    );
  } catch (error) {
    console.error("Erro ao enviar notificação:", error.message);
    return new Response(
      JSON.stringify({ error: error.message }),
      { headers: { 'Content-Type': 'application/json' } }
    );
  }
});
Did you check FlutterFlow's Documentation for this topic?
No
1