mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-16 22:14:15 +00:00
94 lines
2.0 KiB
JavaScript
94 lines
2.0 KiB
JavaScript
import { TrackLike } from "@db_models"
|
|
|
|
import TrackClass from "@classes/track"
|
|
|
|
const HANDLERS = {
|
|
track: {
|
|
model: TrackLike,
|
|
class: TrackClass,
|
|
type: "tracks",
|
|
idField: "track_id",
|
|
},
|
|
// release: {
|
|
// model: ReleaseLike,
|
|
// class: ReleaseClass,
|
|
// type: 'releases',
|
|
// idField: 'release_id'
|
|
// },
|
|
// playlist: {
|
|
// model: PlaylistLike,
|
|
// class: PlaylistClass,
|
|
// type: 'playlists',
|
|
// idField: 'playlist_id'
|
|
// },
|
|
}
|
|
|
|
async function getLikedItemsFromHandler(config, userId, pagination) {
|
|
try {
|
|
// obtain ids data and total items
|
|
const [total, likes] = await Promise.all([
|
|
config.model.countDocuments({ user_id: userId }),
|
|
config.model
|
|
.find({ user_id: userId })
|
|
.sort({ created_at: -1 })
|
|
.limit(pagination.limit)
|
|
.skip(pagination.offset),
|
|
])
|
|
|
|
const likedAtMap = new Map()
|
|
const itemIds = []
|
|
|
|
for (const like of likes) {
|
|
const itemId = like[config.idField]
|
|
|
|
likedAtMap.set(itemId, like.created_at)
|
|
itemIds.push(itemId)
|
|
}
|
|
|
|
// fetch track data
|
|
let processedItems = await config.class.get(itemIds, {
|
|
onlyList: true,
|
|
minimalData: true,
|
|
})
|
|
|
|
// mix with likes data
|
|
processedItems = processedItems.map((item) => {
|
|
item.liked = true
|
|
item.liked_at = likedAtMap.get(item._id.toString())
|
|
return item
|
|
})
|
|
|
|
return {
|
|
items: processedItems,
|
|
total_items: total,
|
|
}
|
|
} catch (error) {
|
|
console.error(`Error processing ${config.type}:`, error)
|
|
return { items: [], total_items: 0 }
|
|
}
|
|
}
|
|
|
|
//
|
|
// A endpoint to fetch track & playlists & releases likes
|
|
//
|
|
export default {
|
|
middlewares: ["withAuthentication"],
|
|
fn: async (req) => {
|
|
const userId = req.auth.session.user_id
|
|
const { limit = 50, offset = 0 } = req.query
|
|
|
|
const activeHandlers = Object.values(HANDLERS)
|
|
|
|
const results = await Promise.all(
|
|
activeHandlers.map((handler) =>
|
|
getLikedItemsFromHandler(handler, userId, { limit, offset }),
|
|
),
|
|
)
|
|
|
|
return activeHandlers.reduce((response, handler, index) => {
|
|
response[handler.type] = results[index]
|
|
return response
|
|
}, {})
|
|
},
|
|
}
|