diff --git a/server/config/db.js b/server/config/db.js index 88bfb6f4..54f66eca 100644 --- a/server/config/db.js +++ b/server/config/db.js @@ -8,11 +8,11 @@ const connectDB = async () => { throw new Error("Invalid NODE_ENV specified"); } try { + const conn = await mongoose.connect(process.env.MONGO_URI_DEVELOPMENT, { const mongoURI = process.env.NODE_ENV === "production" ? process.env.MONGO_URI_PROD : process.env.MONGO_URI_DEV; - const conn = await mongoose.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true, diff --git a/server/data/artist.json b/server/data/artist.json new file mode 100644 index 00000000..3116efde --- /dev/null +++ b/server/data/artist.json @@ -0,0 +1,32 @@ +[ + { + "_id": "60c72b3f4f7d5c001f6471a1", + "name": { + "hebrew": "אביב גפן", + "arabic": "أفيف جيفن", + "english": "Aviv Geffen" + }, + "imgURL": "https://example.com/aviv_geffen.jpg", + "albums": ["Blackfield", "Blackfield II"] + }, + { + "_id": "60c72b3f4f7d5c001f6471a2", + "name": { + "hebrew": "אריק איינשטיין", + "arabic": "أريك أينشتاين", + "english": "Arik Einstein" + }, + "imgURL": "https://example.com/arik_einstein.jpg", + "albums": ["Good Old Eretz Israel", "Songs of the Paratroopers"] + }, + { + "_id": "60c72b3f4f7d5c001f6471a4", + "name": { + "hebrew": "שלמה ארצי", + "arabic": "شلومو أرتزي", + "english": "Shlomo Artzi" + }, + "imgURL": "https://example.com/shlomo_artzi.jpg", + "albums": ["Songs of My Beloved Land", "A Man Reflects on a Woman"] + } +] diff --git a/server/data/song.json b/server/data/song.json new file mode 100644 index 00000000..1ef3e65d --- /dev/null +++ b/server/data/song.json @@ -0,0 +1,56 @@ +[ + { + "_id": "60c72b3f4f7d5c001f6471b1", + "name": { + "hebrew": "אחרי שהכל נגמר", + "arabic": "بعد أن انتهى كل شيء", + "english": "After Everything is Over" + }, + "lyrics": { + "hebrew": "אחרי שהכל נגמר...", + "arabic": "بعد أن انتهى كل شيء...", + "english": "After everything is over..." + }, + "originalLang": "hebrew", + "artist": "60c72b3f4f7d5c001f6471a1", + "imgURL": "https://example.com/after_everything_is_over.jpg", + "album": "Blackfield", + "youtubeURL": "https://www.youtube.com/watch?v=example1" + }, + { + "_id": "60c72b3f4f7d5c001f6471b2", + "name": { + "hebrew": "אני ואתה", + "arabic": "أنا وأنت", + "english": "Me and You" + }, + "lyrics": { + "hebrew": "אני ואתה...", + "arabic": "أنا وأنت...", + "english": "Me and you..." + }, + "originalLang": "hebrew", + "artist": "60c72b3f4f7d5c001f6471a2", + "imgURL": "https://example.com/me_and_you.jpg", + "album": "Good Old Eretz Israel", + "youtubeURL": "https://www.youtube.com/watch?v=example2" + }, + { + "_id": "60c72b3f4f7d5c001f6471b3", + "name": { + "hebrew": "מרץ", + "arabic": "مرتز", + "english": "March" + }, + "lyrics": { + "hebrew": "מרץ, מרץ, תירוץ, תירוץ...", + "arabic": "مرتز، مرتز، تيروز، تيروز...", + "english": "March, march, excuse, excuse..." + }, + "originalLang": "hebrew", + "artist": "60c72b3f4f7d5c001f6471a4", + "imgURL": "https://example.com/march.jpg", + "album": "Songs of My Beloved Land", + "youtubeURL": "https://www.youtube.com/watch?v=example3" + } +] diff --git a/server/data/topSongs.json b/server/data/topSongs.json new file mode 100644 index 00000000..64f7a3b9 --- /dev/null +++ b/server/data/topSongs.json @@ -0,0 +1,142 @@ +[ + { + "_id": "60c72b3f4f7d5c001f6471d1", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e1"], + "imgURL": "https://example.com/song1.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d2", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e2"], + "imgURL": "https://example.com/song2.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d3", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e3"], + "imgURL": "https://example.com/song3.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d4", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e4"], + "imgURL": "https://example.com/song4.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d5", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e5"], + "imgURL": "https://example.com/song5.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d6", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e6"], + "imgURL": "https://example.com/song6.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d7", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e7"], + "imgURL": "https://example.com/song7.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d8", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e8"], + "imgURL": "https://example.com/song8.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f6471d9", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b8e9"], + "imgURL": "https://example.com/song9.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647110", + "date": "2023-06-14T12:34:56.789Z", + "language": "hebrew", + "songs": ["60c3cfc5546eef0015f6b810"], + "imgURL": "https://example.com/son10.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647111", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b811"], + "imgURL": "https://example.com/son11.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647112", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b812"], + "imgURL": "https://example.com/son12.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647113", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b813"], + "imgURL": "https://example.com/son13.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647114", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b814"], + "imgURL": "https://example.com/son14.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647115", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b815"], + "imgURL": "https://example.com/son15.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647116", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b816"], + "imgURL": "https://example.com/son16.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647117", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b817"], + "imgURL": "https://example.com/son17.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647118", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b818"], + "imgURL": "https://example.com/son18.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647119", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b819"], + "imgURL": "https://example.com/son19.jpg" + }, + { + "_id": "60c72b3f4f7d5c001f647120", + "date": "2023-06-14T12:34:56.789Z", + "language": "arabic", + "songs": ["60c3cfc5546eef0015f6b820"], + "imgURL": "https://example.com/son20.jpg" + } +] diff --git a/server/generateDummyData.js b/server/generateDummyData.js new file mode 100644 index 00000000..b012e802 --- /dev/null +++ b/server/generateDummyData.js @@ -0,0 +1,66 @@ +import fs from "fs"; +import mongoose from "mongoose"; +import dotenv from "dotenv"; + +import { fileURLToPath } from "url"; +import { join, dirname } from "path"; + +import Artist from "./models/Artist.js"; +import Song from "./models/Song.js"; +import TopSongs from "./models/TopSongs.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +dotenv.config({ path: join(__dirname, "./config/config.env") }); + +mongoose.connect(process.env.MONGO_URI_DEV, { + useNewUrlParser: true, + useUnifiedTopology: true, +}); + +const artist = JSON.parse( + fs.readFileSync(new URL("./data/artist.json", import.meta.url), "utf-8") +); + +const song = JSON.parse( + fs.readFileSync(new URL("./data/song.json", import.meta.url), "utf-8") +); + +const topSongs = JSON.parse( + fs.readFileSync(new URL("./data/topSongs.json", import.meta.url), "utf-8") +); + +// Import into DB +const importData = async () => { + try { + await Artist.create(artist); + await Song.create(song); + await TopSongs.create(topSongs); + + console.log("Data Imported..."); + process.exit(); + } catch (err) { + console.error(err); + } +}; + +// Delete data +const deleteData = async () => { + try { + await Artist.deleteMany({ imgURL: { $regex: /https:\/\/example\.com/ } }); + await Song.deleteMany({ imgURL: { $regex: /https:\/\/example\.com/ } }); + await TopSongs.deleteMany({ imgURL: { $regex: /https:\/\/example\.com/ } }); + + console.log("Data Destroyed..."); + process.exit(); + } catch (err) { + console.error(err); + } +}; + +if (process.argv[2] === "-i") { + importData(); +} else if (process.argv[2] === "-d") { + deleteData(); +} diff --git a/server/models/Song.js b/server/models/Song.js index 92537a7a..06243b9e 100644 --- a/server/models/Song.js +++ b/server/models/Song.js @@ -1,6 +1,7 @@ import mongoose from "mongoose"; import Artist from "./Artist.js"; import asyncHandler from "../middleware/asyncHandler.js"; +import ErrorResponse from "../utils/ErrorResponse.js"; const SongSchema = new mongoose.Schema( { diff --git a/server/models/TopSongs.js b/server/models/TopSongs.js index 0004893c..305cdf68 100644 --- a/server/models/TopSongs.js +++ b/server/models/TopSongs.js @@ -1,41 +1,39 @@ import mongoose from "mongoose"; const TopSongsSchema = new mongoose.Schema( - { - date:{ - type: Date, - default: Date.now, - }, - language: { - type: String, - required: [true, "Please add language"], - enum: ['hebrew', 'arabic'] - }, - songs:[ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'Song', - } - ], - // This field needs to be refractured: - imgURL: { - type: String, - }, + { + date: { + type: Date, + default: Date.now, }, - { - toJSON: { - transform(_, ret) { - delete ret.__v; - }, - }, - toObject: { - transform(_, ret) { - delete ret.__v; - }, - }, - } - -) - + language: { + type: String, + required: [true, "Please add language"], + enum: ["hebrew", "arabic"], + }, + songs: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: "Song", + }, + ], + // This field needs to be refractured: + imgURL: { + type: String, + }, + }, + { + toJSON: { + transform(_, ret) { + delete ret.__v; + }, + }, + toObject: { + transform(_, ret) { + delete ret.__v; + }, + }, + } +); -export default mongoose.model("TopSongs", TopSongsSchema); \ No newline at end of file +export default mongoose.model("TopSongs", TopSongsSchema); diff --git a/server/package-lock.json b/server/package-lock.json index 1fc79136..79238416 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -16,6 +16,7 @@ "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", + "fs": "^0.0.1-security", "mocha": "^10.2.0", "mongoose": "^7.1.1", "openai": "^3.2.1", @@ -1927,6 +1928,11 @@ "node": ">= 0.6" } }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", diff --git a/server/package.json b/server/package.json index fe225c01..b0e548a8 100644 --- a/server/package.json +++ b/server/package.json @@ -8,7 +8,9 @@ "test": "mocha './tests/**/*.tests.js'", "start": "node server.js", "server": "nodemon server.js", - "config": "bash ./scripts/config.script.sh" + "config": "bash ./scripts/config.script.sh", + "generateData": "node ./generateDummyData.js -i", + "deleteData":"node ./generateDummyData.js -d" }, "author": "", "license": "ISC", diff --git a/server/scripts/config.script.sh b/server/scripts/config.script.sh index b4d74133..29e21558 100644 --- a/server/scripts/config.script.sh +++ b/server/scripts/config.script.sh @@ -12,6 +12,7 @@ else # Define an array of environment variable names declare -a variables=("PORT" "NODE_ENV" "MONGO_URI_DEV" "MONGO_URI_PROD" "OPEN_AI_API_KEY" "SPOTIFY_CLIENT_ID" "SPOTIFY_CLIENT_SECRET") + # Loop over the array and prompt the user to enter values for each variable for variable in "${variables[@]}" do