mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-09 18:44:16 +00:00
added likes
logic
This commit is contained in:
parent
c2bff2a092
commit
b2eb2a94fb
@ -1,11 +1,14 @@
|
|||||||
import { Playlist, Track } from "@models"
|
import { Playlist, Track } from "@models"
|
||||||
import { AuthorizationError, PermissionError, NotFoundError } from "@shared-classes/Errors"
|
import { AuthorizationError, PermissionError, NotFoundError } from "@shared-classes/Errors"
|
||||||
|
import RemoveTracks from "@services/removeTracks"
|
||||||
|
|
||||||
export default async (req, res) => {
|
export default async (req, res) => {
|
||||||
if (!req.session) {
|
if (!req.session) {
|
||||||
return new AuthorizationError(req, res)
|
return new AuthorizationError(req, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let removedTracksIds = []
|
||||||
|
|
||||||
const removeWithTracks = req.query.remove_with_tracks === "true"
|
const removeWithTracks = req.query.remove_with_tracks === "true"
|
||||||
|
|
||||||
let playlist = await Playlist.findOne({
|
let playlist = await Playlist.findOne({
|
||||||
@ -27,12 +30,11 @@ export default async (req, res) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (removeWithTracks) {
|
if (removeWithTracks) {
|
||||||
await Track.deleteMany({
|
removedTracksIds = await RemoveTracks(playlist.list)
|
||||||
_id: playlist.tracks,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.json({
|
return res.json({
|
||||||
success: true,
|
success: true,
|
||||||
|
removedTracksIds,
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import { Playlist, Track } from "@models"
|
import { Playlist, TrackLike, Track } from "@models"
|
||||||
import { NotFoundError } from "@shared-classes/Errors"
|
import { NotFoundError } from "@shared-classes/Errors"
|
||||||
|
|
||||||
export default async (req, res) => {
|
export default async (req, res) => {
|
||||||
@ -37,5 +37,20 @@ export default async (req, res) => {
|
|||||||
return orderedIds.findIndex((id) => id === a._id.toString()) - orderedIds.findIndex((id) => id === b._id.toString())
|
return orderedIds.findIndex((id) => id === a._id.toString()) - orderedIds.findIndex((id) => id === b._id.toString())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (req.session) {
|
||||||
|
const likes = await TrackLike.find({
|
||||||
|
user_id: req.session.user_id,
|
||||||
|
track_id: [...playlist.list.map((track) => track._id.toString())],
|
||||||
|
})
|
||||||
|
|
||||||
|
playlist.list = playlist.list.map((track) => {
|
||||||
|
track = track.toObject()
|
||||||
|
|
||||||
|
track.liked = likes.findIndex((like) => like.track_id === track._id.toString()) !== -1
|
||||||
|
|
||||||
|
return track
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return res.json(playlist)
|
return res.json(playlist)
|
||||||
}
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import { Playlist, Track } from "@models"
|
import { Playlist, Track } from "@models"
|
||||||
import { AuthorizationError, NotFoundError, PermissionError, BadRequestError } from "@shared-classes/Errors"
|
import { AuthorizationError, NotFoundError, PermissionError, BadRequestError } from "@shared-classes/Errors"
|
||||||
|
import axios from "axios"
|
||||||
|
|
||||||
const PlaylistAllowedUpdateFields = [
|
const PlaylistAllowedUpdateFields = [
|
||||||
"title",
|
"title",
|
||||||
@ -23,6 +24,29 @@ const TrackAllowedUpdateFields = [
|
|||||||
"public",
|
"public",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
async function fetchTrackSourceMetadata(track) {
|
||||||
|
// get headers of source url (X-Amz-Meta-Duration)
|
||||||
|
const response = await axios({
|
||||||
|
method: "HEAD",
|
||||||
|
url: track.source,
|
||||||
|
}).catch((err) => {
|
||||||
|
return {
|
||||||
|
data: null,
|
||||||
|
headers: null,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (response.headers) {
|
||||||
|
return {
|
||||||
|
duration: response.headers["x-amz-meta-duration"],
|
||||||
|
size: response.headers["content-length"],
|
||||||
|
bitrate: response.headers["x-amz-meta-bitrate"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
async function createOrUpdateTrack(payload) {
|
async function createOrUpdateTrack(payload) {
|
||||||
if (!payload.title || !payload.source || !payload.publisher) {
|
if (!payload.title || !payload.source || !payload.publisher) {
|
||||||
throw new Error("title and source and publisher are required")
|
throw new Error("title and source and publisher are required")
|
||||||
@ -54,6 +78,12 @@ async function createOrUpdateTrack(payload) {
|
|||||||
await track.save()
|
await track.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!track.metadata) {
|
||||||
|
track.metadata = await fetchTrackSourceMetadata(track)
|
||||||
|
|
||||||
|
await track.save()
|
||||||
|
}
|
||||||
|
|
||||||
return track
|
return track
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
import { TrackLike, Track } from "@models"
|
||||||
|
import { AuthorizationError, NotFoundError } from "@shared-classes/Errors"
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
if (!req.session) {
|
||||||
|
return new AuthorizationError(req, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { track_id } = req.params
|
||||||
|
|
||||||
|
const track = await Track.findById(track_id).catch((err) => {
|
||||||
|
return null
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!track) {
|
||||||
|
return new NotFoundError(req, res, "Track not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
let like = await TrackLike.findOne({
|
||||||
|
track_id: track_id,
|
||||||
|
user_id: req.session.user_id,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (like) {
|
||||||
|
await like.delete()
|
||||||
|
like = null
|
||||||
|
} else {
|
||||||
|
like = new TrackLike({
|
||||||
|
track_id: track_id,
|
||||||
|
user_id: req.session.user_id,
|
||||||
|
})
|
||||||
|
|
||||||
|
await like.save()
|
||||||
|
}
|
||||||
|
|
||||||
|
global.ws.io.emit("music:self:track:toggle:like", {
|
||||||
|
track_id: track_id,
|
||||||
|
user_id: req.session.user_id,
|
||||||
|
action: like ? "liked" : "unliked",
|
||||||
|
})
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
message: "ok",
|
||||||
|
action: like ? "liked" : "unliked",
|
||||||
|
})
|
||||||
|
}
|
14
packages/music_server/src/models/track_like/index.js
Normal file
14
packages/music_server/src/models/track_like/index.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export default {
|
||||||
|
name: "TrackLike",
|
||||||
|
collection: "tracks_likes",
|
||||||
|
schema: {
|
||||||
|
user_id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
track_id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
49
packages/music_server/src/services/removeTracks.js
Normal file
49
packages/music_server/src/services/removeTracks.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import { Track } from "@models"
|
||||||
|
|
||||||
|
const urlRegex = new RegExp(`^https://(.*?)/(.*)$`)
|
||||||
|
|
||||||
|
export default async (tracksIds) => {
|
||||||
|
if (typeof tracksIds === "string") {
|
||||||
|
tracksIds = [tracksIds]
|
||||||
|
}
|
||||||
|
|
||||||
|
const removedIds = []
|
||||||
|
|
||||||
|
// find Tracks
|
||||||
|
const tracks = await Track.find({
|
||||||
|
_id: tracksIds,
|
||||||
|
})
|
||||||
|
|
||||||
|
for (const track of tracks) {
|
||||||
|
const match = urlRegex.exec(track.source)
|
||||||
|
|
||||||
|
const bucket = match[2].split("/")[0]
|
||||||
|
const objectName = match[2].split("/").slice(1).join("/")
|
||||||
|
|
||||||
|
try {
|
||||||
|
// find on storage and remove
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
global.storage.removeObject(bucket, objectName, (err) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolve()
|
||||||
|
})
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
// remove from db
|
||||||
|
await track.remove()
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
removedIds.push(track._id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return removedIds
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user