diff --git a/backend/data/licenses.json b/backend/data/licenses.json new file mode 100644 index 0000000..8fa0437 --- /dev/null +++ b/backend/data/licenses.json @@ -0,0 +1,182 @@ +[ + { + "image": "alex-turner.jpg", + "license": "CC BY 2.0", + "creator": "Raph_PH", + "url": "https://upload.wikimedia.org/wikipedia/commons/9/95/Alex_Turner%2C_Way_Out_West_2018.jpg" + }, + { + "image": "andy-nicholson.jpg", + "license": "CC BY 2.0", + "creator": "Lola's Big Adventure!", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Andy_Nicholson_%28cropped%29.jpg" + }, + { + "image": "anthony-kiedis.jpg", + "license": "CC BY 2.0", + "creator": "Hel Davies", + "url": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Anthony_Kiedis_2022.jpg" + }, + { + "image": "chris-martin.jpg", + "license": "CC BY 2.0", + "creator": "Raph_PH", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/68/ChrisMartinManch030623_%28cropped%29.jpg" + }, + { + "image": "chris-wolstenholme.jpg", + "license": "CC BY-SA 4.0", + "creator": "Markus Felix", + "url": "https://upload.wikimedia.org/wikipedia/commons/e/eb/2018_Chris_Wolstenholme_%28cropped%29.jpg" + }, + { + "image": "flea.jpg", + "license": "CC BY 2.0", + "creator": "Piyush Kumar", + "url": "https://upload.wikimedia.org/wikipedia/commons/8/8e/Flea_1012_%282%29.jpg" + }, + { + "image": "chad-smith.jpg", + "license": "Gemeinfrei", + "creator": "Bojosoto", + "url": "https://upload.wikimedia.org/wikipedia/commons/4/42/Chadsmithclinic.jpg" + }, + { + "image": "john-frusciante.jpg", + "license": "CC BY-SA 2.0", + "creator": "Hel Davies", + "url": "https://upload.wikimedia.org/wikipedia/commons/1/1f/John_Frusciante_%2852279466415%29.jpg" + }, + { + "image": "logo.png", + "license": "MIT", + "creator": "Tobias Zoghaib", + "url": "" + }, + { + "image": "lanxess-arena-indoor.jpg", + "license": "CC BY-SA 3.0", + "creator": "Admin Kübelbeck", + "url": "https://upload.wikimedia.org/wikipedia/commons/f/f3/Koelnarena_inside.jpg" + }, + { + "image": "lanxess-arena-outdoor.jpg", + "license": "CC BY-SA 2.0", + "creator": "Rolf H.", + "url": "https://upload.wikimedia.org/wikipedia/commons/1/18/Lanxess_Arena_Flight_over_Cologne.jpg" + }, + { + "image": "red-hot-chili-peppers-1.jpg", + "license": "CC BY-SA 4.0", + "creator": "Kreepin Deth", + "url": "https://upload.wikimedia.org/wikipedia/commons/1/14/RHCP_Live_in_London_26_June_2022.jpg" + }, + { + "image": "swiss-life-hall-indoor.jpg", + "license": "CC BY-SA 3.0", + "creator": "Bernd Schwabe in Hannover", + "url": "https://upload.wikimedia.org/wikipedia/commons/8/89/2013-09-18_Besuch_14._Dalai_Lama_Tendzin_Gyatsho_in_Hannover%2C_future4children%2C_Swiss_Life_Hall%2C_%2876%29.JPG" + }, + { + "image": "swiss-life-hall-outdoor.jpg", + "license": "Public Domain", + "creator": "AxelHH", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/66/AWD_Hall_Seite.jpg" + }, + { + "image": "astra-kulturhaus-outdoor.jpg", + "license": "CC BY 2.0", + "creator": "Marcus Grbac", + "url": "https://upload.wikimedia.org/wikipedia/commons/f/fd/Astra_Kulturhaus_Biergarten_RAW_Berlin_July_2017.jpg" + }, + { + "image": "thom-yorke.jpg", + "license": "CC BY 2.0", + "creator": "Raph_PH", + "url": "https://upload.wikimedia.org/wikipedia/commons/2/25/RadioheadMontreal170718-70_%2843600493681%29_%28cropped%29.jpg" + }, + { + "image": "rami-jaffee.jpg", + "license": "CC BY 2.0", + "creator": "Raph_PH", + "url": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Rami_Jaffee_1.jpg" + }, + { + "image": "philip-selway.jpg", + "license": "CC BY-SA 2.0", + "creator": "Michell Zappa", + "url": "https://upload.wikimedia.org/wikipedia/commons/1/1f/Phil_Selway.jpg" + }, + { + "image": "phil-harvey.jpg", + "license": "CC BY-SA 3.0", + "creator": "Hayley St. James", + "url": "https://upload.wikimedia.org/wikipedia/commons/3/36/PhilHarveyNewYork17062021.png" + }, + { + "image": "pat-smear.jpg", + "license": "GNU v.1.2", + "creator": "Andrew Burns", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/66/Patsmear.jpg" + }, + { + "image": "mike-kerr.jpg", + "license": "CC BY 4.0", + "creator": "Dena Flows", + "url": "https://upload.wikimedia.org/wikipedia/commons/8/85/017-BIME-2017-Royal-Blood-27X17-por-Dena-Flows.jpg" + }, + { + "image": "matthew-bellamy.jpg", + "license": "CC BY 3.0", + "creator": "Minerva97", + "url": "https://upload.wikimedia.org/wikipedia/commons/d/d0/2009_Matthew_Bellamy_%28cropped%29.jpg" + }, + { + "image": "capitol-outside.jpg", + "license": "", + "creator": "AxelHH", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Hannover_Capitol_ganz.jpg" + }, + { + "image": "red-hot-chili-peppers-logo.png", + "license": "", + "creator": "Viiticus", + "url": "https://upload.wikimedia.org/wikipedia/commons/3/31/Red_Hot_Chili_Peppers_logo.svg" + }, + { + "image": "red-hot-chili-peppers-2.jpg", + "license": "CC BY-SA 4.0", + "creator": "Roberto Gianardi", + "url": "https://upload.wikimedia.org/wikipedia/commons/6/64/Red_Hot_Chili_Peppers_Bologna_2016.jpg" + }, + { + "image": "arctic-monkeys-1.jpg", + "license": "CC BY 3.0", + "creator": "Bill Ebbesen", + "url": "https://upload.wikimedia.org/wikipedia/commons/0/04/Arctic_Monkeys_-_Orange_Stage_-_Roskilde_Festival_2014.jpg" + }, + { + "image": ".jpg", + "license": "CC BY-SA 2.0", + "creator": "", + "url": "" + }, + { + "image": "arctic-monkeys-3.jpg", + "license": "CC BY-SA 2.0", + "creator": "Aurelien Guichard", + "url": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Arctic_Monkeys_%40_Shepherds_Bush_Empire.jpg" + }, + { + "image": "european-tour-arctic-monkeys.jpg", + "license": "Gemeinfrei", + "creator": "Matthew Cooper", + "url": "https://upload.wikimedia.org/wikipedia/commons/e/e7/%22AM%22_%28Arctic_Monkeys%29.jpg" + }, + { + "image": ".jpg", + "license": "CC BY-SA 2.0", + "creator": "", + "url": "" + } +] \ No newline at end of file diff --git a/backend/images/artists/alex-turner.jpg b/backend/images/artists/alex-turner.jpg index 6869e13..2f559f8 100644 Binary files a/backend/images/artists/alex-turner.jpg and b/backend/images/artists/alex-turner.jpg differ diff --git a/backend/images/artists/andy-nicholson.jpg b/backend/images/artists/andy-nicholson.jpg index 052d411..81db613 100644 Binary files a/backend/images/artists/andy-nicholson.jpg and b/backend/images/artists/andy-nicholson.jpg differ diff --git a/backend/images/artists/chad-smith.jpg b/backend/images/artists/chad-smith.jpg index 50836be..1a2a77f 100644 Binary files a/backend/images/artists/chad-smith.jpg and b/backend/images/artists/chad-smith.jpg differ diff --git a/backend/images/artists/flea.jpg b/backend/images/artists/flea.jpg index 13c5d6a..554f5b6 100644 Binary files a/backend/images/artists/flea.jpg and b/backend/images/artists/flea.jpg differ diff --git a/backend/images/artists/john-frusciante.jpg b/backend/images/artists/john-frusciante.jpg index 63daa36..f68bbda 100644 Binary files a/backend/images/artists/john-frusciante.jpg and b/backend/images/artists/john-frusciante.jpg differ diff --git a/backend/images/artists/matthew-bellamy.jpg b/backend/images/artists/matthew-bellamy.jpg index c758184..0c7a0ec 100644 Binary files a/backend/images/artists/matthew-bellamy.jpg and b/backend/images/artists/matthew-bellamy.jpg differ diff --git a/backend/images/artists/mike-kerr.jpg b/backend/images/artists/mike-kerr.jpg index 640d99d..951a31f 100644 Binary files a/backend/images/artists/mike-kerr.jpg and b/backend/images/artists/mike-kerr.jpg differ diff --git a/backend/images/artists/philip-selway.jpg b/backend/images/artists/philip-selway.jpg index cf7b309..eea7877 100644 Binary files a/backend/images/artists/philip-selway.jpg and b/backend/images/artists/philip-selway.jpg differ diff --git a/backend/images/bands/red-hot-chili-peppers-2.jpg b/backend/images/bands/red-hot-chili-peppers-2.jpg index 1725e3a..78e93d6 100644 Binary files a/backend/images/bands/red-hot-chili-peppers-2.jpg and b/backend/images/bands/red-hot-chili-peppers-2.jpg differ diff --git a/backend/images/concerts/european-tour-arctic-monkeys.jpg b/backend/images/concerts/european-tour-arctic-monkeys.jpg index c06f26b..f4c7380 100644 Binary files a/backend/images/concerts/european-tour-arctic-monkeys.jpg and b/backend/images/concerts/european-tour-arctic-monkeys.jpg differ diff --git a/backend/images/locations/astra-kulturhaus-outdoor.jpg b/backend/images/locations/astra-kulturhaus-outdoor.jpg index 0726a4b..af10b1b 100644 Binary files a/backend/images/locations/astra-kulturhaus-outdoor.jpg and b/backend/images/locations/astra-kulturhaus-outdoor.jpg differ diff --git a/backend/images/locations/capitol-outdoor.jpg b/backend/images/locations/capitol-outdoor.jpg index e7ef51f..aff71e0 100644 Binary files a/backend/images/locations/capitol-outdoor.jpg and b/backend/images/locations/capitol-outdoor.jpg differ diff --git a/backend/images/locations/swiss-life-hall-indoor.jpg b/backend/images/locations/swiss-life-hall-indoor.jpg index ec7cf64..55f731d 100644 Binary files a/backend/images/locations/swiss-life-hall-indoor.jpg and b/backend/images/locations/swiss-life-hall-indoor.jpg differ diff --git a/backend/images/locations/swiss-life-hall-outdoor.jpg b/backend/images/locations/swiss-life-hall-outdoor.jpg index ff0f4db..fbe5d67 100644 Binary files a/backend/images/locations/swiss-life-hall-outdoor.jpg and b/backend/images/locations/swiss-life-hall-outdoor.jpg differ diff --git a/backend/routes/files.routes.ts b/backend/routes/files.routes.ts index cecfb20..19c9400 100644 --- a/backend/routes/files.routes.ts +++ b/backend/routes/files.routes.ts @@ -1,7 +1,8 @@ import { Request, Response, NextFunction, Router } from 'express' -import fs from "fs" +import fs, { createReadStream } from "fs" import multer from "multer" const upload = multer({ dest: './backend/images/' }) +import licenses from "../data/licenses.json" export const files = Router() @@ -32,17 +33,20 @@ files.get("/:folder", async (req: Request, res: Response) => { let result = [] let fileNames = fs.readdirSync("./backend/images/" + req.params.folder + "/") - fileNames.forEach(file => { - let resData = fs.readFileSync("./backend/images/" + req.params.folder + "/" + file, "utf8") + let resData = "" + let url = "http://localhost:3000/static/" + req.params.folder + "/" + file + + if (file.endsWith("html") || file.endsWith("js")) { + resData = fs.readFileSync("./backend/images/" + req.params.folder + "/" + file, "utf8") + } - // todo License, Author, URL result.push({ name: file, size: fs.statSync("./backend/images/" + req.params.folder + "/" + file).size, content: resData, - url: "http://localhost:3000/static/" + req.params.folder + "/" + file, - + url: url, + copyright: licenses.find(data => data.image == file) }) }) diff --git a/backend/server.ts b/backend/server.ts index 57d838e..480f94f 100644 --- a/backend/server.ts +++ b/backend/server.ts @@ -29,6 +29,7 @@ startDatabase() const path = require('path') app.use('/static', express.static(path.join(__dirname, 'images'))) app.use("/exercises", exercises) +app.use("/files", files) // Add delay for more realistic response times app.use((req, res, next) => { @@ -44,7 +45,6 @@ app.use("/orders", order) app.use("/accounts", account) app.use("/cities", city) app.use("/concerts", concert) -app.use("/files", files) // Start server const server = app.listen(port, () => { diff --git a/package-lock.json b/package-lock.json index 033c2ed..4024f8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "axios": "^1.7.7", "body-parser": "^1.20.2", "cors": "^2.8.5", + "csv": "^6.3.11", + "csv-reader": "^1.0.12", "exif-js": "^2.3.0", "exifreader": "^4.25.0", "express": "^4.21.1", @@ -4286,6 +4288,48 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/csv": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/csv/-/csv-6.3.11.tgz", + "integrity": "sha512-a8bhT76Q546jOElHcTrkzWY7Py925mfLO/jqquseH61ThOebYwOjLbWHBqdRB4K1VpU36sTyIei6Jwj7QdEZ7g==", + "license": "MIT", + "dependencies": { + "csv-generate": "^4.4.2", + "csv-parse": "^5.6.0", + "csv-stringify": "^6.5.2", + "stream-transform": "^3.3.3" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/csv-generate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.4.2.tgz", + "integrity": "sha512-W6nVsf+rz0J3yo9FOjeer7tmzBJKaTTxf7K0uw6GZgRocZYPVpuSWWa5/aoWWrjQZj4/oNIKTYapOM7hiNjVMA==", + "license": "MIT" + }, + "node_modules/csv-parse": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", + "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==", + "license": "MIT" + }, + "node_modules/csv-reader": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/csv-reader/-/csv-reader-1.0.12.tgz", + "integrity": "sha512-0AAgazKJUywtjvZbclNuovIiQY/WyvojWw15Y2k3kPixE+pDiOFnfg5FcH3CfDqqnrB2f3p5oPAc446EXD01Tw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csv-stringify": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.2.tgz", + "integrity": "sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==", + "license": "MIT" + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -8618,6 +8662,12 @@ "node": ">= 0.8" } }, + "node_modules/stream-transform": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.3.3.tgz", + "integrity": "sha512-dALXrXe+uq4aO5oStdHKlfCM/b3NBdouigvxVPxCdrMRAU6oHh3KNss20VbTPQNQmjAHzZGKGe66vgwegFEIog==", + "license": "MIT" + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", diff --git a/package.json b/package.json index ad289ed..de35d03 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,8 @@ "axios": "^1.7.7", "body-parser": "^1.20.2", "cors": "^2.8.5", + "csv": "^6.3.11", + "csv-reader": "^1.0.12", "exif-js": "^2.3.0", "exifreader": "^4.25.0", "express": "^4.21.1", diff --git a/src/data/models/files/filesApiModel.ts b/src/data/models/files/filesApiModel.ts new file mode 100644 index 0000000..84b7db0 --- /dev/null +++ b/src/data/models/files/filesApiModel.ts @@ -0,0 +1,13 @@ +export class FilesApiModel { + name: string + size: number + content: string + url: string + copyright: CopyRightModel = new CopyRightModel() +} + +class CopyRightModel { + license: string = "" + creator: string = "" + url: string = "" +} \ No newline at end of file diff --git a/src/pages/admin/filesAdminPage/index.vue b/src/pages/admin/filesAdminPage/index.vue index 275410c..609fda2 100644 --- a/src/pages/admin/filesAdminPage/index.vue +++ b/src/pages/admin/filesAdminPage/index.vue @@ -19,6 +19,7 @@ filesStore.getStaticFolders() :hide-add-button="true" > + + + + > + + + + - {{ filesStore.selectedFile.url }} - - - - - + + + + + + + + {{ filesStore.selectedFile.url }} + + + + {{ Math.round(filesStore.selectedFile.size / 1024) + ' KB' }} + + + + + + diff --git a/src/stores/files.store.ts b/src/stores/files.store.ts index 82fb528..1a33a31 100644 --- a/src/stores/files.store.ts +++ b/src/stores/files.store.ts @@ -1,4 +1,5 @@ import { fetchFileNames, fetchFolderNames, postFile } from "@/data/api/files.api"; +import { FilesApiModel } from "@/data/models/files/filesApiModel"; import { defineStore } from "pinia"; import { ref } from "vue"; @@ -7,14 +8,17 @@ export const useFilesStore = defineStore('filesStore', { /** Request to server sent, waiting for data response */ fetchInProgress: ref(false), + /** List of all folders on the server */ staticFolders: ref>([]), + /** Current selected folder in file browsre */ selectedFolder: ref<{name: string, nrOfItems: number}>(), /** List of files on the server */ - staticFiles: ref>([]), + staticFiles: ref>([]), - selectedFile: ref<{name: string, size: number, content: string, url: string}>(), + /** Current selected file in file browser */ + selectedFile: ref(), showFileUploadDialog: ref(false), @@ -24,6 +28,9 @@ export const useFilesStore = defineStore('filesStore', { }), actions: { + /** + * Fetch all static folders on the server + */ async getStaticFolders() { this.fetchInProgress = true @@ -47,6 +54,7 @@ export const useFilesStore = defineStore('filesStore', { }) }, + async uploadFile() { this.fetchInProgress = true