Skip to content

Commit 1e9674d

Browse files
committed
feat(BangumiService): add access token parameter to related subjects and image retrieval methods
1 parent 58e80b3 commit 1e9674d

13 files changed

Lines changed: 53 additions & 297 deletions

File tree

flow-client/src/main/java/com/ligg/flowclient/controller/FlowUserController.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,22 @@
55

66
package com.ligg.flowclient.controller;
77

8+
import com.ligg.common.entity.UserOauthEntity;
9+
import com.ligg.common.exception.LoginExpiredException;
810
import com.ligg.common.response.Result;
911
import com.ligg.common.statuenum.ResponseCode;
1012
import com.ligg.flowclient.interceptor.AuthorizationInterceptor;
1113
import com.ligg.flowclient.module.dto.UpdateUserCollectionDto;
1214
import com.ligg.flowclient.module.dto.UpdateUserDto;
1315
import com.ligg.flowclient.module.vo.FlowUserVo;
1416
import com.ligg.common.vo.bangumi.UserCollectionsVo;
17+
import com.ligg.flowclient.service.BangumiOAuthTokenService;
18+
import com.ligg.flowclient.service.JwtTokenService;
1519
import com.ligg.flowclient.service.UserBgmCollectionService;
1620
import com.ligg.flowclient.service.UserService;
1721
import jakarta.validation.Valid;
1822
import lombok.RequiredArgsConstructor;
23+
import org.springframework.util.StringUtils;
1924
import org.springframework.web.bind.annotation.*;
2025
import org.springframework.web.multipart.MultipartFile;
2126

