From dab6f76d2b222ada3b345ef934824459e99ff2f8 Mon Sep 17 00:00:00 2001 From: Michele Catalano Date: Mon, 17 Apr 2023 10:26:04 +0200 Subject: [PATCH 1/5] add database diagram and entity for event and style --- docs/diagrams/DatabaseModels.png | Bin 0 -> 79031 bytes docs/diagrams/database_models.puml | 136 ++++++++++++++++++ packages/backend/pom.xml | 10 ++ .../mayflower/backend/entity/EventEntity.kt | 34 +++++ .../de/mayflower/backend/entity/Style.kt | 33 +++++ .../src/test/resources/application.yml | 31 ++++ 6 files changed, 244 insertions(+) create mode 100644 docs/diagrams/DatabaseModels.png create mode 100644 docs/diagrams/database_models.puml create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt create mode 100644 packages/backend/src/test/resources/application.yml diff --git a/docs/diagrams/DatabaseModels.png b/docs/diagrams/DatabaseModels.png new file mode 100644 index 0000000000000000000000000000000000000000..c4173b4ca2168f3a459633a01810af87cc6843ef GIT binary patch literal 79031 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/database_models.puml b/docs/diagrams/database_models.puml new file mode 100644 index 0000000..adeef0e --- /dev/null +++ b/docs/diagrams/database_models.puml @@ -0,0 +1,136 @@ +@startuml DatabaseModels + +hide circle + +skinparam linetype ortho + +entity "Event" as e { + + id: ulid + + name: string + + description: string + + location: string + + startDate: date + + endDate: date + + style_id: ulid + + day_ids: ulid[] + + sponsor_ids: ulid[] + + session_ids: ulid[] + + timeslotSize_ids: ulid[] + -- + url: string + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "style" as s { + + id: ulid + + name: string + + description: string + + color: string + + textColor: string + + image: string + + event_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "day" as d { + + id: ulid + + date: date + + note: string + + event_id: ulid + + room_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "room" as r { + + id: ulid + + name: string + + description: string + + day_ids: ulid[] + + timeslot_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "timeslot" as t { + + id: ulid + + start: time + + end: time + + room_id: ulid + + session_ids: ulid[] + + isBreak: boolean + + isBlocking: boolean + + isNoBlockingBreak: boolean + + timeslotSize_id: ulid + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "timeslotSize" as ts { + + id: ulid + + name: string + + minutes: number + + timeslot_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "sponsor" as sp { + + id: ulid + + title: string + + description: string + + speaker_ids: ulid[] + + event_id: ulid + timeslot: ulid + + url: string + + image: string + + event_id: ulid + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "session" as se { + + id: ulid + + name: string + + description: string + + timeslot_ids: ulid[] + + event_id: ulid + + speaker_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +entity "speaker" as spk { + + id: ulid + + name: string + + description: string + + url: string + + image: string + + session_ids: ulid[] + -- + + created_at: timestamp + + updated_at: timestamp +} + +e }o--|| s +e ||--|{ d +r }|--|{ d +r ||--|{ t +t }o--|| ts +e ||--|{ sp +e }|--|{ ts +e ||--|{ se +se ||--|{ spk +se |o--|| t + +@enduml \ No newline at end of file diff --git a/packages/backend/pom.xml b/packages/backend/pom.xml index 450be94..d313a18 100644 --- a/packages/backend/pom.xml +++ b/packages/backend/pom.xml @@ -26,6 +26,7 @@ 0.2.6 4.20.0 1.0.0 + 2.1.214 6.4.0 @@ -73,6 +74,11 @@ jackson-databind-nullable ${jackson-databind-nullable.version} + + com.h2database + h2 + ${h2.version} + @@ -116,6 +122,10 @@ org.springframework.boot spring-boot-starter-data-jpa + + com.h2database + h2 + diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt new file mode 100644 index 0000000..950b7a4 --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt @@ -0,0 +1,34 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator +import java.util.Date + +@Entity +@Table(name = "event") +class EventEntity( + @NotNull + @NotBlank + val name: String, + + @NotNull + val description: String, + + @NotNull + val location: String, + + @NotNull + val startDate: Date, + + @NotNull + val endDate: Date + +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(String(), String(), String(), Date(), Date()) +} \ No newline at end of file diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt new file mode 100644 index 0000000..1eb05dd --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt @@ -0,0 +1,33 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator + +@Entity +@Table(name = "style") +class Style( + @NotNull + @NotBlank + val name: String, + + @NotNull + val description: String, + + @NotNull + @NotBlank + val color: String, + + @NotNull + @NotBlank + val textColor: String, + + val image: String, +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(String(), String(), String(), String(), String()) +} \ No newline at end of file diff --git a/packages/backend/src/test/resources/application.yml b/packages/backend/src/test/resources/application.yml new file mode 100644 index 0000000..fd0d5e4 --- /dev/null +++ b/packages/backend/src/test/resources/application.yml @@ -0,0 +1,31 @@ +--- +# default profile +spring: + profiles: + default: local + # database-connection + datasource: + driver-class-name: org.h2.Driver + # jpa + jpa: + hibernate: + ddl-auto: none + properties: + hibernate.format_sql: true + # liquibase + liquibase: + enabled: true + change-log: 'classpath:db-changelog.yml' + drop-first: false +--- +spring.config.activate.on-profile: local + +spring: + # database-connection + datasource: + url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 + username: backend + password: backend + liquibase.contexts: fixtures +--- +spring.config.activate.on-profile: docker From a098517ee234306cf0a940240c9e70cb66b0ae2e Mon Sep 17 00:00:00 2001 From: Laura Schlemmer Date: Mon, 17 Apr 2023 14:12:29 +0200 Subject: [PATCH 2/5] Event, Room, Style, Sponsor & Session Entities added or updated --- docs/diagrams/database_models.puml | 3 -- .../mayflower/backend/entity/EventEntity.kt | 38 ++++++++++++++++--- .../de/mayflower/backend/entity/RoomEntity.kt | 17 +++++++-- .../mayflower/backend/entity/SessionEntity.kt | 21 +++++----- .../mayflower/backend/entity/SponsorEntity.kt | 29 ++++++++++++++ .../de/mayflower/backend/entity/Style.kt | 15 +++++--- 6 files changed, 95 insertions(+), 28 deletions(-) create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/SponsorEntity.kt diff --git a/docs/diagrams/database_models.puml b/docs/diagrams/database_models.puml index adeef0e..efcf8f9 100644 --- a/docs/diagrams/database_models.puml +++ b/docs/diagrams/database_models.puml @@ -87,9 +87,6 @@ entity "sponsor" as sp { + id: ulid + title: string + description: string - + speaker_ids: ulid[] - + event_id: ulid - timeslot: ulid + url: string + image: string + event_id: ulid diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt index 950b7a4..9a57167 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt @@ -10,19 +10,44 @@ import java.util.Date class EventEntity( @NotNull @NotBlank - val name: String, + var name: String, @NotNull - val description: String, + var description: String, @NotNull - val location: String, + var location: String, @NotNull - val startDate: Date, + var startDate: Date, @NotNull - val endDate: Date + var endDate: Date, + + var url: String, + + @ManyToOne(cascade = [CascadeType.ALL]) + var style: Style = Style(), + + /*@OneToMany( + mappedBy = "event", + cascade = [CascadeType.ALL]) + var days: MutableSet = mutableSetOf(),*//* + + */@OneToMany( + mappedBy = "event", + cascade = [CascadeType.ALL]) + var sponsors: MutableSet = mutableSetOf(), + + @OneToMany( + mappedBy = "event", + cascade = [CascadeType.ALL]) + var sessions: MutableSet = mutableSetOf(), + + /*@OneToMany( + mappedBy = "event", + cascade = [CascadeType.ALL]) + var timeSlotSizes: MutableSet = mutableSetOf(),*/ ) { @Id @@ -30,5 +55,6 @@ class EventEntity( @GeneratedValue(generator = "ulid_generator") val id: String = String() - constructor() : this(String(), String(), String(), Date(), Date()) + constructor() : this(String(), String(), String(), Date(), Date(), String()) + } \ No newline at end of file diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt index 1dc60d2..932f304 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt @@ -1,22 +1,31 @@ package de.mayflower.backend.entity import jakarta.persistence.* +import jakarta.validation.constraints.NotNull import org.hibernate.annotations.GenericGenerator @Entity @Table(name = "room") class RoomEntity( - val name: String, + @NotNull + var name: String, - @OneToMany( + var description: String, + + /*@OneToMany( + mappedBy = "room", + cascade = [CascadeType.ALL]) + val days: MutableSet = mutableSetOf()*/ + + /*@OneToMany( mappedBy = "room", cascade = [CascadeType.ALL]) - val sessions: MutableSet = mutableSetOf() + val timeslots: MutableSet = mutableSetOf()*/ ) { @Id @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") @GeneratedValue(generator = "ulid_generator") val id: String = String() - constructor() : this(String()) + constructor() : this(String(), String()) } \ No newline at end of file diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt index 7cc5b4e..3eaf49b 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt @@ -13,24 +13,25 @@ class SessionEntity( var name: String, @NotNull - @NotBlank - var abstract: String, - - @NotNull - var start_timestamp: Long, + var description: String, - @NotNull - var end_timestamp: Long, + /*@OneToMany( + mappedBy = "session", + cascade = [CascadeType.ALL]) + var timeslots: MutableSet = mutableSetOf(),*/ @ManyToOne(cascade = [CascadeType.ALL]) - var room: RoomEntity = RoomEntity(), + var event: EventEntity = EventEntity(), - var description: String = String() + /*@OneToMany( + mappedBy = "session", + cascade = [CascadeType.ALL]) + var speakers: MutableSet = mutableSetOf(),*/ ) { @Id @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") @GeneratedValue(generator = "ulid_generator") val id: String = String() - constructor() : this(String(), String(), -1, -1) + constructor() : this(String(), String()) } \ No newline at end of file diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SponsorEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SponsorEntity.kt new file mode 100644 index 0000000..1dc5e6b --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SponsorEntity.kt @@ -0,0 +1,29 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import org.hibernate.annotations.GenericGenerator + +@Entity +@Table(name = "sponsor") +class SponsorEntity( + @NotNull + var title: String, + + var description: String, + + var url: String, + + var image: String, + + @ManyToOne(cascade = [CascadeType.ALL]) + var event: EventEntity = EventEntity(), + +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(String(), String(), String(), String()) +} diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt index 1eb05dd..906f1a8 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt @@ -9,20 +9,25 @@ import org.hibernate.annotations.GenericGenerator class Style( @NotNull @NotBlank - val name: String, + var name: String, @NotNull - val description: String, + var description: String, @NotNull @NotBlank - val color: String, + var color: String, @NotNull @NotBlank - val textColor: String, + var textColor: String, - val image: String, + var image: String, + + @OneToMany( + mappedBy = "event", + cascade = [CascadeType.ALL]) + var events: MutableSet = mutableSetOf(), ) { @Id @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") From 18c49d72f7cccceaf478b4d34f2f961d0f92a618 Mon Sep 17 00:00:00 2001 From: Lorenz Herbst Date: Tue, 18 Apr 2023 08:40:33 +0200 Subject: [PATCH 3/5] add Entities for day, speaker, timeslot, timeslotSize --- .../de/mayflower/backend/entity/DayEntity.kt | 33 +++++++++++ .../mayflower/backend/entity/SpeakerEntity.kt | 31 ++++++++++ .../backend/entity/TimeslotEntity.kt | 59 +++++++++++++++++++ .../backend/entity/TimeslotSizeEntity.kt | 31 ++++++++++ 4 files changed, 154 insertions(+) create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/SpeakerEntity.kt create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt new file mode 100644 index 0000000..1755daf --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt @@ -0,0 +1,33 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator +import java.util.Date + +@Entity +@Table(name = "day") +class DayEntity( + @NotNull + val date: Date, + + @NotNull + val note: String, + + @ManyToOne(cascade = [CascadeType.ALL]) + val event: EventEntity = EventEntity(), + + @OneToMany( + mappedBy = "day", + cascade = [CascadeType.ALL] + ) + @JoinColumn(name = "id", nullable = false) + val rooms: MutableSet = mutableSetOf() +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(Date(), String(), EventEntity(), mutableSetOf()) +} diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SpeakerEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SpeakerEntity.kt new file mode 100644 index 0000000..775932c --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SpeakerEntity.kt @@ -0,0 +1,31 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator + +@Entity +@Table(name = "speaker") +class SpeakerEntity( + @NotNull + val name: String, + + @NotNull + val description: String, + + @NotNull + val url: String, + + @NotNull + val image: String, + + @ManyToMany(cascade = [CascadeType.ALL]) + val sessions: MutableSet = mutableSetOf() +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(String(), String(), String(), String(), mutableSetOf()) +} diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt new file mode 100644 index 0000000..d4f9386 --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt @@ -0,0 +1,59 @@ +package de.mayflower.backend.entity + +import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.Boolean +import io.azam.ulidj.ULID +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator +import org.hibernate.validator.constraints.UUID +import java.sql.Time +import java.time.LocalTime +import java.util.Date + +@Entity +@Table(name = "timeslot") +class TimeslotEntity( + @NotNull + val start: Time, + + @NotNull + val end: Time, + + @ManyToOne(cascade = [CascadeType.ALL]) + val room: RoomEntity = RoomEntity(), + + @OneToMany( + mappedBy = "timeslot", + cascade = [CascadeType.ALL] + ) + @JoinColumn(name = "id", nullable = false) + val sessions: MutableSet = mutableSetOf(), + + @NotNull + val isBreak: Boolean, + + @NotNull + val isBlocking: Boolean, + + @NotNull + val isNoBlockingBreak: Boolean, + + @ManyToOne(cascade = [CascadeType.ALL]) + val timeslotSize: TimeslotSizeEntity = TimeslotSizeEntity() +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this( + Time.valueOf(LocalTime.now()), + Time.valueOf(LocalTime.now()), + RoomEntity(), + mutableSetOf(), + false, + false, + false, + TimeslotSizeEntity() + ) +} diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt new file mode 100644 index 0000000..971bdd5 --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt @@ -0,0 +1,31 @@ +package de.mayflower.backend.entity + +import jakarta.persistence.* +import jakarta.validation.constraints.* +import org.hibernate.annotations.GenericGenerator +import org.hibernate.validator.constraints.UUID +import java.util.Date + +@Entity +@Table(name = "timeslotSize") +class TimeslotSizeEntity( + @NotNull + val name: String, + + @NotNull + val minutes: Number, + + @OneToMany( + mappedBy = "timeslotSize", + cascade = [CascadeType.ALL] + ) + @JoinColumn(name = "id", nullable = false) + val timeslots: MutableSet = mutableSetOf() +) { + @Id + @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") + @GeneratedValue(generator = "ulid_generator") + val id: String = String() + + constructor() : this(String(), 0, mutableSetOf()) +} From 3d1bd32bf7924da99d54307e86dc7319523502a3 Mon Sep 17 00:00:00 2001 From: Lorenz Herbst Date: Tue, 18 Apr 2023 11:08:12 +0200 Subject: [PATCH 4/5] fix entity mapping --- .../de/mayflower/backend/entity/DayEntity.kt | 8 ++--- .../mayflower/backend/entity/EventEntity.kt | 16 +++++----- .../de/mayflower/backend/entity/RoomEntity.kt | 10 +++--- .../mayflower/backend/entity/SessionEntity.kt | 9 +++--- .../de/mayflower/backend/entity/Style.kt | 2 +- .../backend/entity/TimeslotEntity.kt | 15 +++------ .../backend/entity/TimeslotSizeEntity.kt | 1 - .../src/main/resources/application.yml | 9 +++--- .../src/main/resources/application1.yml | 32 +++++++++++++++++++ 9 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 packages/backend/src/main/resources/application1.yml diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt index 1755daf..c42c1aa 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/DayEntity.kt @@ -17,11 +17,7 @@ class DayEntity( @ManyToOne(cascade = [CascadeType.ALL]) val event: EventEntity = EventEntity(), - @OneToMany( - mappedBy = "day", - cascade = [CascadeType.ALL] - ) - @JoinColumn(name = "id", nullable = false) + @ManyToMany(cascade = [CascadeType.ALL]) val rooms: MutableSet = mutableSetOf() ) { @Id @@ -29,5 +25,5 @@ class DayEntity( @GeneratedValue(generator = "ulid_generator") val id: String = String() - constructor() : this(Date(), String(), EventEntity(), mutableSetOf()) + constructor() : this(Date(), String()) } diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt index 9a57167..cfac391 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/EventEntity.kt @@ -29,13 +29,13 @@ class EventEntity( @ManyToOne(cascade = [CascadeType.ALL]) var style: Style = Style(), - /*@OneToMany( - mappedBy = "event", + @OneToMany( + //mappedBy = "event", cascade = [CascadeType.ALL]) - var days: MutableSet = mutableSetOf(),*//* + var days: MutableSet = mutableSetOf(), - */@OneToMany( - mappedBy = "event", + @OneToMany( + //mappedBy = "event", cascade = [CascadeType.ALL]) var sponsors: MutableSet = mutableSetOf(), @@ -44,10 +44,10 @@ class EventEntity( cascade = [CascadeType.ALL]) var sessions: MutableSet = mutableSetOf(), - /*@OneToMany( - mappedBy = "event", + @OneToMany( + //mappedBy = "event", cascade = [CascadeType.ALL]) - var timeSlotSizes: MutableSet = mutableSetOf(),*/ + var timeSlotSizes: MutableSet = mutableSetOf(), ) { @Id diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt index 932f304..b9b29aa 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/RoomEntity.kt @@ -12,15 +12,15 @@ class RoomEntity( var description: String, - /*@OneToMany( - mappedBy = "room", + @ManyToMany( + //mappedBy = "room", cascade = [CascadeType.ALL]) - val days: MutableSet = mutableSetOf()*/ + val days: MutableSet = mutableSetOf(), - /*@OneToMany( + @OneToMany( mappedBy = "room", cascade = [CascadeType.ALL]) - val timeslots: MutableSet = mutableSetOf()*/ + val timeslots: MutableSet = mutableSetOf() ) { @Id @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt index 3eaf49b..e7c90d5 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/SessionEntity.kt @@ -15,18 +15,17 @@ class SessionEntity( @NotNull var description: String, - /*@OneToMany( + @OneToMany( mappedBy = "session", cascade = [CascadeType.ALL]) - var timeslots: MutableSet = mutableSetOf(),*/ + var timeslots: MutableSet = mutableSetOf(), @ManyToOne(cascade = [CascadeType.ALL]) var event: EventEntity = EventEntity(), - /*@OneToMany( - mappedBy = "session", + @ManyToMany( cascade = [CascadeType.ALL]) - var speakers: MutableSet = mutableSetOf(),*/ + var speakers: MutableSet = mutableSetOf(), ) { @Id @GenericGenerator(name = "ulid_generator", strategy = "de.mayflower.backend.helper.UlidGenerator") diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt index 906f1a8..96802d9 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/Style.kt @@ -25,7 +25,7 @@ class Style( var image: String, @OneToMany( - mappedBy = "event", + //mappedBy = "event", cascade = [CascadeType.ALL]) var events: MutableSet = mutableSetOf(), ) { diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt index d4f9386..d67ed38 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotEntity.kt @@ -1,14 +1,10 @@ package de.mayflower.backend.entity -import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.Boolean -import io.azam.ulidj.ULID import jakarta.persistence.* -import jakarta.validation.constraints.* +import jakarta.validation.constraints.NotNull import org.hibernate.annotations.GenericGenerator -import org.hibernate.validator.constraints.UUID import java.sql.Time import java.time.LocalTime -import java.util.Date @Entity @Table(name = "timeslot") @@ -22,12 +18,11 @@ class TimeslotEntity( @ManyToOne(cascade = [CascadeType.ALL]) val room: RoomEntity = RoomEntity(), - @OneToMany( - mappedBy = "timeslot", + @ManyToOne( + //mappedBy = "timeslot", cascade = [CascadeType.ALL] ) - @JoinColumn(name = "id", nullable = false) - val sessions: MutableSet = mutableSetOf(), + val session: SessionEntity = SessionEntity(), @NotNull val isBreak: Boolean, @@ -50,7 +45,7 @@ class TimeslotEntity( Time.valueOf(LocalTime.now()), Time.valueOf(LocalTime.now()), RoomEntity(), - mutableSetOf(), + SessionEntity(), false, false, false, diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt index 971bdd5..5bfe89b 100644 --- a/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/entity/TimeslotSizeEntity.kt @@ -19,7 +19,6 @@ class TimeslotSizeEntity( mappedBy = "timeslotSize", cascade = [CascadeType.ALL] ) - @JoinColumn(name = "id", nullable = false) val timeslots: MutableSet = mutableSetOf() ) { @Id diff --git a/packages/backend/src/main/resources/application.yml b/packages/backend/src/main/resources/application.yml index 0f26beb..fd0d5e4 100644 --- a/packages/backend/src/main/resources/application.yml +++ b/packages/backend/src/main/resources/application.yml @@ -3,16 +3,14 @@ spring: profiles: default: local - devtools.add-properties: false # database-connection datasource: - driver-class-name: org.postgresql.Driver + driver-class-name: org.h2.Driver # jpa jpa: hibernate: ddl-auto: none properties: - hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect hibernate.format_sql: true # liquibase liquibase: @@ -23,10 +21,11 @@ spring: spring.config.activate.on-profile: local spring: - devtools.add-properties: true # database-connection datasource: - url: jdbc:postgresql://localhost:5432/otto + url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 + username: backend + password: backend liquibase.contexts: fixtures --- spring.config.activate.on-profile: docker diff --git a/packages/backend/src/main/resources/application1.yml b/packages/backend/src/main/resources/application1.yml new file mode 100644 index 0000000..0f26beb --- /dev/null +++ b/packages/backend/src/main/resources/application1.yml @@ -0,0 +1,32 @@ +--- +# default profile +spring: + profiles: + default: local + devtools.add-properties: false + # database-connection + datasource: + driver-class-name: org.postgresql.Driver + # jpa + jpa: + hibernate: + ddl-auto: none + properties: + hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect + hibernate.format_sql: true + # liquibase + liquibase: + enabled: true + change-log: 'classpath:db-changelog.yml' + drop-first: false +--- +spring.config.activate.on-profile: local + +spring: + devtools.add-properties: true + # database-connection + datasource: + url: jdbc:postgresql://localhost:5432/otto + liquibase.contexts: fixtures +--- +spring.config.activate.on-profile: docker From dbd1bbb847e213e21b1546491fdab19c4f6b3eeb Mon Sep 17 00:00:00 2001 From: Lukas Bauer Date: Wed, 19 Apr 2023 13:30:16 +0200 Subject: [PATCH 5/5] Adds RoomController.kt; change hibernate config to update the database --- .../backend/controller/RoomController.kt | 35 +++++++++++++++++++ .../src/main/resources/application.yml | 2 +- .../main/resources/changesets/changeset-1.yml | 14 ++++---- 3 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 packages/backend/src/main/kotlin/de/mayflower/backend/controller/RoomController.kt diff --git a/packages/backend/src/main/kotlin/de/mayflower/backend/controller/RoomController.kt b/packages/backend/src/main/kotlin/de/mayflower/backend/controller/RoomController.kt new file mode 100644 index 0000000..b4c4765 --- /dev/null +++ b/packages/backend/src/main/kotlin/de/mayflower/backend/controller/RoomController.kt @@ -0,0 +1,35 @@ +package de.mayflower.backend.controller + +import de.mayflower.backend.entity.RoomEntity +import de.mayflower.backend.repository.RoomRepository +import de.mayflower.backend.stubs.api.RoomsControllerDelegate +import de.mayflower.backend.stubs.model.Room +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Component + +@Component("roomsControllerDelegate") +class RoomController(private val roomRepository: RoomRepository) : RoomsControllerDelegate { + + override fun getRooms(): ResponseEntity> { + val roomsEntityList = this.roomRepository.findAll() + + val rooms = roomsEntityList.map { Room(it.id, it.name) } + + return ResponseEntity(rooms, HttpStatus.OK) + } + + override fun createRoom(room: Room?): ResponseEntity { + + if(room === null) { + return ResponseEntity(HttpStatus.BAD_REQUEST) + } + + val roomEntity = RoomEntity(room.name, "description") + + this.roomRepository.save(roomEntity) + + return ResponseEntity(room, HttpStatus.CREATED) + } +} \ No newline at end of file diff --git a/packages/backend/src/main/resources/application.yml b/packages/backend/src/main/resources/application.yml index fd0d5e4..40ad067 100644 --- a/packages/backend/src/main/resources/application.yml +++ b/packages/backend/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: # jpa jpa: hibernate: - ddl-auto: none + ddl-auto: update properties: hibernate.format_sql: true # liquibase diff --git a/packages/backend/src/main/resources/changesets/changeset-1.yml b/packages/backend/src/main/resources/changesets/changeset-1.yml index 0be6ac1..ad12121 100644 --- a/packages/backend/src/main/resources/changesets/changeset-1.yml +++ b/packages/backend/src/main/resources/changesets/changeset-1.yml @@ -8,36 +8,36 @@ databaseChangeLog: columns: - column: name: id - type: char(128) + type: varchar(128) constraints: primaryKey: true nullable: false - column: name: name - type: char(128) + type: varchar(128) - createTable: tableName: session columns: - column: name: id - type: char(128) + type: varchar(128) constraints: primaryKey: true nullable: false - column: name: room_id - type: char(128) + type: varchar(128) - column: name: name - type: char(128) + type: varchar(128) constraints: nullable: false - column: name: description - type: char(256) + type: varchar(256) - column: name: abstract - type: char(1024) + type: varchar(1024) constraints: nullable: false - column: