90 lines
2.5 KiB
JavaScript
90 lines
2.5 KiB
JavaScript
import { USER_ID } from '@/lib/constants'
|
|
import { deleteReminders, getDeleteAt, getRemindAt } from '@/lib/item'
|
|
import { parseInternalLinks } from '@/lib/url'
|
|
|
|
export async function getMentions ({ text }, { me, models }) {
|
|
const mentionPattern = /\B@[\w_]+/gi
|
|
const names = text.match(mentionPattern)?.map(m => m.slice(1))
|
|
if (names?.length > 0) {
|
|
const users = await models.user.findMany({
|
|
where: {
|
|
name: {
|
|
in: names
|
|
},
|
|
id: {
|
|
not: me?.id || USER_ID.anon
|
|
}
|
|
}
|
|
})
|
|
return users.map(user => ({ userId: user.id }))
|
|
}
|
|
return []
|
|
}
|
|
|
|
export const getItemMentions = async ({ text }, { me, models }) => {
|
|
const linkPattern = new RegExp(`${process.env.NEXT_PUBLIC_URL}/items/\\d+[a-zA-Z0-9/?=]*`, 'gi')
|
|
const refs = text.match(linkPattern)?.map(m => {
|
|
try {
|
|
const { itemId, commentId } = parseInternalLinks(m)
|
|
return Number(commentId || itemId)
|
|
} catch (err) {
|
|
return null
|
|
}
|
|
}).filter(r => !!r)
|
|
|
|
if (refs?.length > 0) {
|
|
const referee = await models.item.findMany({
|
|
where: {
|
|
id: { in: refs },
|
|
userId: { not: me?.id || USER_ID.anon }
|
|
}
|
|
})
|
|
return referee.map(r => ({ refereeId: r.id }))
|
|
}
|
|
|
|
return []
|
|
}
|
|
|
|
export async function performBotBehavior ({ text, id }, { me, tx }) {
|
|
// delete any existing deleteItem or reminder jobs for this item
|
|
const userId = me?.id || USER_ID.anon
|
|
id = Number(id)
|
|
await tx.$queryRaw`
|
|
DELETE FROM pgboss.job
|
|
WHERE name = 'deleteItem'
|
|
AND data->>'id' = ${id}::TEXT
|
|
AND state <> 'completed'`
|
|
await deleteReminders({ id, userId, models: tx })
|
|
|
|
if (text) {
|
|
const deleteAt = getDeleteAt(text)
|
|
if (deleteAt) {
|
|
await tx.$queryRaw`
|
|
INSERT INTO pgboss.job (name, data, startafter, expirein)
|
|
VALUES (
|
|
'deleteItem',
|
|
jsonb_build_object('id', ${id}::INTEGER),
|
|
${deleteAt}::TIMESTAMP WITH TIME ZONE,
|
|
${deleteAt}::TIMESTAMP WITH TIME ZONE - now() + interval '1 minute')`
|
|
}
|
|
|
|
const remindAt = getRemindAt(text)
|
|
if (remindAt) {
|
|
await tx.$queryRaw`
|
|
INSERT INTO pgboss.job (name, data, startafter, expirein)
|
|
VALUES (
|
|
'reminder',
|
|
jsonb_build_object('itemId', ${id}::INTEGER, 'userId', ${userId}::INTEGER),
|
|
${remindAt}::TIMESTAMP WITH TIME ZONE,
|
|
${remindAt}::TIMESTAMP WITH TIME ZONE - now() + interval '1 minute')`
|
|
await tx.reminder.create({
|
|
data: {
|
|
userId,
|
|
itemId: Number(id),
|
|
remindAt
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|