diff --git a/build.gradle b/build.gradle index 03c56f755..63daa0732 100644 --- a/build.gradle +++ b/build.gradle @@ -66,7 +66,6 @@ dependencies { 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' compileOnly 'org.projectlombok:lombok' diff --git a/frontend/components/article/ArticleMeta.tsx b/frontend/components/article/ArticleMeta.tsx index 450795e86..9954f3f52 100644 --- a/frontend/components/article/ArticleMeta.tsx +++ b/frontend/components/article/ArticleMeta.tsx @@ -3,6 +3,7 @@ import React from "react"; import ArticleActions from "./ArticleActions"; import CustomImage from "../common/CustomImage"; import CustomLink from "../common/CustomLink"; +import relativeTime from "../../lib/utils/relativeTime"; const ArticleMeta = ({ article }) => { if (!article) return; @@ -24,8 +25,11 @@ const ArticleMeta = ({ article }) => { > {article.author?.username} - - {new Date(article.createdAt).toDateString()} + + {relativeTime(article.createdAt)} diff --git a/frontend/components/article/ArticlePreview.tsx b/frontend/components/article/ArticlePreview.tsx index 266853203..1c1713ff8 100644 --- a/frontend/components/article/ArticlePreview.tsx +++ b/frontend/components/article/ArticlePreview.tsx @@ -9,6 +9,7 @@ import CustomImage from "../common/CustomImage"; import { usePageDispatch } from "../../lib/context/PageContext"; import checkLogin from "../../lib/utils/checkLogin"; import { SERVER_BASE_URL } from "../../lib/utils/constant"; +import relativeTime from "../../lib/utils/relativeTime"; import storage from "../../lib/utils/storage"; const FAVORITED_CLASS = "btn btn-sm btn-primary"; @@ -90,8 +91,11 @@ const ArticlePreview = ({ article }) => { > setPage(0)}>{preview.author.username} - - {new Date(preview.createdAt).toDateString()} + + {relativeTime(preview.createdAt)} diff --git a/frontend/components/comment/Comment.tsx b/frontend/components/comment/Comment.tsx index 3604dce34..2de95305a 100644 --- a/frontend/components/comment/Comment.tsx +++ b/frontend/components/comment/Comment.tsx @@ -6,6 +6,7 @@ import CustomImage from "../common/CustomImage"; import Maybe from "../common/Maybe"; import DeleteButton from "./DeleteButton"; import checkLogin from "../../lib/utils/checkLogin"; +import relativeTime from "../../lib/utils/relativeTime"; import storage from "../../lib/utils/storage"; const Comment = ({ comment }) => { @@ -39,8 +40,11 @@ const Comment = ({ comment }) => { > {comment.author.username} - - {new Date(comment.createdAt).toDateString()} + + {relativeTime(comment.createdAt)} diff --git a/frontend/lib/utils/relativeTime.ts b/frontend/lib/utils/relativeTime.ts new file mode 100644 index 000000000..c90d6cef3 --- /dev/null +++ b/frontend/lib/utils/relativeTime.ts @@ -0,0 +1,29 @@ +const units = [ + { name: "year", seconds: 31536000 }, + { name: "month", seconds: 2592000 }, + { name: "week", seconds: 604800 }, + { name: "day", seconds: 86400 }, + { name: "hour", seconds: 3600 }, + { name: "minute", seconds: 60 }, + { name: "second", seconds: 1 }, +]; + +export default function relativeTime(value: string): string { + const date = new Date(value); + + if (Number.isNaN(date.getTime())) return ""; + + const difference = date.getTime() - Date.now(); + const seconds = Math.abs(difference) / 1000; + + if (seconds < 45) return "just now"; + + const unit = units.find(({ seconds: unitSeconds }) => seconds >= unitSeconds); + const amount = Math.round(difference / 1000 / unit.seconds); + + const formatter = new (Intl as any).RelativeTimeFormat("en", { + numeric: "always", + }); + + return formatter.format(amount, unit.name); +} diff --git a/src/main/java/io/spring/JacksonCustomizations.java b/src/main/java/io/spring/JacksonCustomizations.java index 86fab0abe..828bacf6c 100644 --- a/src/main/java/io/spring/JacksonCustomizations.java +++ b/src/main/java/io/spring/JacksonCustomizations.java @@ -6,13 +6,16 @@ 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.ZoneOffset; +import java.time.format.DateTimeFormatter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonCustomizations { + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC); @Bean public Module realWorldModules() { @@ -21,23 +24,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(DATE_TIME_FORMATTER.format(value)); } } } diff --git a/src/main/java/io/spring/application/ArticleQueryService.java b/src/main/java/io/spring/application/ArticleQueryService.java index 959e8c638..9e4f41bdc 100644 --- a/src/main/java/io/spring/application/ArticleQueryService.java +++ b/src/main/java/io/spring/application/ArticleQueryService.java @@ -9,6 +9,7 @@ import io.spring.infrastructure.mybatis.readservice.ArticleFavoritesReadService; import io.spring.infrastructure.mybatis.readservice.ArticleReadService; import io.spring.infrastructure.mybatis.readservice.UserRelationshipQueryService; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -17,7 +18,6 @@ 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..974ffabc8 100644 --- a/src/main/java/io/spring/application/CommentQueryService.java +++ b/src/main/java/io/spring/application/CommentQueryService.java @@ -4,6 +4,7 @@ import io.spring.core.user.User; import io.spring.infrastructure.mybatis.readservice.CommentReadService; import io.spring.infrastructure.mybatis.readservice.UserRelationshipQueryService; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -11,7 +12,6 @@ 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 index cfcc86bc8..cf090af19 100644 --- a/src/main/java/io/spring/application/DateTimeCursor.java +++ b/src/main/java/io/spring/application/DateTimeCursor.java @@ -1,23 +1,22 @@ package io.spring.application; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; +import java.time.Instant; -public class DateTimeCursor extends PageCursor { +public class DateTimeCursor extends PageCursor { - public DateTimeCursor(DateTime data) { + public DateTimeCursor(Instant data) { super(data); } @Override public String toString() { - return String.valueOf(getData().getMillis()); + return String.valueOf(getData().toEpochMilli()); } - public static DateTime parse(String cursor) { + public static Instant parse(String cursor) { if (cursor == null) { return null; } - return new DateTime().withMillis(Long.parseLong(cursor)).withZone(DateTimeZone.UTC); + return Instant.ofEpochMilli(Long.parseLong(cursor)); } } diff --git a/src/main/java/io/spring/application/data/ArticleData.java b/src/main/java/io/spring/application/data/ArticleData.java index 3d3c947e2..43fd08a72 100644 --- a/src/main/java/io/spring/application/data/ArticleData.java +++ b/src/main/java/io/spring/application/data/ArticleData.java @@ -2,11 +2,11 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.spring.application.DateTimeCursor; +import java.time.Instant; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; @Data @NoArgsConstructor @@ -19,8 +19,8 @@ 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") diff --git a/src/main/java/io/spring/application/data/CommentData.java b/src/main/java/io/spring/application/data/CommentData.java index 1e28d94bd..96919485f 100644 --- a/src/main/java/io/spring/application/data/CommentData.java +++ b/src/main/java/io/spring/application/data/CommentData.java @@ -4,10 +4,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.spring.application.DateTimeCursor; 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,8 +16,8 @@ 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; diff --git a/src/main/java/io/spring/core/article/Article.java b/src/main/java/io/spring/core/article/Article.java index f23c2c6d5..f53ad0ca8 100644 --- a/src/main/java/io/spring/core/article/Article.java +++ b/src/main/java/io/spring/core/article/Article.java @@ -3,13 +3,14 @@ import static java.util.stream.Collectors.toList; import io.spring.Util; +import java.time.Instant; +import java.time.temporal.ChronoUnit; 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 +23,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().truncatedTo(ChronoUnit.MILLIS)); } public Article( @@ -36,7 +37,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 +53,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().truncatedTo(ChronoUnit.MILLIS); } if (!Util.isEmpty(description)) { this.description = description; - this.updatedAt = new DateTime(); + this.updatedAt = Instant.now().truncatedTo(ChronoUnit.MILLIS); } if (!Util.isEmpty(body)) { this.body = body; - this.updatedAt = new DateTime(); + this.updatedAt = Instant.now().truncatedTo(ChronoUnit.MILLIS); } } diff --git a/src/main/java/io/spring/core/comment/Comment.java b/src/main/java/io/spring/core/comment/Comment.java index 5b9fbe7d8..a75483c2e 100644 --- a/src/main/java/io/spring/core/comment/Comment.java +++ b/src/main/java/io/spring/core/comment/Comment.java @@ -1,10 +1,11 @@ package io.spring.core.comment; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.UUID; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import org.joda.time.DateTime; @Getter @NoArgsConstructor @@ -14,13 +15,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().truncatedTo(ChronoUnit.MILLIS); } } diff --git a/src/main/java/io/spring/graphql/ArticleDatafetcher.java b/src/main/java/io/spring/graphql/ArticleDatafetcher.java index 37c82939a..5be51c01f 100644 --- a/src/main/java/io/spring/graphql/ArticleDatafetcher.java +++ b/src/main/java/io/spring/graphql/ArticleDatafetcher.java @@ -27,14 +27,17 @@ import io.spring.graphql.types.ArticleEdge; import io.spring.graphql.types.ArticlesConnection; import io.spring.graphql.types.Profile; +import java.time.ZoneOffset; +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 public class ArticleDatafetcher { + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC); private ArticleQueryService articleQueryService; private UserRepository userRepository; @@ -371,14 +374,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(DATE_TIME_FORMATTER.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(DATE_TIME_FORMATTER.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..f8b586741 100644 --- a/src/main/java/io/spring/graphql/CommentDatafetcher.java +++ b/src/main/java/io/spring/graphql/CommentDatafetcher.java @@ -21,15 +21,18 @@ import io.spring.graphql.types.Comment; import io.spring.graphql.types.CommentEdge; import io.spring.graphql.types.CommentsConnection; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import lombok.AllArgsConstructor; -import org.joda.time.format.ISODateTimeFormat; @DgsComponent @AllArgsConstructor public class CommentDatafetcher { + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC); private CommentQueryService commentQueryService; @DgsData(parentType = COMMENTPAYLOAD.TYPE_NAME, field = COMMENTPAYLOAD.Comment) @@ -115,8 +118,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(DATE_TIME_FORMATTER.format(comment.getCreatedAt())) + .createdAt(DATE_TIME_FORMATTER.format(comment.getCreatedAt())) .build(); } } diff --git a/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java b/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java index 19323e565..cfdef67c0 100644 --- a/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java +++ b/src/main/java/io/spring/infrastructure/mybatis/DateTimeHandler.java @@ -5,40 +5,39 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; +import java.time.Instant; 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 { +@MappedTypes(Instant.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) + public void setParameter(PreparedStatement ps, int i, Instant parameter, JdbcType jdbcType) throws SQLException { - ps.setTimestamp( - i, parameter != null ? new Timestamp(parameter.getMillis()) : null, UTC_CALENDAR); + ps.setTimestamp(i, parameter != null ? Timestamp.from(parameter) : null, UTC_CALENDAR); } @Override - public DateTime getResult(ResultSet rs, String columnName) throws SQLException { + public Instant getResult(ResultSet rs, String columnName) throws SQLException { Timestamp timestamp = rs.getTimestamp(columnName, UTC_CALENDAR); - return timestamp != null ? new DateTime(timestamp.getTime()) : null; + return timestamp != null ? timestamp.toInstant() : null; } @Override - public DateTime getResult(ResultSet rs, int columnIndex) throws SQLException { + public Instant getResult(ResultSet rs, int columnIndex) throws SQLException { Timestamp timestamp = rs.getTimestamp(columnIndex, UTC_CALENDAR); - return timestamp != null ? new DateTime(timestamp.getTime()) : null; + return timestamp != null ? timestamp.toInstant() : null; } @Override - public DateTime getResult(CallableStatement cs, int columnIndex) throws SQLException { + public Instant getResult(CallableStatement cs, int columnIndex) throws SQLException { Timestamp ts = cs.getTimestamp(columnIndex, UTC_CALENDAR); - return ts != null ? new DateTime(ts.getTime()) : null; + 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..36dbfa3f7 100644 --- a/src/test/java/io/spring/TestHelper.java +++ b/src/test/java/io/spring/TestHelper.java @@ -4,13 +4,14 @@ import io.spring.application.data.ProfileData; import io.spring.core.article.Article; import io.spring.core.user.User; +import java.time.Instant; +import java.time.temporal.ChronoUnit; 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().truncatedTo(ChronoUnit.MILLIS); return new ArticleData( seed + "id", "title-" + seed, @@ -36,7 +37,7 @@ public static ArticleData getArticleDataFromArticleAndUser(Article article, User 0, article.getCreatedAt(), article.getUpdatedAt(), - Arrays.asList("joda"), + Arrays.asList("java"), new ProfileData(user.getId(), user.getUsername(), user.getBio(), user.getImage(), false)); } } diff --git a/src/test/java/io/spring/api/ArticleApiTest.java b/src/test/java/io/spring/api/ArticleApiTest.java index df2ebe755..97b4d24dd 100644 --- a/src/test/java/io/spring/api/ArticleApiTest.java +++ b/src/test/java/io/spring/api/ArticleApiTest.java @@ -19,13 +19,15 @@ import io.spring.core.article.Article; import io.spring.core.article.ArticleRepository; import io.spring.core.user.User; +import java.time.Instant; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.HashMap; 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; @@ -37,6 +39,8 @@ @WebMvcTest({ArticleApi.class}) @Import({WebSecurityConfig.class, JacksonCustomizations.class}) public class ArticleApiTest extends TestWithCurrentUser { + private static final DateTimeFormatter DATE_TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC); @Autowired private MockMvc mvc; @MockBean private ArticleQueryService articleQueryService; @@ -55,7 +59,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().truncatedTo(ChronoUnit.MILLIS); Article article = new Article( "Test New Article", @@ -74,7 +78,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(DATE_TIME_FORMATTER.format(time))); } @Test @@ -131,7 +135,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().truncatedTo(ChronoUnit.MILLIS); ArticleData articleData = new ArticleData( article.getId(), @@ -143,7 +147,7 @@ public void should_get_403_if_not_author_to_update_article() throws Exception { 0, time, time, - Arrays.asList("joda"), + Arrays.asList("java"), new ProfileData( anotherUser.getId(), anotherUser.getUsername(), diff --git a/src/test/java/io/spring/api/ArticlesApiTest.java b/src/test/java/io/spring/api/ArticlesApiTest.java index 18948417d..7bb7fd4f7 100644 --- a/src/test/java/io/spring/api/ArticlesApiTest.java +++ b/src/test/java/io/spring/api/ArticlesApiTest.java @@ -16,11 +16,12 @@ import io.spring.application.data.ArticleData; import io.spring.application.data.ProfileData; import io.spring.core.article.Article; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.HashMap; 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 +64,8 @@ public void should_create_article_success() throws Exception { body, false, 0, - new DateTime(), - new DateTime(), + Instant.now().truncatedTo(ChronoUnit.MILLIS), + Instant.now().truncatedTo(ChronoUnit.MILLIS), tagList, new ProfileData("userid", user.getUsername(), user.getBio(), user.getImage(), false)); @@ -132,8 +133,8 @@ public void should_get_error_message_with_duplicated_title() { body, false, 0, - new DateTime(), - new DateTime(), + Instant.now().truncatedTo(ChronoUnit.MILLIS), + Instant.now().truncatedTo(ChronoUnit.MILLIS), 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..8bdadb9f0 100644 --- a/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java +++ b/src/test/java/io/spring/application/article/ArticleQueryServiceTest.java @@ -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,12 @@ 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().truncatedTo(ChronoUnit.MILLIS)); articleRepository.save(article); } @@ -92,7 +98,7 @@ public void should_get_default_article_list() { "body", Arrays.asList("test"), user.getId(), - new DateTime().minusHours(1)); + Instant.now().truncatedTo(ChronoUnit.MILLIS).minus(1, ChronoUnit.HOURS)); articleRepository.save(anotherArticle); ArticleDataList recentArticles = @@ -116,7 +122,7 @@ public void should_get_default_article_list_by_cursor() { "body", Arrays.asList("test"), user.getId(), - new DateTime().minusHours(1)); + Instant.now().truncatedTo(ChronoUnit.MILLIS).minus(1, ChronoUnit.HOURS)); articleRepository.save(anotherArticle); CursorPager recentArticles = @@ -130,7 +136,7 @@ public void should_get_default_article_list_by_cursor() { null, null, null, - new CursorPageParameter( + new CursorPageParameter( DateTimeCursor.parse(recentArticles.getEndCursor().toString()), 20, Direction.NEXT), user); Assertions.assertEquals(nodata.getData().size(), 0);