From 85752c537d687d6b941a4a25118466e8221a3444 Mon Sep 17 00:00:00 2001 From: dbroqua Date: Sun, 8 Oct 2023 15:02:08 +0200 Subject: [PATCH] Import d'une collection depuis Discogs --- .eslintrc.js | 8 +- .../mon-compte/ma-collection/importer.js | 106 ++++++++++++++++++ sass/flash.scss | 4 + src/middleware/Albums.js | 19 +++- src/routes/ma-collection.js | 13 +++ views/index.ejs | 3 + .../mon-compte/ma-collection/importer.ejs | 43 +++++++ 7 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 javascripts/mon-compte/ma-collection/importer.js create mode 100644 views/pages/mon-compte/ma-collection/importer.ejs diff --git a/.eslintrc.js b/.eslintrc.js index dc91020..c6debb5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -22,7 +22,13 @@ module.exports = { camelcase: [ "error", { - allow: ["artists_sort", "access_token", "api_url", "media_ids"], + allow: [ + "artists_sort", + "access_token", + "api_url", + "media_ids", + "release_id", + ], }, ], }, diff --git a/javascripts/mon-compte/ma-collection/importer.js b/javascripts/mon-compte/ma-collection/importer.js new file mode 100644 index 0000000..08f2b6f --- /dev/null +++ b/javascripts/mon-compte/ma-collection/importer.js @@ -0,0 +1,106 @@ +Vue.createApp({ + data() { + return { + file: "", + content: [], + parsed: false, + imported: 0, + disabled: true, + state: "default", + }; + }, + created() {}, + destroyed() {}, + methods: { + handleFileUpload(event) { + const { files } = event.target; + const [csv] = files; + + this.file = csv; + + this.file = csv; + // this.parseFile(); + + const reader = new FileReader(); + reader.onload = (content) => { + this.content = []; + this.state = "parse"; + const lines = content.target.result.split(/\r\n|\n/); + for (let line = 1; line < lines.length - 1; line += 1) { + this.parseLine(lines[0], lines[line]); + } + + this.state = "default"; + this.disabled = false; + }; + + reader.readAsText(csv); + }, + parseLine(header, line) { + const row = {}; + let currentHeaderIndex = 0; + + let separant = ","; + let value = ""; + for (let i = 0; i < line.length; i += 1) { + const char = line[i]; + + if (char !== separant) { + if (char === '"') { + separant = '"'; + } else { + value += char; + } + } else if (char === '"') { + separant = ","; + } else { + row[header.split(",")[currentHeaderIndex]] = value; + currentHeaderIndex += 1; + value = ""; + } + } + this.content.push(row); + }, + async addOne(index) { + const { Artist, Title, release_id } = this.content[index]; + + try { + const res = await axios.get( + `/api/v1/albums?discogsId=${release_id}` + ); + + if (res.status === 204) { + await axios.post("/api/v1/albums", { + discogsId: release_id, + share: false, + }); + } + + this.imported += 1; + if (this.content.length > index + 1) { + await this.addOne(index + 1); + } + } catch (err) { + showToastr( + `Impossible d'ajouter l'album ${Title} de ${Artist}` + ); + + return false; + } + + return true; + }, + async importCollection(event) { + event.preventDefault(); + + this.disabled = true; + this.state = "submit"; + this.imported = 0; + + const imported = await this.addOne(0); + + this.disabled = false; + this.state = imported ? "done" : "default"; + }, + }, +}).mount("#importer"); diff --git a/sass/flash.scss b/sass/flash.scss index 20f749e..b1eb3d5 100644 --- a/sass/flash.scss +++ b/sass/flash.scss @@ -8,6 +8,10 @@ width: calc(100% - 6rem); margin: 2rem auto; + .header { + font-weight: 700; + } + &.info { background-color: $warning-color; } diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js index c5ba642..731ad4f 100644 --- a/src/middleware/Albums.js +++ b/src/middleware/Albums.js @@ -25,10 +25,21 @@ class Albums extends Pages { */ static async postAddOne(req) { const { body, user } = req; - const { album: albumDetails, share } = body; + const { share, discogsId } = body; + + let albumDetails = body.album; + if (discogsId) { + albumDetails = await getAlbumDetails(discogsId); + body.id = discogsId; + } + + if (!albumDetails) { + throw new ErrorEvent(406, "Aucun album à ajouter"); + } + const data = { ...albumDetails, - discogsId: body.id, + discogsId: albumDetails.id, User: user._id, }; data.released = data.released @@ -169,6 +180,7 @@ Publié automatiquement via #musictopus`; style, userId: collectionUserId, discogsIds, + discogsId, } = this.req.query; let userId = this.req.user?._id; @@ -221,6 +233,9 @@ Publié automatiquement via #musictopus`; if (discogsIds) { where.discogsId = { $in: discogsIds }; } + if (discogsId) { + where.discogsId = Number(discogsId); + } const count = await AlbumsModel.count({ User: userId, diff --git a/src/routes/ma-collection.js b/src/routes/ma-collection.js index ddf5527..32189d3 100644 --- a/src/routes/ma-collection.js +++ b/src/routes/ma-collection.js @@ -32,6 +32,19 @@ router page.setPageTitle("Exporter ma collection"); + render(res, page); + } catch (err) { + next(err); + } + }); +router + .route("/importer") + .get(ensureLoggedIn("/connexion"), async (req, res, next) => { + try { + const page = new Albums(req, "mon-compte/ma-collection/importer"); + + page.setPageTitle("Importer une collection"); + render(res, page); } catch (err) { next(err); diff --git a/views/index.ejs b/views/index.ejs index fbaa99b..7f3d713 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -89,6 +89,9 @@ Exporter ma collection + + Importer une collection + <% } %> diff --git a/views/pages/mon-compte/ma-collection/importer.ejs b/views/pages/mon-compte/ma-collection/importer.ejs new file mode 100644 index 0000000..e8c849e --- /dev/null +++ b/views/pages/mon-compte/ma-collection/importer.ejs @@ -0,0 +1,43 @@ +
+

Importer une collection

+

+ Il est actuellement possible d'importer une collection provenant de discogs. +
+ Vous devez dans un premier temps vous rendre sur la page Exporter de discogs. +
+ Une fois exporter vous recevrez un mail de Discogs avec un lien de téléchargement. Une fois le fichier .zip téléchargé vous devez en extraire le fichier .csv afin de l'importer dans MusicTopus. +

+

+ D'autres formats d'imports seront ajoutés par la suite, comme l'import entre 2 instances MusicTopus. +

+
+
+ Information +
+
+ Si un album est déjà présent en base celui-ci sera ignoré. +
+
+ +
+ +
+ + +
+ +
+ + Album à impoter : {{content.length}} + +
+ + +
+
\ No newline at end of file