Skip to content

Commit

Permalink
Changed REST API for marking pages as deleted [comixed#444]
Browse files Browse the repository at this point in the history
 * The API now returns the owning comic as the response.
  • Loading branch information
mcpierce committed Aug 2, 2020
1 parent 7fc223b commit 0ac5d04
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
Expand Down Expand Up @@ -74,11 +75,19 @@ public int deleteAllWithHash(@PathVariable("hash") String hash) {
return this.pageService.deleteAllWithHash(hash);
}

/**
* Marks a page for deletion.
*
* @param id the page id
* @return the parent comic
*/
@DeleteMapping(value = "/pages/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public boolean deletePage(@PathVariable("id") long id) {
@PreAuthorize("hasRole('ADMIN')")
@JsonView(View.ComicDetails.class)
public Comic deletePage(@PathVariable("id") long id) {
log.info("Deleting page: id={}", id);

return this.pageService.deletePage(id) != null;
return this.pageService.deletePage(id);
}

@GetMapping(value = "/comics/{id}/pages", produces = MediaType.APPLICATION_JSON_VALUE)
Expand Down Expand Up @@ -192,11 +201,19 @@ public int undeleteAllWithHash(@PathVariable("hash") String hash) {
return this.pageService.undeleteAllWithHash(hash);
}

/**
* Unmarks the page for deletion.
*
* @param id the page id
* @return the parent comic
*/
@PostMapping(value = "/pages/{id}/undelete", produces = MediaType.APPLICATION_JSON_VALUE)
public boolean undeletePage(@PathVariable("id") long id) {
@PreAuthorize("hasRole('ADMIN')")
@JsonView(View.ComicDetails.class)
public Comic undeletePage(@PathVariable("id") long id) {
log.info("Undeleting page: id={}", id);

return this.pageService.undeletePage(id) != null;
return this.pageService.undeletePage(id);
}

@PutMapping(value = "/pages/{id}/type", produces = MediaType.APPLICATION_JSON_VALUE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,16 +190,21 @@ public void testGetImageInComicByIndex()
public void testDeletePageInvalidId() {
Mockito.when(pageService.deletePage(Mockito.anyLong())).thenReturn(null);

assertFalse(pageController.deletePage(TEST_PAGE_ID));
final Comic result = pageController.deletePage(TEST_PAGE_ID);

assertNull(result);

Mockito.verify(pageService, Mockito.times(1)).deletePage(TEST_PAGE_ID);
}

@Test
public void testDeletePage() {
Mockito.when(pageService.deletePage(Mockito.anyLong())).thenReturn(page);
Mockito.when(pageService.deletePage(Mockito.anyLong())).thenReturn(comic);

final Comic result = pageController.deletePage(TEST_PAGE_ID);

assertTrue(pageController.deletePage(TEST_PAGE_ID));
assertNotNull(result);
assertSame(comic, result);

Mockito.verify(pageService, Mockito.times(1)).deletePage(TEST_PAGE_ID);
}
Expand All @@ -208,16 +213,21 @@ public void testDeletePage() {
public void testUndeletePageForNonexistentPage() {
Mockito.when(pageService.undeletePage(Mockito.anyLong())).thenReturn(null);

assertFalse(pageController.undeletePage(TEST_PAGE_ID));
final Comic result = pageController.undeletePage(TEST_PAGE_ID);

assertNull(result);

Mockito.verify(pageService, Mockito.times(1)).undeletePage(TEST_PAGE_ID);
}

@Test
public void testUndeletePage() {
Mockito.when(pageService.undeletePage(Mockito.anyLong())).thenReturn(page);
Mockito.when(pageService.undeletePage(Mockito.anyLong())).thenReturn(comic);

final Comic result = pageController.undeletePage(TEST_PAGE_ID);

assertTrue(pageController.undeletePage(TEST_PAGE_ID));
assertNotNull(result);
assertSame(comic, result);

Mockito.verify(pageService, Mockito.times(1)).undeletePage(TEST_PAGE_ID);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,42 +131,53 @@ public Page getPageInComicByIndex(final long comicId, final int pageIndex) {
return null;
}

/**
* Marks a page for deletion.
*
* @param id the page id
* @return the comic
*/
@Transactional
public Page deletePage(final long id) {
public Comic deletePage(final long id) {
log.debug("Marking page as deleted: id={}", id);
final Optional<Page> page = this.pageRepository.findById(id);

if (page.isPresent()) {
if (page.get().isDeleted()) {
log.debug("Page was already marked as deleted");
return page.get();
return page.get().getComic();
} else {
page.get().setDeleted(true);
final Page result = this.pageRepository.save(page.get());
log.debug("Page deleted");
return result;
return result.getComic();
}
}

log.warn("No such page");
return null;
}

/**
* Unmarks a page for deletion.
*
* @param id the page id
* @return the comic
*/
@Transactional
public Page undeletePage(final long id) {
public Comic undeletePage(final long id) {
log.debug("Marking page as not deleted: id={}", id);

final Optional<Page> page = this.pageRepository.findById(id);

if (page.isPresent()) {
if (page.get().isDeleted()) {
page.get().setDeleted(false);
log.debug("Page undeleted");
return this.pageRepository.save(page.get());
return this.pageRepository.save(page.get()).getComic();

} else {
log.debug("Page was not marked as deleted");
return page.get();
return page.get().getComic();
}
} else {
log.warn("No such page");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,12 @@ public void testDeletePageInvalidId() {
public void testDeletePageAlreadyMarkedAsDeleted() {
Mockito.when(pageRepository.findById(TEST_PAGE_ID)).thenReturn(Optional.of(page));
Mockito.when(page.isDeleted()).thenReturn(true);
Mockito.when(page.getComic()).thenReturn(comic);

final Page result = pageService.deletePage(TEST_PAGE_ID);
final Comic result = pageService.deletePage(TEST_PAGE_ID);

assertNotNull(result);
assertSame(page, result);
assertSame(comic, result);

Mockito.verify(pageRepository, Mockito.times(1)).findById(TEST_PAGE_ID);
Mockito.verify(page, Mockito.times(1)).isDeleted();
Expand All @@ -285,11 +286,12 @@ public void testDeletePage() {
Mockito.when(page.isDeleted()).thenReturn(false);
Mockito.doNothing().when(page).setDeleted(Mockito.anyBoolean());
Mockito.when(pageRepository.save(Mockito.any(Page.class))).thenReturn(page);
Mockito.when(page.getComic()).thenReturn(comic);

final Page result = pageService.deletePage(TEST_PAGE_ID);
final Comic result = pageService.deletePage(TEST_PAGE_ID);

assertNotNull(result);
assertSame(page, result);
assertSame(comic, result);

Mockito.verify(pageRepository, Mockito.times(1)).findById(TEST_PAGE_ID);
Mockito.verify(page, Mockito.times(1)).isDeleted();
Expand All @@ -310,11 +312,12 @@ public void testUndeletePageForNonexistentPage() {
public void testUndeletePageForUnmarkedPage() {
Mockito.when(pageRepository.findById(Mockito.anyLong())).thenReturn(Optional.of(page));
Mockito.when(page.isDeleted()).thenReturn(false);
Mockito.when(page.getComic()).thenReturn(comic);

final Page result = pageService.undeletePage(TEST_PAGE_ID);
final Comic result = pageService.undeletePage(TEST_PAGE_ID);

assertNotNull(result);
assertSame(page, result);
assertSame(comic, result);

Mockito.verify(pageRepository, Mockito.times(1)).findById(TEST_PAGE_ID);
Mockito.verify(page, Mockito.times(1)).isDeleted();
Expand All @@ -326,11 +329,12 @@ public void testUndeletePage() {
Mockito.when(page.isDeleted()).thenReturn(true);
Mockito.doNothing().when(page).setDeleted(Mockito.anyBoolean());
Mockito.when(pageRepository.save(Mockito.any(Page.class))).thenReturn(page);
Mockito.when(page.getComic()).thenReturn(comic);

final Page result = pageService.undeletePage(TEST_PAGE_ID);
final Comic result = pageService.undeletePage(TEST_PAGE_ID);

assertNotNull(result);
assertSame(page, result);
assertSame(comic, result);

Mockito.verify(pageRepository, Mockito.times(1)).findById(TEST_PAGE_ID);
Mockito.verify(page, Mockito.times(1)).isDeleted();
Expand Down

0 comments on commit 0ac5d04

Please sign in to comment.