From 2e8afd3948f0305bdea39f3dc23a8d1a6f35f144 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Sat, 7 Mar 2026 20:53:59 +0700 Subject: [PATCH] fix --- .vscode/settings.json | 6 ++ internal/services/story_service/service.go | 46 +++++++++------ .../services/story_service/service_test.go | 58 +++++++++++++++++++ 3 files changed, 93 insertions(+), 17 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0610281..8168377 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,9 +2,14 @@ "cSpell.words": [ "ввода", "внимательно", + "вопрос", + "второй", + "дает", "Детективы", "диалога", "диалогом", + "другой", + "задать", "корректный", "Можно", "Название", @@ -12,6 +17,7 @@ "найдено", "Нельзя", "Открываем", + "Открытие", "открытую", "открыть", "получение", diff --git a/internal/services/story_service/service.go b/internal/services/story_service/service.go index 9a81904..eeb6e10 100644 --- a/internal/services/story_service/service.go +++ b/internal/services/story_service/service.go @@ -55,12 +55,22 @@ func (s *StoryService) GetPlace(code string) *models.Place { if s.cleaner.ClearCode(place.Code) == clearCode { applications := make([]*models.Application, 0, len(place.Applications)) for _, application := range place.Applications { - name := s.cleaner.ClearText(application.Name) applications = append( applications, - &models.Application{ - Name: name, - }, + models.NewApplication( + s.cleaner.ClearText(application.Name), + ), + ) + } + doors := make([]*models.Door, 0, len(place.Doors)) + for _, door := range place.Doors { + doors = append( + doors, + models.NewDoor( + door.Code, + door.Name, + models.WithDoorShow(door.Show), + ), ) } return models.NewPlace( @@ -69,7 +79,7 @@ func (s *StoryService) GetPlace(code string) *models.Place { s.cleaner.ClearText(place.Text), models.WithPlaceApplication(applications...), models.WithPlaceHidden(place.Hidden), - models.WithPlaceDoors(place.Doors...), + models.WithPlaceDoors(doors...), ) } } @@ -78,25 +88,27 @@ func (s *StoryService) GetPlace(code string) *models.Place { func (s *StoryService) GetPlaces(codes []string) []*models.Place { places := make([]*models.Place, 0, 100) - m := map[string]any{} + mOpen := map[string]any{} + mDeleted := map[string]any{} for i, code := range codes { place := s.GetPlace(code) - _, ok := m[place.Code] - if place.Hidden && !ok { + if _, ok := mOpen[place.Code]; place.Hidden && !ok { place = models.NewNotFoundPlace(place.Code) } places = append(places, place) - for _, door := range place.Doors { - m[door.Code] = struct{}{} + for j, door := range places[i].Doors { + if _, ok := mDeleted[door.Code]; ok { + places[i].Doors[j].Show = false + continue + } + mOpen[door.Code] = struct{}{} } - if i > 0 { - for j := range places[i-1].Doors { - if places[i-1].Doors[j].Code != place.Code { - if places[i-1].Doors[j].Show { - places[i-1].Doors[j].Show = false - delete(m, places[i-1].Doors[j].Code) - } + for j, door := range places[i-1].Doors { + if door.Code != place.Code && door.Show { + places[i-1].Doors[j].Show = false + delete(mOpen, door.Code) + mDeleted[door.Code] = struct{}{} } } } diff --git a/internal/services/story_service/service_test.go b/internal/services/story_service/service_test.go index af2f7c8..2afe2a3 100644 --- a/internal/services/story_service/service_test.go +++ b/internal/services/story_service/service_test.go @@ -396,6 +396,64 @@ func TestStoryService_GetPlaces(t *testing.T) { ), }, }, + { + name: "Открытие второй раз точки не дает задать другой вопрос", + story: &models.Story{ + Places: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(true)), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewPlace( + "Ы-3", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + }, + }, + codes: []string{"Ы-1", "Ы-2", "Ы-3", "Ы-1", "Ы-3", "Ы-2"}, + want: []*models.Place{ + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(true)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(false)), + ), + ), + models.NewPlace( + "Ы-2", + "Название", + "Текст", + models.WithPlaceHidden(true), + ), + models.NewNotFoundPlace("Ы-3"), + models.NewPlace( + "Ы-1", + "Название", + "Текст", + models.WithPlaceDoors( + models.NewDoor("Ы-2", "Название", models.WithDoorShow(false)), + models.NewDoor("Ы-3", "Название", models.WithDoorShow(false)), + ), + ), + models.NewNotFoundPlace("Ы-3"), + models.NewNotFoundPlace("Ы-2"), + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {