mirror of
https://github.com/20kaushik02/spotify-manager.git
synced 2025-12-06 11:54:07 +00:00
112 lines
3.3 KiB
TypeScript
112 lines
3.3 KiB
TypeScript
import type { RequestHandler } from "express";
|
|
|
|
// load db models
|
|
import Links from "../models/links.ts";
|
|
import Playlists from "../models/playlists.ts";
|
|
|
|
import { dateForFilename } from "../utils/getFormattedDate.ts";
|
|
import logger from "../utils/logger.ts";
|
|
|
|
const exportData: RequestHandler = async (req, res) => {
|
|
try {
|
|
if (!req.session.user)
|
|
throw new ReferenceError("session does not have user object");
|
|
const uID = req.session.user.id;
|
|
|
|
const currentPlaylists = await Playlists.findAll({
|
|
attributes: ["playlistID", "playlistName"],
|
|
raw: true,
|
|
where: {
|
|
userID: uID,
|
|
},
|
|
});
|
|
const currentLinks = await Links.findAll({
|
|
attributes: ["from", "to"],
|
|
raw: true,
|
|
where: {
|
|
userID: uID,
|
|
},
|
|
});
|
|
|
|
res.attachment(
|
|
"Spotify Manager - Core Backup - " + dateForFilename() + ".json"
|
|
);
|
|
res.send(JSON.stringify({ currentPlaylists, currentLinks }));
|
|
logger.debug("exported data");
|
|
return null;
|
|
} catch (error) {
|
|
res.status(500).send({ message: "Internal Server Error" });
|
|
logger.error("exportData", { error });
|
|
return null;
|
|
}
|
|
};
|
|
|
|
const importData: RequestHandler = async (req, res) => {
|
|
try {
|
|
if (!req.session.user)
|
|
throw new ReferenceError("session does not have user object");
|
|
const uID = req.session.user.id;
|
|
|
|
if (!req.file) {
|
|
res.status(400).send({ message: "No file provided!" });
|
|
logger.debug("no file provided");
|
|
return null;
|
|
}
|
|
let exportedLinks: Pick<Links, "from" | "to">[];
|
|
let exportedPls: Pick<Playlists, "playlistID" | "playlistName">[];
|
|
try {
|
|
let exportedData = JSON.parse(req.file.buffer.toString());
|
|
exportedLinks = structuredClone(exportedData["currentLinks"]);
|
|
exportedPls = structuredClone(exportedData["currentPlaylists"]);
|
|
} catch (error: any) {
|
|
const message = "Could not parse data file";
|
|
res.status(400).send({ message });
|
|
logger.info(message, { error });
|
|
return null;
|
|
}
|
|
|
|
const delPlNum = await Playlists.destroy({ where: { userID: uID } });
|
|
const delLinkNum = await Links.destroy({ where: { userID: uID } });
|
|
logger.debug("cleaned before importing", { delPlNum, delLinkNum });
|
|
|
|
const addedPls = await Playlists.bulkCreate(
|
|
exportedPls.map((pl) => {
|
|
return { ...pl, userID: uID };
|
|
}),
|
|
{ validate: true }
|
|
);
|
|
if (addedPls.length !== exportedPls.length) {
|
|
logger.error("Could not import all playlists");
|
|
}
|
|
const addedLinks = await Links.bulkCreate(
|
|
exportedLinks.map((link) => {
|
|
return { ...link, userID: uID };
|
|
}),
|
|
{ validate: true }
|
|
);
|
|
if (addedLinks.length !== exportedLinks.length) {
|
|
logger.error("Could not import all links");
|
|
}
|
|
const message =
|
|
"Imported " +
|
|
addedLinks.length +
|
|
" links, " +
|
|
addedPls.length +
|
|
" playlists.";
|
|
res
|
|
.status(200)
|
|
.send({ message, links: addedLinks.length, playlists: addedPls.length });
|
|
logger.debug(message, {
|
|
links: addedLinks.length,
|
|
playlists: addedPls.length,
|
|
});
|
|
return null;
|
|
} catch (error) {
|
|
res.status(500).send({ message: "Internal Server Error" });
|
|
logger.error("exportData", { error });
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export { exportData, importData };
|