feat: enhance content provider functionality with flag and sorting

This commit is contained in:
Rodrigo Verdiani 2026-04-10 10:14:53 -03:00
parent e4f672a5f8
commit d1b7fa4f89
4 changed files with 42 additions and 5 deletions

View File

@ -11,13 +11,15 @@ public record ContentProviderListDTO(@NotNull List<ContentProviderDTO> providers
contentProviders.stream().map(ContentProviderDTO::from).toList());
}
public record ContentProviderDTO(long id, @NotBlank String name, String url, boolean active) {
public record ContentProviderDTO(
long id, @NotBlank String name, String url, boolean active, boolean supportsContentFetch) {
public static ContentProviderDTO from(ContentProvider contentProvider) {
return new ContentProviderDTO(
contentProvider.getId(),
contentProvider.getName(),
contentProvider.getUrl(),
contentProvider.isActive());
contentProvider.isActive(),
contentProvider.getSupportsContentFetch());
}
}
}

View File

@ -7,7 +7,9 @@ import com.magamochi.common.exception.NotFoundException;
import com.magamochi.ingestion.model.dto.ContentProviderListDTO;
import com.magamochi.ingestion.model.entity.ContentProvider;
import com.magamochi.ingestion.model.repository.ContentProviderRepository;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
@ -16,7 +18,7 @@ public class ContentProviderService {
private final ContentProviderRepository contentProviderRepository;
public ContentProviderListDTO getProviders(Boolean manualImport) {
var providers = contentProviderRepository.findAll();
var providers = contentProviderRepository.findAll(Sort.by(Sort.Direction.ASC, "name"));
if (nonNull(manualImport) && manualImport) {
providers = providers.stream().filter(ContentProvider::getManualImport).toList();
@ -34,6 +36,14 @@ public class ContentProviderService {
"Content Provider not found (ID: " + contentProviderId + ")."));
}
public List<ContentProvider> getUpdatableProviders() {
return contentProviderRepository.findAll().stream()
.filter(
contentProvider ->
contentProvider.isActive() && contentProvider.getSupportsContentFetch())
.toList();
}
public ContentProvider getManualImportProvider(Long providerId) {
var provider = find(providerId);

View File

@ -37,6 +37,17 @@ public class IngestionService {
public void fetchContentProviderMangas(long contentProviderId) {
var contentProvider = contentProviderService.find(contentProviderId);
if (!contentProvider.isActive()) {
throw new IllegalStateException(
"Content provider is not active: " + contentProvider.getName());
}
if (!contentProvider.getSupportsContentFetch()) {
throw new IllegalArgumentException(
"Content provider does not support content fetch: " + contentProvider.getName());
}
var pagedContentProvider =
pagedContentProviderFactory.getPagedContentProvider(contentProvider.getName());
var pages = pagedContentProvider.getTotalPages();
@ -50,6 +61,12 @@ public class IngestionService {
public void fetchProviderPageMangas(long providerId, int page) {
var contentProvider = contentProviderService.find(providerId);
if (!contentProvider.isActive()) {
throw new IllegalStateException(
"Content provider is not active: " + contentProvider.getName());
}
var pagedContentProvider =
pagedContentProviderFactory.getPagedContentProvider(contentProvider.getName());
@ -62,8 +79,9 @@ public class IngestionService {
}
public void fetchAllContentProviderMangas() {
var contentProviders = contentProviderService.getProviders(null);
contentProviders.providers().forEach(dto -> fetchContentProviderMangas(dto.id()));
var contentProviders = contentProviderService.getUpdatableProviders();
contentProviders.forEach(
contentProvider -> fetchContentProviderMangas(contentProvider.getId()));
}
public void fetchMangaContentProviderContentList(Long mangaContentProviderId) {

View File

@ -0,0 +1,7 @@
UPDATE content_providers
SET supports_content_fetch = FALSE
WHERE name = 'MangaDex';
UPDATE content_providers
SET url = 'https://mangadex.org/'
WHERE name = 'MangaDex';