63 lines
1.8 KiB
JavaScript

import { RecentActivity } from "@db_models"
const IdToTypes = {
"player.play": "track_played"
}
export default {
middlewares: [
"withAuthentication",
],
fn: async (req, res) => {
const user_id = req.auth.session.user_id
let { id, payload } = req.body
if (!id) {
throw new OperationError(400, "Event id is required")
}
if (!payload) {
throw new OperationError(400, "Event payload is required")
}
id = id.toLowerCase()
if (!IdToTypes[id]) {
throw new OperationError(400, `Event id ${id} is not supported`)
}
const type = IdToTypes[id]
// get latest 20 activities
let latestActivities = await RecentActivity.find({
user_id: user_id,
type: type,
})
.limit(20)
.sort({ created_at: -1 })
// check if the activity is already in some position and remove
const sameLatestActivityIndex = latestActivities.findIndex((activity) => {
return activity.payload === payload && activity.type === type
})
// if the activity is already in some position, remove it from that position
if (sameLatestActivityIndex !== -1) {
latestActivities.splice(sameLatestActivityIndex, 1)
}
// if the list is full, remove the oldest activity and add the new one
if (latestActivities.length >= 20) {
await RecentActivity.findByIdAndDelete(latestActivities[latestActivities.length - 1]._id)
}
const activity = await RecentActivity.create({
user_id: user_id,
type: type,
payload: payload,
created_at: new Date(),
})
return activity
}
}