Move software files one directory up, Readme
This commit is contained in:
41
backend/scripts/calcScripts.ts
Normal file
41
backend/scripts/calcScripts.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { Rating } from "../models/acts/rating.model";
|
||||
|
||||
/**
|
||||
* Calculate the average of an Array of ratings
|
||||
*
|
||||
* @param ratings Array of ratings
|
||||
*
|
||||
* @returns Average rating as number
|
||||
*/
|
||||
export function calcOverallRating(ratings: Array<Rating>): number {
|
||||
let sum = 0
|
||||
|
||||
for (let rating of ratings) {
|
||||
sum += rating.dataValues.rating
|
||||
}
|
||||
|
||||
return sum / ratings.length
|
||||
}
|
||||
|
||||
/**
|
||||
* Classifies a bunch of ratings to groups from 1 to 5 stars
|
||||
*
|
||||
* @param ratings Array of RatingModels
|
||||
*
|
||||
* @returns Array of Objects: { value: number[1-5], count: number }
|
||||
*/
|
||||
export function calcRatingValues(ratings: Array<Rating>) {
|
||||
let ratingValues = [
|
||||
{ value: 1, count: 0 },
|
||||
{ value: 2, count: 0 },
|
||||
{ value: 3, count: 0 },
|
||||
{ value: 4, count: 0 },
|
||||
{ value: 5, count: 0 }
|
||||
]
|
||||
|
||||
for (let rating of ratings) {
|
||||
ratingValues[rating.dataValues.rating - 1].count += 1
|
||||
}
|
||||
|
||||
return ratingValues
|
||||
}
|
||||
397
backend/scripts/databaseHelper.ts
Normal file
397
backend/scripts/databaseHelper.ts
Normal file
@@ -0,0 +1,397 @@
|
||||
import { Order } from '../models/ordering/order.model'
|
||||
import { Ticket } from '../models/ordering/ticket.model'
|
||||
import { Account } from '../models/user/account.model'
|
||||
import { Address } from '../models/user/address.model'
|
||||
import { Payment } from '../models/user/payment.model'
|
||||
import { AccountRole } from '../models/user/accountRole.model'
|
||||
import { Rating } from '../models/acts/rating.model'
|
||||
import { Member } from '../models/acts/member.model'
|
||||
import { Genre } from '../models/acts/genre.model'
|
||||
import { Band } from '../models/acts/band.model'
|
||||
import { Location } from '../models/locations/location.model'
|
||||
import { Concert } from '../models/acts/concert.model'
|
||||
import { City } from '../models/locations/city.model'
|
||||
import { BandGenre } from '../models/acts/bandGenre.model'
|
||||
import { SeatGroup } from '../models/locations/seatGroup.model'
|
||||
import { Seat } from '../models/locations/seat.model'
|
||||
import { SeatRow } from '../models/locations/seatRow.model'
|
||||
import { Exercise } from '../models/exercises/exercise.model'
|
||||
import { ExerciseGroup } from '../models/exercises/exerciseGroup.model'
|
||||
|
||||
import accounts from "../data/accounts.json"
|
||||
import orders from "../data/orders.json"
|
||||
import accountRoles from "../data/accountRoles.json"
|
||||
import citiesLocations from "../data/cities-locations.json"
|
||||
import exercises from "../data/exercises.json"
|
||||
import bandsConcerts from "../data/bands-concerts.json"
|
||||
import { Op } from 'sequelize'
|
||||
import moment from 'moment'
|
||||
|
||||
|
||||
/**
|
||||
* Delete all datasets in every database table
|
||||
*/
|
||||
export function deleteAllTables() {
|
||||
Ticket.destroy({truncate: true })
|
||||
Order.destroy({ truncate: true })
|
||||
|
||||
Rating.destroy({ truncate: true })
|
||||
Member.destroy({ truncate: true })
|
||||
Genre.destroy({ truncate: true })
|
||||
Band.destroy({ truncate: true })
|
||||
|
||||
City.destroy({ truncate: true })
|
||||
Location.destroy({ truncate: true })
|
||||
Concert.destroy({ truncate: true })
|
||||
SeatGroup.destroy({ truncate: true })
|
||||
SeatRow.destroy({ truncate: true })
|
||||
Seat.destroy({ truncate: true })
|
||||
|
||||
Address.destroy({ truncate: true })
|
||||
Payment.destroy({ truncate: true })
|
||||
Account.destroy({ truncate: true })
|
||||
AccountRole.destroy({ truncate: true})
|
||||
}
|
||||
|
||||
export function deleteExerciseProgressTables() {
|
||||
Exercise.destroy({truncate: true})
|
||||
ExerciseGroup.destroy({truncate: true})
|
||||
}
|
||||
|
||||
export async function prepopulateExerciseDatabase() {
|
||||
for (let exerciseGroup of exercises.groups) {
|
||||
ExerciseGroup.create(exerciseGroup)
|
||||
.then(async dataset => {
|
||||
for (let exercise of exerciseGroup.exercises) {
|
||||
exercise["exerciseGroupId"] = dataset.id
|
||||
exercise["solved"] = false
|
||||
|
||||
await Exercise.create(exercise)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert default datasets in the database tables
|
||||
*/
|
||||
export async function prepopulateDatabase() {
|
||||
deleteAllTables()
|
||||
|
||||
let start = moment()
|
||||
|
||||
|
||||
|
||||
////////// Locations and Seat Tables //////////
|
||||
|
||||
// Buffer seats, write them in one bulk action to the DB
|
||||
let seats = []
|
||||
|
||||
for (let city of citiesLocations.cities)
|
||||
{
|
||||
await City.create(city)
|
||||
.then(async cityDataset => {
|
||||
for (let { ...location } of city.locations)
|
||||
{
|
||||
location["cityId"] = cityDataset.id
|
||||
location["urlName"] = location.name.replaceAll(" ", "-").toLowerCase()
|
||||
location.imageIndoor = "http://localhost:3000/static/" + location["imageIndoor"]
|
||||
location.imageOutdoor = "http://localhost:3000/static/" + location["imageOutdoor"]
|
||||
|
||||
await Location.create(location)
|
||||
.then(async locationDataset => {
|
||||
let capacity = 0
|
||||
let seatGroups = []
|
||||
|
||||
for (let seatGroup of location.seatGroups) {
|
||||
seatGroup["locationId"] = locationDataset.id
|
||||
|
||||
let surcharge = 0
|
||||
|
||||
switch (seatGroup.name) {
|
||||
case 'A': {
|
||||
if (location.rows != 0) {
|
||||
surcharge = 30
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'B':
|
||||
case 'D':
|
||||
case 'F':
|
||||
case 'H': surcharge = 20; break;
|
||||
|
||||
case 'C':
|
||||
case 'E':
|
||||
case 'G':
|
||||
case 'I': surcharge = 10; break;
|
||||
}
|
||||
|
||||
seatGroup["surcharge"] = surcharge
|
||||
|
||||
seatGroups.push(seatGroup)
|
||||
}
|
||||
|
||||
await SeatGroup.bulkCreate(seatGroups)
|
||||
.then(async seatGroupsRes => {
|
||||
for (let seatGroup of seatGroupsRes) {
|
||||
if (seatGroup.dataValues.standingArea) {
|
||||
// In an area without seats, create one row with all "seats"
|
||||
await SeatRow.create({
|
||||
row: 0,
|
||||
seatGroupId: seatGroup.dataValues.id
|
||||
})
|
||||
.then(async seatRowRes => {
|
||||
for (let i = 0; i < seatGroup.dataValues.capacity; i++) {
|
||||
seats.push({
|
||||
seatNr: i + 1,
|
||||
seatRowId: seatRowRes.id
|
||||
})
|
||||
|
||||
capacity++
|
||||
}
|
||||
})
|
||||
}
|
||||
else
|
||||
{
|
||||
let seatRows = []
|
||||
|
||||
for (let row = 0; row < location.rows; row++) {
|
||||
seatRows.push({
|
||||
row: row + 1,
|
||||
seatGroupId: seatGroup.dataValues.id
|
||||
})
|
||||
}
|
||||
|
||||
await SeatRow.bulkCreate(seatRows)
|
||||
.then(seatRowRes => {
|
||||
for (let seatRow of seatRowRes) {
|
||||
for (let col = 0; col < seatGroup.dataValues.capacity / location.rows; col++) {
|
||||
seats.push({
|
||||
seatNr: col,
|
||||
seatRowId: seatRow.dataValues.id
|
||||
})
|
||||
|
||||
capacity++
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Update capacity of location
|
||||
await Location.update(
|
||||
{ capacity: capacity },
|
||||
{
|
||||
where: {
|
||||
id: locationDataset.dataValues.id
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Create seats to the database as bulk for better performance
|
||||
await Seat.bulkCreate(seats)
|
||||
|
||||
|
||||
////////// Account Tables //////////
|
||||
|
||||
let addresses = []
|
||||
let payments = []
|
||||
|
||||
AccountRole.bulkCreate(accountRoles.data)
|
||||
|
||||
for (let account of accounts.data) {
|
||||
await Account.create(account)
|
||||
.then(async dataset => {
|
||||
for (let address of account.addresses) {
|
||||
addresses.push({
|
||||
accountId: dataset.dataValues.id,
|
||||
street: address.street,
|
||||
houseNumber: address.houseNumber,
|
||||
postalCode: address.postalCode,
|
||||
city: address.city
|
||||
})
|
||||
}
|
||||
|
||||
for (let payment of account.payments) {
|
||||
payments.push({
|
||||
accountId: dataset.dataValues.id,
|
||||
bankName: payment.bankName,
|
||||
iban: payment.iban
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Address.bulkCreate(addresses)
|
||||
Payment.bulkCreate(payments)
|
||||
|
||||
|
||||
|
||||
////////// Band and Concert Tables //////////
|
||||
|
||||
let bandGenres = []
|
||||
let bandMembers = []
|
||||
let concerts = []
|
||||
let ratings = []
|
||||
|
||||
for(let { ...band } of bandsConcerts.bands) {
|
||||
band.imageMembers = "http://localhost:3000/static/" + band.imageMembers
|
||||
band.images = band.images.map(image => "http://localhost:3000/static/" + image)
|
||||
band.logo = "http://localhost:3000/static/" + band.logo
|
||||
|
||||
// Create a band dataset
|
||||
await Band.create(band)
|
||||
.then(async dataset => {
|
||||
// Create the m:n associations for the genres
|
||||
for (let genre of band.genres) {
|
||||
await Genre.findOrCreate({
|
||||
where: {
|
||||
name: genre
|
||||
},
|
||||
defaults: {
|
||||
name: genre
|
||||
}
|
||||
})
|
||||
.then(async genreDataset => {
|
||||
bandGenres.push({
|
||||
genreId: genreDataset[0].dataValues.id,
|
||||
bandId: dataset.dataValues.id
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
for (let rating of band.ratings) {
|
||||
await Account.findOne({
|
||||
where: {
|
||||
username: rating.username
|
||||
}
|
||||
})
|
||||
.then(async account => {
|
||||
ratings.push({
|
||||
accountId: account.dataValues.id,
|
||||
rating: rating.rating,
|
||||
bandId: dataset.dataValues.id
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
for (let member of band.members) {
|
||||
bandMembers.push({
|
||||
name: member.name,
|
||||
image: "http://localhost:3000/static/" + member.image,
|
||||
bandId: dataset.dataValues.id
|
||||
})
|
||||
}
|
||||
|
||||
for (let concertGroup of band.concertGroups) {
|
||||
for (let concert of concertGroup.concerts) {
|
||||
await Location.findOne({
|
||||
where: {
|
||||
name: concert.location
|
||||
}
|
||||
})
|
||||
.then(async location => {
|
||||
concerts.push({
|
||||
date: moment().add(concert.date, "days").format("YYYY-MM-DD"),
|
||||
name: concertGroup.name,
|
||||
price: concert.price,
|
||||
image: "http://localhost:3000/static/" + concertGroup.image,
|
||||
inStock: concert.inStock,
|
||||
offered: concert.offered != undefined ? concert.offered : true,
|
||||
bandId: dataset.dataValues.id,
|
||||
locationId: location.dataValues.id
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
BandGenre.bulkCreate(bandGenres)
|
||||
Member.bulkCreate(bandMembers)
|
||||
Concert.bulkCreate(concerts)
|
||||
Rating.bulkCreate(ratings)
|
||||
|
||||
|
||||
|
||||
////////// Order and Ticket Tables //////////
|
||||
|
||||
let tickets = []
|
||||
|
||||
for (let order of orders.orders) {
|
||||
let account = await Account.findOne({
|
||||
where: {
|
||||
username: order.username
|
||||
}
|
||||
})
|
||||
|
||||
let payment = await Payment.findOne({
|
||||
where: {
|
||||
accountId: account.dataValues.id
|
||||
}
|
||||
})
|
||||
|
||||
let address = await Address.findOne({
|
||||
where: {
|
||||
accountId: account.dataValues.id
|
||||
}
|
||||
})
|
||||
|
||||
await Order.create({
|
||||
accountId: account.dataValues.id,
|
||||
paymentId: payment.dataValues.id,
|
||||
addressId: address.dataValues.id
|
||||
})
|
||||
.then(async dataset => {
|
||||
for (let ticket of order.tickets) {
|
||||
let concert = await Concert.findOne({
|
||||
where: {
|
||||
[Op.and] : [
|
||||
{ name: ticket.concertGroupName },
|
||||
{ date: moment().add(ticket.date, "days").format("YYYY-MM-DD") }
|
||||
]
|
||||
}
|
||||
})
|
||||
|
||||
SeatGroup.findOne({
|
||||
where: {
|
||||
name: ticket.seatGroup
|
||||
}
|
||||
})
|
||||
.then(seatGroup => {
|
||||
SeatRow.findOne({
|
||||
where: {
|
||||
seatGroupId: seatGroup.id,
|
||||
row: ticket.seatRow
|
||||
}
|
||||
})
|
||||
.then(seatRow => {
|
||||
Seat.findOne({
|
||||
where: {
|
||||
seatRowId: seatRow.id,
|
||||
seatNr: ticket.seat
|
||||
}
|
||||
})
|
||||
.then(async seat => {
|
||||
tickets.push({
|
||||
orderId: dataset.dataValues.id,
|
||||
concertId: concert.dataValues.id,
|
||||
orderPrice: ticket.orderPrice,
|
||||
seatId: seat.dataValues.id
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
Ticket.bulkCreate(tickets)
|
||||
}
|
||||
|
||||
console.log(moment().diff(start))
|
||||
}
|
||||
16
backend/scripts/validateHelper.ts
Normal file
16
backend/scripts/validateHelper.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Validates a string for undefined and length
|
||||
*
|
||||
* @param string String to prove
|
||||
* @param length Minimal length of string
|
||||
*
|
||||
* @returns True if valid
|
||||
*/
|
||||
export function validateString(string: string, length: number = 0) : boolean {
|
||||
if (string != undefined) {
|
||||
if (string.length >= length)
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user