66package com .ligg .flowclient .controller ;
77
88import com .ligg .common .entity .UserOauthEntity ;
9- import com .ligg .common .exception .LoginExpiredException ;
109import com .ligg .common .response .Result ;
1110import com .ligg .common .statuenum .ResponseCode ;
11+ import com .ligg .flowclient .annotation .IpEndpointRateLimit ;
1212import com .ligg .flowclient .interceptor .AuthorizationInterceptor ;
1313import com .ligg .flowclient .module .dto .UpdateUserCollectionDto ;
1414import com .ligg .flowclient .module .dto .UpdateUserDto ;
1515import com .ligg .flowclient .module .vo .FlowUserVo ;
1616import com .ligg .common .vo .bangumi .UserCollectionsVo ;
17- import com .ligg .flowclient .service .BangumiOAuthTokenService ;
18- import com .ligg .flowclient .service .JwtTokenService ;
19- import com .ligg .flowclient .service .UserBgmCollectionService ;
20- import com .ligg .flowclient .service .UserService ;
17+ import com .ligg .flowclient .module .vo .UserBgmCollectionSyncStatusVo ;
18+ import com .ligg .flowclient .service .*;
2119import jakarta .validation .Valid ;
2220import lombok .RequiredArgsConstructor ;
23- import org .springframework .util .StringUtils ;
2421import org .springframework .web .bind .annotation .*;
2522import org .springframework .web .multipart .MultipartFile ;
2623
@@ -35,6 +32,8 @@ public class FlowUserController {
3532
3633 private final BangumiOAuthTokenService bangumiOAuthTokenService ;
3734
35+ private final UserBgmCollectionSyncService userBgmCollectionSyncService ;
36+
3837 private final JwtTokenService jwtTokenService ;
3938
4039 /**
@@ -104,4 +103,29 @@ public Result<Void> updateCollection(
104103 userBgmCollectionService .updateCollection (accessToken , subjectId , body );
105104 return Result .success ();
106105 }
106+
107+ /**
108+ * 提交 Bangumi 收藏同步任务(异步执行,立即返回任务状态)。
109+ * 从 user_oauth 读取 Bangumi token 拉取收藏并写入 user_bgm_collection。
110+ */
111+ @ PostMapping ("/collections/sync" )
112+ @ IpEndpointRateLimit (keyPrefix = "animeflow:account:sync-bgm-collection:ip:" , seconds = 60 , maxRequests = 5 )
113+ public Result <UserBgmCollectionSyncStatusVo > syncBangumiCollections (
114+ @ RequestAttribute (AuthorizationInterceptor .ACCESS_TOKEN_REQUEST_ATTRIBUTE ) String accessToken ,
115+ @ RequestParam (defaultValue = "2" ) int subjectType ) {
116+ Long userId = jwtTokenService .validateAccessToken (accessToken );
117+ UserBgmCollectionSyncStatusVo status = userBgmCollectionSyncService .triggerSync (userId , subjectType );
118+ return Result .success (ResponseCode .SUCCESS , status );
119+ }
120+
121+ /**
122+ * 查询 Bangumi 收藏同步任务状态。
123+ */
124+ @ GetMapping ("/collections/sync" )
125+ public Result <UserBgmCollectionSyncStatusVo > getBangumiCollectionSyncStatus (
126+ @ RequestAttribute (AuthorizationInterceptor .ACCESS_TOKEN_REQUEST_ATTRIBUTE ) String accessToken ) {
127+ Long userId = jwtTokenService .validateAccessToken (accessToken );
128+ UserBgmCollectionSyncStatusVo status = userBgmCollectionSyncService .getSyncStatus (userId );
129+ return Result .success (ResponseCode .SUCCESS , status );
130+ }
107131}
0 commit comments