Files
evening_detective_server/internal/app/participation.go
T
2026-10-03 01:24:18 +07:00

59 lines
2.1 KiB
Go

package app
import (
"context"
"errors"
"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 *participation_service.Participation) *proto.ParticipationRsp {
result := &proto.ParticipationRsp{}
if p != nil {
result.TeamName = p.TeamName
result.GameName = p.GameName
result.StartAt = timestamppb.New(p.StartAt)
result.ParticipantsCount = p.ParticipantsCount
result.Status = p.Status
result.Closed = p.Closed
}
return result
}
func participationError(err error) string {
if errors.Is(err, participation_service.ErrParticipationLink) || errors.Is(err, participation_service.ErrParticipationFinal) || errors.Is(err, participation_service.ErrParticipationClosed) {
return err.Error()
}
return "Не удалось обработать ответ. Попробуйте позже."
}
func (s *server) GetParticipation(ctx context.Context, req *proto.GetParticipationReq) (*proto.ParticipationRsp, error) {
_ = grpc.SetHeader(ctx, metadata.Pairs("Cache-Control", "no-store"))
if req == nil {
return &proto.ParticipationRsp{Error: participationError(participation_service.ErrParticipationLink)}, nil
}
p, err := s.participationService.GetParticipation(ctx, req.Token)
result := mapParticipationResponse(p)
if err != nil {
result.Error = participationError(err)
}
return result, nil
}
func (s *server) AnswerParticipation(ctx context.Context, req *proto.AnswerParticipationReq) (*proto.ParticipationRsp, error) {
_ = grpc.SetHeader(ctx, metadata.Pairs("Cache-Control", "no-store"))
if req == nil {
return &proto.ParticipationRsp{Error: participationError(participation_service.ErrParticipationLink)}, nil
}
if req.Answer != "confirmed" && req.Answer != "cancelled" {
return &proto.ParticipationRsp{Error: participation_service.ErrInvalidAnswer.Error()}, nil
}
p, err := s.participationService.AnswerParticipation(ctx, req.Token, req.Answer)
result := mapParticipationResponse(p)
if err != nil {
result.Error = participationError(err)
}
return result, nil
}