From cacf02681bfdda7926379d37d58ad1a21e398e1a Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期六, 04 十月 2025 19:08:12 +0800
Subject: [PATCH] fix(auth): 对无 Authorization 的 GraphQL 请求默认匿名放行到解析层,避免 400/403;公开查询仍优先识别后放行

---
 backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java |  122 +++++++++++++++++++++++++++++-----------
 1 files changed, 87 insertions(+), 35 deletions(-)

diff --git a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java
index 9c2a940..b40491c 100644
--- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java
+++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java
@@ -18,6 +18,7 @@
 import com.rongyichuang.user.service.UserService;
 import com.rongyichuang.media.service.MediaV2Service;
 import com.rongyichuang.media.dto.MediaSaveInput;
+import com.rongyichuang.message.service.MessageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -58,8 +59,26 @@
     @Autowired
     private MediaV2Service mediaV2Service;
 
+    @Autowired
+    private MessageService messageService;
 
 
+    public ActivityPlayer getMyActivityPlayer(Long activityId) {
+        Long userId = userContextUtil.getCurrentUserId();
+        if (userId == null) {
+            return null;
+        }
+        Optional<Player> playerOpt = playerRepository.findByUserId(userId);
+        if (playerOpt.isEmpty()) {
+            return null;
+        }
+        Player player = playerOpt.get();
+        List<ActivityPlayer> activityPlayers = activityPlayerRepository.findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId());
+        if (activityPlayers.isEmpty()) {
+            return null;
+        }
+        return activityPlayers.get(0);
+    }
     /**
      * 鎻愪氦娲诲姩鎶ュ悕
      * @param input 鎶ュ悕杈撳叆淇℃伅
@@ -94,28 +113,24 @@
             }
             log.info("閫夋墜璁板綍澶勭悊鎴愬姛锛岄�夋墜ID: {}", player.getId());
 
-            // 3. 妫�鏌ユ槸鍚﹀凡缁忔姤鍚�
-            log.info("妫�鏌ユ槸鍚﹀凡缁忔姤鍚嶏紝娲诲姩ID: {}, 閫夋墜ID: {}", input.getActivityId(), player.getId());
-            Optional<ActivityPlayer> existingRegistration = activityPlayerRepository
-                    .findByActivityIdAndPlayerId(input.getActivityId(), player.getId());
-            if (existingRegistration.isPresent()) {
-                log.warn("閫夋墜宸茬粡鎶ュ悕杩囨娲诲姩");
-                return ActivityRegistrationResponse.error("鎮ㄥ凡缁忔姤鍚嶈繃姝ゆ椿鍔�");
+            // 3. 妫�鏌ユ槸鍚﹀凡缁忔姤鍚嶏紙涓ユ牸闄愬畾鍚屼竴娲诲姩+鍚屼竴閫夋墜锛�
+            log.info("妫�鏌ユ槸鍚﹀瓨鍦ㄦ湁鏁堟姤鍚嶏紙state IN 0,1锛夛紝娲诲姩ID: {}, 閫夋墜ID: {}", input.getActivityId(), player.getId());
+            Long activeOrPendingCount = activityPlayerRepository.countActiveOrPendingByActivityAndPlayer(input.getActivityId(), player.getId());
+            if (activeOrPendingCount != null && activeOrPendingCount > 0) {
+                log.warn("鍚屼竴娲诲姩涓庨�夋墜瀛樺湪寰呭鏍告垨宸查�氳繃鐨勬姤鍚嶈褰曪紝绂佹閲嶅鎻愪氦銆俢ount={}", activeOrPendingCount);
+                return ActivityRegistrationResponse.error("鎮ㄥ湪璇ユ椿鍔ㄥ凡鏈夊緟瀹℃牳鎴栧凡閫氳繃鐨勬姤鍚嶏紝璇峰嬁閲嶅鎻愪氦");
             }
-            log.info("鏈彂鐜伴噸澶嶆姤鍚�");
+            log.info("鏈彂鐜版湁鏁堟姤鍚嶏紝鍏佽鍒涘缓鏂扮殑鎶ュ悕璁板綍銆�");
 
-            // 4. 鏌ユ壘绗竴闃舵锛屽鏋滄病鏈夊垯浣跨敤娲诲姩鏈韩
+            // 4. 鏌ユ壘绗竴闃舵锛堜弗鏍硷細pid=娲诲姩ID 涓� sort_order=1锛夛紝鏈厤缃垯鎷掔粷鎶ュ悕
             log.info("鏌ユ壘娲诲姩鐨勭涓�闃舵锛屾椿鍔↖D: {}", input.getActivityId());
             Activity firstStage = activityRepository.findFirstStageByActivityId(input.getActivityId());
-            Long stageId;
-            if (firstStage != null) {
-                stageId = firstStage.getId();
-                log.info("鎵惧埌绗竴闃舵锛岄樁娈礗D: {}, 闃舵鍚嶇О: {}", firstStage.getId(), firstStage.getName());
-            } else {
-                // 濡傛灉娌℃湁鎵惧埌绗竴闃舵锛屼娇鐢ㄦ椿鍔ㄦ湰韬綔涓洪樁娈�
-                stageId = input.getActivityId();
-                log.info("鏈壘鍒扮涓�闃舵锛屼娇鐢ㄦ椿鍔ㄦ湰韬綔涓洪樁娈碉紝娲诲姩ID: {}", input.getActivityId());
+            if (firstStage == null) {
+                log.warn("鏈壘鍒扮涓�闃舵锛坧id={}, sort_order=1锛夛紝鎷掔粷鎶ュ悕銆傛椿鍔↖D: {}", input.getActivityId(), input.getActivityId());
+                return ActivityRegistrationResponse.error("娲诲姩鏈厤缃涓�闃舵锛屾棤娉曟姤鍚�");
             }
+            Long stageId = firstStage.getId();
+            log.info("鎵惧埌绗竴闃舵锛岄樁娈礗D: {}, 闃舵鍚嶇О: {}", firstStage.getId(), firstStage.getName());
 
             // 5. 鍒涘缓鎶ュ悕璁板綍
             log.info("寮�濮嬪垱寤烘姤鍚嶈褰�");
@@ -216,25 +231,47 @@
     }
 
     /**
-     * 鍒涘缓鎴栨洿鏂扮敤鎴疯褰�
+     * 鍒涘缓鎴栨洿鏂扮敤鎴疯褰曪紙浠呭湪灏忕▼搴忔姤鍚嶆垚鍔熸椂鍒涘缓鏂扮敤鎴凤級
      */
     private User createOrUpdateUser(ActivityRegistrationInput input) {
         try {
-            // 浣跨敤UserService鐨刦indOrCreateUserByPhone鏂规硶
-            User user = userService.findOrCreateUserByPhone(
-                input.getPlayerInfo().getPhone(),
-                input.getPlayerInfo().getName(),
-                null // 涓嶈缃瘑鐮侊紝浣跨敤榛樿瀵嗙爜
-            );
+            String phone = input.getPlayerInfo().getPhone();
+            String name = input.getPlayerInfo().getName();
             
-            // 鏇存柊鐢ㄦ埛鐨勭敓鏃ヤ俊鎭�
-            if (input.getPlayerInfo().getBirthDate() != null) {
-                user.setBirthday(input.getPlayerInfo().getBirthDate());
+            // 鍏堟煡鎵剧幇鏈夌敤鎴�
+            Optional<User> existingUserOpt = userService.findByPhone(phone);
+            
+            if (existingUserOpt.isPresent()) {
+                // 鐢ㄦ埛瀛樺湪锛屾洿鏂颁俊鎭�
+                User user = existingUserOpt.get();
+                user.setName(name);
+                
+                // 鏇存柊鐢ㄦ埛鐨勭敓鏃ヤ俊鎭�
+                if (input.getPlayerInfo().getBirthDate() != null) {
+                    user.setBirthday(input.getPlayerInfo().getBirthDate());
+                }
+                
                 user = userService.save(user);
-                log.info("鏇存柊鐢ㄦ埛鐢熸棩淇℃伅鎴愬姛锛岀敤鎴稩D: {}", user.getId());
+                log.info("鏇存柊鐜版湁鐢ㄦ埛淇℃伅鎴愬姛锛岀敤鎴稩D: {}", user.getId());
+                return user;
+            } else {
+                // 鐢ㄦ埛涓嶅瓨鍦紝鍒涘缓鏂扮敤鎴凤紙浠呭湪灏忕▼搴忔姤鍚嶆垚鍔熸椂锛�
+                log.info("鐢ㄦ埛涓嶅瓨鍦紝涓哄皬绋嬪簭鎶ュ悕鎴愬姛鍒涘缓鏂扮敤鎴凤紝鎵嬫満鍙�: {}", phone);
+                
+                User newUser = new User();
+                newUser.setName(name);
+                newUser.setPhone(phone);
+                newUser.setPassword(userService.getPasswordEncoder().encode("123456")); // 榛樿瀵嗙爜
+                
+                // 璁剧疆鐢熸棩淇℃伅
+                if (input.getPlayerInfo().getBirthDate() != null) {
+                    newUser.setBirthday(input.getPlayerInfo().getBirthDate());
+                }
+                
+                newUser = userService.save(newUser);
+                log.info("涓哄皬绋嬪簭鎶ュ悕鎴愬姛鍒涘缓鏂扮敤鎴凤紝鐢ㄦ埛ID: {}", newUser.getId());
+                return newUser;
             }
-            
-            return user;
         } catch (Exception e) {
             log.error("鍒涘缓鎴栨洿鏂扮敤鎴疯褰曟椂鍙戠敓閿欒", e);
             throw new RuntimeException("鍒涘缓鎴栨洿鏂扮敤鎴疯褰曞け璐�", e);
@@ -318,16 +355,17 @@
 
             Player player = playerOpt.get();
             
-            // 鏌ユ壘璇ョ帺瀹跺湪鎸囧畾娲诲姩涓殑鎶ュ悕璁板綍
-            Optional<ActivityPlayer> activityPlayerOpt = activityPlayerRepository
-                    .findByActivityIdAndPlayerId(activityId, player.getId());
+            // 鏌ユ壘璇ョ帺瀹跺湪鎸囧畾娲诲姩涓殑鎶ュ悕璁板綍锛堣幏鍙栨渶鏂扮殑锛�
+            List<ActivityPlayer> activityPlayers = activityPlayerRepository
+                    .findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId());
             
-            if (!activityPlayerOpt.isPresent()) {
+            if (activityPlayers.isEmpty()) {
                 log.info("鐜╁ {} 鏈湪娲诲姩 {} 涓姤鍚�", player.getId(), activityId);
                 return null;
             }
 
-            ActivityPlayer activityPlayer = activityPlayerOpt.get();
+            // 鑾峰彇鏈�鏂扮殑鎶ュ悕璁板綍
+            ActivityPlayer activityPlayer = activityPlayers.get(0);
             
             // 鏋勫缓鍝嶅簲瀵硅薄
             PlayerRegistrationResponse response = new PlayerRegistrationResponse();
@@ -362,6 +400,13 @@
             activityPlayer.setFeedback(feedback);
             activityPlayerRepository.save(activityPlayer);
 
+            // 鍒涘缓瀹℃牳閫氳繃娑堟伅
+            messageService.createApprovalMessage(
+                activityPlayerId, 
+                activityPlayer.getPlayerId(), 
+                activityPlayer.getProjectName()
+            );
+
             log.info("瀹℃牳閫氳繃鎴愬姛锛宎ctivityPlayerId: {}", activityPlayerId);
             return true;
         } catch (Exception e) {
@@ -385,6 +430,13 @@
             activityPlayer.setFeedback(feedback);
             activityPlayerRepository.save(activityPlayer);
 
+            // 鍒涘缓瀹℃牳椹冲洖娑堟伅
+            messageService.createRejectionMessage(
+                activityPlayerId, 
+                activityPlayer.getPlayerId(), 
+                activityPlayer.getProjectName()
+            );
+
             log.info("瀹℃牳椹冲洖鎴愬姛锛宎ctivityPlayerId: {}", activityPlayerId);
             return true;
         } catch (Exception e) {

--
Gitblit v1.8.0