diff --git a/internal/app/participation.go b/internal/app/participation.go
index 9994a7c..4ce150f 100644
--- a/internal/app/participation.go
+++ b/internal/app/participation.go
@@ -3,14 +3,14 @@ package app
import (
"context"
"errors"
- "evening_detective_server/internal/repos/teams_repo"
+ "evening_detective_server/internal/services/participation_service"
"evening_detective_server/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"google.golang.org/protobuf/types/known/timestamppb"
)
-func mapParticipationResponse(p *teams_repo.Participation) *proto.ParticipationRsp {
+func mapParticipationResponse(p *participation_service.Participation) *proto.ParticipationRsp {
result := &proto.ParticipationRsp{}
if p != nil {
result.TeamName = p.TeamName
@@ -24,7 +24,7 @@ func mapParticipationResponse(p *teams_repo.Participation) *proto.ParticipationR
}
func participationError(err error) string {
- if errors.Is(err, teams_repo.ErrParticipationLink) || errors.Is(err, teams_repo.ErrParticipationFinal) || errors.Is(err, teams_repo.ErrParticipationClosed) {
+ if errors.Is(err, participation_service.ErrParticipationLink) || errors.Is(err, participation_service.ErrParticipationFinal) || errors.Is(err, participation_service.ErrParticipationClosed) {
return err.Error()
}
return "Не удалось обработать ответ. Попробуйте позже."
diff --git a/internal/services/participation_service/mapper.go b/internal/services/participation_service/mapper.go
new file mode 100644
index 0000000..536e377
--- /dev/null
+++ b/internal/services/participation_service/mapper.go
@@ -0,0 +1,20 @@
+package participation_service
+
+import "evening_detective_server/internal/repos/teams_repo"
+
+func mapParticipation(p *teams_repo.Participation) *Participation {
+ if p == nil {
+ return nil
+ }
+ return &Participation{
+ TeamID: p.TeamID,
+ TeamName: p.TeamName,
+ GameName: p.GameName,
+ StartAt: p.StartAt,
+ ParticipantsCount: p.ParticipantsCount,
+ Status: p.Status,
+ Closed: p.Closed,
+ Email: p.Email,
+ Attempts: p.Attempts,
+ }
+}
diff --git a/internal/services/participation_service/participation.go b/internal/services/participation_service/participation.go
new file mode 100644
index 0000000..42886e5
--- /dev/null
+++ b/internal/services/participation_service/participation.go
@@ -0,0 +1,26 @@
+package participation_service
+
+import (
+ "time"
+
+ "evening_detective_server/internal/repos/teams_repo"
+)
+
+// Participation — данные участия, доступные транспортному и email-сценариям.
+type Participation struct {
+ TeamID int
+ TeamName string
+ GameName string
+ StartAt time.Time
+ ParticipantsCount int32
+ Status string
+ Closed bool
+ Email string
+ Attempts int
+}
+
+var (
+ ErrParticipationLink = teams_repo.ErrParticipationLink
+ ErrParticipationClosed = teams_repo.ErrParticipationClosed
+ ErrParticipationFinal = teams_repo.ErrParticipationFinal
+)
diff --git a/internal/services/participation_service/participation_test.go b/internal/services/participation_service/participation_test.go
index 2445b24..8016579 100644
--- a/internal/services/participation_service/participation_test.go
+++ b/internal/services/participation_service/participation_test.go
@@ -33,7 +33,7 @@ func TestParticipationEmail(t *testing.T) {
if len(token) != 64 || token != participationToken("test-secret", 42) || token == participationToken("test-secret", 43) || token == participationToken("other", 42) {
t.Fatal("token isolation or retry stability broken")
}
- p := &teams_repo.Participation{TeamName: "", GameName: "Game", Email: "captain@example.org", StartAt: time.Date(2026, 9, 20, 12, 0, 0, 0, time.UTC), ParticipantsCount: 5}
+ p := &Participation{TeamName: "", GameName: "Game", Email: "captain@example.org", StartAt: time.Date(2026, 9, 20, 12, 0, 0, 0, time.UTC), ParticipantsCount: 5}
m := participationEmail(p, "https://example.org", token, time.FixedZone("+07", 7*3600))
if strings.Contains(m.HTML, "