Skip to content

Commit 1d2c6ac

Browse files
authored
Merge pull request #89 from TU-NEBULA/refactor/SCRUM-226
SCRUM 226 : 스타 필드에 조회시간 추가에 따른 기능 수정
2 parents 48943b5 + 5c548f2 commit 1d2c6ac

8 files changed

Lines changed: 62 additions & 32 deletions

File tree

data/testdb.mv.db

20 KB
Binary file not shown.

data/testdb.trace.db

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2025-03-06 14:29:54.151996+09:00 jdbc[3]: exception
2+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
3+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
4+
2025-03-06 14:30:42.223336+09:00 jdbc[3]: exception
5+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
6+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
7+
2025-03-06 14:30:48.663140+09:00 jdbc[3]: exception
8+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
9+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
10+
2025-03-15 14:11:51.719896+09:00 jdbc[3]: exception
11+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
12+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
13+
2025-03-15 14:11:59.193304+09:00 jdbc[3]: exception
14+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
15+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
16+
2025-03-15 14:57:23.019542+09:00 jdbc[3]: exception
17+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
18+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]
19+
2025-03-15 14:58:28.511833+09:00 jdbc[3]: exception
20+
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" not found (this database is empty); SQL statement:
21+
select u1_0.id,u1_0.email,u1_0.name,u1_0.refresh_token,u1_0.role,u1_0.username from users u1_0 where u1_0.username=? [42104-224]

src/main/java/com/team_nebula/nebula/domain/star/converter/StarConverter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.team_nebula.nebula.domain.star.dto.response.*;
44

5+
import java.time.LocalDateTime;
56
import java.util.*;
67

