Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions services/chronikService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -385,12 +385,8 @@ export class ChronikBlockchainClient implements BlockchainClient {
const { created, tx } = await createTransaction(addressWithTransaction.transaction)
if (tx !== undefined) {
const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx)
if (created) { // only execute trigger for unconfirmed tx arriving
try {
await executeAddressTriggers(broadcastTxData, tx.address.networkId)
} catch (err: any) {
console.error(RESPONSE_MESSAGES.COULD_NOT_EXECUTE_TRIGGER_500.message, err.stack)
}
if (created) { // only execute trigger for newly added txs
await executeAddressTriggers(broadcastTxData, tx.address.networkId)
}
}
}
Expand Down Expand Up @@ -435,9 +431,12 @@ export class ChronikBlockchainClient implements BlockchainClient {
for (const transaction of blockTxsToSync) {
const addressesWithTransactions = await this.getAddressesForTransaction(transaction)
for (const addressWithTransaction of addressesWithTransactions) {
const { tx } = await createTransaction(addressWithTransaction.transaction)
const { created, tx } = await createTransaction(addressWithTransaction.transaction)
if (tx !== undefined) {
this.broadcastIncomingTx(addressWithTransaction.address.address, tx)
const broadcastTxData = this.broadcastIncomingTx(addressWithTransaction.address.address, tx)
if (created) { // only execute trigger for newly added txs
await executeAddressTriggers(broadcastTxData, tx.address.networkId)
}
}
}
}
Expand Down
88 changes: 47 additions & 41 deletions services/triggerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,28 +231,50 @@ interface EmailTriggerLog {
}

export async function executeAddressTriggers (broadcastTxData: BroadcastTxData, networkId: number): Promise<void> {
const address = broadcastTxData.address
const tx = broadcastTxData.txs[0]
const currency = NETWORK_TICKERS_FROM_ID[networkId]
const {
amount,
hash,
timestamp,
paymentId,
message,
rawMessage
} = tx

const addressTriggers = await fetchTriggersForAddress(address)

// Send post requests
const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger)
await Promise.all(posterTriggers.map(async (trigger) => {
const postDataParameters: PostDataParameters = {
try {
const address = broadcastTxData.address
const tx = broadcastTxData.txs[0]
const currency = NETWORK_TICKERS_FROM_ID[networkId]
const {
amount,
hash,
timestamp,
paymentId,
message,
rawMessage
} = tx

const addressTriggers = await fetchTriggersForAddress(address)
if (addressTriggers.length === 0) return
console.log(`[TRIGGER ${currency}]: Will execute ${addressTriggers.length} triggers for tx ${hash} and address ${address}`)

// Send post requests
const posterTriggers = addressTriggers.filter(t => !t.isEmailTrigger)
await Promise.all(posterTriggers.map(async (trigger) => {
const postDataParameters: PostDataParameters = {
amount,
currency,
txId: hash,
buttonName: trigger.paybutton.name,
address,
timestamp,
opReturn: paymentId !== '' || message !== ''
? {
paymentId,
message,
rawMessage
}
: EMPTY_OP_RETURN
}
await postDataForTrigger(trigger, postDataParameters)
}))

// Send emails
const emailTriggers = addressTriggers.filter(t => t.isEmailTrigger)
const sendEmailParameters: Partial<SendEmailParameters> = {
amount,
currency,
txId: hash,
buttonName: trigger.paybutton.name,
address,
timestamp,
opReturn: paymentId !== '' || message !== ''
Expand All @@ -263,29 +285,13 @@ export async function executeAddressTriggers (broadcastTxData: BroadcastTxData,
}
: EMPTY_OP_RETURN
}
await postDataForTrigger(trigger, postDataParameters)
}))

// Send emails
const emailTriggers = addressTriggers.filter(t => t.isEmailTrigger)
const sendEmailParameters: Partial<SendEmailParameters> = {
amount,
currency,
txId: hash,
address,
timestamp,
opReturn: paymentId !== '' || message !== ''
? {
paymentId,
message,
rawMessage
}
: EMPTY_OP_RETURN
await Promise.all(emailTriggers.map(async (trigger) => {
sendEmailParameters.buttonName = trigger.paybutton.name
await sendEmailForTrigger(trigger, sendEmailParameters as SendEmailParameters)
}))
} catch (err: any) {
console.error(RESPONSE_MESSAGES.COULD_NOT_EXECUTE_TRIGGER_500.message, err.stack)
}
await Promise.all(emailTriggers.map(async (trigger) => {
sendEmailParameters.buttonName = trigger.paybutton.name
await sendEmailForTrigger(trigger, sendEmailParameters as SendEmailParameters)
}))
}

async function fetchUserFromTriggerId (triggerId: string): Promise<UserProfile> {
Expand Down
Loading