Skip to content

Commit

Permalink
[Issue #233] Refactor REST APIs for creating reading lists.
Browse files Browse the repository at this point in the history
  • Loading branch information
mcpierce committed Jun 21, 2020
1 parent ae7d80e commit 913e6fe
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 103 deletions.
Expand Up @@ -157,8 +157,7 @@ public void importList(String listName, List<String> list, ComiXedUser importUse
}

try {
this.readingListService.createReadingList(
email, listName, "Imported from ComicRack", entries);
this.readingListService.createReadingList(email, listName, "Imported from ComicRack");
} catch (ReadingListNameException e) {
this.log.error("Reading list {} already exists!", listName);
}
Expand Down
Expand Up @@ -47,28 +47,28 @@ public class ReadingList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonProperty("id")
@JsonView(View.ComicList.class)
@JsonView({View.ComicList.class, View.ReadingList.class})
private Long id;

@Column(name = "name", length = 128)
@JsonProperty("name")
@JsonView(View.ComicList.class)
@JsonView({View.ComicList.class, View.ReadingList.class})
private String name;

@Column(name = "summary", length = 256, nullable = true)
@JsonProperty("summary")
@JsonView(View.ComicList.class)
@JsonView({View.ComicList.class, View.ReadingList.class})
private String summary;

@JsonProperty("owner")
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "owner_id")
@JsonView(View.ComicList.class)
@JsonView({View.ComicList.class, View.ReadingList.class})
private ComiXedUser owner;

@Column(name = "last_updated")
@JsonProperty("lastUpdated")
@JsonView(View.ComicList.class)
@JsonView({View.ComicList.class, View.ReadingList.class})
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private Date lastUpdated = new Date();

Expand Down
Expand Up @@ -24,6 +24,7 @@
import java.util.List;
import lombok.extern.log4j.Log4j2;
import org.comixed.model.library.ReadingList;
import org.comixed.net.CreateReadingListRequest;
import org.comixed.net.UpdateReadingListRequest;
import org.comixed.repositories.library.ReadingListRepository;
import org.comixed.service.comic.ComicException;
Expand All @@ -45,16 +46,15 @@ public class ReadingListController {
@RequestMapping(value = "/lists", method = RequestMethod.POST)
@JsonView(View.ReadingList.class)
public ReadingList createReadingList(
Principal principal,
@RequestParam("name") String name,
@RequestParam("summary") String summary,
@RequestParam("entries") List<Long> entries)
Principal principal, @RequestBody() CreateReadingListRequest request)
throws NoSuchReadingListException, ReadingListNameException, ComicException {
final String email = principal.getName();
final String name = request.getName();
final String summary = request.getSummary();

this.log.info("Creating reading list for user: email={} name={}", email, name);

return this.readingListService.createReadingList(email, name, summary, entries);
return this.readingListService.createReadingList(email, name, summary);
}

