diff --git a/app.go b/app.go index ceb2ced..2452682 100644 --- a/app.go +++ b/app.go @@ -2,8 +2,12 @@ package main import ( "context" + "fmt" "gegio-ue1/model" + "os" + "slices" + "github.com/wailsapp/wails/v2/pkg/runtime" "gorm.io/gorm" ) @@ -38,7 +42,7 @@ func (a *App) GetTournaments() (ts []model.Tournament, err error) { } func (a *App) GetTournament(id int) (t model.Tournament, err error) { - err = a.db.Preload("Game").Preload("Participants").First(&t, id).Error + err = a.db.Preload("Game").Preload("Participants").Preload("Matches").First(&t, id).Error return } func (a *App) SaveTournament(t model.Tournament) error { @@ -58,6 +62,42 @@ func (a *App) FillRandom(t model.Tournament) { } +func (a *App) StartTournament(t model.Tournament) { + t.TournamentState = 1 + a.SaveTournament(t) + t, _ = a.GetTournament(int(t.ID)) + matches := make([]model.Match, 0, len(t.Participants)/2) + for i := range len(t.Participants) / 2 { + matches = append(matches, model.Match{ + TournamentID: t.ID, + Stage: 1, + Order: i, + Participant1ID: t.Participants[i].ID, + Participant2ID: t.Participants[i+len(t.Participants)/2].ID, + }) + } + if len(t.Participants)%2 != 0 { + matches = append(matches, model.Match{ + TournamentID: t.ID, + Stage: 1, + Order: len(t.Participants)/2 + 1, + Participant1ID: t.Participants[len(t.Participants)-1].ID, + Participant2ID: t.Participants[len(t.Participants)-1].ID, + }) + } + a.db.Save(matches) +} + +func (a *App) ExportTournament(t model.Tournament) { + dirname, _ := os.UserHomeDir() + str, err := runtime.SaveFileDialog(a.ctx, runtime.SaveDialogOptions{DefaultDirectory: dirname, DefaultFilename: "tournament.csv"}) + if err != nil { + fmt.Println(err) + } + println(str) + +} + func (a *App) GetParticipants() (ps []model.Participant, err error) { err = a.db.Find(&ps).Error return @@ -75,3 +115,17 @@ func (a *App) RemoveParticipantFromTournament(p model.Participant, t model.Tourn } a.db.Model(&t).Association("Participants").Delete(&p) } + +func (a *App) GetMatches(tID uint) [][]model.Match { + matches := make([][]model.Match, 0) + for { + ms := make([]model.Match, 0) + if err := a.db.Where("tournament_id = ? AND stage = ?", tID, len(matches)).Find(&ms).Error; err != nil || len(ms) == 0 { + fmt.Println(ms) + fmt.Println(err) + return matches + } + slices.SortFunc(ms, func(a, b model.Match) int { return a.Order - b.Order }) + matches = append(matches, ms) + } +} diff --git a/frontend/src/routes/Matches.svelte b/frontend/src/routes/Matches.svelte index 9a6a6dc..18ebe8b 100644 --- a/frontend/src/routes/Matches.svelte +++ b/frontend/src/routes/Matches.svelte @@ -1,17 +1,24 @@ @@ -33,7 +28,7 @@ {#if tournament}
{tournament.Title} - +
diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts index af3c53d..03aa673 100755 --- a/frontend/wailsjs/go/main/App.d.ts +++ b/frontend/wailsjs/go/main/App.d.ts @@ -4,10 +4,14 @@ import {model} from '../models'; export function DeleteParticipat(arg1:model.Participant):Promise; +export function ExportTournament(arg1:model.Tournament):Promise; + export function FillRandom(arg1:model.Tournament):Promise; export function GetGames():Promise>; +export function GetMatches(arg1:number):Promise>; + export function GetParticipants():Promise>; export function GetTournament(arg1:number):Promise; @@ -19,3 +23,5 @@ export function RemoveParticipantFromTournament(arg1:model.Participant,arg2:mode export function SaveParticipant(arg1:model.Participant):Promise; export function SaveTournament(arg1:model.Tournament):Promise; + +export function StartTournament(arg1:model.Tournament):Promise; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js index 9dec93f..dba73c9 100755 --- a/frontend/wailsjs/go/main/App.js +++ b/frontend/wailsjs/go/main/App.js @@ -6,6 +6,10 @@ export function DeleteParticipat(arg1) { return window['go']['main']['App']['DeleteParticipat'](arg1); } +export function ExportTournament(arg1) { + return window['go']['main']['App']['ExportTournament'](arg1); +} + export function FillRandom(arg1) { return window['go']['main']['App']['FillRandom'](arg1); } @@ -14,6 +18,10 @@ export function GetGames() { return window['go']['main']['App']['GetGames'](); } +export function GetMatches(arg1) { + return window['go']['main']['App']['GetMatches'](arg1); +} + export function GetParticipants() { return window['go']['main']['App']['GetParticipants'](); } @@ -37,3 +45,7 @@ export function SaveParticipant(arg1) { export function SaveTournament(arg1) { return window['go']['main']['App']['SaveTournament'](arg1); } + +export function StartTournament(arg1) { + return window['go']['main']['App']['StartTournament'](arg1); +} diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index 2c01fcc..6fb34b3 100755 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -57,6 +57,7 @@ export namespace model { WinnierParticipantID: number; WinnierParticipant: Participant; Participants: Participant[]; + Matches: Match[]; static createFrom(source: any = {}) { return new Tournament(source); @@ -76,6 +77,7 @@ export namespace model { this.WinnierParticipantID = source["WinnierParticipantID"]; this.WinnierParticipant = this.convertValues(source["WinnierParticipant"], Participant); this.Participants = this.convertValues(source["Participants"], Participant); + this.Matches = this.convertValues(source["Matches"], Match); } convertValues(a: any, classs: any, asMap: boolean = false): any { @@ -143,6 +145,64 @@ export namespace model { return a; } } + export class Match { + ID: number; + // Go type: time + CreatedAt: any; + // Go type: time + UpdatedAt: any; + // Go type: gorm + DeletedAt: any; + TournamentID: number; + Stage: number; + Order: number; + Participant1ID: number; + Participant1: Participant; + Participant2ID: number; + Participant2: Participant; + WinnierParticipantID: number; + WinnierParticipant: Participant; + + static createFrom(source: any = {}) { + return new Match(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.ID = source["ID"]; + this.CreatedAt = this.convertValues(source["CreatedAt"], null); + this.UpdatedAt = this.convertValues(source["UpdatedAt"], null); + this.DeletedAt = this.convertValues(source["DeletedAt"], null); + this.TournamentID = source["TournamentID"]; + this.Stage = source["Stage"]; + this.Order = source["Order"]; + this.Participant1ID = source["Participant1ID"]; + this.Participant1 = this.convertValues(source["Participant1"], Participant); + this.Participant2ID = source["Participant2ID"]; + this.Participant2 = this.convertValues(source["Participant2"], Participant); + this.WinnierParticipantID = source["WinnierParticipantID"]; + this.WinnierParticipant = this.convertValues(source["WinnierParticipant"], Participant); + } + + convertValues(a: any, classs: any, asMap: boolean = false): any { + if (!a) { + return a; + } + if (a.slice && a.map) { + return (a as any[]).map(elem => this.convertValues(elem, classs)); + } else if ("object" === typeof a) { + if (asMap) { + for (const key of Object.keys(a)) { + a[key] = new classs(a[key]); + } + return a; + } + return new classs(a); + } + return a; + } + } + } diff --git a/model/model.go b/model/model.go index ea761ae..1a5eaff 100644 --- a/model/model.go +++ b/model/model.go @@ -27,17 +27,18 @@ type Tournament struct { WinnierParticipantID int WinnierParticipant Participant `gorm:"foreignKey:WinnierParticipantID"` Participants []*Participant `gorm:"many2many:partcipant_tournaments;"` + Matches []Match } type Match struct { gorm.Model - TournamentID int + TournamentID uint Stage int Order int - Participant1ID int + Participant1ID uint Participant1 Participant `gorm:"foreignKey:Participant1ID"` - Participant2ID int + Participant2ID uint Participant2 Participant `gorm:"foreignKey:Participant2ID"` - WinnierParticipantID int + WinnierParticipantID uint WinnierParticipant Participant `gorm:"foreignKey:WinnierParticipantID"` } diff --git a/things.db b/things.db deleted file mode 100644 index e69de29..0000000 diff --git a/things/resource.go b/things/resource.go deleted file mode 100644 index 6bd18ba..0000000 --- a/things/resource.go +++ /dev/null @@ -1,43 +0,0 @@ -package things - -import "slices" - -type Thing struct { - ID int - Name string -} - -type Service struct { - things map[int]Thing - maxID int -} - -func NewThingsService() *Service { - return &Service{ - things: make(map[int]Thing), - } -} - -func (s *Service) NewThing(name string) { - s.maxID++ - s.things[s.maxID] = Thing{ - Name: name, - ID: s.maxID, - } - - print(name) -} - -func (s *Service) GetThings() []Thing { - things := make([]Thing, 0, len(s.things)) - for _, t := range s.things { - things = append(things, t) - } - slices.SortFunc(things, func(a, b Thing) int { return a.ID - b.ID }) - return things -} - -func (s *Service) DeleteThing(id int) { - delete(s.things, id) - -} diff --git a/tournament.db b/tournament.db index efeac48..b917d5a 100644 Binary files a/tournament.db and b/tournament.db differ