Skip to content

Commit 402caa5

Browse files
committed
feat(BangumiClient): add bgmToken parameter to subject-related methods for OAuth support #4
1 parent 1e9674d commit 402caa5

3 files changed

Lines changed: 81 additions & 39 deletions

File tree

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

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,17 @@ public Result<SubjectCharactersVo> subjectCharacters(
7575
@NotNull @PathVariable int subjectId,
7676
@RequestParam(defaultValue = "10") int limit,
7777
@RequestParam(defaultValue = "0") int offset,
78+
@RequestAttribute(name = AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE, required = false) String flowAccessToken,
7879
@RequestParam(required = false) Integer type) {
80+
final UserOauthEntity oauth = resolveBangumiOauth(flowAccessToken);
7981
Supplier<SubjectCharactersVo> loader = () -> {
80-
SubjectCharactersDto dto = bangumiClient.getSubjectCharacters(subjectId, limit, offset, type);
82+
SubjectCharactersDto dto;
83+
if (oauth != null) {
84+
dto = bangumiOAuthExecutor.execute(oauth,
85+
token -> bangumiClient.getSubjectCharacters(token, subjectId, limit, offset, type));
86+
} else {
87+
dto = bangumiClient.getSubjectCharacters(null, subjectId, limit, offset, type);
88+
}
8189
if (dto.getData() != null) {
8290
for (SubjectCharactersDto.Item item : dto.getData()) {
8391
if (item == null) {
@@ -128,10 +136,18 @@ public Result<SubjectCharactersVo> subjectCharacters(
128136
@GetMapping("/{subjectId}/staffs/persons")
129137
public Result<SubjectStaffPersonsVo> subjectStaffPersons(
130138
@NotNull @PathVariable int subjectId,
139+
@RequestAttribute(name = AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE, required = false) String flowAccessToken,
131140
@RequestParam(defaultValue = "10") int limit,
132141
@RequestParam(defaultValue = "0") int offset) {
142+
final UserOauthEntity oauth = resolveBangumiOauth(flowAccessToken);
133143
Supplier<SubjectStaffPersonsVo> loader = () -> {
134-
SubjectStaffPersonsDto dto = bangumiClient.getSubjectStaffPersons(subjectId, limit, offset);
144+
SubjectStaffPersonsDto dto;
145+
if (oauth != null) {
146+
dto = bangumiOAuthExecutor.execute(oauth,
147+
token -> bangumiClient.getSubjectStaffPersons(token, subjectId, limit, offset));
148+
} else {
149+
dto = bangumiClient.getSubjectStaffPersons(null, subjectId, limit, offset);
150+
}
135151
if (dto.getData() != null) {
136152
for (SubjectStaffPersonsDto.Item item : dto.getData()) {
137153
if (item != null && item.getStaff() != null) {
@@ -172,9 +188,18 @@ public Result<SubjectStaffPersonsVo> subjectStaffPersons(
172188
public Result<SubjectCommentsVo> subjectComments(
173189
@NotNull @PathVariable int subjectId,
174190
@RequestParam(defaultValue = "20") int limit,
175-
@RequestParam(defaultValue = "0") int offset) {
191+
@RequestParam(defaultValue = "0") int offset,
192+
@RequestAttribute(name = AuthorizationInterceptor.ACCESS_TOKEN_REQUEST_ATTRIBUTE, required = false) String flowAccessToken
193+
) {
194+
final UserOauthEntity oauth = resolveBangumiOauth(flowAccessToken);
176195
Supplier<SubjectCommentsVo> loader = () -> {
177-
SubjectCommentsDto dto = bangumiClient.getSubjectComments(subjectId, limit, offset);
196+
SubjectCommentsDto dto;
197+
if (oauth != null) {
198+
dto = bangumiOAuthExecutor.execute(oauth,
199+
token -> bangumiClient.getSubjectComments(token, subjectId, limit, offset));
200+
} else {
201+
dto = bangumiClient.getSubjectComments(null, subjectId, limit, offset);
202+
}
178203
if (dto.getData() != null) {
179204
for (SubjectCommentsDto.Comment comment : dto.getData()) {
180205
if (comment != null && comment.getUser() != null) {
@@ -217,14 +242,14 @@ public Result<SubjectRelationsVo> subjectRelationsLocal(
217242
@RequestParam(defaultValue = "20") int limit,
218243
@RequestParam(defaultValue = "0") int offset,
219244
@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();
245+
UserOauthEntity oauth = resolveBangumiOauth(flowAccessToken);
246+
SubjectRelationsVo vo;
247+
if (oauth != null) {
248+
vo = bangumiOAuthExecutor.execute(oauth,
249+
token -> bangumiService.getRelatedSubjects(subjectId, limit, offset, type, token));
250+
} else {
251+
vo = bangumiService.getRelatedSubjects(subjectId, limit, offset, type, null);
226252
}
227-
SubjectRelationsVo vo = bangumiService.getRelatedSubjects(subjectId, limit, offset, type, bangumiAccessToken);
228253
if (vo.getData() != null) {
229254
for (SubjectRelationsVo.Item item : vo.getData()) {
230255
if (item != null && item.getSubject() != null) {
@@ -325,6 +350,23 @@ public Result<SubjectDetailVo> subjectDetail(
325350
return Result.success(ResponseCode.SUCCESS, vo);
326351
}
327352

353+
/**
354+
* 从 Flow JWT 中解析 Bangumi OAuth 实体。
355+
* token 无效或未绑定 Bangumi 时返回 {@code null},回退公开访问。
356+
*/
357+
private UserOauthEntity resolveBangumiOauth(String flowAccessToken) {
358+
if (flowAccessToken == null) {
359+
return null;
360+
}
361+
try {
362+
Long userId = jwtTokenService.validateAccessToken(flowAccessToken);
363+
return bangumiOAuthTokenService.findBangumiOauth(userId);
364+
} catch (LoginExpiredException ignored) {
365+
// token 无效或未绑定 Bangumi,回退公开访问
366+
}
367+
return null;
368+
}
369+
328370
private static SubjectDetailVo toSubjectDetailVo(SubjectDetailDto dto) {
329371
Utils.applyWsrvCdnInPlace(dto.getImages());
330372
SubjectDetailVo detailVo = new SubjectDetailVo();

third-party-api/src/main/java/com/ligg/api/bangumiapi/BangumiClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public interface BangumiClient {
7575
*
7676
* @param type 角色类型筛选,可为空
7777
*/
78-
SubjectCharactersDto getSubjectCharacters(int subjectId, int limit, int offset, Integer type);
78+
SubjectCharactersDto getSubjectCharacters(String bgmToken, int subjectId, int limit, int offset, Integer type);
7979

8080
/**
8181
* 获取角色详情
@@ -97,12 +97,12 @@ public interface BangumiClient {
9797
/**
9898
* 获取条目制作人员列表
9999
*/
100-
SubjectStaffPersonsDto getSubjectStaffPersons(int subjectId, int limit, int offset);
100+
SubjectStaffPersonsDto getSubjectStaffPersons(String bgmToken, int subjectId, int limit, int offset);
101101

102102
/**
103103
* 获取条目评论列表
104104
*/
105-
SubjectCommentsDto getSubjectComments(int subjectId, int limit, int offset);
105+
SubjectCommentsDto getSubjectComments(String bgmToken, int subjectId, int limit, int offset);
106106

107107
/**
108108
* 获取条目关联列表

third-party-api/src/main/java/com/ligg/api/bangumiapi/BangumiClientImpl.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,16 @@
1212
import com.ligg.common.thirdparty.bangumi.enums.SubjectBrowseSort;
1313
import com.ligg.common.thirdparty.bangumi.request.SearchSubjectsBody;
1414
import com.ligg.common.thirdparty.bangumi.request.UpdateCollectionBody;
15-
import com.ligg.common.thirdparty.bangumi.response.CharacterCommentDto;
16-
import com.ligg.common.thirdparty.bangumi.response.CharacterCommentsDto;
17-
import com.ligg.common.thirdparty.bangumi.response.CharacterCastsDto;
18-
import com.ligg.common.thirdparty.bangumi.response.CharacterDetailDto;
19-
import com.ligg.common.thirdparty.bangumi.response.CalendarDto;
20-
import com.ligg.common.thirdparty.bangumi.response.EpisodeCommentDto;
21-
import com.ligg.common.thirdparty.bangumi.response.EpisodeCommentsDto;
22-
import com.ligg.common.thirdparty.bangumi.response.SubjectDetailDto;
23-
import com.ligg.common.thirdparty.bangumi.response.SubjectCharactersDto;
24-
import com.ligg.common.thirdparty.bangumi.response.SubjectEpisodesDto;
25-
import com.ligg.common.thirdparty.bangumi.response.SubjectCommentsDto;
26-
import com.ligg.common.thirdparty.bangumi.response.SubjectRelationsDto;
27-
import com.ligg.common.thirdparty.bangumi.response.SubjectStaffPersonsDto;
28-
import com.ligg.common.thirdparty.bangumi.response.SubjectsDto;
29-
import com.ligg.common.thirdparty.bangumi.response.TrendingSubjectsDto;
30-
import com.ligg.common.thirdparty.bangumi.response.UserCollectionsDto;
31-
import com.ligg.common.thirdparty.bangumi.response.UserProfileDto;
15+
import com.ligg.common.thirdparty.bangumi.response.*;
3216
import com.ligg.common.vo.BangumiUserinfoVO;
17+
import io.netty.handler.timeout.ReadTimeoutException;
3318
import lombok.extern.slf4j.Slf4j;
3419
import org.springframework.beans.factory.annotation.Qualifier;
3520
import org.springframework.beans.factory.annotation.Value;
3621
import org.springframework.core.ParameterizedTypeReference;
3722
import org.springframework.http.HttpHeaders;
38-
import org.springframework.util.StringUtils;
3923
import org.springframework.stereotype.Service;
24+
import org.springframework.util.StringUtils;
4025
import org.springframework.web.reactive.function.client.WebClient;
4126
import org.springframework.web.reactive.function.client.WebClientRequestException;
4227
import org.springframework.web.reactive.function.client.WebClientResponseException;
@@ -47,8 +32,6 @@
4732
import java.util.List;
4833
import java.util.concurrent.TimeoutException;
4934

50-
import io.netty.handler.timeout.ReadTimeoutException;
51-
5235
@Slf4j
5336
@Service
5437
public class BangumiClientImpl implements BangumiClient {
@@ -166,7 +149,7 @@ public SubjectEpisodesDto getSubjectEpisodes(int subjectId, int limit, int offse
166149
}
167150

168151
@Override
169-
public SubjectCharactersDto getSubjectCharacters(int subjectId, int limit, int offset, Integer type) {
152+
public SubjectCharactersDto getSubjectCharacters(String bgmToken, int subjectId, int limit, int offset, Integer type) {
170153
log.info("获取条目角色 subjectId={} limit={} offset={} type={}", subjectId, limit, offset, type);
171154
return blockBangumi(bangumiNextClient.get()
172155
.uri(uriBuilder -> {
@@ -179,6 +162,11 @@ public SubjectCharactersDto getSubjectCharacters(int subjectId, int limit, int o
179162
}
180163
return builder.build(subjectId);
181164
})
165+
.headers(headers -> {
166+
if (StringUtils.hasText(bgmToken)) {
167+
headers.setBearerAuth(bgmToken);
168+
}
169+
})
182170
.retrieve()
183171
.bodyToMono(SubjectCharactersDto.class));
184172
}
@@ -202,7 +190,8 @@ public CharacterCommentsDto getCharacterComments(int characterId, int limit, int
202190
.queryParam("offset", offset)
203191
.build(characterId))
204192
.retrieve()
205-
.bodyToMono(new ParameterizedTypeReference<List<CharacterCommentDto>>() {})
193+
.bodyToMono(new ParameterizedTypeReference<List<CharacterCommentDto>>() {
194+
})
206195
.map(comments -> {
207196
CharacterCommentsDto dto = new CharacterCommentsDto();
208197
dto.setData(comments);
@@ -230,27 +219,37 @@ public CharacterCastsDto getCharacterCasts(int characterId, int limit, int offse
230219
}
231220

232221
@Override
233-
public SubjectStaffPersonsDto getSubjectStaffPersons(int subjectId, int limit, int offset) {
222+
public SubjectStaffPersonsDto getSubjectStaffPersons(String bgmToken, int subjectId, int limit, int offset) {
234223
log.info("获取条目制作人员 subjectId={} limit={} offset={}", subjectId, limit, offset);
235224
return blockBangumi(bangumiNextClient.get()
236225
.uri(uriBuilder -> uriBuilder
237226
.path(BangumiNextApiPath.P1_SUBJECT_STAFF_PERSONS)
238227
.queryParam("limit", limit)
239228
.queryParam("offset", offset)
240229
.build(subjectId))
230+
.headers(httpHeaders -> {
231+
if (StringUtils.hasText(bgmToken)) {
232+
httpHeaders.setBearerAuth(bgmToken);
233+
}
234+
})
241235
.retrieve()
242236
.bodyToMono(SubjectStaffPersonsDto.class));
243237
}
244238

245239
@Override
246-
public SubjectCommentsDto getSubjectComments(int subjectId, int limit, int offset) {
240+
public SubjectCommentsDto getSubjectComments(String bgmToken, int subjectId, int limit, int offset) {
247241
log.info("获取条目评论 subjectId={} limit={} offset={}", subjectId, limit, offset);
248242
return blockBangumi(bangumiNextClient.get()
249243
.uri(uriBuilder -> uriBuilder
250244
.path(BangumiNextApiPath.P1_SUBJECT_COMMENTS)
251245
.queryParam("limit", limit)
252246
.queryParam("offset", offset)
253247
.build(subjectId))
248+
.headers(httpHeaders -> {
249+
if (StringUtils.hasText(bgmToken)) {
250+
httpHeaders.setBearerAuth(bgmToken);
251+
}
252+
})
254253
.retrieve()
255254
.bodyToMono(SubjectCommentsDto.class));
256255
}
@@ -278,7 +277,8 @@ public EpisodeCommentsDto getEpisodeComments(long episodeId) {
278277
return blockBangumi(bangumiNextClient.get()
279278
.uri(BangumiNextApiPath.P1_EPISODE_COMMENTS, episodeId)
280279
.retrieve()
281-
.bodyToMono(new ParameterizedTypeReference<List<EpisodeCommentDto>>() {})
280+
.bodyToMono(new ParameterizedTypeReference<List<EpisodeCommentDto>>() {
281+
})
282282
.map(comments -> {
283283
EpisodeCommentsDto dto = new EpisodeCommentsDto();
284284
dto.setData(comments);

0 commit comments

Comments
 (0)