add IssueWork entity with Repository, Form and View

This commit is contained in:
Thomas Peetz
2025-06-04 21:36:26 +02:00
committed by Thomas Peetz
parent 518a72c6e8
commit 26a91274c2
18 changed files with 0 additions and 686 deletions
@@ -1,17 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface ArtistRepository extends JpaRepository<Artist, String> {
@Query("select a from Artist a " +
"where lower(a.name) like lower(concat('%', :searchTerm, '%')) ")
List<Artist> search(@Param("searchTerm") String searchTerm);
List<Artist> findByNameIgnoreCase(String name);
Artist findByName(String name);
}
@@ -1,19 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface ComicRepository extends JpaRepository<Comic, String> {
@Query("select c from Comic c " +
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) ")
List<Comic> search(@Param("searchTerm") String searchTerm);
Comic findByTitleAndPublisher(String title, Publisher publisher);
List<Comic> findByTitle(String title);
List<Comic> findByTitleIgnoreCase(String title);
}
@@ -1,15 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
public interface ComicWorkRepository extends JpaRepository<ComicWork, String> {
@Query("SELECT c from ComicWork c where c.comic = ?1 and c.artist = ?2 and c.workType = ?3")
ComicWork findbyComicAndArtistAndWorktype(Comic comic, Artist artist, Worktype worktype);
@Query("select c from ComicWork c where c.comic = ?1")
List<ComicWork> findByComic(Comic comic);
}
@@ -1,17 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface IssueRepository extends JpaRepository<Issue, String> {
@Query("select i from Issue i " +
"where lower(i.issueNumber) like lower(concat('%', :searchTerm, '%')) ")
List<Issue> search(@Param("searchTerm") String searchTerm);
List<Issue> findByComic(Comic comic);
Issue findByComicAndIssueNumber(Comic comic, String issueNumber);
}
@@ -1,17 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface PublisherRepository extends JpaRepository<Publisher, String> {
@Query("select p from Publisher p " +
"where lower(p.name) like lower(concat('%', :searchTerm, '%')) ")
List<Publisher> search(@Param("searchTerm") String searchTerm);
Publisher findByName(String name);
List<Publisher> findByNameIgnoreCase(String name);
}
@@ -1,17 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface StoryArcRepository extends JpaRepository<StoryArc, String> {
@Query("select s from StoryArc s " +
"where lower(s.name) like lower(concat('%', :searchTerm, '%')) ")
List<StoryArc> search(@Param("searchTerm") String searchTerm);
StoryArc findByNameAndComic(String name, Comic comic);
List<StoryArc> findByComic(Comic comic);
}
@@ -1,20 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface TradePaperbackRepository extends JpaRepository<TradePaperback, String> {
@Query("select t from TradePaperback t " +
"where lower(t.name) like lower(concat('%', :searchTerm, '%')) ")
List<TradePaperback> search(@Param("searchTerm") String searchTerm);
List<TradePaperback> findByComic(Comic comic);
List<TradePaperback> findByNameAndComic(String name, Comic comic);
@Query("select t from TradePaperback t where t.name = ?1 and t.comic = ?2 and t.issueStart = ?3 and t.issueEnd = ?4")
TradePaperback findByFields(String name, Comic comic, int start, int end);
}
@@ -1,13 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
public interface VolumeRepository extends JpaRepository<Volume, String> {
List<Volume> findByName(String name);
List<Volume> findByComic(Comic comic);
}
@@ -1,18 +0,0 @@
package de.thpeetz.kontor.comics.data;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface WorktypeRepository extends JpaRepository<Worktype, String> {
@Query("select w from Worktype w " +
"where lower(w.name) like lower(concat('%', :searchTerm, '%')) ")
List<Worktype> search(@Param("searchTerm") String searchTerm);
Worktype findByName(String name);
List<Worktype> findByNameIgnoreCase(String name);
}
@@ -1,73 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@TestMethodOrder(OrderAnnotation.class)
class ArtistRepositoryTest {
private Artist stanLee;
private static final String ARTISTNAME = "Lee, Stan";
@Autowired
ArtistRepository artistRepository;
@BeforeEach
void setupData() {
stanLee = new Artist();
stanLee.setName(ARTISTNAME);
}
@Test
@Order(1)
void checkInitialLoad() {
int count = artistRepository.findAll().size();
assertEquals(5, count);
}
@Test
@Order(2)
void saveArtist() {
int count = artistRepository.findAll().size();
artistRepository.save(stanLee);
assertEquals(count+1, artistRepository.findAll().size());
}
@Test
@Order(3)
void findArtist() {
List<Artist> artists = artistRepository.findByNameIgnoreCase("lEE, sTAN");
assertTrue(artists.size() > 0);
assertEquals(artists.get(0).getName(), stanLee.getName());
}
@Test
@Order(4)
void searchArtist() {
List<Artist> artists = artistRepository.search("Lee");
assertEquals(1, artists.size());
assertEquals(ARTISTNAME, artists.get(0).getName());
List<Artist> artists2 = artistRepository.search("Stan");
assertEquals(1, artists2.size());
assertEquals(ARTISTNAME, artists2.get(0).getName());
}
@Test
@Order(5)
void deleteArtist() {
int count = artistRepository.findAll().size();
Artist artist = artistRepository.findByName(ARTISTNAME);
artistRepository.delete(artist);
assertEquals(count-1, artistRepository.findAll().size());
}
}
@@ -1,53 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ComicRepositoryTest {
@Autowired
private ComicRepository comicRepository;
@Autowired
private PublisherRepository publisherRepository;
@Test
void testFindByTitle() {
List<Comic> comics = comicRepository.findByTitle("Emma Frost");
assertEquals(1, comics.size());
assertEquals("Emma Frost", comics.get(0).getTitle());
Publisher publisher = comics.get(0).getPublisher();
assertEquals("Marvel", publisher.getName());
}
@Test
void testFindByTitleIgnoreCase() {
List<Comic> comics = comicRepository.findByTitleIgnoreCase("x-men");
assertEquals(1, comics.size());
assertEquals("X-Men", comics.get(0).getTitle());
}
@Test
void testFindByTitleAndPublisher() {
Publisher publisher = publisherRepository.findByName("Marvel");
assertNotNull(publisher);
Comic found = comicRepository.findByTitleAndPublisher("Emma Frost", publisher);
assertNotNull(found);
assertEquals("Emma Frost", found.getTitle());
assertEquals("Marvel", found.getPublisher().getName());
}
@Test
void testSearch() {
List<Comic> comics = comicRepository.search("X-men");
assertEquals(11, comics.size());
assertTrue(comics.stream().map(comic -> comic.getTitle()).collect(Collectors.toList()).contains("Astonishing X-Men"));
}
}
@@ -1,83 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.services.ComicService;
@SpringBootTest
@TestMethodOrder(OrderAnnotation.class)
class ComicWorkRepositoryTest {
@Autowired
private ComicWorkRepository comicWorkRepository;
@Autowired
private ComicRepository comicRepository;
@Autowired
private WorktypeRepository worktypeRepository;
@Autowired
private ArtistRepository artistRepository;
@Autowired
private ComicService comicService;
@Test
@Order(1)
void checkInitialLoad() {
int count = comicWorkRepository.findAll().size();
assertEquals(18, count);
}
@Test
@Order(2)
void saveComicWork() {
int count = comicWorkRepository.findAll().size();
Artist artist = artistRepository.findByName("Turner, Michael");
Worktype worktype = worktypeRepository.findByName("Writer");
Comic comic = comicRepository.findByTitle("Emma Frost").get(0);
ComicWork comicWork = new ComicWork();
comicWork.setArtist(artist);
comicWork.setComic(comic);
comicWork.setWorkType(worktype);
comicWorkRepository.save(comicWork);
assertEquals(count + 1, comicWorkRepository.findAll().size());
}
@Test
@Order(3)
void findByComicAndArtistAndComicWork() {
assertEquals(19, comicWorkRepository.count());
Artist artist = artistRepository.findByName("Turner, Michael");
Worktype worktype = worktypeRepository.findByName("Writer");
Comic comic = comicRepository.findByTitle("Emma Frost").get(0);
ComicWork comicWork = comicWorkRepository.findbyComicAndArtistAndWorktype(comic, artist, worktype);
assertNotNull(comicWork);
assertEquals(comicWork.getArtist().getName(), artist.getName());
assertEquals(comicWork.getComic().getTitle(), comic.getTitle());
assertEquals(comicWork.getWorkType().getName(), worktype.getName());
ComicWork notFound = comicWorkRepository.findbyComicAndArtistAndWorktype(comic, artist, null);
assertNull(notFound);
}
@Test
@Order(4)
void deleteComicWork() {
long count = comicWorkRepository.count();
Artist artist = artistRepository.findByName("Turner, Michael");
Worktype worktype = worktypeRepository.findByName("Writer");
Comic comic = comicRepository.findByTitle("Emma Frost").get(0);
ComicWork comicWork = comicWorkRepository.findbyComicAndArtistAndWorktype(comic, artist, worktype);
assertNotNull(comicWork);
comicService.deleteComicWork(comicWork);
assertEquals(count - 1, comicWorkRepository.count());
}
}
@@ -1,45 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
import de.thpeetz.kontor.comics.services.ComicService;
@SpringBootTest
class IssueRepositoryTest {
@Autowired
private IssueRepository issueRepository;
@Autowired
private ComicService comicService;
@Test
void testFindByComic() {
Comic comic = TestConstants.getComicWithIssues(comicService);
List<Issue> issues = issueRepository.findByComic(comic);
assertEquals(TestConstants.BATTLE_POPE_ISSUE_COUNT, issues.size());
}
@Test
void testFindByComicAndIssueNumber() {
Comic comic = TestConstants.getComicWithIssues(comicService);
Issue issue = issueRepository.findByComicAndIssueNumber(comic, "12");
assertNotNull(issue);
assertFalse(issue.getIsRead());
}
@Test
void testSearch() {
List<Issue> issues = issueRepository.search("2");
assertEquals(187, issues.size());
}
}
@@ -1,68 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
@SpringBootTest
@TestMethodOrder(OrderAnnotation.class)
class PublisherRepositoryTest {
@Autowired
private PublisherRepository publisherRepository;
@Test
@Order(1)
void checkInitialLoad() {
assertEquals(TestConstants.PUBLISHER_COUNT, publisherRepository.findAll().size());
}
@Test
@Order(2)
void savePublisher() {
Publisher publisher = new Publisher();
publisher.setName(TestConstants.PUBLISHER_NAME);
publisherRepository.save(publisher);
assertEquals(TestConstants.PUBLISHER_COUNT + 1, publisherRepository.findAll().size());
}
@Test
@Order(3)
void findPublisherByName() {
Publisher publisher = publisherRepository.findByName(TestConstants.PUBLISHER_NAME);
assertNotNull(publisher);
assertEquals(TestConstants.PUBLISHER_NAME, publisher.getName());
Publisher notFound = publisherRepository.findByName("Cow");
assertNull(notFound);
List<Publisher> publishers = publisherRepository
.findByNameIgnoreCase(TestConstants.PUBLISHER_NAME.toLowerCase());
assertEquals(1, publishers.size());
assertEquals(TestConstants.PUBLISHER_NAME, publishers.get(0).getName());
}
@Test
@Order(4)
void searchPublisher() {
List<Publisher> publishers = publisherRepository.search("Cow");
assertEquals(1, publishers.size());
assertEquals("Top Cow Productions", publishers.get(0).getName());
}
@Test
@Order(5)
void deletePublisher() {
Publisher publisher = publisherRepository.findByName(TestConstants.PUBLISHER_NAME);
assertNotNull(publisher);
publisherRepository.delete(publisher);
assertEquals(TestConstants.PUBLISHER_COUNT, publisherRepository.findAll().size());
}
}
@@ -1,45 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
import de.thpeetz.kontor.comics.services.ComicService;
@SpringBootTest
class StoryArcRepositoryTest {
@Autowired
private StoryArcRepository storyArcRepository;
@Autowired
private ComicService comicService;
@Test
void testSearch() {
List<StoryArc> storyArcs = storyArcRepository.search("Learn");
assertNotNull(storyArcs);
assertEquals(1, storyArcs.size());
}
@Test
void findByComic() {
Comic comic = TestConstants.getComicWithStoryArcs(comicService);
List<StoryArc> storyArcs = storyArcRepository.findByComic(comic);
assertNotNull(storyArcs);
assertEquals(3, storyArcs.size());
}
@Test
void findByNameAndComic() {
Comic comic = TestConstants.getComicWithStoryArcs(comicService);
StoryArc storyArc = storyArcRepository.findByNameAndComic("Higher Learning", comic);
assertNotNull(storyArc);
assertEquals("Emma Frost", storyArc.getComic().getTitle());
}
}
@@ -1,59 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
import de.thpeetz.kontor.comics.services.ComicService;
@SpringBootTest
class TradePaperbackRepositoryTest {
@Autowired
private TradePaperbackRepository tradePaperbackRepository;
@Autowired
private ComicService comicService;
@Test
void testSearch() {
List<TradePaperback> tradePaperbacks = tradePaperbackRepository.search("Dragon");
assertNotNull(tradePaperbacks);
assertEquals(1, tradePaperbacks.size());
}
@Test
void testFindByComic() {
Comic comic = TestConstants.getComicWithTradePaperbacks(comicService);
List<TradePaperback> tradePaperbacks = tradePaperbackRepository.findByComic(comic);
assertNotNull(tradePaperbacks);
assertEquals(TestConstants.SOJOURN_TPB_COUNT, tradePaperbacks.size());
}
@Test
void testFindByNameAndComic() {
Comic comic = TestConstants.getComicWithTradePaperbacks(comicService);
List<TradePaperback> tradePaperbacks = tradePaperbackRepository
.findByNameAndComic(TestConstants.SOJOURN_TPB_NAME, comic);
assertNotNull(tradePaperbacks);
assertTrue(tradePaperbacks.size() > 0);
assertEquals(TestConstants.SOJOURN_TPB_COMIC_TITLE, tradePaperbacks.get(0).getComic().getTitle());
}
@Test
void testFindByFields() {
Comic comic = TestConstants.getComicWithTradePaperbacks(comicService);
TradePaperback tradePaperback = tradePaperbackRepository.findByFields(TestConstants.SOJOURN_TPB_NAME,
comic, TestConstants.SOJOURN_TPB_START, TestConstants.SOJOURN_TPB_END);
assertNotNull(tradePaperback);
assertEquals(TestConstants.SOJOURN_TPB_COMIC_TITLE, tradePaperback.getComic().getTitle());
assertEquals(TestConstants.SOJOURN_TPB_END, tradePaperback.getIssueEnd());
}
}
@@ -1,61 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
import de.thpeetz.kontor.comics.services.ComicService;
@SpringBootTest
class VolumeRepositoryTest {
@Autowired
private VolumeRepository volumeRepository;
@Autowired
private ComicRepository comicRepository;
@Autowired
private ComicService comicService;
@Test
void testFindByComic() {
Comic comic = TestConstants.getComicWithoutReferences(comicService);
assertEquals(0, comic.getVolumes().size());
Volume volume = new Volume();
volume.setName(TestConstants.VOLUME_NAME);
volume.setComic(comic);
Volume savedInstance = volumeRepository.save(volume);
assertNotNull(savedInstance);
List<Volume> found = volumeRepository.findByComic(comic);
assertEquals(1, found.size());
comicService.deleteVolume(found.get(0));
assertEquals(0, comic.getVolumes().size());
assertEquals(TestConstants.VOLUME_COUNT, volumeRepository.count());
}
@Test
void testFindByName() {
Comic comic = TestConstants.getComicWithoutReferences(comicService);
assertEquals(0, comic.getVolumes().size());
Volume volume = new Volume();
volume.setName(TestConstants.VOLUME_NAME);
volume.setComic(comic);
Volume savedInstance = volumeRepository.save(volume);
assertNotNull(savedInstance);
List<Volume> found = volumeRepository.findByName(TestConstants.VOLUME_NAME);
assertEquals(1, found.size());
comicService.deleteVolume(found.get(0));
assertEquals(0, comic.getVolumes().size());
assertEquals(TestConstants.VOLUME_COUNT, volumeRepository.count());
}
}
@@ -1,46 +0,0 @@
package de.thpeetz.kontor.comics.data;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import de.thpeetz.kontor.comics.TestConstants;
@SpringBootTest
class WorktypeRepositoryTest {
@Autowired
private WorktypeRepository worktypeRepository;
@Test
void findWorktypeByName() {
Worktype found = worktypeRepository.findByName("Writer");
assertNotNull(found);
Worktype notFound = worktypeRepository.findByName("er");
assertNull(notFound);
}
@Test
void findWorktypeByNameIgnoreCase() {
List<Worktype> worktypes = worktypeRepository.findByNameIgnoreCase("Writer".toLowerCase());
assertNotNull(worktypes);
assertEquals(1, worktypes.size());
assertEquals("Writer", worktypes.get(0).getName());
}
@Test
void searchWorktype() {
List<Worktype> worktypes = worktypeRepository.search("er");
assertEquals(3, worktypes.size());
assertTrue(worktypes.stream().map(worktype -> worktype.getName()).collect(Collectors.toList()).contains("Writer"));
}
}