#2 {menu, csv, xls}
This commit is contained in:
parent
0b8b4b21bd
commit
1f63c74ac3
16 changed files with 325 additions and 52 deletions
|
@ -12,6 +12,7 @@ import config, { env, mongoDbUri, secret } from "./config";
|
|||
import { isXhr } from "./helpers";
|
||||
|
||||
import indexRouter from "./routes";
|
||||
import maCollectionRouter from "./routes/ma-collection";
|
||||
|
||||
import importAlbumRouterApiV1 from "./routes/api/v1/albums";
|
||||
import importSearchRouterApiV1 from "./routes/api/v1/search";
|
||||
|
@ -80,6 +81,7 @@ app.use(
|
|||
);
|
||||
|
||||
app.use("/", indexRouter);
|
||||
app.use("/ma-collection", maCollectionRouter);
|
||||
app.use("/api/v1/albums", importAlbumRouterApiV1);
|
||||
app.use("/api/v1/search", importSearchRouterApiV1);
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import moment from "moment";
|
||||
import momenttz from "moment-timezone";
|
||||
import xl from "excel4node";
|
||||
|
||||
import Pages from "./Pages";
|
||||
|
||||
|
@ -9,6 +11,126 @@ import ErrorEvent from "../libs/error";
|
|||
* Classe permettant la gestion des albums d'un utilisateur
|
||||
*/
|
||||
class Albums extends Pages {
|
||||
/**
|
||||
* Méthode permettant de convertir les rows en csv
|
||||
* @param {Array} rows
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
static async convertToCsv(rows) {
|
||||
let data = "";
|
||||
|
||||
data +=
|
||||
"Artiste;Titre;Genre;Styles;Pays;Année;Date de sortie;Format\n\r";
|
||||
|
||||
for (let i = 0; i < rows.length; i += 1) {
|
||||
const {
|
||||
artists_sort,
|
||||
title,
|
||||
genres,
|
||||
styles,
|
||||
country,
|
||||
year,
|
||||
released,
|
||||
formats,
|
||||
} = rows[i];
|
||||
|
||||
let format = "";
|
||||
for (let j = 0; j < formats.length; j += 1) {
|
||||
format += `${format !== "" ? ", " : ""}${formats[j].name}`;
|
||||
}
|
||||
|
||||
data += `${artists_sort};${title};${genres.join()};${styles.join()};${country};${year};${released};${format}\n\r`;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant de convertir les rows en fichier xls
|
||||
* @param {Array} rows
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
static async convertToXls(rows) {
|
||||
const wb = new xl.Workbook();
|
||||
const ws = wb.addWorksheet("MusicTopus");
|
||||
|
||||
const headerStyle = wb.createStyle({
|
||||
font: {
|
||||
color: "#FFFFFF",
|
||||
size: 11,
|
||||
},
|
||||
fill: {
|
||||
type: "pattern",
|
||||
patternType: "solid",
|
||||
bgColor: "#595959",
|
||||
fgColor: "#595959",
|
||||
},
|
||||
});
|
||||
const style = wb.createStyle({
|
||||
font: {
|
||||
color: "#000000",
|
||||
size: 11,
|
||||
},
|
||||
numberFormat: "0000",
|
||||
});
|
||||
|
||||
const header = [
|
||||
"Artiste",
|
||||
"Titre",
|
||||
"Genre",
|
||||
"Styles",
|
||||
"Pays",
|
||||
"Année",
|
||||
"Date de sortie",
|
||||
"Format",
|
||||
];
|
||||
for (let i = 0; i < header.length; i += 1) {
|
||||
ws.cell(1, i + 1)
|
||||
.string(header[i])
|
||||
.style(headerStyle);
|
||||
}
|
||||
|
||||
for (let i = 0; i < rows.length; i += 1) {
|
||||
const currentRow = i + 2;
|
||||
const {
|
||||
artists_sort,
|
||||
title,
|
||||
genres,
|
||||
styles,
|
||||
country,
|
||||
year,
|
||||
released,
|
||||
formats,
|
||||
} = rows[i];
|
||||
|
||||
let format = "";
|
||||
for (let j = 0; j < formats.length; j += 1) {
|
||||
format += `${format !== "" ? ", " : ""}${formats[j].name}`;
|
||||
}
|
||||
|
||||
ws.cell(currentRow, 1).string(artists_sort).style(style);
|
||||
ws.cell(currentRow, 2).string(title).style(style);
|
||||
ws.cell(currentRow, 3).string(genres.join()).style(style);
|
||||
ws.cell(currentRow, 4).string(styles.join()).style(style);
|
||||
if (country) {
|
||||
ws.cell(currentRow, 5).string(country).style(style);
|
||||
}
|
||||
if (year) {
|
||||
ws.cell(currentRow, 6).number(year).style(style);
|
||||
}
|
||||
if (released) {
|
||||
ws.cell(currentRow, 7)
|
||||
.date(momenttz.tz(released, "Europe/Paris").hour(12))
|
||||
.style({ numberFormat: "dd/mm/yyyy" });
|
||||
}
|
||||
ws.cell(currentRow, 8).string(format).style(style);
|
||||
}
|
||||
|
||||
return wb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode permettant d'ajouter un album dans une collection
|
||||
* @param {Object} req
|
||||
|
@ -59,16 +181,15 @@ class Albums extends Pages {
|
|||
*/
|
||||
async getAll() {
|
||||
const {
|
||||
page = 1,
|
||||
limit = 4,
|
||||
page,
|
||||
limit,
|
||||
exportFormat = "json",
|
||||
sort = "artists_sort",
|
||||
order = "asc",
|
||||
artists_sort,
|
||||
format,
|
||||
} = this.req.query;
|
||||
|
||||
const skip = (page - 1) * limit;
|
||||
|
||||
const where = {};
|
||||
|
||||
if (artists_sort) {
|
||||
|
@ -83,25 +204,43 @@ class Albums extends Pages {
|
|||
...where,
|
||||
});
|
||||
|
||||
let params = {
|
||||
sort: {
|
||||
[sort]: order.toLowerCase() === "asc" ? 1 : -1,
|
||||
},
|
||||
};
|
||||
|
||||
if (page && limit) {
|
||||
const skip = (page - 1) * limit;
|
||||
|
||||
params = {
|
||||
...params,
|
||||
skip,
|
||||
limit,
|
||||
};
|
||||
}
|
||||
|
||||
const rows = await AlbumsModel.find(
|
||||
{
|
||||
user: this.req.user._id,
|
||||
...where,
|
||||
},
|
||||
[],
|
||||
{
|
||||
skip,
|
||||
limit,
|
||||
sort: {
|
||||
[sort]: order.toLowerCase() === "asc" ? 1 : -1,
|
||||
},
|
||||
}
|
||||
params
|
||||
);
|
||||
|
||||
return {
|
||||
rows,
|
||||
count,
|
||||
};
|
||||
switch (exportFormat) {
|
||||
case "csv":
|
||||
return Albums.convertToCsv(rows);
|
||||
case "xls":
|
||||
return Albums.convertToXls(rows);
|
||||
case "json":
|
||||
default:
|
||||
return {
|
||||
rows,
|
||||
count,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -13,10 +13,20 @@ router
|
|||
try {
|
||||
const albums = new Albums(req);
|
||||
const data = await albums.getAll();
|
||||
const { exportFormat = "json" } = req.query;
|
||||
|
||||
sendResponse(req, res, data);
|
||||
switch (exportFormat) {
|
||||
case "csv":
|
||||
res.header("Content-Type", "text/csv");
|
||||
return res.status(200).send(data);
|
||||
case "xls":
|
||||
return data.write("musictopus.xls", res);
|
||||
case "json":
|
||||
default:
|
||||
return sendResponse(req, res, data);
|
||||
}
|
||||
} catch (err) {
|
||||
next(err);
|
||||
return next(err);
|
||||
}
|
||||
})
|
||||
.post(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
|
|
|
@ -4,7 +4,6 @@ import { ensureLoggedIn } from "connect-ensure-login";
|
|||
|
||||
import Pages from "../middleware/Pages";
|
||||
import Auth from "../middleware/Auth";
|
||||
import Albums from "../middleware/Albums";
|
||||
|
||||
import render from "../libs/format";
|
||||
|
||||
|
@ -89,38 +88,6 @@ router
|
|||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/ma-collection")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(req, "mon-compte/ma-collection");
|
||||
|
||||
await page.loadMyCollection();
|
||||
|
||||
if (page.getPageContent("artists").length > 0) {
|
||||
render(res, page);
|
||||
} else {
|
||||
res.redirect("/ajouter-un-album");
|
||||
}
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/ma-collection/:itemId")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(req, "mon-compte/ma-collection/details");
|
||||
|
||||
await page.loadItem();
|
||||
|
||||
render(res, page);
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
router.route("/nous-contacter").get(async (req, res, next) => {
|
||||
try {
|
||||
const page = new Pages(req, "nous-contacter");
|
||||
|
|
53
src/routes/ma-collection.js
Normal file
53
src/routes/ma-collection.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import express from "express";
|
||||
import { ensureLoggedIn } from "connect-ensure-login";
|
||||
|
||||
import Albums from "../middleware/Albums";
|
||||
|
||||
import render from "../libs/format";
|
||||
|
||||
// eslint-disable-next-line new-cap
|
||||
const router = express.Router();
|
||||
|
||||
router.route("/").get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(req, "mon-compte/ma-collection");
|
||||
|
||||
await page.loadMyCollection();
|
||||
|
||||
if (page.getPageContent("artists").length > 0) {
|
||||
render(res, page);
|
||||
} else {
|
||||
res.redirect("/ajouter-un-album");
|
||||
}
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/exporter")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(req, "mon-compte/ma-collection/exporter");
|
||||
|
||||
render(res, page);
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
router
|
||||
.route("/:itemId")
|
||||
.get(ensureLoggedIn("/connexion"), async (req, res, next) => {
|
||||
try {
|
||||
const page = new Albums(req, "mon-compte/ma-collection/details");
|
||||
|
||||
await page.loadItem();
|
||||
|
||||
render(res, page);
|
||||
} catch (err) {
|
||||
next(err);
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
Loading…
Add table
Add a link
Reference in a new issue