@@ -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 ();
0 commit comments