code.vegaprotocol.io/vega@v0.79.0/datanode/entities/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 entities
    17  
    18  import (
    19  	"encoding/json"
    20  	"fmt"
    21  	"time"
    22  
    23  	"code.vegaprotocol.io/vega/libs/num"
    24  	v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2"
    25  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    26  )
    27  
    28  type (
    29  	_Team  struct{}
    30  	TeamID = ID[_Team]
    31  )
    32  
    33  type Team struct {
    34  	ID             TeamID
    35  	Referrer       PartyID
    36  	Name           string
    37  	TeamURL        *string
    38  	AvatarURL      *string
    39  	Closed         bool
    40  	AllowList      []string
    41  	TotalMembers   uint64
    42  	CreatedAt      time.Time
    43  	CreatedAtEpoch uint64
    44  	VegaTime       time.Time
    45  }
    46  
    47  func (t Team) Cursor() *Cursor {
    48  	tc := TeamCursor{
    49  		CreatedAt: t.CreatedAt,
    50  		ID:        t.ID,
    51  	}
    52  	return NewCursor(tc.String())
    53  }
    54  
    55  func (t Team) ToProto() *v2.Team {
    56  	return &v2.Team{
    57  		TeamId:         string(t.ID),
    58  		Referrer:       string(t.Referrer),
    59  		Name:           t.Name,
    60  		TeamUrl:        t.TeamURL,
    61  		AvatarUrl:      t.AvatarURL,
    62  		CreatedAt:      t.CreatedAt.UnixNano(),
    63  		Closed:         t.Closed,
    64  		AllowList:      t.AllowList,
    65  		CreatedAtEpoch: t.CreatedAtEpoch,
    66  		TotalMembers:   t.TotalMembers,
    67  	}
    68  }
    69  
    70  func (t Team) ToProtoEdge(_ ...any) (*v2.TeamEdge, error) {
    71  	return &v2.TeamEdge{
    72  		Node:   t.ToProto(),
    73  		Cursor: t.Cursor().Encode(),
    74  	}, nil
    75  }
    76  
    77  func TeamCreatedFromProto(created *eventspb.TeamCreated, vegaTime time.Time) *Team {
    78  	return &Team{
    79  		ID:             TeamID(created.TeamId),
    80  		Referrer:       PartyID(created.Referrer),
    81  		Name:           created.Name,
    82  		TeamURL:        created.TeamUrl,
    83  		AvatarURL:      created.AvatarUrl,
    84  		CreatedAt:      time.Unix(0, created.CreatedAt),
    85  		CreatedAtEpoch: created.AtEpoch,
    86  		VegaTime:       vegaTime,
    87  		Closed:         created.Closed,
    88  		AllowList:      created.AllowList,
    89  	}
    90  }
    91  
    92  type TeamUpdated struct {
    93  	ID        TeamID
    94  	Name      string
    95  	TeamURL   *string
    96  	AvatarURL *string
    97  	Closed    bool
    98  	AllowList []string
    99  	VegaTime  time.Time
   100  }
   101  
   102  func TeamUpdatedFromProto(updated *eventspb.TeamUpdated, vegaTime time.Time) *TeamUpdated {
   103  	return &TeamUpdated{
   104  		ID:        TeamID(updated.TeamId),
   105  		Name:      updated.Name,
   106  		TeamURL:   updated.TeamUrl,
   107  		AvatarURL: updated.AvatarUrl,
   108  		Closed:    updated.Closed,
   109  		AllowList: updated.AllowList,
   110  		VegaTime:  vegaTime,
   111  	}
   112  }
   113  
   114  type TeamCursor struct {
   115  	CreatedAt time.Time
   116  	ID        TeamID
   117  }
   118  
   119  func (tc TeamCursor) String() string {
   120  	bs, err := json.Marshal(tc)
   121  	if err != nil {
   122  		panic(fmt.Errorf("could not marshal team cursor: %v", err))
   123  	}
   124  	return string(bs)
   125  }
   126  
   127  func (tc *TeamCursor) Parse(cursorString string) error {
   128  	if cursorString == "" {
   129  		return nil
   130  	}
   131  	return json.Unmarshal([]byte(cursorString), tc)
   132  }
   133  
   134  type TeamsStatistics struct {
   135  	TeamID              TeamID
   136  	TotalQuantumRewards num.Decimal
   137  	QuantumRewards      []QuantumRewardsPerEpoch
   138  	TotalQuantumVolumes *num.Uint
   139  	QuantumVolumes      []QuantumVolumesPerEpoch
   140  	TotalGamesPlayed    uint64
   141  	GamesPlayed         []GameID
   142  }
   143  
   144  type QuantumRewardsPerEpoch struct {
   145  	Epoch uint64
   146  	Total num.Decimal
   147  }
   148  
   149  type QuantumVolumesPerEpoch struct {
   150  	Epoch uint64
   151  	Total *num.Uint
   152  }
   153  
   154  func (t TeamsStatistics) Cursor() *Cursor {
   155  	tc := TeamsStatisticsCursor{
   156  		ID: t.TeamID,
   157  	}
   158  	return NewCursor(tc.String())
   159  }
   160  
   161  func (t TeamsStatistics) ToProto() *v2.TeamStatistics {
   162  	gamesPlayed := make([]string, 0, len(t.GamesPlayed))
   163  	for _, id := range t.GamesPlayed {
   164  		gamesPlayed = append(gamesPlayed, id.String())
   165  	}
   166  
   167  	quantumRewards := make([]*v2.QuantumRewardsPerEpoch, 0, len(t.QuantumRewards))
   168  	for _, r := range t.QuantumRewards {
   169  		quantumRewards = append(quantumRewards, &v2.QuantumRewardsPerEpoch{
   170  			Epoch:               r.Epoch,
   171  			TotalQuantumRewards: r.Total.String(),
   172  		})
   173  	}
   174  
   175  	quantumVolumes := make([]*v2.QuantumVolumesPerEpoch, 0, len(t.QuantumVolumes))
   176  	for _, r := range t.QuantumVolumes {
   177  		quantumVolumes = append(quantumVolumes, &v2.QuantumVolumesPerEpoch{
   178  			Epoch:               r.Epoch,
   179  			TotalQuantumVolumes: r.Total.String(),
   180  		})
   181  	}
   182  
   183  	return &v2.TeamStatistics{
   184  		TeamId:              string(t.TeamID),
   185  		TotalQuantumVolume:  t.TotalQuantumVolumes.String(),
   186  		TotalQuantumRewards: t.TotalQuantumRewards.String(),
   187  		QuantumRewards:      quantumRewards,
   188  		QuantumVolumes:      quantumVolumes,
   189  		TotalGamesPlayed:    t.TotalGamesPlayed,
   190  		GamesPlayed:         gamesPlayed,
   191  	}
   192  }
   193  
   194  func (t TeamsStatistics) ToProtoEdge(_ ...any) (*v2.TeamStatisticsEdge, error) {
   195  	return &v2.TeamStatisticsEdge{
   196  		Node:   t.ToProto(),
   197  		Cursor: t.Cursor().Encode(),
   198  	}, nil
   199  }
   200  
   201  type TeamsStatisticsCursor struct {
   202  	ID TeamID
   203  }
   204  
   205  func (c TeamsStatisticsCursor) String() string {
   206  	bs, err := json.Marshal(c)
   207  	if err != nil {
   208  		panic(fmt.Errorf("could not marshal teams stats cursor: %v", err))
   209  	}
   210  	return string(bs)
   211  }
   212  
   213  func (c *TeamsStatisticsCursor) Parse(cursorString string) error {
   214  	if cursorString == "" {
   215  		return nil
   216  	}
   217  	return json.Unmarshal([]byte(cursorString), c)
   218  }
   219  
   220  type TeamMembersStatistics struct {
   221  	PartyID             PartyID
   222  	TotalQuantumVolumes *num.Uint
   223  	TotalQuantumRewards num.Decimal
   224  	QuantumRewards      []QuantumRewardsPerEpoch
   225  	QuantumVolumes      []QuantumVolumesPerEpoch
   226  	TotalGamesPlayed    uint64
   227  	GamesPlayed         []GameID
   228  }
   229  
   230  func (t TeamMembersStatistics) Cursor() *Cursor {
   231  	tc := TeamMemberStatisticsCursor{
   232  		ID: t.PartyID,
   233  	}
   234  	return NewCursor(tc.String())
   235  }
   236  
   237  func (t TeamMembersStatistics) ToProto() *v2.TeamMemberStatistics {
   238  	gamesPlayed := make([]string, 0, len(t.GamesPlayed))
   239  	for _, id := range t.GamesPlayed {
   240  		gamesPlayed = append(gamesPlayed, id.String())
   241  	}
   242  
   243  	quantumRewards := make([]*v2.QuantumRewardsPerEpoch, 0, len(t.QuantumRewards))
   244  	for _, r := range t.QuantumRewards {
   245  		quantumRewards = append(quantumRewards, &v2.QuantumRewardsPerEpoch{
   246  			Epoch:               r.Epoch,
   247  			TotalQuantumRewards: r.Total.String(),
   248  		})
   249  	}
   250  
   251  	quantumVolumes := make([]*v2.QuantumVolumesPerEpoch, 0, len(t.QuantumVolumes))
   252  	for _, r := range t.QuantumVolumes {
   253  		quantumVolumes = append(quantumVolumes, &v2.QuantumVolumesPerEpoch{
   254  			Epoch:               r.Epoch,
   255  			TotalQuantumVolumes: r.Total.String(),
   256  		})
   257  	}
   258  
   259  	return &v2.TeamMemberStatistics{
   260  		PartyId:             string(t.PartyID),
   261  		TotalQuantumVolume:  t.TotalQuantumVolumes.String(),
   262  		TotalQuantumRewards: t.TotalQuantumRewards.String(),
   263  		QuantumRewards:      quantumRewards,
   264  		QuantumVolumes:      quantumVolumes,
   265  		TotalGamesPlayed:    t.TotalGamesPlayed,
   266  		GamesPlayed:         gamesPlayed,
   267  	}
   268  }
   269  
   270  func (t TeamMembersStatistics) ToProtoEdge(_ ...any) (*v2.TeamMemberStatisticsEdge, error) {
   271  	return &v2.TeamMemberStatisticsEdge{
   272  		Node:   t.ToProto(),
   273  		Cursor: t.Cursor().Encode(),
   274  	}, nil
   275  }
   276  
   277  type TeamMemberStatisticsCursor struct {
   278  	ID PartyID
   279  }
   280  
   281  func (c TeamMemberStatisticsCursor) String() string {
   282  	bs, err := json.Marshal(c)
   283  	if err != nil {
   284  		panic(fmt.Errorf("could not marshal team member stats cursor: %v", err))
   285  	}
   286  	return string(bs)
   287  }
   288  
   289  func (c *TeamMemberStatisticsCursor) Parse(cursorString string) error {
   290  	if cursorString == "" {
   291  		return nil
   292  	}
   293  	return json.Unmarshal([]byte(cursorString), c)
   294  }
   295  
   296  type TeamMember struct {
   297  	TeamID        TeamID
   298  	PartyID       PartyID
   299  	JoinedAt      time.Time
   300  	JoinedAtEpoch uint64
   301  	VegaTime      time.Time
   302  }
   303  
   304  func (t TeamMember) Cursor() *Cursor {
   305  	rc := RefereeCursor{
   306  		PartyID: t.PartyID,
   307  	}
   308  	return NewCursor(rc.String())
   309  }
   310  
   311  func (t TeamMember) ToProto() *v2.TeamReferee {
   312  	return &v2.TeamReferee{
   313  		TeamId:        string(t.TeamID),
   314  		Referee:       string(t.PartyID),
   315  		JoinedAt:      t.JoinedAt.UnixNano(),
   316  		JoinedAtEpoch: t.JoinedAtEpoch,
   317  	}
   318  }
   319  
   320  func (t TeamMember) ToProtoEdge(_ ...any) (*v2.TeamRefereeEdge, error) {
   321  	return &v2.TeamRefereeEdge{
   322  		Node:   t.ToProto(),
   323  		Cursor: t.Cursor().Encode(),
   324  	}, nil
   325  }
   326  
   327  func TeamRefereeFromProto(joined *eventspb.RefereeJoinedTeam, vegaTime time.Time) *TeamMember {
   328  	return &TeamMember{
   329  		TeamID:        TeamID(joined.TeamId),
   330  		PartyID:       PartyID(joined.Referee),
   331  		JoinedAt:      time.Unix(0, joined.JoinedAt),
   332  		JoinedAtEpoch: joined.AtEpoch,
   333  		VegaTime:      vegaTime,
   334  	}
   335  }
   336  
   337  type RefereeCursor struct {
   338  	PartyID PartyID
   339  }
   340  
   341  func (rc RefereeCursor) String() string {
   342  	bs, err := json.Marshal(rc)
   343  	if err != nil {
   344  		panic(fmt.Errorf("could not marshal referee cursor: %v", err))
   345  	}
   346  	return string(bs)
   347  }
   348  
   349  func (rc *RefereeCursor) Parse(cursorString string) error {
   350  	if cursorString == "" {
   351  		return nil
   352  	}
   353  	return json.Unmarshal([]byte(cursorString), rc)
   354  }
   355  
   356  type TeamMemberHistory struct {
   357  	TeamID        TeamID
   358  	JoinedAt      time.Time
   359  	JoinedAtEpoch uint64
   360  }
   361  
   362  func (t TeamMemberHistory) Cursor() *Cursor {
   363  	rc := RefereeHistoryCursor{
   364  		JoinedAtEpoch: t.JoinedAtEpoch,
   365  	}
   366  	return NewCursor(rc.String())
   367  }
   368  
   369  func (t TeamMemberHistory) ToProto() *v2.TeamRefereeHistory {
   370  	return &v2.TeamRefereeHistory{
   371  		TeamId:        string(t.TeamID),
   372  		JoinedAt:      t.JoinedAt.UnixNano(),
   373  		JoinedAtEpoch: t.JoinedAtEpoch,
   374  	}
   375  }
   376  
   377  func (t TeamMemberHistory) ToProtoEdge(_ ...any) (*v2.TeamRefereeHistoryEdge, error) {
   378  	return &v2.TeamRefereeHistoryEdge{
   379  		Node: &v2.TeamRefereeHistory{
   380  			TeamId:        string(t.TeamID),
   381  			JoinedAt:      t.JoinedAt.UnixNano(),
   382  			JoinedAtEpoch: t.JoinedAtEpoch,
   383  		},
   384  		Cursor: t.Cursor().Encode(),
   385  	}, nil
   386  }
   387  
   388  type RefereeHistoryCursor struct {
   389  	JoinedAtEpoch uint64
   390  }
   391  
   392  func (rh RefereeHistoryCursor) String() string {
   393  	bs, err := json.Marshal(rh)
   394  	if err != nil {
   395  		panic(fmt.Errorf("could not marshal referee history cursor: %v", err))
   396  	}
   397  	return string(bs)
   398  }
   399  
   400  func (rh *RefereeHistoryCursor) Parse(cursorString string) error {
   401  	if cursorString == "" {
   402  		return nil
   403  	}
   404  	return json.Unmarshal([]byte(cursorString), rh)
   405  }
   406  
   407  type RefereeTeamSwitch struct {
   408  	FromTeamID      TeamID
   409  	ToTeamID        TeamID
   410  	PartyID         PartyID
   411  	SwitchedAt      time.Time
   412  	SwitchedAtEpoch uint64
   413  	VegaTime        time.Time
   414  }
   415  
   416  func TeamRefereeHistoryFromProto(switched *eventspb.RefereeSwitchedTeam, vegaTime time.Time) *RefereeTeamSwitch {
   417  	return &RefereeTeamSwitch{
   418  		FromTeamID:      TeamID(switched.FromTeamId),
   419  		ToTeamID:        TeamID(switched.ToTeamId),
   420  		PartyID:         PartyID(switched.Referee),
   421  		SwitchedAt:      time.Unix(0, switched.SwitchedAt),
   422  		SwitchedAtEpoch: switched.AtEpoch,
   423  		VegaTime:        vegaTime,
   424  	}
   425  }