@PutMapping(
Expand All @@ -70,7 +70,6 @@ public ReadingList updateReadingList(
final String email = principal.getName();
final String name = request.getName();
final String summary = request.getSummary();
final List<Long> entries = request.getEntries();

this.log.info(
"Updating reading list for user: email={} id={} name={} summary={}",
Expand All @@ -79,7 +78,7 @@ public ReadingList updateReadingList(
name,
summary);

return this.readingListService.updateReadingList(email, id, name, summary, entries);
return this.readingListService.updateReadingList(email, id, name, summary);
}

@RequestMapping(value = "/lists", method = RequestMethod.GET)
Expand Down
@@ -0,0 +1,44 @@
/*
* ComiXed - A digital comic book library management application.
* Copyright (C) 2020, The ComiXed Project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses>
*/

package org.comixed.net;

import com.fasterxml.jackson.annotation.JsonProperty;

public class CreateReadingListRequest {
@JsonProperty("name")
private String name;

@JsonProperty("summary")
private String summary;

public CreateReadingListRequest() {}

public CreateReadingListRequest(String name, String summary) {
this.name = name;
this.summary = summary;
}

public String getName() {
return name;
}

public String getSummary() {
return summary;
}
}
Expand Up @@ -18,34 +18,27 @@

package org.comixed.net;

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class UpdateReadingListRequest {
@JsonProperty("name")
private String name;

@JsonProperty("summary")
private String summary;
private List<Long> entries;

public String getName() {
return name;
}
public UpdateReadingListRequest() {}

public void setName(final String name) {
public UpdateReadingListRequest(String name, String summary) {
this.name = name;
}

public String getSummary() {
return summary;
}

public void setSummary(final String summary) {
this.summary = summary;
}

public List<Long> getEntries() {
return entries;
public String getName() {
return name;
}

public void setEntries(final List<Long> entries) {
this.entries = entries;
public String getSummary() {
return summary;
}
}
Expand Up @@ -27,6 +27,7 @@
import org.comixed.model.library.ReadingList;
import org.comixed.model.library.ReadingListEntry;
import org.comixed.model.user.ComiXedUser;
import org.comixed.net.CreateReadingListRequest;
import org.comixed.net.UpdateReadingListRequest;
import org.comixed.service.comic.ComicException;
import org.comixed.service.library.NoSuchReadingListException;
Expand Down Expand Up @@ -78,26 +79,20 @@ public void testCreateReadingList()
Mockito.when(principal.getName()).thenReturn(TEST_USER_EMAIL);
Mockito.when(
readingListService.createReadingList(
Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList()))
Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
.thenReturn(readingList);

ReadingList result =
controller.createReadingList(
principal,
TEST_READING_LIST_NAME,
TEST_READING_LIST_SUMMARY,
TEST_READING_LIST_ENTRIES);
new CreateReadingListRequest(TEST_READING_LIST_NAME, TEST_READING_LIST_SUMMARY));

assertNotNull(result);
assertSame(result, readingList);

Mockito.verify(principal, Mockito.times(1)).getName();
Mockito.verify(readingListService, Mockito.times(1))
.createReadingList(
TEST_USER_EMAIL,
TEST_READING_LIST_NAME,
TEST_READING_LIST_SUMMARY,
TEST_READING_LIST_ENTRIES);
.createReadingList(TEST_USER_EMAIL, TEST_READING_LIST_NAME, TEST_READING_LIST_SUMMARY);
}

@Test
Expand Down Expand Up @@ -155,19 +150,14 @@ public void testUpdateReadingList() throws NoSuchReadingListException, ComicExce
Mockito.when(principal.getName()).thenReturn(TEST_USER_EMAIL);
Mockito.when(
readingListService.updateReadingList(
Mockito.anyString(),
Mockito.anyLong(),
Mockito.anyString(),
Mockito.anyString(),
Mockito.anyList()))
Mockito.anyString(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyString()))
.thenReturn(readingList);

final UpdateReadingListRequest request = new UpdateReadingListRequest();
request.setName(TEST_READING_LIST_NAME);
request.setSummary(TEST_READING_LIST_SUMMARY);
request.setEntries(TEST_READING_LIST_ENTRIES);

ReadingList result = controller.updateReadingList(principal, TEST_READING_LIST_ID, request);
ReadingList result =
controller.updateReadingList(
principal,
TEST_READING_LIST_ID,
new UpdateReadingListRequest(TEST_READING_LIST_NAME, TEST_READING_LIST_SUMMARY));

assertNotNull(result);
assertSame(readingList, result);
Expand All @@ -178,7 +168,6 @@ public void testUpdateReadingList() throws NoSuchReadingListException, ComicExce
TEST_USER_EMAIL,
TEST_READING_LIST_ID,
TEST_READING_LIST_NAME,
TEST_READING_LIST_SUMMARY,
TEST_READING_LIST_ENTRIES);
TEST_READING_LIST_SUMMARY);
}
}
Expand Up @@ -25,7 +25,6 @@
import org.comixed.model.comic.Comic;
import org.comixed.model.library.Matcher;
import org.comixed.model.library.ReadingList;
import org.comixed.model.library.ReadingListEntry;
import org.comixed.model.library.SmartReadingList;
import org.comixed.model.user.ComiXedUser;
import org.comixed.repositories.ComiXedUserRepository;
Expand All @@ -46,8 +45,7 @@ public class ReadingListService {
@Autowired ComicService comicService;

@Transactional
public ReadingList createReadingList(
final String email, final String name, final String summary, final List<Long> entries)
public ReadingList createReadingList(final String email, final String name, final String summary)
throws ReadingListNameException, ComicException {
this.log.debug("Creating reading list: email={} name={}", email, name);

Expand All @@ -64,25 +62,12 @@ public ReadingList createReadingList(
readingList.setOwner(owner);
readingList.setName(name);
readingList.setSummary(summary);

loadComics(entries, readingList);
readingList.setLastUpdated(new Date());

this.log.debug("Saving reading list");
return this.readingListRepository.save(readingList);
}

private void loadComics(final List<Long> entries, final ReadingList readingList)
throws ComicException {
this.log.debug("Adding comics to list");
readingList.getEntries().clear();
for (int index = 0; index < entries.size(); index++) {
final Long id = entries.get(index);
this.log.debug("Loading comic: id={}", id);
final Comic comic = this.comicService.getComic(id);
readingList.getEntries().add(new ReadingListEntry(comic, readingList));
}
}

public List<ReadingList> getReadingListsForUser(final String email, final Date lastUpdated) {
this.log.debug("Getting reading lists for user: email={} updated after={}", email, lastUpdated);

Expand All @@ -94,11 +79,7 @@ public List<ReadingList> getReadingListsForUser(final String email, final Date l

@Transactional
public ReadingList updateReadingList(
final String email,
final long id,
final String name,
final String summary,
final List<Long> entries)
final String email, final long id, final String name, final String summary)
throws NoSuchReadingListException, ComicException {
this.log.debug("Updating reading list: owner={} id={} name={}", email, id, name);

Expand All @@ -117,8 +98,6 @@ public ReadingList updateReadingList(
readingList.get().setSummary(summary);
readingList.get().setLastUpdated(new Date());

loadComics(entries, readingList.get());

this.log.debug("Updating reading list");
return this.readingListRepository.save(readingList.get());
}
Expand Down

0 comments on commit 913e6fe

Please sign in to comment.