8
8
import static org .websoso .WSSServer .exception .error .CustomUserNovelError .USER_NOVEL_ALREADY_EXISTS ;
9
9
import static org .websoso .WSSServer .exception .error .CustomUserNovelError .USER_NOVEL_NOT_FOUND ;
10
10
11
+ import java .time .LocalDateTime ;
12
+ import java .util .ArrayList ;
11
13
import java .util .Collections ;
12
14
import java .util .LinkedHashMap ;
13
15
import java .util .List ;
@@ -122,51 +124,84 @@ private void updateUserNovel(UserNovel userNovel, UserNovelUpdateRequest request
122
124
}
123
125
124
126
private void updateAssociations (UserNovel userNovel , UserNovelUpdateRequest request ) {
125
- Set <AttractivePoint > previousAttractivePoints = getPreviousAttractivePoints (userNovel );
126
- Set <Keyword > previousKeywords = getPreviousKeywords (userNovel );
127
-
128
- manageAttractivePoints (userNovel , request .attractivePoints (), previousAttractivePoints );
129
- manageKeywords (userNovel , request .keywordIds (), previousKeywords );
130
-
131
- userNovelAttractivePointRepository .deleteByAttractivePointsAndUserNovel (previousAttractivePoints , userNovel );
132
- userNovelKeywordRepository .deleteByKeywordsAndUserNovel (previousKeywords , userNovel );
127
+ updateAttractivePoints (userNovel , request .attractivePoints ());
128
+ updateKeywords (userNovel , request .keywordIds ());
133
129
}
134
130
135
- private Set < AttractivePoint > getPreviousAttractivePoints (UserNovel userNovel ) {
136
- return userNovel .getUserNovelAttractivePoints ()
131
+ private void updateAttractivePoints (UserNovel userNovel , List < String > attractivePoints ) {
132
+ Map < AttractivePoint , UserNovelAttractivePoint > currentPointMap = userNovel .getUserNovelAttractivePoints ()
137
133
.stream ()
138
- .map (UserNovelAttractivePoint ::getAttractivePoint )
134
+ .collect (Collectors .toMap (UserNovelAttractivePoint ::getAttractivePoint , it -> it ));
135
+
136
+ Set <AttractivePoint > requestedPoints = attractivePoints .stream ()
137
+ .map (attractivePointService ::getAttractivePointByString )
139
138
.collect (Collectors .toSet ());
139
+
140
+ addUserNovelAttractivePoints (userNovel , currentPointMap , requestedPoints );
141
+ deleteUserNovelAttractivePoints (userNovel , currentPointMap , requestedPoints );
142
+ }
143
+
144
+ private void addUserNovelAttractivePoints (UserNovel userNovel ,
145
+ Map <AttractivePoint , UserNovelAttractivePoint > currentPointMap ,
146
+ Set <AttractivePoint > requestedPoints ) {
147
+ for (AttractivePoint requested : requestedPoints ) {
148
+ if (!currentPointMap .containsKey (requested )) {
149
+ userNovelAttractivePointRepository .save (UserNovelAttractivePoint .create (userNovel , requested ));
150
+ }
151
+ }
152
+ }
153
+
154
+ private void deleteUserNovelAttractivePoints (UserNovel userNovel ,
155
+ Map <AttractivePoint , UserNovelAttractivePoint > currentPointMap ,
156
+ Set <AttractivePoint > requestedPoints ) {
157
+ List <UserNovelAttractivePoint > toDelete = new ArrayList <>();
158
+ for (Map .Entry <AttractivePoint , UserNovelAttractivePoint > entry : currentPointMap .entrySet ()) {
159
+ if (!requestedPoints .contains (entry .getKey ())) {
160
+ toDelete .add (entry .getValue ());
161
+ }
162
+ }
163
+ if (!toDelete .isEmpty ()) {
164
+ userNovel .getUserNovelAttractivePoints ().removeAll (toDelete );
165
+ userNovel .touch ();
166
+ }
140
167
}
141
168
142
- private Set < Keyword > getPreviousKeywords (UserNovel userNovel ) {
143
- return userNovel .getUserNovelKeywords ()
169
+ private void updateKeywords (UserNovel userNovel , List < Integer > keywordIds ) {
170
+ Map < Keyword , UserNovelKeyword > currentKeywordMap = userNovel .getUserNovelKeywords ()
144
171
.stream ()
145
- .map (UserNovelKeyword ::getKeyword )
172
+ .collect (Collectors .toMap (UserNovelKeyword ::getKeyword , it -> it ));
173
+
174
+ Set <Keyword > requestedKeywords = keywordIds .stream ()
175
+ .map (keywordService ::getKeywordOrException )
146
176
.collect (Collectors .toSet ());
177
+
178
+ addUserNovelKeywords (userNovel , currentKeywordMap , requestedKeywords );
179
+ deleteUserNovelKeywords (userNovel , currentKeywordMap , requestedKeywords );
147
180
}
148
181
149
- private void manageAttractivePoints (UserNovel userNovel , List <String > attractivePoints ,
150
- Set <AttractivePoint > previousAttractivePoints ) {
151
- for (String stringAttractivePoint : attractivePoints ) {
152
- AttractivePoint attractivePoint = attractivePointService .getAttractivePointByString (stringAttractivePoint );
153
- if (previousAttractivePoints .contains (attractivePoint )) {
154
- previousAttractivePoints .remove (attractivePoint );
155
- } else {
156
- userNovelAttractivePointRepository .save (UserNovelAttractivePoint .create (userNovel , attractivePoint ));
182
+ private void addUserNovelKeywords (UserNovel userNovel ,
183
+ Map <Keyword , UserNovelKeyword > currentKeywordMap ,
184
+ Set <Keyword > requestedKeywords ) {
185
+ for (Keyword requested : requestedKeywords ) {
186
+ if (!currentKeywordMap .containsKey (requested )) {
187
+ userNovelKeywordRepository .save (UserNovelKeyword .create (userNovel , requested ));
157
188
}
158
189
}
159
190
}
160
191
161
- private void manageKeywords (UserNovel userNovel , List < Integer > keywordIds , Set < Keyword > previousKeywords ) {
162
- for ( Integer keywordId : keywordIds ) {
163
- Keyword keyword = keywordService . getKeywordOrException ( keywordId );
164
- if ( previousKeywords . contains ( keyword )) {
165
- previousKeywords . remove ( keyword );
166
- } else {
167
- userNovelKeywordRepository . save ( UserNovelKeyword . create ( userNovel , keyword ));
192
+ private void deleteUserNovelKeywords (UserNovel userNovel ,
193
+ Map < Keyword , UserNovelKeyword > currentKeywordMap ,
194
+ Set < Keyword > requestedKeywords ) {
195
+ List < UserNovelKeyword > toDelete = new ArrayList <>();
196
+ for ( Map . Entry < Keyword , UserNovelKeyword > entry : currentKeywordMap . entrySet ()) {
197
+ if (! requestedKeywords . contains ( entry . getKey ())) {
198
+ toDelete . add ( entry . getValue ( ));
168
199
}
169
200
}
201
+ if (!toDelete .isEmpty ()) {
202
+ userNovel .getUserNovelKeywords ().removeAll (toDelete );
203
+ userNovel .touch ();
204
+ }
170
205
}
171
206
172
207
private void createUserNovelAttractivePoints (UserNovel userNovel , List <String > request ) {
@@ -242,7 +277,7 @@ public UserNovelAndNovelsGetResponse getUserNovelsAndNovels(User visitor, Long o
242
277
List <String > readStatuses ,
243
278
List <String > attractivePoints , Float novelRating ,
244
279
String query , Long lastUserNovelId , int size ,
245
- String sortType ) {
280
+ String sortType , LocalDateTime updatedSince ) {
246
281
User owner = userService .getUserOrException (ownerId );
247
282
248
283
if (isProfileInaccessible (visitor , ownerId , owner )) {
@@ -253,10 +288,10 @@ public UserNovelAndNovelsGetResponse getUserNovelsAndNovels(User visitor, Long o
253
288
boolean isAscending = sortType .equalsIgnoreCase (SORT_TYPE_OLDEST );
254
289
255
290
List <UserNovel > userNovels = userNovelRepository .findFilteredUserNovels (ownerId , isInterest , readStatuses ,
256
- attractivePoints , novelRating , query , lastUserNovelId , size , isAscending );
291
+ attractivePoints , novelRating , query , lastUserNovelId , size , isAscending , updatedSince );
257
292
258
293
Long totalCount = userNovelRepository .countByUserIdAndFilters (ownerId , isInterest , readStatuses ,
259
- attractivePoints , novelRating , query );
294
+ attractivePoints , novelRating , query , updatedSince );
260
295
261
296
boolean isLoadable = userNovels .size () == size ;
262
297
0 commit comments