Display all bands grouped by genre, create m:n association between Band and Genre in database

This commit is contained in:
2024-09-27 23:25:24 +02:00
parent 848e7abf92
commit 9b325c849e
29 changed files with 275 additions and 165 deletions

View File

@@ -8,7 +8,7 @@
"descriptionDe": "Red Hot Chili Peppers (Abkürzung: RHCP) ist eine 1983 gegründete US-amerikanische Funk- und Alternative-Rockband. Sie zählt zu den kommerziell erfolgreichsten Vertretern des Crossover. Ihr Album Blood Sugar Sex Magik gilt als eines der bedeutendsten dieses Genres.",
"images": [ "red-hot-chili-peppers-1.jpg" ],
"logo": "red-hot-chili-peppers-logo.png",
"genreId": 0,
"genreId": [ 0, 2, 3 ],
"members": [
{
"name": "Anthony Kiedis",
@@ -47,7 +47,7 @@
"descriptionDe": "Radiohead ist eine britische Rockband, die 1985 in Oxford, England gegründet wurde. Die Band besteht aus Thom Yorke (Gesang, Rhythmusgitarre, Piano), Jonny Greenwood (Lead-Gitarre, Keyboard, Ondes Martenot), Colin Greenwood (E-Bass, Keyboard), Ed OBrien (Gitarre, Backgroundvocals) und Phil Selway (Schlagzeug, Backgroundvocals). Radioheads experimenteller Ansatz gilt als Wegbereiter für den Sound des Alternative Rocks.",
"images": [ "radiohead-1.jpg" ],
"logo": "radiohead-logo.jpg",
"genreId": 1,
"genreId": [ 1, 2, 4, 5, 6 ],
"members": [
{
"name": "Thom Yorke",
@@ -96,7 +96,7 @@
"descriptionDe": "Die Arctic Monkeys sind eine vierköpfige britische Alternative-Rock-Band mit Einflüssen aus Post-Punk und Garage Rock. Sie wurde 2002 im englischen Sheffield gegründet und veröffentlichte 2006 ihr Debütalbum, das Platz eins der britischen Charts erreichte. 2007, 2009, 2011, 2013 und 2018 erschienen jeweils weitere Alben der Musikgruppe, die alle ebenfalls die Spitzenposition in Großbritannien erreichten. Aktuelles Album der Band ist das am 21. Oktober 2022 erschienene The Car.",
"images": [ "arctic-monkeys-1.jpg", "arctic-monkeys-2.jpg" ],
"logo": "arctic-monkeys-logo.png",
"genreId": 2,
"genreId": [ 2, 7, 8 ],
"members": [
{
"name": "Glyn Jones",
@@ -150,7 +150,7 @@
"descriptionDe": "Coldplay ist eine britische Pop-Rock-Band, bestehend aus Chris Martin, Jonny Buckland, Will Champion und Guy Berryman. Sie ist eine der weltweit erfolgreichsten Bands der 2000er-Jahre und hat knapp 80 Millionen Tonträger weltweit verkauft, davon 50 Millionen Alben.",
"images": [ "coldplay-1.jpg" ],
"logo": "coldplay-logo.jpg",
"genreId": 2,
"genreId": [ 2, 9 ],
"members": [
{
"name": "Chris Martin",
@@ -174,7 +174,7 @@
},
{
"name": "Phil Harvey",
"bandId": 2,
"bandId": 3,
"image": "phil-harvey.jpg"
}
],
@@ -199,7 +199,7 @@
"descriptionDe": "Foo Fighters ist eine US-amerikanische Rockband. Prominentestes Mitglied und Band-Gründer ist der ehemalige Nirvana-Schlagzeuger Dave Grohl. ",
"images": [ "foo-fighters-1.jpg" ],
"logo": "foo-fighters-logo.png",
"genreId": 2,
"genreId": [ 2, 10 ],
"members": [
{
"name": "Dave Grohl",

View File

@@ -2,15 +2,47 @@
"data": [
{
"id": 0,
"name": "Funk rock"
"name": "Funk Rock"
},
{
"id": 1,
"name": "Art rock"
"name": "Art Rock"
},
{
"id": 2,
"name": "Alternative Rock"
},
{
"id": 3,
"name": "Crossover"
},
{
"id": 4,
"name": "Electronica"
},
{
"id": 5,
"name": "Post-Rock"
},
{
"id": 6,
"name": "Britpop"
},
{
"id": 7,
"name": "Post-Punk"
},
{
"id": 8,
"name": "Garage Rock"
},
{
"id": 9,
"name": "Pop-Rock"
},
{
"id": 10,
"name": "Post-Grunge"
}
]
}

View File

@@ -16,6 +16,7 @@ import { Member } from "./models/acts/member.model"
import { Rating } from "./models/acts/rating.model"
import { Tour } from "./models/acts/tour.model"
import { City } from "./models/acts/city.model"
import { BandGenre } from "./models/acts/bandGenre.model"
const dbName = "database"
const dbUser = "root"
@@ -30,7 +31,7 @@ export const sequelize = new Sequelize({
storage: "database.sqlite",
models: [
AccountRole, Account, Payment, Address,
City, Location, Genre, Band, Rating, Member, Tour, Show,
City, Location, Genre, Band, BandGenre, Rating, Member, Tour, Show,
Order, OrderItem
]
})

View File

@@ -1,8 +1,9 @@
import { BelongsTo, Column, DataType, ForeignKey, HasMany, Model, Table } from "sequelize-typescript";
import { BelongsTo, BelongsToMany, Column, DataType, ForeignKey, HasMany, Model, Table } from "sequelize-typescript";
import { Member } from "./member.model";
import { Genre } from "./genre.model";
import { Rating } from "./rating.model";
import { Tour } from "./tour.model";
import { BandGenre } from "./bandGenre.model";
@Table({ timestamps: false })
export class Band extends Model {
@@ -32,10 +33,6 @@ export class Band extends Model {
@Column
logo: String
@ForeignKey(() => Genre)
@Column
genreId: Number
// Relations
@@ -48,6 +45,6 @@ export class Band extends Model {
@HasMany(() => Tour)
tours: Tour[]
@BelongsTo(() => Genre)
genre: Genre
@BelongsToMany(() => Genre, () => BandGenre)
genres: Genre[]
}

View File

@@ -0,0 +1,16 @@
import { AutoIncrement, Column, ForeignKey, Model, PrimaryKey, Table, Unique } from "sequelize-typescript";
import { Genre } from "./genre.model";
import { Band } from "./band.model";
@Table({ timestamps: false })
export class BandGenre extends Model {
@PrimaryKey
@Column({autoIncrement: true})
declare id: number
@ForeignKey(() => Genre)
genreId: number
@ForeignKey(() => Band)
bandId: number
}

View File

@@ -1,5 +1,6 @@
import { Column, HasMany, Model, Table } from "sequelize-typescript";
import { BelongsToMany, Column, Model, Table } from "sequelize-typescript";
import { Band } from "./band.model";
import { BandGenre } from "./bandGenre.model";
@Table({ timestamps: false })
export class Genre extends Model {
@@ -9,6 +10,6 @@ export class Genre extends Model {
// Relations
@HasMany(() => Band)
@BelongsToMany(() => Band, () => BandGenre)
bands: Band[]
}

View File

@@ -1,10 +1,19 @@
import { Rating } from "../models/acts/rating.model";
import { Band } from "../models/acts/band.model";
import { Genre } from "../models/acts/genre.model";
import { Request, Response, Router } from "express";
export const genre = Router()
genre.get("/", (req: Request, res: Response) => {
Genre.findAll()
Genre.findAll({
include: [
{
model: Band,
include: [ Rating ]
}
]
})
.then(genres => {
res.status(200).json(genres)
})

View File

@@ -12,6 +12,7 @@ import { Location } from '../models/acts/location.model'
import { Show } from '../models/acts/show.model'
import { Tour } from '../models/acts/tour.model'
import { City } from '../models/acts/city.model'
import { BandGenre } from '../models/acts/bandGenre.model'
import accounts from "./../data/accounts.json"
import orders from "./../data/orders.json"
@@ -69,8 +70,17 @@ export async function prepopulateDatabase() {
for(let band of bands.data) {
// Create a band dataset
await Band.create(band)
.then(dataset => {
.then(async dataset => {
// Create the m:n associations for the genres
for (let genreId of band.genreId) {
await BandGenre.create({
genreId: Number(genreId),
bandId: dataset.dataValues.id
})
}
Rating.bulkCreate(band.ratings)
Member.bulkCreate(band.members)
})