Skip to content

Commit

Permalink
Added option to delete original comic when converting comics [#184]
Browse files Browse the repository at this point in the history
- When converting comics, the admin can choose to delete the original comic

various fix on added option to delete original comic
  • Loading branch information
BRUCELLA2 authored and mcpierce committed Aug 3, 2020
1 parent 0529fd3 commit 92ec52f
Show file tree
Hide file tree
Showing 26 changed files with 311 additions and 59 deletions.
Expand Up @@ -151,6 +151,7 @@ export class LibraryConvertComics implements Action {
archiveType: string;
renamePages: boolean;
deletePages: boolean;
deleteOriginal: boolean;
}
) {}
}
Expand Down
12 changes: 10 additions & 2 deletions comixed-frontend/src/app/library/adaptors/library.adaptor.spec.ts
Expand Up @@ -84,6 +84,7 @@ describe('LibraryAdaptor', () => {
const DIRECTORY = '/Users/comixedreader/Documents/comics';
const RENAMING_RULE =
'$PUBLISHER/$SERIES/$VOLUME/$SERIES v$VOLUME #$ISSUE [$COVERDATE]';
const DELETE_ORIGINAL_COMIC = false;

let adaptor: LibraryAdaptor;
let store: Store<AppState>;
Expand Down Expand Up @@ -345,7 +346,13 @@ describe('LibraryAdaptor', () => {

describe('converting comics', () => {
beforeEach(() => {
adaptor.convertComics(COMICS, ARCHIVE_TYPE, RENAME_PAGES, DELETE_PAGES);
adaptor.convertComics(
COMICS,
ARCHIVE_TYPE,
RENAME_PAGES,
DELETE_PAGES,
DELETE_ORIGINAL_COMIC
);
});

it('fires an action', () => {
Expand All @@ -354,7 +361,8 @@ describe('LibraryAdaptor', () => {
comics: COMICS,
archiveType: ARCHIVE_TYPE,
renamePages: RENAME_PAGES,
deletePages: DELETE_PAGES
deletePages: DELETE_PAGES,
deleteOriginal: DELETE_ORIGINAL_COMIC
})
);
});
Expand Down
9 changes: 6 additions & 3 deletions comixed-frontend/src/app/library/adaptors/library.adaptor.ts
Expand Up @@ -303,21 +303,24 @@ export class LibraryAdaptor {
comics: Comic[],
archiveType: string,
renamePages: boolean,
deletePages: boolean
deletePages: boolean,
deleteOriginal: boolean
) {
this.logger.debug(
'firing action to convert comics:',
comics,
archiveType,
renamePages,
deletePages
deletePages,
deleteOriginal
);
this.store.dispatch(
new LibraryConvertComics({
comics: comics,
archiveType: archiveType,
renamePages: renamePages,
deletePages: deletePages
deletePages: deletePages,
deleteOriginal: deleteOriginal
})
);
}
Expand Down
Expand Up @@ -24,6 +24,14 @@
[binary]='true'
formControlName='deletePages'></p-checkbox>
</div>
<div class='ui-g-12'>
<label for='delete-pages'>{{ 'convert-comics-settings.label.delete-original' | translate }}</label>
</div>
<div class='ui-g-12'>
<p-checkbox id='delete-original-comic'
[binary]='true'
formControlName='deleteOriginal'></p-checkbox>
</div>
<div class='ui-g-12 cx-container-centered-text'>
<button pButton
type='button'
Expand Down
Expand Up @@ -44,8 +44,9 @@ export class ConvertComicsSettingsComponent implements OnInit, OnDestroy {
) {
this.conversionForm = this.formBuilder.group({
archiveType: ['', Validators.required],
renamePages: ['', Validators.required],
deletePages: ['', Validators.required]
renamePages: [''],
deletePages: [''],
deleteOriginal: ['']
});
this.langChangeSubscription = this.translateService.onLangChange.subscribe(
() => this.loadTranslations()
Expand All @@ -72,6 +73,7 @@ export class ConvertComicsSettingsComponent implements OnInit, OnDestroy {
USER_PREFERENCE_DELETE_PAGES_ON_CONVERT
) || 'false') === 'true'
);
this.conversionForm.controls['deleteOriginal'].setValue(false);
}

ngOnDestroy() {
Expand Down Expand Up @@ -116,6 +118,8 @@ export class ConvertComicsSettingsComponent implements OnInit, OnDestroy {
const archiveType = this.conversionForm.controls['archiveType'].value;
const renamePages = this.conversionForm.controls['renamePages'].value;
const deletePages = this.conversionForm.controls['deletePages'].value;
const deleteOriginal = this.conversionForm.controls['deleteOriginal']
.value;
this.logger.debug(
`saving user preferences: archive type=${archiveType} renamePages=${renamePages} deletePages=${deletePages}`
);
Expand All @@ -136,7 +140,8 @@ export class ConvertComicsSettingsComponent implements OnInit, OnDestroy {
this.selectedComics,
archiveType,
renamePages,
deletePages
deletePages,
deleteOriginal
);
this.selectionAdaptor.clearComicSelections();
this.cancel.emit(true);
Expand Down
Expand Up @@ -361,7 +361,8 @@ describe('LibraryEffects', () => {
comics: COMICS,
archiveType: 'CBZ',
renamePages: true,
deletePages: true
deletePages: true,
deleteOriginal: true
});
const outcome = new LibraryComicsConverting();

Expand All @@ -381,7 +382,8 @@ describe('LibraryEffects', () => {
comics: COMICS,
archiveType: 'CBZ',
renamePages: true,
deletePages: true
deletePages: true,
deleteOriginal: true
});
const outcome = new LibraryConvertComicsFailed();

Expand All @@ -400,7 +402,8 @@ describe('LibraryEffects', () => {
comics: COMICS,
archiveType: 'CBZ',
renamePages: true,
deletePages: true
deletePages: true,
deleteOriginal: true
});
const outcome = new LibraryConvertComicsFailed();

Expand Down
3 changes: 2 additions & 1 deletion comixed-frontend/src/app/library/effects/library.effects.ts
Expand Up @@ -272,7 +272,8 @@ export class LibraryEffects {
action.comics,
action.archiveType,
action.renamePages,
action.deletePages
action.deletePages,
action.deleteOriginal
)
.pipe(
tap(response => this.logger.debug('received response:', response)),
Expand Down
Expand Up @@ -375,7 +375,8 @@ describe('Library Reducer', () => {
comics: COMICS,
archiveType: 'CBZ',
renamePages: true,
deletePages: true
deletePages: true,
deleteOriginal: true
})
);
});
Expand Down
Expand Up @@ -165,7 +165,7 @@ describe('LibraryService', () => {

it('can convert comics', () => {
service
.convertComics(COMICS, 'CBZ', true, false)
.convertComics(COMICS, 'CBZ', true, false, false)
.subscribe((response: HttpResponse<any>) =>
expect(response.status).toEqual(200)
);
Expand All @@ -176,9 +176,12 @@ describe('LibraryService', () => {
ids: COMICS.map(comic => comic.id),
archiveType: 'CBZ',
renamePages: true,
deletePages: false
deletePages: false,
deleteOriginal: false
} as ConvertComicsRequest);
req.flush(new HttpResponse<any>({ status: 200 }));
req.flush(
new HttpResponse<any>({ status: 200 })
);
});

it('can consolidate the library', () => {
Expand Down
9 changes: 6 additions & 3 deletions comixed-frontend/src/app/library/services/library.service.ts
Expand Up @@ -83,20 +83,23 @@ export class LibraryService {
comics: Comic[],
archiveType: string,
renamePages: boolean,
deletePages: boolean
deletePages: boolean,
deleteOriginal: boolean
): Observable<any> {
this.logger.debug(
'[POST] http request: converting comics:',
comics,
archiveType,
renamePages,
deletePages
deletePages,
deleteOriginal
);
return this.http.post(interpolate(CONVERT_COMICS_URL), {
ids: comics.map(comic => comic.id),
archiveType: archiveType,
renamePages: renamePages,
deletePages: deletePages
deletePages: deletePages,
deleteOriginal: deleteOriginal
} as ConvertComicsRequest);
}

Expand Down
3 changes: 2 additions & 1 deletion comixed-frontend/src/assets/i18n/en/library.json
Expand Up @@ -397,7 +397,8 @@
"label": {
"archive-type": "Archive Type",
"rename-pages": "Rename Pages",
"delete-pages": "Remove Deleted And Blocked Pages"
"delete-pages": "Remove Deleted And Blocked Pages",
"delete-original": "Delete Original Comic"
},
"option": {
"cbz": "CBZ (Zip)",
Expand Down
3 changes: 2 additions & 1 deletion comixed-frontend/src/assets/i18n/es/library.json
Expand Up @@ -397,7 +397,8 @@
"label": {
"archive-type": "Tipo de archivo",
"rename-pages": "Renombrar páginas",
"delete-pages": "Remove Deleted And Blocked Pages"
"delete-pages": "Remove Deleted And Blocked Pages",
"delete-original": "Delete Original Comic"
},
"option": {
"cbz": "CBZ (Zip)",
Expand Down
3 changes: 2 additions & 1 deletion comixed-frontend/src/assets/i18n/fr/library.json
Expand Up @@ -397,7 +397,8 @@
"label": {
"archive-type": "Type d'archives",
"rename-pages": "Renommer les pages",
"delete-pages": "Enlever les pages supprimées et bloquées"
"delete-pages": "Enlever les pages supprimées et bloquées",
"delete-original": "Supprimer la bande dessinée originale"
},
"option": {
"cbz": "CBZ (Zip)",
Expand Down
3 changes: 2 additions & 1 deletion comixed-frontend/src/assets/i18n/pt/library.json
Expand Up @@ -397,7 +397,8 @@
"label": {
"archive-type": "Archive Type",
"rename-pages": "Rename Pages",
"delete-pages": "Remove Deleted And Blocked Pages"
"delete-pages": "Remove Deleted And Blocked Pages",
"delete-original": "Delete Original Comic"
},
"option": {
"cbz": "CBZ (Zip)",
Expand Down
Expand Up @@ -337,7 +337,9 @@ public class Comic {
@JsonView({View.ComicList.class, View.LibraryUpdate.class})
private Integer duplicateCount;

@ManyToMany(mappedBy = "comics", cascade = CascadeType.ALL)
@ManyToMany(
mappedBy = "comics",
cascade = {CascadeType.ALL})
@JsonProperty("readingLists")
@JsonView({View.ComicList.class, View.LibraryUpdate.class})
@Getter
Expand Down Expand Up @@ -373,15 +375,18 @@ public void addFileEntry(ComicFileEntry fileEntry) {
}

if (replacement) {
log.debug("Removing existing file entry: [{}] {}", index, fileEntry.getFileName());
final ComicFileEntry deadEntry = fileEntries.get(index);
deadEntry.setComic(null);
fileEntries.remove(deadEntry);
log.debug("update existing file entry: [{}] {}", index, fileEntry.getFileName());
final ComicFileEntry updatedEntry = fileEntries.get(index);
updatedEntry.setComic(this);
updatedEntry.setFileNumber(index);
updatedEntry.setFileSize(fileEntry.getFileSize());
updatedEntry.setFileType(fileEntry.getFileType());
} else {
log.debug("Adding file entry: [{}] {}", index, fileEntry.getFileName());
fileEntry.setFileNumber(index);
this.fileEntries.add(index, fileEntry);
fileEntry.setComic(this);
}
log.debug("Adding file entry: [{}] {}", index, fileEntry.getFileName());
fileEntry.setFileNumber(index);
this.fileEntries.add(index, fileEntry);
fileEntry.setComic(this);
}

/**
Expand Down
Expand Up @@ -133,16 +133,19 @@ public void convertComics(@RequestBody() ConvertComicsRequest request) {
ArchiveType archiveType = request.getArchiveType();
boolean renamePages = request.isRenamePages();
boolean deletePages = request.isDeletePages();
boolean deleteOriginal = request.isDeleteOriginal();

log.info(
"Converting {} comic{} to {}{}{}",
"Converting {} comic{} to {}{}{}{}",
idList.size(),
idList.size() == 1 ? "" : "s",
archiveType,
renamePages ? " (rename pages)" : "",
deletePages ? " (delete pages)" : "");
deletePages ? " (delete pages)" : "",
deleteOriginal ? " (delete original comic)" : "");

this.libraryService.convertComics(idList, archiveType, renamePages, deletePages);
this.libraryService.convertComics(
idList, archiveType, renamePages, deletePages, deleteOriginal);
}

@PostMapping(
Expand Down
Expand Up @@ -50,14 +50,21 @@ public class ConvertComicsRequest {
@JsonProperty("deletePages")
private boolean deletePages;

@Getter
@Setter
@JsonProperty("deleteOriginal")
private boolean deleteOriginal;

public ConvertComicsRequest(
final List<Long> comicIdList,
final ArchiveType archiveType,
final boolean renamePages,
final Boolean deletePages) {
final Boolean deletePages,
final boolean deleteOriginal) {
this.comicIdList = comicIdList;
this.archiveType = archiveType;
this.renamePages = renamePages;
this.deletePages = deletePages;
this.deleteOriginal = deleteOriginal;
}
}
Expand Up @@ -60,6 +60,7 @@ public class LibraryControllerTest {
private static final String TEST_RENAMING_RULE = "PUBLISHER/SERIES/VOLUME/SERIES vVOLUME #ISSUE";
private static final String TEST_DESTINATION_DIRECTORY = "/home/comixedreader/Documents/comics";
private static final Boolean TEST_DELETE_PAGES = RANDOM.nextBoolean();
private static final Boolean TEST_DELETE_ORIGINAL_COMIC = RANDOM.nextBoolean();

@InjectMocks private LibraryController libraryController;
@Mock private LibraryService libraryService;
Expand Down Expand Up @@ -215,10 +216,19 @@ public void testGetUpdatedComicsNoResult() throws ComiXedUserException {
public void testConvertComics() {
libraryController.convertComics(
new ConvertComicsRequest(
comicIdList, TEST_ARCHIVE_TYPE, TEST_RENAME_PAGES, TEST_DELETE_PAGES));
comicIdList,
TEST_ARCHIVE_TYPE,
TEST_RENAME_PAGES,
TEST_DELETE_PAGES,
TEST_DELETE_ORIGINAL_COMIC));

Mockito.verify(libraryService, Mockito.times(1))
.convertComics(comicIdList, TEST_ARCHIVE_TYPE, TEST_RENAME_PAGES, TEST_DELETE_PAGES);
.convertComics(
comicIdList,
TEST_ARCHIVE_TYPE,
TEST_RENAME_PAGES,
TEST_DELETE_PAGES,
TEST_DELETE_ORIGINAL_COMIC);
}

@Test
Expand Down

0 comments on commit 92ec52f

Please sign in to comment.