@@ -28,6 +33,10 @@ public class FlowUserController {
2833

2934
private final UserBgmCollectionService userBgmCollectionService;
3035

36+
private final BangumiOAuthTokenService bangumiOAuthTokenService;
37+
38+
private final JwtTokenService jwtTokenService;
39+
3140
/**
3241
* 获取当前登录用户信息(需携带 AnimeFlow access_token)。
3342
*/
@@ -71,13 +80,16 @@ public Result<FlowUserVo> uploadAvatar(
7180
*/
7281
@GetMapping("/collections")
7382
public Result<UserCollectionsVo> getMeCollections(
74-
@RequestAttribute(AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE) String accessToken,
83+
@RequestAttribute(AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE) String flowAccessToken,
7584
@RequestParam(defaultValue = "2") int subjectType,
7685
@RequestParam(defaultValue = "2") int type,
7786
@RequestParam(defaultValue = "20") int limit,
7887
@RequestParam(defaultValue = "0") int offset) {
88+
Long userId = jwtTokenService.validateAccessToken(flowAccessToken);
89+
UserOauthEntity bangumiOauth = bangumiOAuthTokenService.findBangumiOauth(userId);
90+
//accessToken 可能为null (未绑定bangumi)
7991
UserCollectionsVo vo = userBgmCollectionService.listMyCollections(
80-
accessToken, subjectType, type, limit, offset);
92+
bangumiOauth.getAccessToken(), userId, subjectType, type, limit, offset);
8193
return Result.success(ResponseCode.SUCCESS, vo);
8294
}
8395

flow-client/src/main/java/com/ligg/flowclient/controller/bangumi/SubjectsController.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,16 @@
66

77
import com.ligg.api.bangumiapi.BangumiClient;
88
import com.ligg.common.constants.bangumi.BangumiConstants;
9+
import com.ligg.common.entity.UserOauthEntity;
10+
import com.ligg.common.exception.LoginExpiredException;
911
import com.ligg.common.response.Result;
1012
import com.ligg.common.statuenum.ResponseCode;
1113
import com.ligg.common.thirdparty.bangumi.enums.SubjectBrowseSort;
1214
import com.ligg.common.thirdparty.bangumi.response.*;
1315
import com.ligg.common.utils.Utils;
1416
import com.ligg.common.vo.bangumi.*;
1517
import com.ligg.flowclient.interceptor.AuthorizationInterceptor;
16-
import com.ligg.flowclient.service.BangumiCacheService;
17-
import com.ligg.flowclient.service.BangumiOAuthExecutor;
18-
import com.ligg.flowclient.service.BangumiOAuthTokenService;
19-
import com.ligg.flowclient.service.BangumiService;
20-
import com.ligg.flowclient.service.JwtTokenService;
21-
import com.ligg.common.entity.UserOauthEntity;
22-
import com.ligg.common.exception.LoginExpiredException;
18+
import com.ligg.flowclient.service.*;
2319
import jakarta.validation.constraints.NotNull;
2420
import lombok.RequiredArgsConstructor;
2521
import lombok.extern.slf4j.Slf4j;
@@ -219,8 +215,16 @@ public Result<SubjectRelationsVo> subjectRelationsLocal(
219215
@NotNull @PathVariable int subjectId,
220216
@RequestParam(defaultValue = "2") int type,
221217
@RequestParam(defaultValue = "20") int limit,
222-
@RequestParam(defaultValue = "0") int offset) {
223-
SubjectRelationsVo vo = bangumiService.getRelatedSubjects(subjectId, limit, offset, type);
218+
@RequestParam(defaultValue = "0") int offset,
219+
@RequestAttribute(name = AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE, required = false) String flowAccessToken) {
220+
String bangumiAccessToken = null;
221+
Long userId = jwtTokenService.validateAccessToken(flowAccessToken);
222+
//bangumiAccessToken 可能为null (未绑定bangumi)
223+
UserOauthEntity bangumiOauth = bangumiOAuthTokenService.findBangumiOauth(userId);
224+
if (StringUtils.hasText(bangumiOauth.getAccessToken())) {
225+
bangumiAccessToken = bangumiOauth.getAccessToken();
226+
}
227+
SubjectRelationsVo vo = bangumiService.getRelatedSubjects(subjectId, limit, offset, type, bangumiAccessToken);
224228
if (vo.getData() != null) {
225229
for (SubjectRelationsVo.Item item : vo.getData()) {
226230
if (item != null && item.getSubject() != null) {
@@ -285,7 +289,7 @@ public Result<SubjectsVo> subjects(
285289
* 对应 Bangumi {@code GET /p1/subjects/{id}}。未登录时对近期放送条目缓存;
286290
* 携带 Flow JWT 且已绑定 Bangumi 时,服务端换取 Bangumi OAuth token 直查以返回 {@code interest}。
287291
*
288-
* @param subjectId Bangumi 条目 ID
292+
* @param subjectId Bangumi 条目 ID
289293
* @param flowAccessToken 可选 Flow JWT(Bearer)
290294
*/
291295
@GetMapping("/{subjectId}")

flow-client/src/main/java/com/ligg/flowclient/service/BangumiService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ public interface BangumiService {
2828
/**
2929
* 获取关联条目
3030
*/
31-
SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int offset,int type);
31+
SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int offset,int type, String bangumiAccessToken);
3232
}

flow-client/src/main/java/com/ligg/flowclient/service/ImageBackfillService.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,10 @@ public class ImageBackfillService {
3333
*
3434
* @param subjectImagesJson bangumi_subject.images 的 JSON 值,可为空
3535
* @param subjectId 条目 ID
36+
* @param accessToken Bangumi OAuth access token,可为 null(传 null 时不会在请求中携带)
3637
* @return 封面图,获取失败返回空 CoverImages
37-
*
38-
* TODO 需啊添加可选access_token,否有nsfw类型条目获取图片会失败
3938
*/
40-
public CoverImages resolve(String subjectImagesJson, int subjectId) {
39+
public CoverImages resolve(String subjectImagesJson, int subjectId, String accessToken) {
4140
CoverImages images;
4241
if (StringUtils.hasText(subjectImagesJson) && !"null".equals(subjectImagesJson)) {
4342
try {
@@ -47,7 +46,7 @@ public CoverImages resolve(String subjectImagesJson, int subjectId) {
4746
images = new CoverImages();
4847
}
4948
} else {
50-
images = fetchAndSave(subjectId);
49+
images = fetchAndSave(subjectId, accessToken);
5150
}
5251
if (images.getLarge() == null) images.setLarge("");
5352
if (images.getCommon() == null) images.setCommon("");
@@ -57,7 +56,7 @@ public CoverImages resolve(String subjectImagesJson, int subjectId) {
5756
return images;
5857
}
5958

60-
private CoverImages fetchAndSave(int subjectId) {
59+
private CoverImages fetchAndSave(int subjectId, String accessToken) {
6160
// 锁对象不删除:避免 remove 后其他线程创建新锁绕过互斥,造成重复请求。
6261
// subjectId 数量有限(≈3 万),全量常驻仅约 2 MB,可接受。
6362
Object lock = locks.computeIfAbsent(subjectId, k -> new Object());
@@ -79,7 +78,7 @@ private CoverImages fetchAndSave(int subjectId) {
7978

8079
for (SubjectImageType type : SubjectImageType.values()) {
8180
try {
82-
String url = bangumiV0Client.getSubjectImageUrl(subjectId, type);
81+
String url = bangumiV0Client.getSubjectImageUrl(subjectId, type, accessToken);
8382
if (StringUtils.hasText(url)) {
8483
setField(images, type, url);
8584
anySucceeded = true;

flow-client/src/main/java/com/ligg/flowclient/service/JwtTokenService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ public void updateUserEmail(Long userId, String email) {
158158
continue;
159159
}
160160
session.setEmail(email);
161-
Long ttlSeconds = redisTemplate.getExpire(sessionRedisKey(sessionId), TimeUnit.SECONDS);
162-
if (ttlSeconds != null && ttlSeconds > 0) {
161+
long ttlSeconds = redisTemplate.getExpire(sessionRedisKey(sessionId), TimeUnit.SECONDS);
162+
if (ttlSeconds > 0) {
163163
redisTemplate.opsForValue().set(
164164
sessionRedisKey(sessionId),
165165
session,

flow-client/src/main/java/com/ligg/flowclient/service/UserBgmCollectionService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ public interface UserBgmCollectionService {
77

88
/**
99
* 查询当前登录用户已同步到本地的 Bangumi 收藏列表。
10+
* accessToken 可能为null
1011
*/
11-
UserCollectionsVo listMyCollections(String accessToken, int subjectType, int type, int limit, int offset);
12+
UserCollectionsVo listMyCollections(String accessToken, long userId, int subjectType, int type, int limit, int offset);
1213

1314
/**
1415
* 更新当前用户对条目的 Bangumi 收藏,并同步写入本地 {@code user_bgm_collection}。

flow-client/src/main/java/com/ligg/flowclient/service/impl/BangumiServiceImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public SubjectsDto searchSubjects(SearchSubjectsBody body, int limit, int offset
148148
* 获取关联条目。
149149
*/
150150
@Override
151-
public SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int offset, int type) {
151+
public SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int offset, int type, String bangumiAccessToken) {
152152
SubjectRelationsVo vo = new SubjectRelationsVo();
153153
if (subjectId == null || limit <= 0) {
154154
vo.setData(Collections.emptyList());
@@ -166,7 +166,7 @@ public SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int o
166166
return vo;
167167
}
168168

169-
List<SubjectRelationsVo.Item> items = rows.stream().map(this::toRelationItem).toList();
169+
List<SubjectRelationsVo.Item> items = rows.stream().map(row -> toRelationItem(row, bangumiAccessToken)).toList();
170170
vo.setData(items);
171171
vo.setTotal((int) page.getTotal());
172172
return vo;
@@ -175,7 +175,7 @@ public SubjectRelationsVo getRelatedSubjects(Integer subjectId, int limit, int o
175175
/**
176176
* 将 DB 行转为 VO 条目,在转换过程中按需获取并回写图片。
177177
*/
178-
private SubjectRelationsVo.Item toRelationItem(SubjectRelationRow row) {
178+
private SubjectRelationsVo.Item toRelationItem(SubjectRelationRow row, String bangumiAccessToken) {
179179
SubjectRelationsVo.Item item = new SubjectRelationsVo.Item();
180180

181181
// 构建关联信息
@@ -198,7 +198,7 @@ private SubjectRelationsVo.Item toRelationItem(SubjectRelationRow row) {
198198
subject.setInfo(InfoboxParser.toInfo(row.getInfobox()));
199199
subject.setRating(buildRating(row));
200200
subject.setLocked(false);
201-
subject.setImages(imageBackfillService.resolve(row.getImages(), row.getId()));
201+
subject.setImages(imageBackfillService.resolve(row.getImages(), row.getId(), bangumiAccessToken));
202202

203203
item.setSubject(subject);
204204
return item;

flow-client/src/main/java/com/ligg/flowclient/service/impl/UserBgmCollectionServiceImpl.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ public class UserBgmCollectionServiceImpl implements UserBgmCollectionService {
4848
private final ImageBackfillService imageBackfillService;
4949

5050
@Override
51-
public UserCollectionsVo listMyCollections(String accessToken, int subjectType, int type, int limit, int offset) {
52-
Long userId = jwtTokenService.validateAccessToken(accessToken);
53-
51+
public UserCollectionsVo listMyCollections(String accessToken, long userId, int subjectType, int type, int limit, int offset) {
5452
UserCollectionsVo vo = new UserCollectionsVo();
5553
if (limit <= 0) {
5654
vo.setData(Collections.emptyList());
@@ -70,7 +68,7 @@ public UserCollectionsVo listMyCollections(String accessToken, int subjectType,
7068

7169
List<UserCollectionsDto.Item> items = new ArrayList<>(rows.size());
7270
for (UserBgmCollectionRow row : rows) {
73-
items.add(toItem(row));
71+
items.add(toItem(row, accessToken));
7472
}
7573

7674
vo.setData(items);
@@ -230,7 +228,7 @@ private String toJson(Object value) {
230228
}
231229
}
232230

233-
private UserCollectionsDto.Item toItem(UserBgmCollectionRow row) {
231+
private UserCollectionsDto.Item toItem(UserBgmCollectionRow row, String accessToken) {
234232
UserCollectionsDto.Item item = new UserCollectionsDto.Item();
235233
item.setId(row.getSubjectId());
236234
item.setInterest(toInterest(row));
@@ -248,7 +246,7 @@ private UserCollectionsDto.Item toItem(UserBgmCollectionRow row) {
248246
item.setRating(emptyRating());
249247
}
250248

251-
CoverImages images = imageBackfillService.resolve(row.getImages(), row.getSubjectId());
249+
CoverImages images = imageBackfillService.resolve(row.getImages(), row.getSubjectId(), accessToken);
252250
Utils.applyWsrvCdnInPlace(images);
253251
item.setImages(images);
254252
item.setInfo(InfoboxParser.toInfo(row.getInfobox()));

flow-client/src/test/java/com/ligg/flowclient/service/ImageBackfillServiceTest.java

Lines changed: 0 additions & 116 deletions
This file was deleted.

third-party-api/src/main/java/com/ligg/api/bangumiv0api/BangumiV0Client.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ public interface BangumiV0Client {
1010
/**
1111
* 获取条目封面图片 URL({@code GET /v0/subjects/{subject_id}/image} 302 {@code Location})。
1212
*/
13-
String getSubjectImageUrl(int subjectId, SubjectImageType type);
13+
String getSubjectImageUrl(int subjectId, SubjectImageType type, String accessToken);
1414
}

0 commit comments

Comments
 (0)