From 82adb37ecb1566f1ea00314896c38cbfabad20d9 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Tue, 17 Mar 2026 13:09:23 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20BossRoom=20soft=20delete=20=E2=86=92=20h?= =?UTF-8?q?ard=20delete=20+=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BossRoom 삭제 시 Unscoped() hard delete로 변경하여 unique index 충돌 방지 - GetProfile에서 프로필 없으면 기본값으로 자동 생성 Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/bossraid/repository.go | 3 ++- internal/player/service.go | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/bossraid/repository.go b/internal/bossraid/repository.go index f05e919..ff5f398 100644 --- a/internal/bossraid/repository.go +++ b/internal/bossraid/repository.go @@ -208,8 +208,9 @@ func (r *Repository) ResetRoomSlot(sessionName string) error { // DeleteRoomBySessionName removes BossRoom records for a given session name. // Used during ResetRoom to prevent duplicate session_name conflicts on next entry. +// Unscoped to perform hard delete — soft delete would leave the unique index occupied. func (r *Repository) DeleteRoomBySessionName(sessionName string) error { - return r.db.Where("session_name = ?", sessionName).Delete(&BossRoom{}).Error + return r.db.Unscoped().Where("session_name = ?", sessionName).Delete(&BossRoom{}).Error } // ResetStaleSlots clears instanceID for slots with stale heartbeats diff --git a/internal/player/service.go b/internal/player/service.go index 4439bac..f65a204 100644 --- a/internal/player/service.go +++ b/internal/player/service.go @@ -56,12 +56,16 @@ func (s *Service) CreateProfile(userID uint) error { return s.repo.Create(profile) } -// GetProfile JWT 인증된 유저의 프로필을 조회한다. +// GetProfile JWT 인증된 유저의 프로필을 조회한다. 없으면 자동 생성. func (s *Service) GetProfile(userID uint) (*PlayerProfile, error) { profile, err := s.repo.FindByUserID(userID) if err != nil { if err == gorm.ErrRecordNotFound { - return nil, fmt.Errorf("프로필이 존재하지 않습니다") + profile = &PlayerProfile{UserID: userID} + if createErr := s.repo.Create(profile); createErr != nil { + return nil, fmt.Errorf("프로필 자동 생성에 실패했습니다: %w", createErr) + } + return profile, nil } return nil, fmt.Errorf("프로필 조회에 실패했습니다") }