Vorbereitung Release 0.2.0 #83

Merged
tpeetz merged 178 commits from develop/0.2.0 into main 2026-01-29 22:50:42 +00:00
15 changed files with 725 additions and 4 deletions
Showing only changes of commit d4dbfa58e9 - Show all commits
+10
View File
@@ -10,6 +10,16 @@ dependencies {
implementation libs.javalin // Pulling in Javalin
implementation libs.jackson // For JSON serialization of persons
implementation libs.slf4j // To see some Javalin logging
compileOnly libs.lombok
annotationProcessor libs.lombok
implementation libs.postgresql
implementation libs.hibernate
implementation libs.hibernate.validator
implementation libs.validation.api
annotationProcessor libs.hibernate.jpamodelgen
testImplementation(platform(libs.junit.bom))
testImplementation "org.junit.jupiter:junit-jupiter"
}
task fatJar(type: Jar) {
+14 -1
View File
@@ -1,6 +1,7 @@
[versions]
gradle = "8.6"
junit = "5.8.2"
#junit = "5.8.2"
junit = "5.10.3"
#slf4j = "1.7.36"
slf4j = "2.0.16"
hsqldb = "2.7.1"
@@ -8,11 +9,23 @@ sqlite = "3.25.2"
jackson = "2.16.1"
#javalin = "4.6.4"
javalin = "6.7.0"
lombok = "1.18.34"
postgresql = "42.7.3"
hibernate = "7.0.5.Final"
validation = "2.0.1.Final"
[libraries]
junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }
junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" }
slf4j = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }
hsqldb = { module = "org.hsqldb:hsqldb", version.ref = "hsqldb" }
jackson = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" }
sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" }
javalin = { module = "io.javalin:javalin", version.ref = "javalin" }
javalin-bundle = { module = "io.javalin:javalin-bundle", version.ref = "javalin" }
lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }
postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" }
hibernate = { module = "org.hibernate.orm:hibernate-core", version.ref = "hibernate" }
hibernate-jpamodelgen = { module = "org.hibernate.orm:hibernate-jpamodelgen", version.ref = "hibernate" }
hibernate-validator = { module = "org.hibernate:hibernate-validator", version.ref = "hibernate" }
validation-api = { module = "javax.validation:validation-api", version.ref = "validation" }
@@ -0,0 +1,52 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class Artist {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(unique = true, nullable = false)
private String name;
@Column(nullable = true)
private String weblink;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "artist", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<ComicWork> comicWorks = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "artist", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<IssueWork> issueWorks = new LinkedList<>();
}
@@ -0,0 +1,95 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.checkerframework.checker.units.qual.Volume;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class Comic {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(unique = true, nullable = false)
private String title;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "publisher_id")
@JsonIgnoreProperties({ "comics" })
private Publisher publisher;
private Boolean currentOrder = false;
private Boolean completed = false;
@Column(nullable = true)
private String weblink;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "comic", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<ComicWork> comicWorks;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "comic", cascade = CascadeType.REFRESH, orphanRemoval = true)
private List<Issue> issues = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "comic", cascade = CascadeType.REFRESH, orphanRemoval = true)
private List<StoryArc> storyArcs = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "comic", cascade = CascadeType.REFRESH, orphanRemoval = true)
private List<TradePaperback> tradePaperbacks = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "comic", cascade = CascadeType.REFRESH, orphanRemoval = true)
private List<Volume> volumes = new LinkedList<>();
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Comic{");
sb.append("title='").append(title).append('\'');
sb.append(", publisher=").append(publisher);
sb.append(", currentOrder=").append(currentOrder);
sb.append(", completed=").append(completed);
sb.append('}');
return sb.toString();
}
public String getPublisherName() {
return this.publisher.getName();
}
}
@@ -0,0 +1,56 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
@Entity
@Table
public class ComicWork {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "comic_id")
private Comic comic;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "artist_id")
private Artist artist;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "workType_id")
private Worktype workType;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("ComicWork{");
sb.append("comic=").append(comic);
sb.append(", artist=").append(artist);
sb.append(", workType=").append(workType);
sb.append('}');
return sb.toString();
}
}
@@ -0,0 +1,131 @@
package de.thpeetz.kontor.models.comics;
import java.time.YearMonth;
import java.util.Date;
import java.util.List;
import org.checkerframework.checker.units.qual.Volume;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.Type;
@Entity
@Table
@Getter
@Setter
public class Issue {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "comic_id")
@JsonIgnoreProperties({ "issues" })
private Comic comic;
@Column(nullable = true)
@ManyToOne
@JoinColumn(name = "volume_id")
@JsonIgnoreProperties({ "issues" })
private Volume volume;
@Column(nullable = true)
@ManyToOne
@JoinColumn(name = "storyArc_id")
@JsonIgnoreProperties({ "issues" })
private StoryArc storyArc;
@Column(nullable = false)
private String issueNumber;
@Column(nullable = true)
private String title;
@Type(YearMonthDateType.class)
@Column(name = "published_on", columnDefinition = "date", nullable = true)
private YearMonth publishedOn;
@Column
private Boolean isRead;
@Column
private Boolean inStock;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "issue", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<IssueWork> issueWorks;
public String getComicTitle() {
return comic.getTitle();
}
public String getVolumeName() {
if (volume != null) {
return volume.getName();
}
return null;
}
public String getFullTitle() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(this.getComic().getTitle());
stringBuilder.append(" #");
stringBuilder.append(this.getIssueNumber());
if (this.title !=null && !this.title.isEmpty()) {
stringBuilder.append(": ");
stringBuilder.append(this.title);
}
return stringBuilder.toString();
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("Issue{");
result.append("comic=");
result.append(comic);
result.append(", volume=");
result.append(volume);
result.append(", storyArc=");
result.append(storyArc);
result.append(", issueNumber='");
result.append(issueNumber);
result.append(", title='");
result.append(title);
result.append(", publishedOn=");
result.append(publishedOn);
result.append(", isRead=");
result.append(isRead);
result.append(", inStock=");
result.append(inStock);
result.append("}");
return result.toString();
}
}
@@ -0,0 +1,56 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
@Entity
@Table
public class IssueWork {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "issue_id")
private Issue issue;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "artist_id")
private Artist artist;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "workType_id")
private Worktype workType;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("IssueWork{");
sb.append("issue=").append(issue);
sb.append(", artist=").append(artist);
sb.append(", workType=").append(workType);
sb.append('}');
return sb.toString();
}
}
@@ -0,0 +1,79 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class Publisher {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(unique = true, nullable = false)
private String name;
@Column
private String weblink;
@Column(nullable = true)
@JsonBackReference
@ManyToOne
@JoinColumn(name = "parent_publisher_id")
@JsonIgnoreProperties({ "comics" })
private Publisher parentCompany;
@Column(nullable = true)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parentCompany", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Publisher> imprints = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "publisher", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comic> comics = new LinkedList<>();
public String getParentCompanyName() {
if (parentCompany != null) {
return parentCompany.name;
}
return null;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Publisher{");
sb.append("name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
@@ -0,0 +1,61 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class StoryArc {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
private String name;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "comic_id")
@JsonIgnoreProperties({ "storyArcs" })
private Comic comic;
@Column(nullable = true)
@ManyToOne
@JoinColumn(name = "volume_id")
@JsonIgnoreProperties({ "storyArcs" })
private Volume volume;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "storyArc", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Issue> issues = new LinkedList<>();
}
@@ -0,0 +1,48 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class TradePaperback {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
private String name;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "comic_id")
private Comic comic;
@Column
private Integer issueStart;
@Column
private Integer issueEnd;}
@@ -0,0 +1,70 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table
@Getter
@Setter
public class Volume {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(nullable = false)
private String name;
@Column(nullable = false)
@ManyToOne
@JoinColumn(name = "comic_id")
@JsonIgnoreProperties({ "volumes" })
private Comic comic;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "volume", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<StoryArc> storyArcs = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "volume", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Issue> issues = new LinkedList<>();
@Override
public String toString() {
StringBuilder result = new StringBuilder("Volume{");
result.append("name=");
result.append(name);
result.append("comic=Comic{title=");
result.append(comic.getTitle());
result.append("}}");
return result.toString();
}
}
@@ -0,0 +1,53 @@
package de.thpeetz.kontor.models.comics;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
@Entity
@Table
public class Worktype {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Version
private int version;
@Column(name = "created_date")
private Date createdDate;
@Column(name = "last_modified_date")
private Date lastModifiedDate;
@Column(unique = true, nullable = false)
private String name;
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "workType", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<ComicWork> comicWorks = new LinkedList<>();
@Column(nullable = true)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "workType", cascade = CascadeType.REFRESH, orphanRemoval = true)
List<IssueWork> issueWorks = new LinkedList<>();
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Worktype{");
sb.append("name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
@@ -14,7 +14,6 @@ import jakarta.validation.constraints.NotEmpty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
/**
@@ -18,7 +18,6 @@ import jakarta.validation.constraints.NotNull;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@@ -14,7 +14,6 @@ import jakarta.validation.constraints.NotEmpty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Represents a work type in the application.