diff --git a/kontor-javalin/build.gradle b/kontor-javalin/build.gradle index 453cdb2..ab20966 100644 --- a/kontor-javalin/build.gradle +++ b/kontor-javalin/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation libs.postgresql implementation libs.hibernate implementation libs.hibernate.validator + implementation libs.hypersistence implementation libs.validation.api annotationProcessor libs.hibernate.jpamodelgen testImplementation(platform(libs.junit.bom)) diff --git a/kontor-javalin/gradle.properties b/kontor-javalin/gradle.properties index ba98070..7ddf5f2 100644 --- a/kontor-javalin/gradle.properties +++ b/kontor-javalin/gradle.properties @@ -1,3 +1,3 @@ -description='Kontor with Spring Boot' +description='Kontor with Javalin' version=0.2.0-SNAPSHOT group=de.thpeetz diff --git a/kontor-javalin/gradle/libs.versions.toml b/kontor-javalin/gradle/libs.versions.toml index 3976e65..d51ec22 100644 --- a/kontor-javalin/gradle/libs.versions.toml +++ b/kontor-javalin/gradle/libs.versions.toml @@ -13,6 +13,7 @@ lombok = "1.18.34" postgresql = "42.7.3" hibernate = "7.0.5.Final" validation = "2.0.1.Final" +hypersistence = "3.14.1" [libraries] junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } @@ -29,3 +30,4 @@ hibernate = { module = "org.hibernate.orm:hibernate-core", version.ref = "hibern 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" } +hypersistence = { module = "io.hypersistence:hypersistence-utils-hibernate-70", version.ref = "hypersistence" } diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java new file mode 100644 index 0000000..abc2c0b --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/JavalinApp.java @@ -0,0 +1,33 @@ +package de.thpeetz.kontor; + +import io.javalin.Javalin; + +import static io.javalin.apibuilder.ApiBuilder.get; +import static io.javalin.apibuilder.ApiBuilder.path; +import static io.javalin.apibuilder.ApiBuilder.post; + +import java.util.HashMap; + +import de.thpeetz.kontor.web.ComicHandler; +import de.thpeetz.kontor.web.MediaFileHandler; + +public class JavalinApp { + + public static Javalin create() { + return Javalin.create((var config) -> config.router.apiBuilder(() -> { + path("/", () -> get(ctx -> ctx.json("Ok"))); + path("health", () -> get(ctx -> { + HashMap status = new HashMap<>(); + status.put("status", "ok"); + ctx.json(status); + })); + path("/api/v1/comics", () -> { + get(ComicHandler.listAll); + }); + path("/api/v1/media/files", () -> { + get(MediaFileHandler.listAll); + post(MediaFileHandler.save); + }); + })); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java new file mode 100644 index 0000000..3914320 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/Main.java @@ -0,0 +1,15 @@ +package de.thpeetz.kontor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Main { + private static Logger logger = LoggerFactory.getLogger(Main.class); + private static short port = 8400; + + public static void main(String[] args) { + JavalinApp.create().start(port); + + logger.info("API's alive for real :-)"); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java deleted file mode 100644 index 41b2baa..0000000 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/api/Main.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.thpeetz.kontor.api; - -import de.thpeetz.kontor.services.inmemory.InMemoryPersonReader; -import io.javalin.Javalin; - -import java.util.HashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class Main { - private static Logger logger = LoggerFactory.getLogger(Main.class); - private static short port = 8400; - - public static void main(String[] args) { - var personReader = new InMemoryPersonReader(); - var objMapper = new ObjectMapper(); - var result = objMapper.valueToTree(personReader.getAll()); - - logger.info("API: found {} people.", personReader.getAll().size()); - - var app = Javalin.create().start(port); - app.get("/ping", ctx -> ctx.result("pong")); - app.get("/health", ctx -> { - HashMap status = new HashMap<>(); - status.put("status", "ok"); - ctx.json(status); - }); - app.get("/persons", ctx -> { - logger.info("persons called"); - ctx.json(result); - }); - - logger.info("API's alive for real :-)))"); - } -} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernate.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernate.java new file mode 100644 index 0000000..c9768d5 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernate.java @@ -0,0 +1,17 @@ +package de.thpeetz.kontor.infrastructure; + +import java.util.function.Consumer; +import java.util.function.Function; + +import org.hibernate.StatelessSession; + +public class AppHibernate { + + public static void inTransaction(Consumer consumer) { + AppHibernateSessionFactory.getSessionFactory().inStatelessTransaction(consumer); + } + + public static R fromTransaction(Function function) { + return AppHibernateSessionFactory.getSessionFactory().fromStatelessTransaction(function); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateConfig.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateConfig.java new file mode 100644 index 0000000..0764187 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateConfig.java @@ -0,0 +1,54 @@ +package de.thpeetz.kontor.infrastructure; + +import java.util.Properties; + +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.cfg.Configuration; +import org.hibernate.tool.schema.Action; + +import de.thpeetz.kontor.models.comics.Artist; +import de.thpeetz.kontor.models.comics.Comic; +import de.thpeetz.kontor.models.comics.ComicWork; +import de.thpeetz.kontor.models.comics.Issue; +import de.thpeetz.kontor.models.comics.IssueWork; +import de.thpeetz.kontor.models.comics.Publisher; +import de.thpeetz.kontor.models.comics.StoryArc; +import de.thpeetz.kontor.models.comics.TradePaperback; +import de.thpeetz.kontor.models.comics.Volume; +import de.thpeetz.kontor.models.comics.Worktype; +import de.thpeetz.kontor.models.media.MediaActor; +import de.thpeetz.kontor.models.media.MediaActorFile; +import de.thpeetz.kontor.models.media.MediaArticle; +import de.thpeetz.kontor.models.media.MediaFile; +import de.thpeetz.kontor.models.media.MediaVideo; + +class AppHibernateConfig { + static Configuration configuration() { + var configuration = new Configuration(); + var settings = new Properties(); + settings.put(AvailableSettings.JAKARTA_JDBC_DRIVER, "org.postgresql.Driver"); + settings.put(AvailableSettings.JAKARTA_JDBC_URL, "jdbc:postgresql://postgres:5432/kontor"); + settings.put(AvailableSettings.JAKARTA_JDBC_USER, "kontor"); + settings.put(AvailableSettings.JAKARTA_JDBC_PASSWORD, "kontor"); + settings.put(AvailableSettings.HIGHLIGHT_SQL, true); + settings.put(AvailableSettings.HBM2DDL_AUTO, Action.ACTION_CREATE); + + configuration.setProperties(settings); + configuration.addAnnotatedClass(MediaFile.class); + configuration.addAnnotatedClass(MediaActorFile.class); + configuration.addAnnotatedClass(MediaActor.class); + configuration.addAnnotatedClass(MediaArticle.class); + configuration.addAnnotatedClass(MediaVideo.class); + configuration.addAnnotatedClass(Comic.class); + configuration.addAnnotatedClass(Publisher.class); + configuration.addAnnotatedClass(Artist.class); + configuration.addAnnotatedClass(ComicWork.class); + configuration.addAnnotatedClass(Issue.class); + configuration.addAnnotatedClass(IssueWork.class); + configuration.addAnnotatedClass(StoryArc.class); + configuration.addAnnotatedClass(TradePaperback.class); + configuration.addAnnotatedClass(Volume.class); + configuration.addAnnotatedClass(Worktype.class); + return configuration; + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateSessionFactory.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateSessionFactory.java new file mode 100644 index 0000000..23ce217 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/infrastructure/AppHibernateSessionFactory.java @@ -0,0 +1,30 @@ +package de.thpeetz.kontor.infrastructure; + +import java.util.Objects; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class AppHibernateSessionFactory { + + private static final Logger logger = LoggerFactory.getLogger(AppHibernateSessionFactory.class); + + private static SessionFactory sessionFactory; + + static SessionFactory getSessionFactory() { + if (Objects.isNull(sessionFactory)) { + try { + var configuration = AppHibernateConfig.configuration(); + var serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } catch (Throwable ex) { + logger.error("Failed to create session factory", ex); + } + } + return sessionFactory; + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/Person.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/Person.java deleted file mode 100644 index af00658..0000000 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/Person.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.thpeetz.kontor.models; - -public class Person { - private String name; - private int age; - - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Comic.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Comic.java index d6348ed..a5e6436 100644 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Comic.java +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Comic.java @@ -4,8 +4,6 @@ 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; @@ -51,8 +49,10 @@ public class Comic { @JsonIgnoreProperties({ "comics" }) private Publisher publisher; + @Column private Boolean currentOrder = false; + @Column private Boolean completed = false; @Column(nullable = true) diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/ComicQueries.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/ComicQueries.java new file mode 100644 index 0000000..1c9c02d --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/ComicQueries.java @@ -0,0 +1,12 @@ +package de.thpeetz.kontor.models.comics; + +import java.util.List; + +import org.hibernate.StatelessSession; +import org.hibernate.annotations.processing.Find; + +public interface ComicQueries { + + @Find + List getAllComics(StatelessSession session); +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Issue.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Issue.java index 7c79cca..63faa78 100644 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Issue.java +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/Issue.java @@ -4,10 +4,8 @@ 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 io.hypersistence.utils.hibernate.type.basic.YearMonthDateType; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -98,7 +96,7 @@ public class Issue { stringBuilder.append(this.getComic().getTitle()); stringBuilder.append(" #"); stringBuilder.append(this.getIssueNumber()); - if (this.title !=null && !this.title.isEmpty()) { + if (this.title != null && !this.title.isEmpty()) { stringBuilder.append(": "); stringBuilder.append(this.title); } diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/IssueWork.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/IssueWork.java index 0b33e6c..6de5d18 100644 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/IssueWork.java +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/comics/IssueWork.java @@ -11,9 +11,13 @@ 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 IssueWork { @Id diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActor.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActor.java new file mode 100644 index 0000000..4f128a8 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActor.java @@ -0,0 +1,51 @@ +package de.thpeetz.kontor.models.media; + +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 jakarta.validation.constraints.NotEmpty; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +@Entity +@Table +public class MediaActor { + + @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; + + @NotEmpty + @Column(unique = true) + private String name; + + @Column(nullable = true) + private String url; + + @Column(nullable = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "media_actor", cascade = CascadeType.REFRESH, orphanRemoval = true) + List mediaActorFiles = new LinkedList<>(); +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActorFile.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActorFile.java new file mode 100644 index 0000000..73795b0 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaActorFile.java @@ -0,0 +1,56 @@ +package de.thpeetz.kontor.models.media; + +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.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.Version; +import jakarta.validation.constraints.NotNull; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +@Entity +@Table(indexes = { + @Index(columnList = "media_file_id, media_actor_id") }, uniqueConstraints = @UniqueConstraint(columnNames = { + "media_file_id", "media_actor_id" })) +public class MediaActorFile { + + @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; + + @ManyToOne + @JoinColumn(name = "media_file_id") + @NotNull + private MediaFile media_file; + + @ManyToOne + @JoinColumn(name = "media_actor_id") + @NotNull + private MediaActor media_actor; + + public String getTitle() { + return media_file.getTitle(); + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaArticle.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaArticle.java new file mode 100644 index 0000000..629938e --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaArticle.java @@ -0,0 +1,45 @@ +package de.thpeetz.kontor.models.media; + +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.Index; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.Version; +import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(indexes = @Index(columnList = "url"), uniqueConstraints = @UniqueConstraint(columnNames = { "url" })) +public class MediaArticle { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String id; + + @Version + private int version; + + @Column(name = "created_date") + private Date createdDate; + + @Column(name = "last_modified_date", nullable = true) + private Date lastModifiedDate; + + @NotEmpty + private String url; + + @Column + private boolean review; + + @Column(nullable = true) + private String title; +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFile.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFile.java new file mode 100644 index 0000000..85975a2 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFile.java @@ -0,0 +1,71 @@ +package de.thpeetz.kontor.models.media; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +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; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +@Entity +@Table +public class MediaFile { + + @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 = true) + private String url; + + @Column + private boolean review; + + @Column + private boolean shouldDownload; + + @Column(nullable = true) + private String title; + + @Column(nullable = true) + private String cloudLink; + + @Column(nullable = true) + private String fileName; + + @Column(nullable = true) + private String path; + + @Column(nullable = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "media_file", cascade = CascadeType.REFRESH, orphanRemoval = true) + List mediaActorFiles = new LinkedList<>(); + + public static MediaFile newMediaFile(String url) { + var mediaFile = new MediaFile(); + mediaFile.setUrl(url); + return mediaFile; + } +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFileQueries.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFileQueries.java new file mode 100644 index 0000000..4b20e0b --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaFileQueries.java @@ -0,0 +1,11 @@ +package de.thpeetz.kontor.models.media; + +import java.util.List; + +import org.hibernate.annotations.processing.Find; + +public interface MediaFileQueries { + + @Find + List getAllMediaFiles(); +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaVideo.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaVideo.java new file mode 100644 index 0000000..be8fda2 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/models/media/MediaVideo.java @@ -0,0 +1,57 @@ +package de.thpeetz.kontor.models.media; + +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.Table; +import jakarta.persistence.UniqueConstraint; +import jakarta.persistence.Version; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = false) +@Entity +@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "url" }) }) +public class MediaVideo { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private String id; + + @Version + private int version; + + @Column(name = "created_date") + private Date createdDate; + + @Column(name = "last_modified_date", nullable = true) + private Date lastModifiedDate; + + @Column + private String url; + + @Column + private boolean review; + + @Column + private boolean shouldDownload; + + @Column(nullable = true) + private String title; + + @Column(nullable = true) + private String cloudLink; + + @Column(nullable = true) + private String fileName; + + @Column(nullable = true) + private String path; +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/services/api/PersonReader.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/services/api/PersonReader.java deleted file mode 100644 index a864fbe..0000000 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/services/api/PersonReader.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.thpeetz.kontor.services.api; - -import de.thpeetz.kontor.models.Person; -import java.util.List; - -public interface PersonReader { - List getAll(); -} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/services/inmemory/InMemoryPersonReader.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/services/inmemory/InMemoryPersonReader.java deleted file mode 100644 index 39442c7..0000000 --- a/kontor-javalin/src/main/java/de/thpeetz/kontor/services/inmemory/InMemoryPersonReader.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.thpeetz.kontor.services.inmemory; - -import de.thpeetz.kontor.models.Person; -import java.util.List; - -import de.thpeetz.kontor.services.api.PersonReader; - -public class InMemoryPersonReader implements PersonReader { - - @Override - public List getAll() { - return List.of( - new Person("Vincent Vega", 73), - new Person("Jules Winnfield", 12)); - } -} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/ComicHandler.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/ComicHandler.java new file mode 100644 index 0000000..43a0195 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/ComicHandler.java @@ -0,0 +1,17 @@ +package de.thpeetz.kontor.web; + +import java.util.List; + +import de.thpeetz.kontor.infrastructure.AppHibernate; +import de.thpeetz.kontor.models.comics.Comic; +import de.thpeetz.kontor.models.comics.ComicQueries_; +import de.thpeetz.kontor.web.model.ResultComic; +import io.javalin.http.Handler; + +public class ComicHandler { + public static Handler listAll = (context) -> { + List result = AppHibernate.fromTransaction(ComicQueries_::getAllComics); + context.json(new ResultComic(result)); + }; + +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/MediaFileHandler.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/MediaFileHandler.java new file mode 100644 index 0000000..b6cfe69 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/MediaFileHandler.java @@ -0,0 +1,30 @@ +package de.thpeetz.kontor.web; + +import java.util.List; + +import de.thpeetz.kontor.infrastructure.AppHibernate; +import io.javalin.http.Handler; +import io.javalin.http.HttpStatus; +import de.thpeetz.kontor.models.media.MediaFile; +import de.thpeetz.kontor.models.media.MediaFileQueries; +import de.thpeetz.kontor.models.media.MediaFileQueries_; +import de.thpeetz.kontor.web.model.NewMediaFile; +import de.thpeetz.kontor.web.model.ResultMediaFile; + +public class MediaFileHandler { + + public static Handler listAll = (context) -> { + List result = AppHibernate.fromTransaction(MediaFileQueries_::getAllMediaFiles); + context.json(new ResultMediaFile(result)); + }; + + public static Handler save = (context) -> { + var newMediaFile = context.bodyAsClass(NewMediaFile.class); + var result = AppHibernate.fromTransaction(session -> { + var insertedId = session.insert(MediaFile.newMediaFile(newMediaFile.url())); + return session.get(MediaFile.class, insertedId); + }); + context.json(result).status(HttpStatus.CREATED); + }; + +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/NewMediaFile.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/NewMediaFile.java new file mode 100644 index 0000000..685ea99 --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/NewMediaFile.java @@ -0,0 +1,4 @@ +package de.thpeetz.kontor.web.model; + +public record NewMediaFile(String url) { +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultComic.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultComic.java new file mode 100644 index 0000000..25e396b --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultComic.java @@ -0,0 +1,8 @@ +package de.thpeetz.kontor.web.model; + +import java.util.List; + +import de.thpeetz.kontor.models.comics.Comic; + +public record ResultComic(List comics) { +} diff --git a/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultMediaFile.java b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultMediaFile.java new file mode 100644 index 0000000..ef01bbd --- /dev/null +++ b/kontor-javalin/src/main/java/de/thpeetz/kontor/web/model/ResultMediaFile.java @@ -0,0 +1,9 @@ +package de.thpeetz.kontor.web.model; + +import java.util.List; + +import de.thpeetz.kontor.models.media.MediaFile; + +public record ResultMediaFile(List mediaFiles) { + +}