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 }