feat(api, build): Upgrade to Java 25, Gradle 9, and Spring Boot 4, Jackson 3 (#2597)

* refactor: simplify RestTemplate and ObjectMapper configurations, add no-args constructors to progress classes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* chore: update Gradle and Java versions in Docker configuration and build files

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* test: enhance header assertions in tests and add spring-boot-test-autoconfigure dependency

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(tests): migrate to SpringBootTest and update entity management in test cases

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* test: update test property configurations for H2 database in Healthcheck and BookOpds repository tests

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* test: clean up HealthcheckControllerTest by removing unnecessary whitespace and comments

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* test: remove unnecessary whitespace in HealthcheckControllerTest

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* chore: downgrade Flyway version from 12.0.0 to 11.14.1 in build.gradle

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* chore: downgrade Flyway version from 12.0.0 to 11.14.1 in build.gradle

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add @DependsOn annotation for Flyway in MultipartConfig

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add @DependsOn annotation for Flyway in LibraryService

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add test configuration for Flyway in HealthcheckControllerTest
chore: remove unused path variable in deleteLibrary method of LibraryService

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: configure Flyway migration and update test configuration

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: enable remote debugging in bootRun configuration

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: update Flyway version and enhance ObjectMapper configuration

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: remove @DependsOn annotation for Flyway in MultipartConfig and LibraryService

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add NoArgsConstructor and AllArgsConstructor annotations to DTO classes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add NoArgsConstructor and AllArgsConstructor annotations to FileProcessResult, MetadataUpdateContext, and MetadataUpdateWrapper classes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add DependsOnDatabaseInitialization annotation to MultipartConfig, AppSettingService, LibraryService, and JwtSecretService classes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add DependsOnDatabaseInitialization annotation to MultipartConfig and CronService classes

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: implement lazy initialization and thread safety for JWT secret retrieval

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add Flyway dependency and update LibraryService initialization to use ApplicationReadyEvent

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor: remove outdated comments from JwtSecretService class

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor: migrate from com.fasterxml.jackson to tools.jackson for JSON processing

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor: remove unused ObjectMapper bean and related imports from JacksonConfig

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: configure async support with VirtualThreadTaskExecutor in WebMvcConfig

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: enhance application performance with virtual threads and HTTP/2 support

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add JsonSetter annotation to skip null values for triggeredByCron field

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: add triggeredByCron field to TaskCreateRequest and initialize in task management

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* feat: enable Spring Data web support with DTO serialization in WebMvcConfig

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(UserDefaultsService): simplify class structure and remove unused methods

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(BookOpdsRepositoryDataJpaTest): simplify test setup and use TestEntityManager

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(BookOpdsRepositoryDataJpaTest): update test configuration and simplify entity persistence

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor: update Jackson dependencies and migrate to Jackson 3

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(build.gradle): update jackson-annotations dependency to use Jackson 3 BOM

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(BookOpdsRepositoryDataJpaTest): remove unused ObjectMapper bean definition

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

* refactor(LibraryService): simplify library deletion logic

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>

---------

Signed-off-by: Balázs Szücs <bszucs1209@gmail.com>
This commit is contained in:
Balázs Szücs
2026-02-08 18:15:16 +01:00
committed by GitHub
parent e462b6c197
commit 108d94c0f7
147 changed files with 771 additions and 518 deletions

View File

@@ -1,8 +1,8 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.8'
id 'org.springframework.boot' version '4.0.2'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.hibernate.orm' version '6.6.36.Final'
id 'org.hibernate.orm' version '7.2.0.Final'
id 'com.github.ben-manes.versions' version '0.53.0'
}
@@ -11,7 +11,7 @@ version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
languageVersion = JavaLanguageVersion.of(25)
}
}
@@ -41,7 +41,8 @@ dependencies {
implementation 'io.projectreactor:reactor-core'
// --- Database & Migration ---
implementation 'org.mariadb.jdbc:mariadb-java-client:3.5.6'
implementation 'org.mariadb.jdbc:mariadb-java-client:3.5.7'
implementation 'org.springframework.boot:spring-boot-starter-flyway'
implementation 'org.flywaydb:flyway-mysql:11.19.0'
// --- Security & Authentication ---
@@ -77,7 +78,6 @@ dependencies {
implementation 'com.github.junrar:junrar:7.5.7'
// --- JSON & Web Scraping ---
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.1'
implementation 'org.jsoup:jsoup:1.21.2'
// --- Mapping (DTOs & Entities) ---
@@ -93,11 +93,22 @@ dependencies {
// --- Template Engine ---
implementation 'org.freemarker:freemarker:2.3.34'
// --- Jackson 3 ---
implementation platform('tools.jackson:jackson-bom:3.0.4')
implementation 'tools.jackson.core:jackson-core'
implementation 'tools.jackson.core:jackson-databind'
implementation 'tools.jackson.module:jackson-module-blackbird'
// --- Jackson 2 (Compatibility) ---
// jackson-annotations version is managed by Jackson 3 BOM (requires 2.20+)
implementation 'com.fasterxml.jackson.core:jackson-annotations'
// --- Caching ---
implementation 'com.github.ben-manes.caffeine:caffeine:3.2.0'
// --- Test Dependencies ---
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-test-autoconfigure'
testImplementation 'org.assertj:assertj-core:3.27.6'
testImplementation "org.mockito:mockito-inline:5.2.0"
testRuntimeOnly 'com.h2database:h2'
@@ -119,4 +130,8 @@ bootRun {
if (debug.equals("true")) {
jvmArgs("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005")
}
}
bootJar {
mainClass = 'org.booklore.BookloreApplication'
}

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

View File

@@ -2,12 +2,13 @@ package org.booklore.config;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.socket.config.WebSocketMessageBrokerStats;
import java.net.http.HttpClient;
import java.time.Duration;
@Configuration
@@ -17,13 +18,16 @@ public class BeanConfig {
private WebSocketMessageBrokerStats webSocketMessageBrokerStats;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.connectTimeout(Duration.ofSeconds(10)).readTimeout(Duration.ofSeconds(15))
.build();
public RestTemplate restTemplate(HttpClient httpClient) {
JdkClientHttpRequestFactory factory = new JdkClientHttpRequestFactory(httpClient);
factory.setReadTimeout(Duration.ofSeconds(15));
return new RestTemplate(factory);
}
@PostConstruct
public void init() {
webSocketMessageBrokerStats.setLoggingPeriod(30 * 24 * 60 * 60 * 1000L); // 30 days
}
}

View File

@@ -0,0 +1,22 @@
package org.booklore.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.http.HttpClient;
import java.time.Duration;
import java.util.concurrent.Executors;
@Configuration
public class HttpClientConfig {
@Bean
public HttpClient httpClient() {
return HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.followRedirects(HttpClient.Redirect.NORMAL)
.executor(Executors.newVirtualThreadPerTaskExecutor())
.build();
}
}

View File

@@ -1,12 +1,11 @@
package org.booklore.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.ser.BeanPropertyWriter;
import tools.jackson.databind.ser.ValueSerializerModifier;
import java.util.List;
import java.util.stream.Collectors;
@@ -20,25 +19,24 @@ public class JacksonConfig {
public static final String KOMGA_CLEAN_OBJECT_MAPPER = "komgaCleanObjectMapper";
@Bean(name = KOMGA_CLEAN_OBJECT_MAPPER)
public ObjectMapper komgaCleanObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.build();
public ObjectMapper komgaCleanObjectMapper() {
return JsonMapper.builder()
.findAndAddModules()
.serializerFactory(
tools.jackson.databind.ser.BeanSerializerFactory.instance
.withSerializerModifier(new ValueSerializerModifier() {
@Override
public List<BeanPropertyWriter> changeProperties(
tools.jackson.databind.SerializationConfig config,
tools.jackson.databind.BeanDescription.Supplier beanDescSupplier,
List<BeanPropertyWriter> beanProperties) {
// Register the custom serializer modifier on this dedicated mapper only
mapper.setSerializerFactory(
mapper.getSerializerFactory().withSerializerModifier(new BeanSerializerModifier() {
@Override
public List<BeanPropertyWriter> changeProperties(
com.fasterxml.jackson.databind.SerializationConfig config,
com.fasterxml.jackson.databind.BeanDescription beanDesc,
List<BeanPropertyWriter> beanProperties) {
return beanProperties.stream()
.map(KomgaCleanBeanPropertyWriter::new)
.collect(Collectors.toList());
}
})
);
return mapper;
return beanProperties.stream()
.map(KomgaCleanBeanPropertyWriter::new)
.collect(Collectors.toList());
}
})
)
.build();
}
}

View File

@@ -1,9 +1,9 @@
package org.booklore.config;
import org.booklore.context.KomgaCleanContext;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import tools.jackson.core.JsonGenerator;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ser.BeanPropertyWriter;
import java.util.Collection;
@@ -21,7 +21,7 @@ public class KomgaCleanBeanPropertyWriter extends BeanPropertyWriter {
}
@Override
public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
public void serializeAsProperty(Object bean, JsonGenerator gen, SerializationContext prov) throws Exception {
if (KomgaCleanContext.isCleanMode()) {
String propertyName = getName();
@@ -43,6 +43,6 @@ public class KomgaCleanBeanPropertyWriter extends BeanPropertyWriter {
}
// Default behavior
super.serializeAsField(bean, gen, prov);
super.serializeAsProperty(bean, gen, prov);
}
}

View File

@@ -1,8 +1,6 @@
package org.booklore.config;
import org.booklore.service.appsettings.AppSettingService;
import jakarta.servlet.MultipartConfigElement;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;
@@ -10,13 +8,17 @@ import org.springframework.util.unit.DataSize;
@Configuration
public class MultipartConfig {
@Bean
public MultipartConfigElement multipartConfigElement(AppSettingService appSettingService) {
MultipartConfigFactory factory = new MultipartConfigFactory();
long maxSizeMb = appSettingService.getAppSettings().getMaxFileUploadSizeInMb();
private static final long DEFAULT_MAX_UPLOAD_SIZE_MB = 1024;
factory.setMaxFileSize(DataSize.ofMegabytes(maxSizeMb));
factory.setMaxRequestSize(DataSize.ofMegabytes(maxSizeMb));
return factory.createMultipartConfig();
/**
* Provides a MultipartConfigElement with a generous default max upload size.
* The actual user-configured limit from app_settings is enforced at the service layer.
* This bean is created during servlet container initialization (before Flyway migrations run),
* so it must NOT query the database.
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
long maxSizeBytes = DataSize.ofMegabytes(DEFAULT_MAX_UPLOAD_SIZE_MB).toBytes();
return new MultipartConfigElement("", maxSizeBytes, maxSizeBytes, 0);
}
}

View File

@@ -2,16 +2,25 @@ package org.booklore.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.VirtualThreadTaskExecutor;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler;
@Configuration
public class TaskExecutorConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
public AsyncTaskExecutor taskExecutor() {
return new VirtualThreadTaskExecutor("async-");
}
@Bean
public TaskScheduler taskScheduler() {
SimpleAsyncTaskScheduler scheduler = new SimpleAsyncTaskScheduler();
scheduler.setVirtualThreads(true);
scheduler.setThreadNamePrefix("scheduler-");
return scheduler;
}
}

View File

@@ -1,14 +1,20 @@
package org.booklore.config;
import lombok.RequiredArgsConstructor;
import org.booklore.interceptor.KomgaCleanInterceptor;
import org.booklore.interceptor.KomgaEnabledInterceptor;
import org.booklore.interceptor.OpdsEnabledInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.VirtualThreadTaskExecutor;
import org.springframework.data.web.config.EnableSpringDataWebSupport;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import static org.springframework.data.web.config.EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO;
@Configuration
@EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO)
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
@@ -16,6 +22,11 @@ public class WebMvcConfig implements WebMvcConfigurer {
private final KomgaEnabledInterceptor komgaEnabledInterceptor;
private final KomgaCleanInterceptor komgaCleanInterceptor;
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setTaskExecutor(new VirtualThreadTaskExecutor("mvc-async-"));
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(opdsEnabledInterceptor)

View File

@@ -1,17 +1,17 @@
package org.booklore.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.booklore.model.dto.settings.AppSettingKey;
import org.booklore.model.dto.settings.AppSettings;
import org.booklore.model.dto.settings.SettingRequest;
import org.booklore.service.appsettings.AppSettingService;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import tools.jackson.core.JacksonException;
import java.util.List;
@@ -36,7 +36,7 @@ public class AppSettingController {
@ApiResponse(responseCode = "400", description = "Invalid request")
})
@PutMapping
public void updateSettings(@Parameter(description = "List of settings to update") @RequestBody List<SettingRequest> settingRequests) throws JsonProcessingException {
public void updateSettings(@Parameter(description = "List of settings to update") @RequestBody List<SettingRequest> settingRequests) throws JacksonException {
for (SettingRequest settingRequest : settingRequests) {
AppSettingKey key = AppSettingKey.valueOf(settingRequest.getName());
appSettingService.updateSetting(key, settingRequest.getValue());

View File

@@ -1,19 +1,5 @@
package org.booklore.controller;
import org.booklore.model.dto.BookLoreUser;
import org.booklore.model.dto.Shelf;
import org.booklore.model.dto.kobo.KoboAuthentication;
import org.booklore.model.dto.kobo.KoboReadingState;
import org.booklore.model.dto.kobo.KoboReadingStateList;
import org.booklore.model.dto.kobo.KoboReadingStateRequest;
import org.booklore.model.dto.kobo.KoboResources;
import org.booklore.model.dto.kobo.KoboTestResponse;
import org.booklore.service.ShelfService;
import org.booklore.service.book.BookDownloadService;
import org.booklore.service.book.BookService;
import org.booklore.service.kobo.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -24,10 +10,19 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.booklore.model.dto.BookLoreUser;
import org.booklore.model.dto.Shelf;
import org.booklore.model.dto.kobo.*;
import org.booklore.service.ShelfService;
import org.booklore.service.book.BookDownloadService;
import org.booklore.service.book.BookService;
import org.booklore.service.kobo.*;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.JsonNode;
import java.util.List;
import java.util.Set;
@@ -61,7 +56,7 @@ public class KoboController {
@Operation(summary = "Initialize Kobo resources", description = "Initialize Kobo resources for the device.")
@ApiResponse(responseCode = "200", description = "Initialization successful")
@GetMapping("/v1/initialization")
public ResponseEntity<KoboResources> initialization() throws JsonProcessingException {
public ResponseEntity<KoboResources> initialization() throws JacksonException {
return koboInitializationService.initialize(token);
}

View File

@@ -1,23 +1,26 @@
package org.booklore.controller;
import org.booklore.config.JacksonConfig;
import org.booklore.mapper.komga.KomgaMapper;
import org.booklore.model.dto.komga.*;
import org.booklore.service.book.BookService;
import org.booklore.service.komga.KomgaService;
import org.booklore.service.opds.OpdsUserV2Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.config.JacksonConfig;
import org.booklore.mapper.komga.KomgaMapper;
import org.booklore.model.dto.komga.KomgaBookDto;
import org.booklore.model.dto.komga.KomgaLibraryDto;
import org.booklore.model.dto.komga.KomgaPageableDto;
import org.booklore.model.dto.komga.KomgaSeriesDto;
import org.booklore.service.book.BookService;
import org.booklore.service.komga.KomgaService;
import org.booklore.service.opds.OpdsUserV2Service;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import tools.jackson.databind.ObjectMapper;
import java.util.List;

View File

@@ -1,16 +1,5 @@
package org.booklore.controller;
import org.booklore.config.security.service.AuthenticationService;
import org.booklore.exception.ApiError;
import org.booklore.exception.APIException;
import org.booklore.model.dto.settings.OidcAutoProvisionDetails;
import org.booklore.model.dto.settings.OidcProviderDetails;
import org.booklore.model.entity.BookLoreUserEntity;
import org.booklore.repository.UserRepository;
import org.booklore.service.appsettings.AppSettingService;
import org.booklore.service.user.UserProvisioningService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.SignedJWT;
import io.swagger.v3.oas.annotations.Operation;
@@ -20,11 +9,22 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.config.security.service.AuthenticationService;
import org.booklore.exception.APIException;
import org.booklore.exception.ApiError;
import org.booklore.model.dto.settings.OidcAutoProvisionDetails;
import org.booklore.model.dto.settings.OidcProviderDetails;
import org.booklore.model.entity.BookLoreUserEntity;
import org.booklore.repository.UserRepository;
import org.booklore.service.appsettings.AppSettingService;
import org.booklore.service.user.UserProvisioningService;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.URLEncoder;

View File

@@ -1,12 +1,12 @@
package org.booklore.convertor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.entity.BookFileEntity.AudioFileChapter;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.List;
@@ -24,7 +24,7 @@ public class AudioFileChapterListConverter implements AttributeConverter<List<Au
}
try {
return objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting chapter list to JSON", e);
return null;
}
@@ -37,7 +37,7 @@ public class AudioFileChapterListConverter implements AttributeConverter<List<Au
}
try {
return objectMapper.readValue(dbData, LIST_TYPE_REF);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting JSON to chapter list", e);
return null;
}

View File

@@ -1,13 +1,12 @@
package org.booklore.convertor;
import org.booklore.model.dto.BookRecommendationLite;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.BookRecommendationLite;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.Set;
@@ -18,10 +17,6 @@ public class BookRecommendationIdsListConverter implements AttributeConverter<Se
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final TypeReference<Set<BookRecommendationLite>> SET_TYPE_REF = new TypeReference<>() {};
static {
objectMapper.registerModule(new JavaTimeModule());
}
@Override
public String convertToDatabaseColumn(Set<BookRecommendationLite> recommendations) {
if (recommendations == null) {
@@ -29,7 +24,7 @@ public class BookRecommendationIdsListConverter implements AttributeConverter<Se
}
try {
return objectMapper.writeValueAsString(recommendations);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Failed to convert BookRecommendation set to JSON string: {}", recommendations, e);
throw new RuntimeException("Error converting BookRecommendation list to JSON", e);
}

View File

@@ -1,12 +1,12 @@
package org.booklore.convertor;
import org.booklore.model.enums.BookFileType;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.enums.BookFileType;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.List;
@@ -25,7 +25,7 @@ public class FormatPriorityConverter implements AttributeConverter<List<BookFile
}
try {
return objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting format priority list to JSON", e);
return null;
}
@@ -38,7 +38,7 @@ public class FormatPriorityConverter implements AttributeConverter<List<BookFile
}
try {
return objectMapper.readValue(dbData, LIST_TYPE_REF);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting JSON to format priority list", e);
return Collections.emptyList();
}

View File

@@ -1,11 +1,11 @@
package org.booklore.convertor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.Map;
@@ -23,7 +23,7 @@ public class JpaJsonConverter implements AttributeConverter<Map<String, Object>,
}
try {
return objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting map to JSON", e);
return null;
}
@@ -36,7 +36,7 @@ public class JpaJsonConverter implements AttributeConverter<Map<String, Object>,
}
try {
return objectMapper.readValue(dbData, MAP_TYPE_REF);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Error converting JSON to map", e);
return null;
}

View File

@@ -1,12 +1,12 @@
package org.booklore.convertor;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Map;
@Converter(autoApply = true)
@@ -23,7 +23,7 @@ public class MapToStringConverter implements AttributeConverter<Map<String, Obje
}
try {
return objectMapper.writeValueAsString(attribute);
} catch (IOException e) {
} catch (JacksonException e) {
log.error("Failed to convert map to JSON string: {}", attribute, e);
throw new IllegalArgumentException("Error converting Map to String", e);
}
@@ -36,7 +36,7 @@ public class MapToStringConverter implements AttributeConverter<Map<String, Obje
}
try {
return objectMapper.readValue(dbData, MAP_TYPE_REF);
} catch (IOException e) {
} catch (JacksonException e) {
log.error("Failed to convert JSON string to map: {}", dbData, e);
throw new IllegalArgumentException("Error converting String to Map", e);
}

View File

@@ -1,14 +1,15 @@
package org.booklore.crons;
import jakarta.annotation.PostConstruct;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.config.AppProperties;
import org.booklore.model.dto.BookloreTelemetry;
import org.booklore.model.dto.InstallationPing;
import org.booklore.model.dto.settings.AppSettings;
import org.booklore.service.TelemetryService;
import org.booklore.service.appsettings.AppSettingService;
import jakarta.annotation.PostConstruct;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@@ -19,6 +20,7 @@ import java.util.concurrent.TimeUnit;
@Service
@AllArgsConstructor
@DependsOnDatabaseInitialization
@Slf4j
public class CronService {

View File

@@ -1,15 +1,15 @@
package org.booklore.mapper;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.BookMetadata;
import org.booklore.model.dto.FetchedProposal;
import org.booklore.model.entity.MetadataFetchProposalEntity;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.springframework.beans.factory.annotation.Autowired;
import tools.jackson.databind.ObjectMapper;
@Mapper(componentModel = "spring")
@Slf4j

View File

@@ -1,18 +1,17 @@
package org.booklore.mapper;
import org.booklore.model.dto.BookMetadata;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.ObjectMapper;
public class JsonMetadataMapper {
private static final ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
private static final ObjectMapper objectMapper = new ObjectMapper();
public static BookMetadata parse(String json) {
try {
return objectMapper.readValue(json, BookMetadata.class);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
return null;
}
}
@@ -20,7 +19,7 @@ public class JsonMetadataMapper {
public static String toJson(BookMetadata metadata) {
try {
return objectMapper.writeValueAsString(metadata);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
return null;
}
}

View File

@@ -2,11 +2,11 @@ package org.booklore.mapper;
import org.booklore.model.dto.kobo.KoboReadingState;
import org.booklore.model.entity.KoboReadingStateEntity;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.ObjectMapper;
import java.util.regex.Pattern;
@@ -38,7 +38,7 @@ public interface KoboReadingStateMapper {
default String toJson(Object value) {
try {
return value == null ? null : objectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
throw new RuntimeException("Failed to serialize JSON", e);
}
}
@@ -46,7 +46,7 @@ public interface KoboReadingStateMapper {
default <T> T fromJson(String json, Class<T> clazz) {
try {
return json == null ? null : objectMapper.readValue(json, clazz);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
throw new RuntimeException("Failed to deserialize JSON", e);
}
}

View File

@@ -1,5 +1,7 @@
package org.booklore.mapper.custom;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.mapper.LibraryMapper;
import org.booklore.model.dto.BookLoreUser;
import org.booklore.model.dto.settings.SidebarSortOption;
@@ -7,11 +9,9 @@ import org.booklore.model.dto.settings.UserSettingKey;
import org.booklore.model.entity.BookLoreUserEntity;
import org.booklore.model.entity.UserSettingEntity;
import org.booklore.model.enums.UserPermission;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.stream.Collectors;

View File

@@ -1,8 +1,10 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.time.LocalDate;
@@ -11,6 +13,8 @@ import java.util.Set;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileBookDetail {
private Long id;
@@ -49,6 +53,8 @@ public class MobileBookDetail {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class EpubProgress {
private String cfi;
private String href;
@@ -58,6 +64,8 @@ public class MobileBookDetail {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PdfProgress {
private Integer page;
private Float percentage;
@@ -66,6 +74,8 @@ public class MobileBookDetail {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CbxProgress {
private Integer page;
private Float percentage;
@@ -74,6 +84,8 @@ public class MobileBookDetail {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AudiobookProgress {
private Long positionMs;
private Integer trackIndex;

View File

@@ -1,13 +1,17 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileBookFile {
private Long id;

View File

@@ -1,14 +1,18 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileBookSummary {
private Long id;

View File

@@ -1,11 +1,15 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileLibrarySummary {
private Long id;

View File

@@ -1,11 +1,15 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileMagicShelfSummary {
private Long id;

View File

@@ -1,13 +1,17 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobilePageResponse<T> {
private List<T> content;

View File

@@ -1,11 +1,15 @@
package org.booklore.mobile.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MobileShelfSummary {
private Long id;

View File

@@ -1,17 +1,16 @@
package org.booklore.model;
import lombok.*;
import org.booklore.model.dto.Book;
import org.booklore.model.enums.FileProcessStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Builder
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class FileProcessResult {
private final Book book;
private final FileProcessStatus status;
private Book book;
private FileProcessStatus status;
}

View File

@@ -1,12 +1,16 @@
package org.booklore.model;
import org.booklore.model.entity.BookEntity;
import org.booklore.model.enums.MetadataReplaceMode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.entity.BookEntity;
import org.booklore.model.enums.MetadataReplaceMode;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MetadataUpdateContext {
private BookEntity bookEntity;
private MetadataUpdateWrapper metadataUpdateWrapper;

View File

@@ -1,11 +1,15 @@
package org.booklore.model;
import org.booklore.model.dto.BookMetadata;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.dto.BookMetadata;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MetadataUpdateWrapper {
private BookMetadata metadata;
@Builder.Default

View File

@@ -1,9 +1,10 @@
package org.booklore.model.dto;
import org.booklore.model.dto.progress.*;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;
import lombok.Data;
import org.booklore.model.dto.progress.*;
import java.time.Instant;
import java.util.List;
import java.util.Set;

View File

@@ -1,10 +1,10 @@
package org.booklore.model.dto;
import org.booklore.model.enums.BookFileType;
import org.booklore.util.ArchiveUtils;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;
import lombok.Data;
import org.booklore.model.enums.BookFileType;
import org.booklore.util.ArchiveUtils;
import java.time.Instant;

View File

@@ -1,12 +1,13 @@
package org.booklore.model.dto;
import org.booklore.model.dto.settings.SidebarSortOption;
import org.booklore.model.enums.*;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.dto.settings.SidebarSortOption;
import org.booklore.model.enums.*;
import java.util.List;
@@ -82,6 +83,7 @@ public class BookLoreUser {
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class TableColumnPreference {
private String field;
private Boolean visible;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookViewerSetting {
private int pageNumber;
private String zoom;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BookViewerSettings {
private PdfViewerPreferences pdfSettings;
private NewPdfViewerPreferences newPdfSettings;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BookWithNeighbors {
private Book currentBook;
private Long previousBookId;

View File

@@ -1,8 +1,6 @@
package org.booklore.model.dto;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.*;
import java.util.List;
import java.util.Map;
@@ -10,6 +8,8 @@ import java.util.Map;
@Builder
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class BookloreTelemetry {
private int telemetryVersion;
private String installationId;
@@ -39,6 +39,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class UserStatistics {
private int totalUsers;
private int totalLocalUsers;
@@ -48,6 +50,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class MetadataStatistics {
private String[] enabledMetadataProviders;
private String[] enabledReviewMetadataProviders;
@@ -60,6 +64,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class OpdsStatistics {
private boolean opdsEnabled;
private int totalOpdsUsers;
@@ -67,6 +73,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class KoboStatistics {
private int totalKoboUsers;
private int totalHardcoverSyncEnabled;
@@ -76,6 +84,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class EmailStatistics {
private int totalEmailProviders;
private int totalEmailRecipients;
@@ -83,6 +93,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class BookStatistics {
private long totalBooks;
private Map<String, Long> bookCountByType;
@@ -90,6 +102,8 @@ public class BookloreTelemetry {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class LibraryStatistics {
private long bookCount;
private int totalLibraryPaths;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto;
import org.booklore.model.enums.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.*;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CbxViewerPreferences {
private Long bookId;
private CbxPageSpread pageSpread;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EbookViewerPreferences {
private Long bookId;
private Long userId;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EpubViewerPreferences {
private Long bookId;
private String theme;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileMoveResult {
private boolean moved;
private String newFileName;

View File

@@ -1,12 +1,16 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HealthcheckResponse {
private String status;
private String message;

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.time.Instant;
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class InstallationPing {
private int pingVersion;
private String appVersion;

View File

@@ -5,13 +5,17 @@ import org.booklore.model.enums.IconType;
import org.booklore.model.enums.LibraryOrganizationMode;
import org.booklore.model.enums.MetadataSource;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Library {
private Long id;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LibraryPath {
private Long id;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto;
import org.booklore.model.enums.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.*;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NewPdfViewerPreferences {
private Long bookId;
private NewPdfPageSpread pageSpread;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PdfViewerPreferences {
private Long bookId;
private String zoom;

View File

@@ -1,12 +1,16 @@
package org.booklore.model.dto;
import org.booklore.model.enums.IconType;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.IconType;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Shelf {
private Long id;

View File

@@ -2,12 +2,12 @@ package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,11 +1,11 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,11 +1,11 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,11 +1,11 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@Builder

View File

@@ -2,12 +2,12 @@ package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,13 +1,13 @@
package org.booklore.model.dto.kobo;
import org.booklore.model.enums.KoboReadStatus;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.KoboReadStatus;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,8 +1,8 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
import java.util.ArrayList;
import java.util.Collection;

View File

@@ -1,14 +1,18 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public class KoboReadingStateRequest {
private List<KoboReadingState> readingStates;

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
import java.util.List;

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.kobo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@Data
@NoArgsConstructor

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto.progress;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AudiobookProgress {
@NotNull
Long positionMs;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto.progress;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CbxProgress {
@NotNull
Integer page;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto.progress;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EpubProgress {
@NotNull
String cfi;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.progress;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KoProgress {
private Float percentage;
}

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.progress;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KoboProgress {
private Float percentage;
}

View File

@@ -1,12 +1,12 @@
package org.booklore.model.dto.progress;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import lombok.*;
@Data
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class KoreaderProgress {
private Long timestamp;
private String document;

View File

@@ -1,11 +1,15 @@
package org.booklore.model.dto.progress;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PdfProgress {
@NotNull
Integer page;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CoverFetchRequest {
private String isbn;
private String title;

View File

@@ -7,14 +7,17 @@ import org.booklore.model.enums.MetadataSource;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreateLibraryRequest {
@NotBlank(message = "Library name must not be empty.")

View File

@@ -2,13 +2,17 @@ package org.booklore.model.dto.request;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreatePhysicalBookRequest {
@NotNull(message = "Library ID must not be null.")

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto.request;
import org.booklore.model.enums.MetadataProvider;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.MetadataProvider;
import java.util.List;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FetchMetadataRequest {
private Long bookId;
private List<MetadataProvider> providers;

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto.request;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Set;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MetadataRefreshRequest {
@NotNull(message = "Refresh type cannot be null")
private RefreshType refreshType;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SetMetadataRequest {
private String googleBookId;
}

View File

@@ -1,14 +1,18 @@
package org.booklore.model.dto.request;
import org.booklore.model.enums.IconType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.IconType;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShelfCreateRequest {
@Null(message = "Id should be null for creation.")
private Long id;

View File

@@ -1,14 +1,16 @@
package org.booklore.model.dto.request;
import org.booklore.model.enums.TaskType;
import org.booklore.task.options.LibraryRescanOptions;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.Nulls;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.TaskType;
import org.booklore.task.options.LibraryRescanOptions;
import tools.jackson.databind.ObjectMapper;
@Data
@Builder
@@ -18,6 +20,7 @@ public class TaskCreateRequest {
private String taskId;
private TaskType taskType;
@Builder.Default
@JsonSetter(nulls = Nulls.SKIP)
private boolean triggeredByCron = false;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "taskType", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookdropBatchResult {
private int totalFiles;
private int successfullyImported;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookdropBulkEditResult {
private int totalFiles;
private int successfullyUpdated;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookdropFileResult {
private String fileName;
private boolean success;

View File

@@ -1,7 +1,9 @@
package org.booklore.model.dto.response;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.util.ArrayList;
@@ -9,6 +11,8 @@ import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookdropFinalizeResult {
private int totalFiles;
private int successfullyImported;

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto.response;
import org.booklore.model.dto.BookMetadata;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.dto.BookMetadata;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BookdropPatternExtractResult {
private int totalFiles;
private int successfullyExtracted;
@@ -16,6 +20,8 @@ public class BookdropPatternExtractResult {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class FileExtractionResult {
private Long fileId;
private String fileName;

View File

@@ -1,12 +1,16 @@
package org.booklore.model.dto.response;
import org.booklore.task.TaskStatus;
import org.booklore.model.enums.TaskType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.TaskType;
import org.booklore.task.TaskStatus;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TaskCreateResponse {
private String taskId;
private TaskType taskType;

View File

@@ -1,18 +1,24 @@
package org.booklore.model.dto.response.kobo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class KoboReadingStateResponse {
private String requestResult;
private List<UpdateResult> updateResults;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class UpdateResult {
private String entitlementId;
private Result currentBookmarkResult;
@@ -22,6 +28,8 @@ public class KoboReadingStateResponse {
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Result {
private String result;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.settings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CoverCroppingSettings {
private boolean verticalCroppingEnabled;
private boolean horizontalCroppingEnabled;

View File

@@ -1,10 +1,14 @@
package org.booklore.model.dto.settings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KoboSettings {
private boolean convertToKepub;
private int conversionLimitInMb;

View File

@@ -1,17 +1,19 @@
package org.booklore.model.dto.settings;
import org.booklore.model.entity.LibraryEntity;
import org.booklore.model.entity.LibraryPathEntity;
import org.booklore.model.enums.BookFileType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.entity.LibraryEntity;
import org.booklore.model.entity.LibraryPathEntity;
import org.booklore.model.enums.BookFileType;
import java.nio.file.Path;
import java.nio.file.Paths;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LibraryFile {
private LibraryEntity libraryEntity;

View File

@@ -1,5 +1,6 @@
package org.booklore.model.dto.settings;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -9,6 +10,7 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class MetadataPersistenceSettings {
private SaveToOriginalFile saveToOriginalFile;
private boolean convertCbrCb7ToCbz;
@@ -19,6 +21,7 @@ public class MetadataPersistenceSettings {
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class SaveToOriginalFile {
private FormatSettings epub;
private FormatSettings pdf;

View File

@@ -1,13 +1,17 @@
package org.booklore.model.dto.settings;
import org.booklore.model.enums.MetadataProvider;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.booklore.model.enums.MetadataProvider;
import java.util.Set;
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MetadataPublicReviewsSettings {
private boolean downloadEnabled;
@@ -16,6 +20,8 @@ public class MetadataPublicReviewsSettings {
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ReviewProviderConfig {
private MetadataProvider provider;
private boolean enabled;

View File

@@ -1,8 +1,8 @@
package org.booklore.model.enums;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import tools.jackson.databind.PropertyNamingStrategies;
import tools.jackson.databind.annotation.JsonNaming;
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public enum KoboReadStatus {

View File

@@ -1,17 +1,17 @@
package org.booklore.service;
import jakarta.persistence.criteria.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.GroupRule;
import org.booklore.model.dto.Rule;
import org.booklore.model.dto.RuleField;
import org.booklore.model.entity.BookEntity;
import org.booklore.model.entity.UserBookProgressEntity;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.criteria.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.time.LocalDate;
import java.time.LocalDateTime;

View File

@@ -1,13 +1,12 @@
package org.booklore.service;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.Installation;
import org.booklore.model.entity.AppSettingEntity;
import org.booklore.repository.AppSettingsRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
@@ -26,9 +25,9 @@ public class InstallationService {
public InstallationService(AppSettingsRepository appSettingsRepository, ObjectMapper objectMapper) {
this.appSettingsRepository = appSettingsRepository;
this.objectMapper = objectMapper.copy();
this.objectMapper.registerModule(new JavaTimeModule());
this.objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
this.objectMapper = JsonMapper.builder()
.findAndAddModules()
.build();
}
public Installation getOrCreateInstallation() {

View File

@@ -1,13 +1,13 @@
package org.booklore.service;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.ReleaseNote;
import org.booklore.model.dto.VersionInfo;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

View File

@@ -1,5 +1,6 @@
package org.booklore.service.appsettings;
import jakarta.transaction.Transactional;
import org.booklore.config.AppProperties;
import org.booklore.config.security.service.AuthenticationService;
import org.booklore.model.dto.BookLoreUser;
@@ -8,12 +9,12 @@ import org.booklore.model.dto.settings.*;
import org.booklore.model.entity.AppSettingEntity;
import org.booklore.model.enums.PermissionType;
import org.booklore.util.UserPermissionUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import jakarta.transaction.Transactional;
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import java.util.List;
import java.util.Map;
@@ -21,6 +22,7 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@Service
@DependsOnDatabaseInitialization
public class AppSettingService {
private final AppProperties appProperties;
@@ -51,7 +53,7 @@ public class AppSettingService {
}
@Transactional
public void updateSetting(AppSettingKey key, Object val) throws JsonProcessingException {
public void updateSetting(AppSettingKey key, Object val) throws JacksonException {
BookLoreUser user = authenticationService.getAuthenticatedUser();
validatePermission(key, user);

View File

@@ -1,17 +1,17 @@
package org.booklore.service.appsettings;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.request.MetadataRefreshOptions;
import org.booklore.model.dto.settings.*;
import org.booklore.model.entity.AppSettingEntity;
import org.booklore.model.enums.MetadataProvider;
import org.booklore.model.enums.MetadataReplaceMode;
import org.booklore.repository.AppSettingsRepository;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import tools.jackson.core.JacksonException;
import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.ObjectMapper;
import java.util.Map;
import java.util.Set;
@@ -54,7 +54,7 @@ public class SettingPersistenceHelper {
if (json != null && !json.isBlank()) {
try {
return deserializer.deserialize(json);
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Failed to parse JSON for setting key '{}'. Using default value. Error: {}", key, e.getMessage());
return defaultValue;
}
@@ -62,7 +62,7 @@ public class SettingPersistenceHelper {
if (defaultValue != null && persistDefault) {
try {
saveDefaultSetting(key, objectMapper.writeValueAsString(defaultValue));
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
log.error("Failed to persist default value for setting key '{}'. Error: {}", key, e.getMessage());
}
}
@@ -71,10 +71,10 @@ public class SettingPersistenceHelper {
@FunctionalInterface
private interface JsonDeserializer<T> {
T deserialize(String json) throws JsonProcessingException;
T deserialize(String json) throws JacksonException;
}
public String serializeSettingValue(AppSettingKey key, Object val) throws JsonProcessingException {
public String serializeSettingValue(AppSettingKey key, Object val) throws JacksonException {
return key.isJson() ? objectMapper.writeValueAsString(val) : val.toString();
}

View File

@@ -1,5 +1,7 @@
package org.booklore.service.bookdrop;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.config.AppProperties;
import org.booklore.exception.ApiError;
import org.booklore.mapper.BookdropFileMapper;
@@ -32,14 +34,12 @@ import org.booklore.service.kobo.KoboAutoShelfService;
import org.booklore.service.metadata.MetadataRefreshService;
import org.booklore.service.monitoring.MonitoringRegistrationService;
import org.booklore.util.FileUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import tools.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
@@ -48,12 +48,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.Instant;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;

View File

@@ -1,12 +1,12 @@
package org.booklore.service.bookdrop;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.booklore.model.dto.BookMetadata;
import org.booklore.model.entity.BookdropFileEntity;
import org.booklore.repository.BookdropFileRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import tools.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.List;

Some files were not shown because too many files have changed in this diff Show More