code.vegaprotocol.io/vega@v0.79.0/datanode/sqlsubscribers/teams.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package sqlsubscribers
    17  
    18  import (
    19  	"context"
    20  
    21  	"code.vegaprotocol.io/vega/core/events"
    22  	"code.vegaprotocol.io/vega/datanode/entities"
    23  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    24  
    25  	"github.com/pkg/errors"
    26  )
    27  
    28  type (
    29  	TeamCreatedEvent interface {
    30  		events.Event
    31  		TeamCreated() *eventspb.TeamCreated
    32  	}
    33  
    34  	TeamUpdateEvent interface {
    35  		events.Event
    36  		TeamUpdated() *eventspb.TeamUpdated
    37  	}
    38  
    39  	RefereeJoinedTeam interface {
    40  		events.Event
    41  		RefereeJoinedTeam() *eventspb.RefereeJoinedTeam
    42  	}
    43  
    44  	RefereeSwitchedTeam interface {
    45  		events.Event
    46  		RefereeSwitchedTeam() *eventspb.RefereeSwitchedTeam
    47  	}
    48  
    49  	TeamsStatsUpdated interface {
    50  		events.Event
    51  		TeamsStatsUpdated() *eventspb.TeamsStatsUpdated
    52  	}
    53  
    54  	TeamStore interface {
    55  		AddTeam(ctx context.Context, team *entities.Team) error
    56  		UpdateTeam(ctx context.Context, team *entities.TeamUpdated) error
    57  		RefereeJoinedTeam(ctx context.Context, referee *entities.TeamMember) error
    58  		RefereeSwitchedTeam(ctx context.Context, referee *entities.RefereeTeamSwitch) error
    59  		TeamsStatsUpdated(ctx context.Context, stats *eventspb.TeamsStatsUpdated) error
    60  	}
    61  
    62  	Teams struct {
    63  		subscriber
    64  		store TeamStore
    65  	}
    66  )
    67  
    68  func NewTeams(store TeamStore) *Teams {
    69  	return &Teams{
    70  		store: store,
    71  	}
    72  }
    73  
    74  func (t *Teams) Types() []events.Type {
    75  	return []events.Type{
    76  		events.TeamCreatedEvent,
    77  		events.TeamUpdatedEvent,
    78  		events.RefereeJoinedTeamEvent,
    79  		events.RefereeSwitchedTeamEvent,
    80  		events.TeamsStatsUpdatedEvent,
    81  	}
    82  }
    83  
    84  func (t *Teams) Push(ctx context.Context, evt events.Event) error {
    85  	switch e := evt.(type) {
    86  	case TeamCreatedEvent:
    87  		return t.consumeTeamCreatedEvent(ctx, e)
    88  	case TeamUpdateEvent:
    89  		return t.consumeTeamUpdateEvent(ctx, e)
    90  	case RefereeJoinedTeam:
    91  		return t.consumeRefereeJoinedTeamEvent(ctx, e)
    92  	case RefereeSwitchedTeam:
    93  		return t.consumeRefereeSwitchedTeamEvent(ctx, e)
    94  	case TeamsStatsUpdated:
    95  		return t.consumeTeamsStatsUpdatedEvent(ctx, e)
    96  	default:
    97  		return nil
    98  	}
    99  }
   100  
   101  func (t *Teams) consumeTeamCreatedEvent(ctx context.Context, e TeamCreatedEvent) error {
   102  	createdEvt := e.TeamCreated()
   103  	created := entities.TeamCreatedFromProto(createdEvt, t.vegaTime)
   104  	return errors.Wrap(t.store.AddTeam(ctx, created), "adding team")
   105  }
   106  
   107  func (t *Teams) consumeTeamUpdateEvent(ctx context.Context, e TeamUpdateEvent) error {
   108  	updatedEvt := e.TeamUpdated()
   109  	updated := entities.TeamUpdatedFromProto(updatedEvt, t.vegaTime)
   110  	return errors.Wrap(t.store.UpdateTeam(ctx, updated), "updating team")
   111  }
   112  
   113  func (t *Teams) consumeRefereeJoinedTeamEvent(ctx context.Context, e RefereeJoinedTeam) error {
   114  	joinedEvt := e.RefereeJoinedTeam()
   115  	referee := entities.TeamRefereeFromProto(joinedEvt, t.vegaTime)
   116  	return errors.Wrap(t.store.RefereeJoinedTeam(ctx, referee), "adding referee to team")
   117  }
   118  
   119  func (t *Teams) consumeRefereeSwitchedTeamEvent(ctx context.Context, e RefereeSwitchedTeam) error {
   120  	switchedEvt := e.RefereeSwitchedTeam()
   121  	switched := entities.TeamRefereeHistoryFromProto(switchedEvt, t.vegaTime)
   122  	return errors.Wrap(t.store.RefereeSwitchedTeam(ctx, switched), "updating referee history")
   123  }
   124  
   125  func (t *Teams) consumeTeamsStatsUpdatedEvent(ctx context.Context, e TeamsStatsUpdated) error {
   126  	return errors.Wrap(t.store.TeamsStatsUpdated(ctx, e.TeamsStatsUpdated()), "teams stats updated")
   127  }
   128  
   129  func (t *Teams) Name() string {
   130  	return "Teams"
   131  }