pg#DatabaseError TypeScript Examples
The following examples show how to use
pg#DatabaseError.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: process-event.ts From posthog-foss with MIT License | 4 votes |
public async mergePeople({
mergeInto,
mergeIntoDistinctId,
otherPerson,
otherPersonDistinctId,
timestamp,
totalMergeAttempts = 0,
shouldIdentifyPerson = true,
}: {
mergeInto: Person
mergeIntoDistinctId: string
otherPerson: Person
otherPersonDistinctId: string
timestamp: DateTime
totalMergeAttempts: number
shouldIdentifyPerson?: boolean
}): Promise<void> {
const teamId = mergeInto.team_id
let firstSeen = mergeInto.created_at
// Merge properties
mergeInto.properties = { ...otherPerson.properties, ...mergeInto.properties }
if (otherPerson.created_at < firstSeen) {
// Keep the oldest created_at (i.e. the first time we've seen this person)
firstSeen = otherPerson.created_at
}
let kafkaMessages: ProducerRecord[] = []
let failedAttempts = totalMergeAttempts
// Retrying merging up to `MAX_FAILED_PERSON_MERGE_ATTEMPTS` times, in case race conditions occur.
// An example is a distinct ID being aliased in another plugin server instance,
// between `moveDistinctId` and `deletePerson` being called here
// – in such a case a distinct ID may be assigned to the person in the database
// AFTER `otherPersonDistinctIds` was fetched, so this function is not aware of it and doesn't merge it.
// That then causes `deletePerson` to fail, because of foreign key constraints –
// the dangling distinct ID added elsewhere prevents the person from being deleted!
// This is low-probability so likely won't occur on second retry of this block.
// In the rare case of the person changing VERY often however, it may happen even a few times,
// in which case we'll bail and rethrow the error.
await this.db.postgresTransaction(async (client) => {
try {
const updatePersonMessages = await this.db.updatePersonDeprecated(
mergeInto,
{
created_at: firstSeen,
properties: mergeInto.properties,
is_identified: mergeInto.is_identified || otherPerson.is_identified,
},
client
)
// Merge the distinct IDs
await this.db.postgresQuery(
'UPDATE posthog_cohortpeople SET person_id = $1 WHERE person_id = $2',
[mergeInto.id, otherPerson.id],
'updateCohortPeople',
client
)
const distinctIdMessages = await this.db.moveDistinctIds(otherPerson, mergeInto, client)
const deletePersonMessages = await this.db.deletePerson(otherPerson, client)
kafkaMessages = [...updatePersonMessages, ...distinctIdMessages, ...deletePersonMessages]
} catch (error) {
if (!(error instanceof DatabaseError)) {
throw error // Very much not OK, this is some completely unexpected error
}
failedAttempts++
if (failedAttempts === MAX_FAILED_PERSON_MERGE_ATTEMPTS) {
throw error // Very much not OK, failed repeatedly so rethrowing the error
}
await this.aliasDeprecated(
otherPersonDistinctId,
mergeIntoDistinctId,
teamId,
timestamp,
shouldIdentifyPerson,
false,
failedAttempts
)
}
})
if (this.kafkaProducer) {
await this.kafkaProducer.queueMessages(kafkaMessages)
}
}