diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index fabe54421..04a02e1f5 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -16,13 +16,13 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: distribution: zulu - java-version: '11' - - uses: actions/cache@v2 + java-version: '21' + - uses: actions/cache@v4 with: path: | ~/.gradle/caches diff --git a/build.gradle b/build.gradle index da384dc69..a8afd095e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ plugins { - id 'org.springframework.boot' version '2.6.3' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'org.springframework.boot' version '3.5.5' + id 'io.spring.dependency-management' version '1.1.7' id 'java' - id "com.netflix.dgs.codegen" version "5.0.6" - id "com.diffplug.spotless" version "6.2.1" + id "com.netflix.dgs.codegen" version "8.1.1" + id "com.diffplug.spotless" version "6.25.0" } version = '0.0.1-SNAPSHOT' -sourceCompatibility = '11' -targetCompatibility = '11' +sourceCompatibility = '21' +targetCompatibility = '21' spotless { java { @@ -35,25 +35,24 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-hateoas' implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2' - implementation 'com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter:4.9.21' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5' + implementation 'com.netflix.graphql.dgs:graphql-dgs-spring-graphql-starter:10.4.0' implementation 'org.flywaydb:flyway-core' - implementation 'io.jsonwebtoken:jjwt-api:0.11.2' - runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2', - 'io.jsonwebtoken:jjwt-jackson:0.11.2' - implementation 'joda-time:joda-time:2.10.13' - implementation 'org.xerial:sqlite-jdbc:3.36.0.3' + implementation 'io.jsonwebtoken:jjwt-api:0.13.0' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.13.0', + 'io.jsonwebtoken:jjwt-jackson:0.13.0' + implementation 'org.xerial:sqlite-jdbc:3.50.3.0' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' - testImplementation 'io.rest-assured:rest-assured:4.5.1' - testImplementation 'io.rest-assured:json-path:4.5.1' - testImplementation 'io.rest-assured:xml-path:4.5.1' - testImplementation 'io.rest-assured:spring-mock-mvc:4.5.1' + testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:json-path:5.5.0' + testImplementation 'io.rest-assured:xml-path:5.5.0' + testImplementation 'io.rest-assured:spring-mock-mvc:5.5.0' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.2.2' + testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.5' } tasks.named('test') { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41dfb8790..1e2fbf0d4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/io/spring/JacksonCustomizations.java b/src/main/java/io/spring/JacksonCustomizations.java index 86fab0abe..30ef71357 100644 --- a/src/main/java/io/spring/JacksonCustomizations.java +++ b/src/main/java/io/spring/JacksonCustomizations.java @@ -6,8 +6,8 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; +import java.time.Instant; +import java.time.format.DateTimeFormatter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -21,23 +21,23 @@ public Module realWorldModules() { public static class RealWorldModules extends SimpleModule { public RealWorldModules() { - addSerializer(DateTime.class, new DateTimeSerializer()); + addSerializer(Instant.class, new InstantSerializer()); } } - public static class DateTimeSerializer extends StdSerializer { + public static class InstantSerializer extends StdSerializer { - protected DateTimeSerializer() { - super(DateTime.class); + protected InstantSerializer() { + super(Instant.class); } @Override - public void serialize(DateTime value, JsonGenerator gen, SerializerProvider provider) + public void serialize(Instant value, JsonGenerator gen, SerializerProvider provider) throws IOException { if (value == null) { gen.writeNull(); } else { - gen.writeString(ISODateTimeFormat.dateTime().withZoneUTC().print(value)); + gen.writeString(DateTimeFormatter.ISO_INSTANT.format(value)); } } } diff --git a/src/main/java/io/spring/api/ArticleApi.java b/src/main/java/io/spring/api/ArticleApi.java index c80afa31d..8f6ad749b 100644 --- a/src/main/java/io/spring/api/ArticleApi.java +++ b/src/main/java/io/spring/api/ArticleApi.java @@ -12,7 +12,7 @@ import io.spring.core.user.User; import java.util.HashMap; import java.util.Map; -import javax.validation.Valid; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; diff --git a/src/main/java/io/spring/api/ArticlesApi.java b/src/main/java/io/spring/api/ArticlesApi.java index 50584bd6d..25337b36c 100644 --- a/src/main/java/io/spring/api/ArticlesApi.java +++ b/src/main/java/io/spring/api/ArticlesApi.java @@ -7,7 +7,7 @@ import io.spring.core.article.Article; import io.spring.core.user.User; import java.util.HashMap; -import javax.validation.Valid; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; diff --git a/src/main/java/io/spring/api/CommentsApi.java b/src/main/java/io/spring/api/CommentsApi.java index c5f7e77e9..a974802e5 100644 --- a/src/main/java/io/spring/api/CommentsApi.java +++ b/src/main/java/io/spring/api/CommentsApi.java @@ -14,8 +14,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/io/spring/api/CurrentUserApi.java b/src/main/java/io/spring/api/CurrentUserApi.java index e096aec0b..cb1d20372 100644 --- a/src/main/java/io/spring/api/CurrentUserApi.java +++ b/src/main/java/io/spring/api/CurrentUserApi.java @@ -9,7 +9,7 @@ import io.spring.core.user.User; import java.util.HashMap; import java.util.Map; -import javax.validation.Valid; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; diff --git a/src/main/java/io/spring/api/UsersApi.java b/src/main/java/io/spring/api/UsersApi.java index d91321e82..1e7e799ba 100644 --- a/src/main/java/io/spring/api/UsersApi.java +++ b/src/main/java/io/spring/api/UsersApi.java @@ -15,9 +15,9 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; -import javax.validation.Valid; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/io/spring/api/exception/CustomizeExceptionHandler.java b/src/main/java/io/spring/api/exception/CustomizeExceptionHandler.java index ade3ff4ff..808d61af2 100644 --- a/src/main/java/io/spring/api/exception/CustomizeExceptionHandler.java +++ b/src/main/java/io/spring/api/exception/CustomizeExceptionHandler.java @@ -7,8 +7,8 @@ import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; diff --git a/src/main/java/io/spring/api/security/JwtTokenFilter.java b/src/main/java/io/spring/api/security/JwtTokenFilter.java index 1b5c50146..42c1a1a22 100644 --- a/src/main/java/io/spring/api/security/JwtTokenFilter.java +++ b/src/main/java/io/spring/api/security/JwtTokenFilter.java @@ -5,10 +5,10 @@ import java.io.IOException; import java.util.Collections; import java.util.Optional; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/src/main/java/io/spring/api/security/WebSecurityConfig.java b/src/main/java/io/spring/api/security/WebSecurityConfig.java index 3786959ef..c5ea4c72b 100644 --- a/src/main/java/io/spring/api/security/WebSecurityConfig.java +++ b/src/main/java/io/spring/api/security/WebSecurityConfig.java @@ -8,10 +8,10 @@ import org.springframework.http.HttpStatus; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.HttpStatusEntryPoint; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; @@ -20,7 +20,7 @@ @Configuration @EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig { @Bean public JwtTokenFilter jwtTokenFilter() { @@ -32,36 +32,34 @@ public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - @Override - protected void configure(HttpSecurity http) throws Exception { - - http.csrf() - .disable() - .cors() - .and() - .exceptionHandling() - .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS) - .permitAll() - .antMatchers("/graphiql") - .permitAll() - .antMatchers("/graphql") - .permitAll() - .antMatchers(HttpMethod.GET, "/articles/feed") - .authenticated() - .antMatchers(HttpMethod.POST, "/users", "/users/login") - .permitAll() - .antMatchers(HttpMethod.GET, "/articles/**", "/profiles/**", "/tags") - .permitAll() - .anyRequest() - .authenticated(); + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.csrf(csrf -> csrf.disable()) + .cors(cors -> {}) + .exceptionHandling( + exception -> + exception.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))) + .sessionManagement( + session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests( + auth -> + auth.requestMatchers(HttpMethod.OPTIONS) + .permitAll() + .requestMatchers("/graphiql") + .permitAll() + .requestMatchers("/graphql") + .permitAll() + .requestMatchers(HttpMethod.GET, "/articles/feed") + .authenticated() + .requestMatchers(HttpMethod.POST, "/users", "/users/login") + .permitAll() + .requestMatchers(HttpMethod.GET, "/articles/**", "/profiles/**", "/tags") + .permitAll() + .anyRequest() + .authenticated()); http.addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); + return http.build(); } @Bean @@ -69,12 +67,7 @@ public CorsConfigurationSource corsConfigurationSource() { final CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(asList("*")); configuration.setAllowedMethods(asList("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH")); - // setAllowCredentials(true) is important, otherwise: - // The value of the 'Access-Control-Allow-Origin' header in the response must not be the - // wildcard '*' when the request's credentials mode is 'include'. configuration.setAllowCredentials(false); - // setAllowedHeaders is important! Without it, OPTIONS preflight request - // will fail with 403 Invalid CORS request configuration.setAllowedHeaders(asList("Authorization", "Cache-Control", "Content-Type")); final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); diff --git a/src/main/java/io/spring/application/ArticleQueryService.java b/src/main/java/io/spring/application/ArticleQueryService.java index 959e8c638..cca9c783e 100644 --- a/src/main/java/io/spring/application/ArticleQueryService.java +++ b/src/main/java/io/spring/application/ArticleQueryService.java @@ -14,10 +14,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.time.Instant; import java.util.Optional; import java.util.Set; import lombok.AllArgsConstructor; -import org.joda.time.DateTime; import org.springframework.stereotype.Service; @Service @@ -55,7 +55,7 @@ public CursorPager findRecentArticlesWithCursor( String tag, String author, String favoritedBy, - CursorPageParameter page, + CursorPageParameter page, User currentUser) { List articleIds = articleReadService.findArticlesWithCursor(tag, author, favoritedBy, page); @@ -78,7 +78,7 @@ public CursorPager findRecentArticlesWithCursor( } public CursorPager findUserFeedWithCursor( - User user, CursorPageParameter page) { + User user, CursorPageParameter page) { List followdUsers = userRelationshipQueryService.followedUsers(user.getId()); if (followdUsers.size() == 0) { return new CursorPager<>(new ArrayList<>(), page.getDirection(), false); diff --git a/src/main/java/io/spring/application/CommentQueryService.java b/src/main/java/io/spring/application/CommentQueryService.java index da1677f4c..3bdd6cd96 100644 --- a/src/main/java/io/spring/application/CommentQueryService.java +++ b/src/main/java/io/spring/application/CommentQueryService.java @@ -8,10 +8,10 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.time.Instant; import java.util.Set; import java.util.stream.Collectors; import lombok.AllArgsConstructor; -import org.joda.time.DateTime; import org.springframework.stereotype.Service; @Service @@ -54,7 +54,7 @@ public List findByArticleId(String articleId, User user) { } public CursorPager findByArticleIdWithCursor( - String articleId, User user, CursorPageParameter page) { + String articleId, User user, CursorPageParameter page) { List comments = commentReadService.findByArticleIdWithCursor(articleId, page); if (comments.isEmpty()) { return new CursorPager<>(new ArrayList<>(), page.getDirection(), false); diff --git a/src/main/java/io/spring/application/DateTimeCursor.java b/src/main/java/io/spring/application/DateTimeCursor.java deleted file mode 100644 index cfcc86bc8..000000000 --- a/src/main/java/io/spring/application/DateTimeCursor.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.spring.application; - -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; - -public class DateTimeCursor extends PageCursor { - - public DateTimeCursor(DateTime data) { - super(data); - } - - @Override - public String toString() { - return String.valueOf(getData().getMillis()); - } - - public static DateTime parse(String cursor) { - if (cursor == null) { - return null; - } - return new DateTime().withMillis(Long.parseLong(cursor)).withZone(DateTimeZone.UTC); - } -} diff --git a/src/main/java/io/spring/application/InstantCursor.java b/src/main/java/io/spring/application/InstantCursor.java new file mode 100644 index 000000000..73745d965 --- /dev/null +++ b/src/main/java/io/spring/application/InstantCursor.java @@ -0,0 +1,22 @@ +package io.spring.application; + +import java.time.Instant; + +public class InstantCursor extends PageCursor { + + public InstantCursor(Instant data) { + super(data); + } + + @Override + public String toString() { + return String.valueOf(getData().toEpochMilli()); + } + + public static Instant parse(String cursor) { + if (cursor == null) { + return null; + } + return Instant.ofEpochMilli(Long.parseLong(cursor)); + } +} diff --git a/src/main/java/io/spring/application/article/ArticleCommandService.java b/src/main/java/io/spring/application/article/ArticleCommandService.java index 861bc22b2..2d88441b7 100644 --- a/src/main/java/io/spring/application/article/ArticleCommandService.java +++ b/src/main/java/io/spring/application/article/ArticleCommandService.java @@ -3,7 +3,7 @@ import io.spring.core.article.Article; import io.spring.core.article.ArticleRepository; import io.spring.core.user.User; -import javax.validation.Valid; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/src/main/java/io/spring/application/article/DuplicatedArticleConstraint.java b/src/main/java/io/spring/application/article/DuplicatedArticleConstraint.java index 0eb1eda84..ba3995a04 100644 --- a/src/main/java/io/spring/application/article/DuplicatedArticleConstraint.java +++ b/src/main/java/io/spring/application/article/DuplicatedArticleConstraint.java @@ -5,8 +5,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Documented @Constraint(validatedBy = DuplicatedArticleValidator.class) diff --git a/src/main/java/io/spring/application/article/DuplicatedArticleValidator.java b/src/main/java/io/spring/application/article/DuplicatedArticleValidator.java index 0e3828e1e..e04853f26 100644 --- a/src/main/java/io/spring/application/article/DuplicatedArticleValidator.java +++ b/src/main/java/io/spring/application/article/DuplicatedArticleValidator.java @@ -2,8 +2,8 @@ import io.spring.application.ArticleQueryService; import io.spring.core.article.Article; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.springframework.beans.factory.annotation.Autowired; class DuplicatedArticleValidator diff --git a/src/main/java/io/spring/application/article/NewArticleParam.java b/src/main/java/io/spring/application/article/NewArticleParam.java index 344d76c33..3d47be4ed 100644 --- a/src/main/java/io/spring/application/article/NewArticleParam.java +++ b/src/main/java/io/spring/application/article/NewArticleParam.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonRootName; import java.util.List; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/io/spring/application/data/ArticleData.java b/src/main/java/io/spring/application/data/ArticleData.java index 3d3c947e2..16c4034bc 100644 --- a/src/main/java/io/spring/application/data/ArticleData.java +++ b/src/main/java/io/spring/application/data/ArticleData.java @@ -1,12 +1,12 @@ package io.spring.application.data; import com.fasterxml.jackson.annotation.JsonProperty; -import io.spring.application.DateTimeCursor; +import io.spring.application.InstantCursor; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; +import java.time.Instant; @Data @NoArgsConstructor @@ -19,15 +19,15 @@ public class ArticleData implements io.spring.application.Node { private String body; private boolean favorited; private int favoritesCount; - private DateTime createdAt; - private DateTime updatedAt; + private Instant createdAt; + private Instant updatedAt; private List tagList; @JsonProperty("author") private ProfileData profileData; @Override - public DateTimeCursor getCursor() { - return new DateTimeCursor(updatedAt); + public InstantCursor getCursor() { + return new InstantCursor(updatedAt); } } diff --git a/src/main/java/io/spring/application/data/CommentData.java b/src/main/java/io/spring/application/data/CommentData.java index 1e28d94bd..5c7884e85 100644 --- a/src/main/java/io/spring/application/data/CommentData.java +++ b/src/main/java/io/spring/application/data/CommentData.java @@ -2,12 +2,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import io.spring.application.DateTimeCursor; +import io.spring.application.InstantCursor; import io.spring.application.Node; +import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; @Data @NoArgsConstructor @@ -16,14 +16,14 @@ public class CommentData implements Node { private String id; private String body; @JsonIgnore private String articleId; - private DateTime createdAt; - private DateTime updatedAt; + private Instant createdAt; + private Instant updatedAt; @JsonProperty("author") private ProfileData profileData; @Override - public DateTimeCursor getCursor() { - return new DateTimeCursor(createdAt); + public InstantCursor getCursor() { + return new InstantCursor(createdAt); } } diff --git a/src/main/java/io/spring/application/user/DuplicatedEmailConstraint.java b/src/main/java/io/spring/application/user/DuplicatedEmailConstraint.java index e41eb009e..fc295395b 100644 --- a/src/main/java/io/spring/application/user/DuplicatedEmailConstraint.java +++ b/src/main/java/io/spring/application/user/DuplicatedEmailConstraint.java @@ -2,8 +2,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Constraint(validatedBy = DuplicatedEmailValidator.class) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/io/spring/application/user/DuplicatedEmailValidator.java b/src/main/java/io/spring/application/user/DuplicatedEmailValidator.java index e30711465..f7543976e 100644 --- a/src/main/java/io/spring/application/user/DuplicatedEmailValidator.java +++ b/src/main/java/io/spring/application/user/DuplicatedEmailValidator.java @@ -1,8 +1,8 @@ package io.spring.application.user; import io.spring.core.user.UserRepository; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.springframework.beans.factory.annotation.Autowired; public class DuplicatedEmailValidator diff --git a/src/main/java/io/spring/application/user/DuplicatedUsernameConstraint.java b/src/main/java/io/spring/application/user/DuplicatedUsernameConstraint.java index 4f365b789..5e4903bb8 100644 --- a/src/main/java/io/spring/application/user/DuplicatedUsernameConstraint.java +++ b/src/main/java/io/spring/application/user/DuplicatedUsernameConstraint.java @@ -2,8 +2,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Constraint(validatedBy = DuplicatedUsernameValidator.class) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/io/spring/application/user/DuplicatedUsernameValidator.java b/src/main/java/io/spring/application/user/DuplicatedUsernameValidator.java index ae1fd21aa..4b803bf85 100644 --- a/src/main/java/io/spring/application/user/DuplicatedUsernameValidator.java +++ b/src/main/java/io/spring/application/user/DuplicatedUsernameValidator.java @@ -1,8 +1,8 @@ package io.spring.application.user; import io.spring.core.user.UserRepository; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.springframework.beans.factory.annotation.Autowired; class DuplicatedUsernameValidator diff --git a/src/main/java/io/spring/application/user/RegisterParam.java b/src/main/java/io/spring/application/user/RegisterParam.java index 3ba1234d3..d629268c6 100644 --- a/src/main/java/io/spring/application/user/RegisterParam.java +++ b/src/main/java/io/spring/application/user/RegisterParam.java @@ -1,8 +1,8 @@ package io.spring.application.user; import com.fasterxml.jackson.annotation.JsonRootName; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/io/spring/application/user/UpdateUserParam.java b/src/main/java/io/spring/application/user/UpdateUserParam.java index 54cd77471..f0263a0bf 100644 --- a/src/main/java/io/spring/application/user/UpdateUserParam.java +++ b/src/main/java/io/spring/application/user/UpdateUserParam.java @@ -1,7 +1,7 @@ package io.spring.application.user; import com.fasterxml.jackson.annotation.JsonRootName; -import javax.validation.constraints.Email; +import jakarta.validation.constraints.Email; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/io/spring/application/user/UserService.java b/src/main/java/io/spring/application/user/UserService.java index 48c6735b8..7772b32aa 100644 --- a/src/main/java/io/spring/application/user/UserService.java +++ b/src/main/java/io/spring/application/user/UserService.java @@ -2,12 +2,12 @@ import io.spring.core.user.User; import io.spring.core.user.UserRepository; +import jakarta.validation.Constraint; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.Valid; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import javax.validation.Constraint; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; diff --git a/src/main/java/io/spring/core/article/Article.java b/src/main/java/io/spring/core/article/Article.java index f23c2c6d5..e909fb212 100644 --- a/src/main/java/io/spring/core/article/Article.java +++ b/src/main/java/io/spring/core/article/Article.java @@ -3,13 +3,13 @@ import static java.util.stream.Collectors.toList; import io.spring.Util; +import java.time.Instant; import java.util.HashSet; import java.util.List; import java.util.UUID; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; @Getter @NoArgsConstructor @@ -22,12 +22,12 @@ public class Article { private String description; private String body; private List tags; - private DateTime createdAt; - private DateTime updatedAt; + private Instant createdAt; + private Instant updatedAt; public Article( String title, String description, String body, List tagList, String userId) { - this(title, description, body, tagList, userId, new DateTime()); + this(title, description, body, tagList, userId, Instant.now()); } public Article( @@ -36,7 +36,7 @@ public Article( String body, List tagList, String userId, - DateTime createdAt) { + Instant createdAt) { this.id = UUID.randomUUID().toString(); this.slug = toSlug(title); this.title = title; @@ -52,15 +52,15 @@ public void update(String title, String description, String body) { if (!Util.isEmpty(title)) { this.title = title; this.slug = toSlug(title); - this.updatedAt = new DateTime(); + this.updatedAt = Instant.now(); } if (!Util.isEmpty(description)) { this.description = description; - this.updatedAt = new DateTime(); + this.updatedAt = Instant.now(); } if (!Util.isEmpty(body)) { this.body = body; - this.updatedAt = new DateTime(); + this.updatedAt = Instant.now(); } } diff --git a/src/main/java/io/spring/core/comment/Comment.java b/src/main/java/io/spring/core/comment/Comment.java index 5b9fbe7d8..9da47d05e 100644 --- a/src/main/java/io/spring/core/comment/Comment.java +++ b/src/main/java/io/spring/core/comment/Comment.java @@ -1,10 +1,10 @@ package io.spring.core.comment; +import java.time.Instant; import java.util.UUID; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; @Getter @NoArgsConstructor @@ -14,13 +14,13 @@ public class Comment { private String body; private String userId; private String articleId; - private DateTime createdAt; + private Instant createdAt; public Comment(String body, String userId, String articleId) { this.id = UUID.randomUUID().toString(); this.body = body; this.userId = userId; this.articleId = articleId; - this.createdAt = new DateTime(); + this.createdAt = Instant.now(); } } diff --git a/src/main/java/io/spring/graphql/ArticleDatafetcher.java b/src/main/java/io/spring/graphql/ArticleDatafetcher.java index 37c82939a..1d8f14f82 100644 --- a/src/main/java/io/spring/graphql/ArticleDatafetcher.java +++ b/src/main/java/io/spring/graphql/ArticleDatafetcher.java @@ -14,7 +14,7 @@ import io.spring.application.CursorPageParameter; import io.spring.application.CursorPager; import io.spring.application.CursorPager.Direction; -import io.spring.application.DateTimeCursor; +import io.spring.application.InstantCursor; import io.spring.application.data.ArticleData; import io.spring.application.data.CommentData; import io.spring.core.user.User; @@ -27,10 +27,10 @@ import io.spring.graphql.types.ArticleEdge; import io.spring.graphql.types.ArticlesConnection; import io.spring.graphql.types.Profile; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.stream.Collectors; import lombok.AllArgsConstructor; -import org.joda.time.format.ISODateTimeFormat; @DgsComponent @AllArgsConstructor @@ -57,12 +57,12 @@ public DataFetcherResult getFeed( articles = articleQueryService.findUserFeedWithCursor( current, - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT)); + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT)); } else { articles = articleQueryService.findUserFeedWithCursor( current, - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV)); + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV)); } graphql.relay.PageInfo pageInfo = buildArticlePageInfo(articles); ArticlesConnection articlesConnection = @@ -107,12 +107,12 @@ public DataFetcherResult userFeed( articles = articleQueryService.findUserFeedWithCursor( target, - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT)); + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT)); } else { articles = articleQueryService.findUserFeedWithCursor( target, - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV)); + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV)); } graphql.relay.PageInfo pageInfo = buildArticlePageInfo(articles); ArticlesConnection articlesConnection = @@ -156,7 +156,7 @@ public DataFetcherResult userFavorites( null, null, profile.getUsername(), - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT), + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT), current); } else { articles = @@ -164,7 +164,7 @@ public DataFetcherResult userFavorites( null, null, profile.getUsername(), - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV), + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV), current); } graphql.relay.PageInfo pageInfo = buildArticlePageInfo(articles); @@ -210,7 +210,7 @@ public DataFetcherResult userArticles( null, profile.getUsername(), null, - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT), + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT), current); } else { articles = @@ -218,7 +218,7 @@ public DataFetcherResult userArticles( null, profile.getUsername(), null, - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV), + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV), current); } graphql.relay.PageInfo pageInfo = buildArticlePageInfo(articles); @@ -265,7 +265,7 @@ public DataFetcherResult getArticles( withTag, authoredBy, favoritedBy, - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT), + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT), current); } else { articles = @@ -273,7 +273,7 @@ public DataFetcherResult getArticles( withTag, authoredBy, favoritedBy, - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV), + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV), current); } graphql.relay.PageInfo pageInfo = buildArticlePageInfo(articles); @@ -371,14 +371,14 @@ private DefaultPageInfo buildArticlePageInfo(CursorPager articles) private Article buildArticleResult(ArticleData articleData) { return Article.newBuilder() .body(articleData.getBody()) - .createdAt(ISODateTimeFormat.dateTime().withZoneUTC().print(articleData.getCreatedAt())) + .createdAt(DateTimeFormatter.ISO_INSTANT.format(articleData.getCreatedAt())) .description(articleData.getDescription()) .favorited(articleData.isFavorited()) .favoritesCount(articleData.getFavoritesCount()) .slug(articleData.getSlug()) .tagList(articleData.getTagList()) .title(articleData.getTitle()) - .updatedAt(ISODateTimeFormat.dateTime().withZoneUTC().print(articleData.getUpdatedAt())) + .updatedAt(DateTimeFormatter.ISO_INSTANT.format(articleData.getUpdatedAt())) .build(); } } diff --git a/src/main/java/io/spring/graphql/CommentDatafetcher.java b/src/main/java/io/spring/graphql/CommentDatafetcher.java index 334a04c36..b29556c8e 100644 --- a/src/main/java/io/spring/graphql/CommentDatafetcher.java +++ b/src/main/java/io/spring/graphql/CommentDatafetcher.java @@ -11,7 +11,7 @@ import io.spring.application.CursorPageParameter; import io.spring.application.CursorPager; import io.spring.application.CursorPager.Direction; -import io.spring.application.DateTimeCursor; +import io.spring.application.InstantCursor; import io.spring.application.data.ArticleData; import io.spring.application.data.CommentData; import io.spring.core.user.User; @@ -22,10 +22,10 @@ import io.spring.graphql.types.CommentEdge; import io.spring.graphql.types.CommentsConnection; import java.util.HashMap; +import java.time.format.DateTimeFormatter; import java.util.Map; import java.util.stream.Collectors; import lombok.AllArgsConstructor; -import org.joda.time.format.ISODateTimeFormat; @DgsComponent @AllArgsConstructor @@ -70,13 +70,13 @@ public DataFetcherResult articleComments( commentQueryService.findByArticleIdWithCursor( articleData.getId(), current, - new CursorPageParameter<>(DateTimeCursor.parse(after), first, Direction.NEXT)); + new CursorPageParameter<>(InstantCursor.parse(after), first, Direction.NEXT)); } else { comments = commentQueryService.findByArticleIdWithCursor( articleData.getId(), current, - new CursorPageParameter<>(DateTimeCursor.parse(before), last, Direction.PREV)); + new CursorPageParameter<>(InstantCursor.parse(before), last, Direction.PREV)); } graphql.relay.PageInfo pageInfo = buildCommentPageInfo(comments); CommentsConnection result = @@ -115,8 +115,8 @@ private Comment buildCommentResult(CommentData comment) { return Comment.newBuilder() .id(comment.getId()) .body(comment.getBody()) - .updatedAt(ISODateTimeFormat.dateTime().withZoneUTC().print(comment.getCreatedAt())) - .createdAt(ISODateTimeFormat.dateTime().withZoneUTC().print(comment.getCreatedAt())) + .updatedAt(DateTimeFormatter.ISO_INSTANT.format(comment.getCreatedAt())) + .createdAt(DateTimeFormatter.ISO_INSTANT.format(comment.getCreatedAt())) .build(); } } diff --git a/src/main/java/io/spring/graphql/UserMutation.java b/src/main/java/io/spring/graphql/UserMutation.java index 581a5b7b5..f595c9324 100644 --- a/src/main/java/io/spring/graphql/UserMutation.java +++ b/src/main/java/io/spring/graphql/UserMutation.java @@ -18,7 +18,7 @@ import io.spring.graphql.types.UserPayload; import io.spring.graphql.types.UserResult; import java.util.Optional; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import lombok.AllArgsConstructor; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/src/main/java/io/spring/graphql/exception/GraphQLCustomizeExceptionHandler.java b/src/main/java/io/spring/graphql/exception/GraphQLCustomizeExceptionHandler.java index bf4768b3b..29d867cd9 100644 --- a/src/main/java/io/spring/graphql/exception/GraphQLCustomizeExceptionHandler.java +++ b/src/main/java/io/spring/graphql/exception/GraphQLCustomizeExceptionHandler.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.springframework.stereotype.Component; @Component diff --git a/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java b/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java deleted file mode 100644 index 19323e565..000000000 --- a/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.spring.infrastructure.mybatis; - -import java.sql.CallableStatement; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.Calendar; -import java.util.TimeZone; -import org.apache.ibatis.type.JdbcType; -import org.apache.ibatis.type.MappedTypes; -import org.apache.ibatis.type.TypeHandler; -import org.joda.time.DateTime; - -@MappedTypes(DateTime.class) -public class DateTimeHandler implements TypeHandler { - - private static final Calendar UTC_CALENDAR = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - - @Override - public void setParameter(PreparedStatement ps, int i, DateTime parameter, JdbcType jdbcType) - throws SQLException { - ps.setTimestamp( - i, parameter != null ? new Timestamp(parameter.getMillis()) : null, UTC_CALENDAR); - } - - @Override - public DateTime getResult(ResultSet rs, String columnName) throws SQLException { - Timestamp timestamp = rs.getTimestamp(columnName, UTC_CALENDAR); - return timestamp != null ? new DateTime(timestamp.getTime()) : null; - } - - @Override - public DateTime getResult(ResultSet rs, int columnIndex) throws SQLException { - Timestamp timestamp = rs.getTimestamp(columnIndex, UTC_CALENDAR); - return timestamp != null ? new DateTime(timestamp.getTime()) : null; - } - - @Override - public DateTime getResult(CallableStatement cs, int columnIndex) throws SQLException { - Timestamp ts = cs.getTimestamp(columnIndex, UTC_CALENDAR); - return ts != null ? new DateTime(ts.getTime()) : null; - } -} diff --git a/src/main/java/io/spring/infrastructure/mybatis/InstantHandler.java b/src/main/java/io/spring/infrastructure/mybatis/InstantHandler.java new file mode 100644 index 000000000..b10b3222a --- /dev/null +++ b/src/main/java/io/spring/infrastructure/mybatis/InstantHandler.java @@ -0,0 +1,39 @@ +package io.spring.infrastructure.mybatis; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +@MappedTypes(Instant.class) +public class InstantHandler implements TypeHandler { + + @Override + public void setParameter(PreparedStatement ps, int i, Instant parameter, JdbcType jdbcType) + throws SQLException { + ps.setTimestamp(i, parameter != null ? Timestamp.from(parameter) : null); + } + + @Override + public Instant getResult(ResultSet rs, String columnName) throws SQLException { + Timestamp timestamp = rs.getTimestamp(columnName); + return timestamp != null ? timestamp.toInstant() : null; + } + + @Override + public Instant getResult(ResultSet rs, int columnIndex) throws SQLException { + Timestamp timestamp = rs.getTimestamp(columnIndex); + return timestamp != null ? timestamp.toInstant() : null; + } + + @Override + public Instant getResult(CallableStatement cs, int columnIndex) throws SQLException { + Timestamp ts = cs.getTimestamp(columnIndex); + return ts != null ? ts.toInstant() : null; + } +} diff --git a/src/main/java/io/spring/infrastructure/mybatis/readservice/CommentReadService.java b/src/main/java/io/spring/infrastructure/mybatis/readservice/CommentReadService.java index 1f7f1c159..88a78fbfe 100644 --- a/src/main/java/io/spring/infrastructure/mybatis/readservice/CommentReadService.java +++ b/src/main/java/io/spring/infrastructure/mybatis/readservice/CommentReadService.java @@ -2,10 +2,10 @@ import io.spring.application.CursorPageParameter; import io.spring.application.data.CommentData; +import java.time.Instant; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.joda.time.DateTime; @Mapper public interface CommentReadService { @@ -14,5 +14,5 @@ public interface CommentReadService { List findByArticleId(@Param("articleId") String articleId); List findByArticleIdWithCursor( - @Param("articleId") String articleId, @Param("page") CursorPageParameter page); + @Param("articleId") String articleId, @Param("page") CursorPageParameter page); } diff --git a/src/test/java/io/spring/TestHelper.java b/src/test/java/io/spring/TestHelper.java index dcd57071c..3387eee6b 100644 --- a/src/test/java/io/spring/TestHelper.java +++ b/src/test/java/io/spring/TestHelper.java @@ -4,13 +4,13 @@ import io.spring.application.data.ProfileData; import io.spring.core.article.Article; import io.spring.core.user.User; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; -import org.joda.time.DateTime; public class TestHelper { public static ArticleData articleDataFixture(String seed, User user) { - DateTime now = new DateTime(); + Instant now = Instant.now(); return new ArticleData( seed + "id", "title-" + seed, diff --git a/src/test/java/io/spring/api/ArticleApiTest.java b/src/test/java/io/spring/api/ArticleApiTest.java index df2ebe755..4ac835d62 100644 --- a/src/test/java/io/spring/api/ArticleApiTest.java +++ b/src/test/java/io/spring/api/ArticleApiTest.java @@ -21,11 +21,11 @@ import io.spring.core.user.User; import java.util.Arrays; import java.util.HashMap; +import java.time.Instant; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.Optional; -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -55,7 +55,7 @@ public void setUp() throws Exception { @Test public void should_read_article_success() throws Exception { String slug = "test-new-article"; - DateTime time = new DateTime(); + Instant time = Instant.now(); Article article = new Article( "Test New Article", @@ -74,7 +74,7 @@ public void should_read_article_success() throws Exception { .statusCode(200) .body("article.slug", equalTo(slug)) .body("article.body", equalTo(articleData.getBody())) - .body("article.createdAt", equalTo(ISODateTimeFormat.dateTime().withZoneUTC().print(time))); + .body("article.createdAt", equalTo(DateTimeFormatter.ISO_INSTANT.format(time))); } @Test @@ -131,7 +131,7 @@ public void should_get_403_if_not_author_to_update_article() throws Exception { new Article( title, description, body, Arrays.asList("java", "spring", "jpg"), anotherUser.getId()); - DateTime time = new DateTime(); + Instant time = Instant.now(); ArticleData articleData = new ArticleData( article.getId(), diff --git a/src/test/java/io/spring/api/ArticlesApiTest.java b/src/test/java/io/spring/api/ArticlesApiTest.java index 18948417d..654dbbb1c 100644 --- a/src/test/java/io/spring/api/ArticlesApiTest.java +++ b/src/test/java/io/spring/api/ArticlesApiTest.java @@ -17,10 +17,10 @@ import io.spring.application.data.ProfileData; import io.spring.core.article.Article; import java.util.HashMap; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.Optional; -import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -63,8 +63,8 @@ public void should_create_article_success() throws Exception { body, false, 0, - new DateTime(), - new DateTime(), + Instant.now(), + Instant.now(), tagList, new ProfileData("userid", user.getUsername(), user.getBio(), user.getImage(), false)); @@ -132,8 +132,8 @@ public void should_get_error_message_with_duplicated_title() { body, false, 0, - new DateTime(), - new DateTime(), + Instant.now(), + Instant.now(), asList(tagList), new ProfileData("userid", user.getUsername(), user.getBio(), user.getImage(), false)); diff --git a/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java b/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java index 96229376c..0f9dc86a3 100644 --- a/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java +++ b/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java @@ -4,7 +4,7 @@ import io.spring.application.CursorPageParameter; import io.spring.application.CursorPager; import io.spring.application.CursorPager.Direction; -import io.spring.application.DateTimeCursor; +import io.spring.application.InstantCursor; import io.spring.application.Page; import io.spring.application.data.ArticleData; import io.spring.application.data.ArticleDataList; @@ -19,9 +19,10 @@ import io.spring.infrastructure.repository.MyBatisArticleFavoriteRepository; import io.spring.infrastructure.repository.MyBatisArticleRepository; import io.spring.infrastructure.repository.MyBatisUserRepository; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Optional; -import org.joda.time.DateTime; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -52,7 +53,7 @@ public void setUp() { userRepository.save(user); article = new Article( - "test", "desc", "body", Arrays.asList("java", "spring"), user.getId(), new DateTime()); + "test", "desc", "body", Arrays.asList("java", "spring"), user.getId(), Instant.now()); articleRepository.save(article); } @@ -92,7 +93,7 @@ public void should_get_default_article_list() { "body", Arrays.asList("test"), user.getId(), - new DateTime().minusHours(1)); + Instant.now().minus(1, ChronoUnit.HOURS)); articleRepository.save(anotherArticle); ArticleDataList recentArticles = @@ -116,7 +117,7 @@ public void should_get_default_article_list_by_cursor() { "body", Arrays.asList("test"), user.getId(), - new DateTime().minusHours(1)); + Instant.now().minus(1, ChronoUnit.HOURS)); articleRepository.save(anotherArticle); CursorPager recentArticles = @@ -130,8 +131,8 @@ public void should_get_default_article_list_by_cursor() { null, null, null, - new CursorPageParameter( - DateTimeCursor.parse(recentArticles.getEndCursor().toString()), 20, Direction.NEXT), + new CursorPageParameter( + InstantCursor.parse(recentArticles.getEndCursor().toString()), 20, Direction.NEXT), user); Assertions.assertEquals(nodata.getData().size(), 0); Assertions.assertEquals(nodata.getStartCursor(), null);