diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e31b5e..46dedec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,5 +18,6 @@ ], "[typescript]": { "editor.defaultFormatter": "denoland.vscode-deno" - } + }, + "deno.enable": true } diff --git a/supabase/functions/_db/interactions.ts b/supabase/functions/_db/interactions.ts new file mode 100644 index 0000000..3cbf5f2 --- /dev/null +++ b/supabase/functions/_db/interactions.ts @@ -0,0 +1,48 @@ +import type { SupabaseClient } from "jsr:@supabase/supabase-js@2"; +import { Transaction } from "./transactions.ts"; + +const INTERACTIONS_TABLE = "a_interactions"; + +export const upsertInteraction = async ( + client: SupabaseClient, + transaction: Pick<Transaction, "id" | "from" | "to">, +) => { + const timestamp = new Date().toISOString(); + + // First direction: from->to + await client + .from(INTERACTIONS_TABLE) + .upsert( + { + transaction_id: transaction.id, + account: transaction.from, + with: transaction.to, + updated_at: timestamp, + created_at: timestamp, + new_interaction: true, + }, + { + onConflict: "account,with", + ignoreDuplicates: false, + }, + ) + .select() + .single(); + + // Second direction: to->from + await client + .from(INTERACTIONS_TABLE) + .upsert({ + transaction_id: transaction.id, + account: transaction.to, + with: transaction.from, + updated_at: timestamp, + created_at: timestamp, + new_interaction: true, + }, { + onConflict: "account,with", + ignoreDuplicates: false, + }) + .select() + .single(); +}; diff --git a/supabase/functions/_db/transactions.ts b/supabase/functions/_db/transactions.ts index 0166ea5..2efae2c 100644 --- a/supabase/functions/_db/transactions.ts +++ b/supabase/functions/_db/transactions.ts @@ -22,7 +22,7 @@ export interface TransactionWithDescription { const TRANSACTIONS_TABLE = "a_transactions"; -export const upsertTransaction = async ( +export const upsertTransaction = ( client: SupabaseClient, transaction: Transaction, ) => { @@ -35,8 +35,18 @@ export const upsertTransactionWithDescription = async ( client: SupabaseClient, transaction: TransactionWithDescription, ) => { - return client.from(TRANSACTIONS_TABLE).upsert(transaction, { - onConflict: "id", + // check if exists + const { data: existingTransaction } = await client.from(TRANSACTIONS_TABLE) + .select("*").eq("id", transaction.id).maybeSingle(); + if (existingTransaction) { + return client.from(TRANSACTIONS_TABLE).update({ + description: transaction.description, + }).eq("id", transaction.id); + } + + return client.from(TRANSACTIONS_TABLE).insert({ + ...transaction, + hash: "", }); }; @@ -44,6 +54,7 @@ export const getTransactionByHash = ( client: SupabaseClient, hash: string, ): Promise<PostgrestSingleResponse<Transaction>> => { + // @ts-ignore: cryptic error return client.from(TRANSACTIONS_TABLE).select("*").eq("hash", hash) .maybeSingle(); }; diff --git a/supabase/functions/process-tx-data/index.ts b/supabase/functions/process-tx-data/index.ts index a01e176..5e73756 100644 --- a/supabase/functions/process-tx-data/index.ts +++ b/supabase/functions/process-tx-data/index.ts @@ -25,15 +25,15 @@ Deno.serve(async (req) => { const { hash, - extra_data, + data, } = record; // Initialize Supabase client const supabaseClient = getServiceRoleClient(); let erc20TransferExtraData: ERC20TransferExtraData = { description: "" }; - if (extra_data) { - erc20TransferExtraData = extra_data as ERC20TransferExtraData; + if (data) { + erc20TransferExtraData = data as ERC20TransferExtraData; } // insert transaction into db diff --git a/supabase/functions/process-tx/index.ts b/supabase/functions/process-tx/index.ts index 4c104c3..7a26798 100644 --- a/supabase/functions/process-tx/index.ts +++ b/supabase/functions/process-tx/index.ts @@ -12,6 +12,7 @@ import { } from "../_citizen-wallet/index.ts"; import { getServiceRoleClient } from "../_db/index.ts"; import { type Transaction, upsertTransaction } from "../_db/transactions.ts"; +import { upsertInteraction } from "../_db/interactions.ts"; import { ensureProfileExists } from "../_citizen-wallet/profiles.ts"; import { createOrder, @@ -108,10 +109,16 @@ Deno.serve(async (req) => { } const { error } = await upsertTransaction(supabaseClient, transaction); + if (error) { console.error("Error inserting transaction:", error); } + await upsertInteraction( + supabaseClient, + transaction, + ); + return new Response("notification sent", { status: 200 }); });