From d6c75dcaadd074cd49066a19db19ed837a7754b0 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Thu, 19 Mar 2026 12:00:14 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Fix:=20BossRoom=20=EB=A0=88=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=AF=B8=EC=82=AD=EC=A0=9C=EB=A1=9C=20=EB=8D=B0?= =?UTF-8?q?=EB=94=94=EC=84=9C=EB=B2=84=20=EC=8A=AC=EB=A1=AF=20=EC=9E=AC?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EB=B6=88=EA=B0=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CompleteRaid/FailRaid에서 슬롯 리셋 전 BossRoom hard-delete 추가. 기존에는 BossRoom.SessionName uniqueIndex 충돌로 한 번 사용된 슬롯의 재사용이 불가능했음 (10개 중 점점 사용 가능 슬롯 감소). Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/bossraid/service.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/internal/bossraid/service.go b/internal/bossraid/service.go index 53436f9..03d79f4 100644 --- a/internal/bossraid/service.go +++ b/internal/bossraid/service.go @@ -252,7 +252,10 @@ func (s *Service) CompleteRaid(sessionName string, rewards []PlayerReward) (*Bos } } - // Reset slot to idle so it can accept new raids + // BossRoom 삭제 후 슬롯 리셋 — 다음 파티가 즉시 슬롯 재사용 가능 + if err := s.repo.DeleteRoomBySessionName(sessionName); err != nil { + log.Printf("BossRoom 삭제 실패 (complete): %s: %v", sessionName, err) + } if err := s.repo.ResetRoomSlot(sessionName); err != nil { log.Printf("슬롯 리셋 실패 (complete): %s: %v", sessionName, err) } @@ -276,15 +279,20 @@ func (s *Service) FailRaid(sessionName string) (*BossRoom, error) { return nil, fmt.Errorf("상태 업데이트 실패: %w", err) } - // Reset slot to idle so it can accept new raids - if err := s.repo.ResetRoomSlot(sessionName); err != nil { - log.Printf("슬롯 리셋 실패 (fail): %s: %v", sessionName, err) - } - + // 응답용 room 조회 (삭제 전에 수행) room, err := s.repo.FindBySessionName(sessionName) if err != nil { return nil, fmt.Errorf("방을 찾을 수 없습니다: %w", err) } + + // BossRoom 삭제 후 슬롯 리셋 — 다음 파티가 즉시 슬롯 재사용 가능 + if err := s.repo.DeleteRoomBySessionName(sessionName); err != nil { + log.Printf("BossRoom 삭제 실패 (fail): %s: %v", sessionName, err) + } + if err := s.repo.ResetRoomSlot(sessionName); err != nil { + log.Printf("슬롯 리셋 실패 (fail): %s: %v", sessionName, err) + } + return room, nil } -- 2.49.1 From 4393503245ed0962ce619fe171575448a59530dc Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Thu, 19 Mar 2026 13:15:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Fix:=20GrantExperience=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EB=AF=B8=EC=A1=B4=EC=9E=AC=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1=20fallback?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FindByUserID → GetProfile(auto-create 포함)로 변경하여 프로필 없는 유저의 경험치 지급 실패 방지. Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/player/service.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/player/service.go b/internal/player/service.go index 735f4a4..15a4099 100644 --- a/internal/player/service.go +++ b/internal/player/service.go @@ -167,9 +167,9 @@ func (s *Service) SaveGameDataByUsername(username string, data *GameDataRequest) // GrantExperience adds experience to a player and handles level ups + stat recalculation. func (s *Service) GrantExperience(userID uint, exp int) (*LevelUpResult, error) { - profile, err := s.repo.FindByUserID(userID) + profile, err := s.GetProfile(userID) if err != nil { - return nil, fmt.Errorf("프로필이 존재하지 않습니다") + return nil, fmt.Errorf("프로필 조회/생성 실패: %w", err) } result := ApplyExperience(profile.Level, profile.Experience, exp) -- 2.49.1