78
public class StarConverter {
@@ -17,6 +18,7 @@ public static GetStarOneResponseDTO convertToStarOneDto(GetStarOneResponseDTO da
1718
.userMemo(data.getUserMemo())
1819
.views(data.getViews())
1920
.faviconUrl(data.getFaviconUrl())
21+
.lastAccessedAt(data.getLastAccessedAt())
2022
.keywordList(data.getKeywordList())
2123
.build();
2224
}

src/main/java/com/team_nebula/nebula/domain/star/dto/response/GetStarOneResponseDTO.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
77

8+
import java.time.LocalDateTime;
89
import java.util.List;
910
import java.util.UUID;
1011

@@ -22,5 +23,6 @@ public class GetStarOneResponseDTO {
2223
private String userMemo;
2324
private int views;
2425
private String faviconUrl;
26+
private LocalDateTime lastAccessedAt;
2527
private List<String> keywordList;
2628
}

src/main/java/com/team_nebula/nebula/domain/star/entity/Star.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.springframework.data.neo4j.core.schema.Property;
1414
import org.springframework.data.neo4j.core.schema.Relationship;
1515

16+
import java.time.LocalDateTime;
1617
import java.util.HashSet;
1718
import java.util.Set;
1819
import java.util.UUID;
@@ -44,6 +45,9 @@ public class Star extends BaseEntity {
4445
@Property("views")
4546
private Integer views;
4647

48+
@Property("lastAccessedAt")
49+
private LocalDateTime lastAccessedAt;
50+
4751
@Property("html_file_url")
4852
private String htmlFileUrl;
4953

@@ -61,7 +65,7 @@ public class Star extends BaseEntity {
6165

6266
@Builder
6367
public Star(String title, String siteUrl, String thumbnailUrl, String summaryAI, String userMemo, int views,
64-
String htmlFileUrl) {
68+
LocalDateTime lastAccessedAt, String htmlFileUrl) {
6569
this.id = UUID.randomUUID();
6670
this.title = title;
6771
this.siteUrl = siteUrl;
@@ -71,6 +75,7 @@ public Star(String title, String siteUrl, String thumbnailUrl, String summaryAI,
7175
this.views = views;
7276
this.htmlFileUrl = htmlFileUrl;
7377
this.isDeletedStatus = false;
78+
this.lastAccessedAt = lastAccessedAt;
7479
}
7580

7681
public void updateStar(String thumbnailUrl, String summaryAI, String userMemo) {
@@ -95,4 +100,6 @@ public void updateUserMemo(String userMemo){
95100
public void updateIsDeletedStatus(){
96101
this.isDeletedStatus = true;
97102
}
103+
104+
public void updateLastAccessedAt(){ this.lastAccessedAt = LocalDateTime.now(); }
98105
}

src/main/java/com/team_nebula/nebula/domain/star/repository/StarRepository.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,29 +28,34 @@ OPTIONAL MATCH (s)-[:HAS_FAVICON]->(f:Favicon)
2828
s.views AS views,
2929
c.name AS categoryName,
3030
f.faviconUrl AS faviconUrl,
31+
s.lastAccessedAt AS lastAccessedAt,
3132
COLLECT(k.name) AS keywordList
3233
""")
3334
List<GetStarOneResponseDTO> findStarsByUserId(@Param("userId") Long userId);
3435

3536
@Query("""
36-
MATCH (s:Star {id: $starId})-[:BELONGS_TO]->(c:Category)
37-
OPTIONAL MATCH (s)-[:TAGGED]->(k:Keyword)
38-
OPTIONAL MATCH (s)-[:HAS_FAVICON]->(f:Favicon)
39-
WHERE s.isDeletedStatus = false
40-
41-
RETURN s.id AS starId,
42-
s.title AS title,
43-
s.siteUrl AS siteUrl,
44-
s.thumbnailUrl AS thumbnailUrl,
45-
s.summaryAI AS summaryAI,
46-
s.userMemo AS userMemo,
47-
s.views AS views,
48-
c.name AS categoryName,
49-
f.faviconUrl AS faviconUrl,
50-
COLLECT(k.name) AS keywordList
37+
MATCH (s:Star {id: $starId})
38+
WHERE s.isDeletedStatus = false
39+
OPTIONAL MATCH (s)-[:BELONGS_TO]->(c:Category)
40+
OPTIONAL MATCH (s)-[:TAGGED]->(k:Keyword)
41+
OPTIONAL MATCH (s)-[:HAS_FAVICON]->(f:Favicon)
42+
SET s.views = s.views + 1,
43+
s.lastAccessedAt = datetime()
44+
RETURN s.id AS starId,
45+
s.title AS title,
46+
s.siteUrl AS siteUrl,
47+
s.thumbnailUrl AS thumbnailUrl,
48+
s.summaryAI AS summaryAI,
49+
s.userMemo AS userMemo,
50+
s.views AS views,
51+
c.name AS categoryName,
52+
f.faviconUrl AS faviconUrl,
53+
s.lastAccessedAt AS lastAccessedAt,
54+
COLLECT(DISTINCT k.name) AS keywordList
5155
""")
5256
GetStarOneResponseDTO findStarDetailById(@Param("starId") UUID starId);
5357

58+
5459
@Query("""
5560
MATCH (u:UserNode)-[:CREATED]->(s:Star)-[:BELONGS_TO]->(c:Category)
5661
WHERE u.userId = $userId AND c.id = $categoryId AND s.isDeletedStatus = false
@@ -65,6 +70,7 @@ OPTIONAL MATCH (s)-[:HAS_FAVICON]->(f:Favicon)
6570
s.views AS views,
6671
c.name AS categoryName,
6772
f.faviconUrl AS faviconUrl,
73+
s.lastAccessedAt AS lastAccessedAt,
6874
COLLECT(k.name) AS keywordList
6975
""")
7076
List<GetStarOneResponseDTO> findStarsInCategory(@Param("userId") Long userId, @Param("categoryId") UUID categoryId);
@@ -83,6 +89,7 @@ OPTIONAL MATCH (s)-[:HAS_FAVICON]->(f:Favicon)
8389
s.views AS views,
8490
c.name AS categoryName,
8591
f.faviconUrl AS faviconUrl,
92+
s.lastAccessedAt AS lastAccessedAt,
8693
COLLECT(k.name) AS keywordList
8794
""")
8895
List<GetStarOneResponseDTO> findStarsInKeyword(@Param("userId") Long userId, @Param("keywordId") String keywordId);
@@ -124,6 +131,7 @@ s2, c2, f2, COLLECT(DISTINCT k2.name) AS linkedKeywordList,
124131
userMemo: s.userMemo,
125132
views: s.views,
126133
faviconUrl: f.faviconUrl,
134+
lastAccessedAt: s.lastAccessedAt,
127135
keywordList: keywordList
128136
},
129137
linkData: links,
@@ -143,20 +151,6 @@ s2, c2, f2, COLLECT(DISTINCT k2.name) AS linkedKeywordList,
143151
""")
144152
List<GetSearchedStarOneResponseDTO> searchStars(@Param("userId") Long userId, @Param("title") String title);
145153

146-
@Query("""
147-
MATCH (s:Star)
148-
WHERE s.id = $starId
149-
SET s.views = s.views + 1
150-
""")
151-
void incrementViews(UUID starId);
152-
153-
@Query("""
154-
MATCH (s:Star)
155-
WHERE s.id = $starId
156-
SET s.views = s.views - 1
157-
""")
158-
void reduceViews(UUID starId);
159-
160154
@Query("""
161155
MATCH (u:UserNode)-[:CREATED]->(s:Star)
162156
WHERE u.userId = $userId AND s.siteUrl IN $urls AND s.isDeletedStatus = false

src/main/java/com/team_nebula/nebula/domain/star/service/StarCommandServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.transaction.annotation.Transactional;
2828
import org.springframework.web.multipart.MultipartFile;
2929

30+
import java.time.LocalDateTime;
3031
import java.util.Optional;
3132
import java.util.UUID;
3233
import java.util.stream.Collectors;
@@ -158,6 +159,8 @@ public GetStarOneResponseDTO updateStar(Long userId, UUID starId, UpdateStarOneR
158159
Optional.ofNullable(requestDTO.getSummaryAI()).ifPresent(latestStar::updateSummaryAI);
159160
Optional.ofNullable(requestDTO.getUserMemo()).ifPresent(latestStar::updateUserMemo);
160161

162+
latestStar.updateLastAccessedAt();
163+
161164
// DB에 저장
162165
Star updatedStar = starRepository.save(latestStar);
163166

@@ -174,6 +177,7 @@ public GetStarOneResponseDTO updateStar(Long userId, UUID starId, UpdateStarOneR
174177
.userMemo(updatedStar.getUserMemo())
175178
.views(updatedStar.getViews())
176179
.faviconUrl(updatedStar.getFavicons().toString())
180+
.lastAccessedAt(updatedStar.getLastAccessedAt())
177181
.keywordList(updatedStar.getKeywords().stream()
178182
.map(Keyword::getName)
179183
.toList())
@@ -244,6 +248,7 @@ public CreateStarResponseDTO createStar(Long userId, CreateStarRequestDTO reques
244248
.thumbnailUrl(requestDTO.getThumbnailUrl())
245249
.summaryAI(requestDTO.getSummaryAI())
246250
.userMemo(requestDTO.getUserMemo())
251+
.lastAccessedAt(LocalDateTime.now())
247252
.build();
248253

249254
Star savedStar = starRepository.save(star);

src/main/java/com/team_nebula/nebula/domain/star/service/StarQueryServiceImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ public List<GetStarOneResponseDTO> findAllStar(Long userId) {
6262
// 단일 스타 조회
6363
@Override
6464
public GetStarOneResponseDTO getStarOne(UUID starId) {
65-
starRepository.incrementViews(starId);
6665
GetStarOneResponseDTO data = starRepository.findStarDetailById(starId);
66+
6767
if (data == null) {
68-
starRepository.reduceViews(starId);
6968
throw new GeneralException(ErrorStatus._STAR_NOT_FOUND);
7069
}
7170

0 commit comments

Comments
 (0)