fix: user events, push count, error handling

This commit is contained in:
Chris Anderson 2025-07-07 09:52:19 -07:00
parent 02c452fd22
commit 2ef5d50953
8 changed files with 27 additions and 20 deletions

View file

@ -27,7 +27,7 @@ export default class App {
static async init<T extends typeof App>(this: T, env: Env): Promise<InstanceType<T>> {
logger.info('parcelvoy initializing')
logger.info('parcelvoy:initializing')
// Boot up error tracking
const error = await loadError(env.error)
@ -130,17 +130,25 @@ export default class App {
delete this.#registered[key]
}
async forceClose(signal: string, reason: string, error?: Error) {
logger.error({ signal, error }, reason)
await this.close()
process.exit()
}
unhandledErrorListener() {
['exit', 'SIGINT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM'].forEach((eventType) => {
['exit', 'beforeExit', 'SIGINT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM'].forEach((eventType) => {
process.on(eventType, async () => {
await this.close()
process.exit()
await this.forceClose(eventType, `received exit signal: ${eventType}`)
})
})
process.on('uncaughtException', async (error) => {
logger.error(error, 'uncaught error')
await this.close()
process.exit()
await this.forceClose('uncaughtException', 'uncaught error', error)
})
process.on('unhandledRejection', async (error, promise) => {
await this.forceClose('unhandledRejection', `uncaught error: ${promise}, reason: ${error}`)
})
}
}

View file

@ -160,6 +160,7 @@ export default class LocalPushProvider extends PushProvider {
success: true,
response: response[0].message[0].messageId,
invalidTokens,
count: tokens.length - invalidTokens.length,
}
}
}

View file

@ -28,6 +28,7 @@ export default class LoggerPushProvider extends PushProvider {
success: true,
response: '',
invalidTokens: [],
count: push.tokens.length,
}
}

View file

@ -10,4 +10,5 @@ export interface PushResponse {
success: boolean
response?: string
invalidTokens: string[]
count: number
}

View file

@ -29,8 +29,9 @@ export default class PushChannel {
return {
push,
success: false,
invalidTokens: [],
response: 'No active devices with push enabled found.',
invalidTokens: [],
count: 0,
}
}

View file

@ -44,15 +44,10 @@ export const createEvent = async (
}
export const getUserEvents = async (id: number, params: PageParams, projectId: number) => {
const searchClause = params.q ? ` AND \`name\` LIKE '%${params.q}%' ` : ''
return await UserEvent.clickhouse().search(
`
SELECT * FROM user_events
WHERE project_id = ${projectId}
AND user_id = ${id}
${searchClause}
ORDER BY created_at DESC
`,
params,
return await UserEvent.search(
{ ...params, fields: ['name'] },
b => b.where('project_id', projectId)
.where('user_id', id)
.orderBy('id', 'desc'),
)
}

View file

@ -236,7 +236,7 @@ export interface Device {
}
export interface UserEvent {
uuid: string
id: number
name: string
data: Record<string, any>
created_at: string

View file

@ -32,7 +32,7 @@ export default function UserDetailEvents() {
params={params}
setParams={setParams}
title={t('events')}
itemKey={({ item }) => item.uuid}
itemKey={({ item }) => item.id}
columns={[
{ key: 'name', title: t('name') },
{ key: 'created_at', title: t('created_at') },