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