feat: add the DeletedAt field to Player and Tribe

This commit is contained in:
Dawid Wysokiński 2022-08-15 10:27:48 +02:00
parent 8cb279f4c9
commit 4b976580a6
Signed by: Kichiyaki
GPG Key ID: B5445E357FB8B892
5 changed files with 84 additions and 40 deletions

View File

@ -7,7 +7,6 @@ linters:
- bodyclose - bodyclose
- deadcode - deadcode
- depguard - depguard
- dupl
- errcheck - errcheck
- gocritic - gocritic
- gofmt - gofmt

View File

@ -3,12 +3,15 @@ package service
import ( import (
"context" "context"
"fmt" "fmt"
"sort"
"gitea.dwysokinski.me/twhelp/core/internal/domain" "gitea.dwysokinski.me/twhelp/core/internal/domain"
) )
type PlayerRepository interface { type PlayerRepository interface {
CreateOrUpdate(ctx context.Context, params ...domain.CreatePlayerParams) error CreateOrUpdate(ctx context.Context, params ...domain.CreatePlayerParams) error
DeleteByID(ctx context.Context, ids ...int64) error
List(ctx context.Context, params domain.ListPlayersParams) ([]domain.Player, int64, error)
} }
type PlayersGetter interface { type PlayersGetter interface {
@ -30,6 +33,17 @@ func (p *Player) Refresh(ctx context.Context, key, url string) (int64, error) {
return 0, fmt.Errorf("TWClient.GetPlayers: %w", err) return 0, fmt.Errorf("TWClient.GetPlayers: %w", err)
} }
existingPlayers, _, err := p.repo.List(ctx, domain.ListPlayersParams{
ServerKeys: []string{key},
Deleted: domain.NullBool{
Valid: true,
Bool: false,
},
})
if err != nil {
return 0, fmt.Errorf("PlayerRepository.List: %w", err)
}
params := make([]domain.CreatePlayerParams, 0, len(players)) params := make([]domain.CreatePlayerParams, 0, len(players))
for _, player := range players { for _, player := range players {
params = append(params, domain.CreatePlayerParams{ params = append(params, domain.CreatePlayerParams{
@ -42,5 +56,21 @@ func (p *Player) Refresh(ctx context.Context, key, url string) (int64, error) {
return 0, fmt.Errorf("PlayerRepository.CreateOrUpdate: %w", err) return 0, fmt.Errorf("PlayerRepository.CreateOrUpdate: %w", err)
} }
//nolint:prealloc
var playersToDelete []int64
for _, existing := range existingPlayers {
i := sort.Search(len(players), func(i int) bool {
return players[i].ID >= existing.ID
})
if i < len(players) && players[i].ID == existing.ID {
continue
}
playersToDelete = append(playersToDelete, existing.ID)
}
err = p.repo.DeleteByID(ctx, playersToDelete...)
if err != nil {
return 0, fmt.Errorf("PlayerRepository.DeleteByID: %w", err)
}
return int64(len(players)), nil return int64(len(players)), nil
} }

View File

@ -3,6 +3,7 @@ package service
import ( import (
"context" "context"
"fmt" "fmt"
"sort"
"gitea.dwysokinski.me/twhelp/core/internal/domain" "gitea.dwysokinski.me/twhelp/core/internal/domain"
) )
@ -10,6 +11,8 @@ import (
type TribeRepository interface { type TribeRepository interface {
CreateOrUpdate(ctx context.Context, params ...domain.CreateTribeParams) error CreateOrUpdate(ctx context.Context, params ...domain.CreateTribeParams) error
UpdateDominance(ctx context.Context, serverKey string, numVillages int64) error UpdateDominance(ctx context.Context, serverKey string, numVillages int64) error
DeleteByID(ctx context.Context, ids ...int64) error
List(ctx context.Context, params domain.ListTribesParams) ([]domain.Tribe, int64, error)
} }
type TribesGetter interface { type TribesGetter interface {
@ -31,6 +34,17 @@ func (t *Tribe) Refresh(ctx context.Context, key, url string) (int64, error) {
return 0, fmt.Errorf("TWClient.GetTribes: %w", err) return 0, fmt.Errorf("TWClient.GetTribes: %w", err)
} }
existingTribes, _, err := t.repo.List(ctx, domain.ListTribesParams{
ServerKeys: []string{key},
Deleted: domain.NullBool{
Valid: true,
Bool: false,
},
})
if err != nil {
return 0, fmt.Errorf("TribeRepository.List: %w", err)
}
params := make([]domain.CreateTribeParams, 0, len(tribes)) params := make([]domain.CreateTribeParams, 0, len(tribes))
for _, tribe := range tribes { for _, tribe := range tribes {
params = append(params, domain.CreateTribeParams{ params = append(params, domain.CreateTribeParams{
@ -43,6 +57,22 @@ func (t *Tribe) Refresh(ctx context.Context, key, url string) (int64, error) {
return 0, fmt.Errorf("TribeRepository.CreateOrUpdate: %w", err) return 0, fmt.Errorf("TribeRepository.CreateOrUpdate: %w", err)
} }
//nolint:prealloc
var tribesToDelete []int64
for _, existing := range existingTribes {
i := sort.Search(len(tribes), func(i int) bool {
return tribes[i].ID >= existing.ID
})
if i < len(tribes) && tribes[i].ID == existing.ID {
continue
}
tribesToDelete = append(tribesToDelete, existing.ID)
}
err = t.repo.DeleteByID(ctx, tribesToDelete...)
if err != nil {
return 0, fmt.Errorf("TribeRepository.DeleteByID: %w", err)
}
return int64(len(tribes)), nil return int64(len(tribes)), nil
} }

View File

@ -9,6 +9,7 @@ import (
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -177,6 +178,10 @@ func (c *Client) GetTribes(ctx context.Context, baseURL string) ([]domain.BaseTr
tribes[i] = tribe tribes[i] = tribe
} }
sort.SliceStable(tribes, func(i, j int) bool {
return tribes[i].ID < tribes[j].ID
})
return tribes, nil return tribes, nil
} }
@ -250,6 +255,10 @@ func (c *Client) GetPlayers(ctx context.Context, baseURL string) ([]domain.BaseP
players[i] = player players[i] = player
} }
sort.SliceStable(players, func(i, j int) bool {
return players[i].ID < players[j].ID
})
return players, nil return players, nil
} }
@ -380,6 +389,10 @@ func (c *Client) GetVillages(ctx context.Context, baseURL string) ([]domain.Base
villages[i] = village villages[i] = village
} }
sort.SliceStable(villages, func(i, j int) bool {
return villages[i].ID < villages[j].ID
})
return villages, nil return villages, nil
} }

View File

@ -10,6 +10,8 @@ import (
"strconv" "strconv"
"testing" "testing"
"github.com/stretchr/testify/require"
"gitea.dwysokinski.me/twhelp/core/internal/domain" "gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/tw" "gitea.dwysokinski.me/twhelp/core/internal/tw"
@ -814,19 +816,9 @@ func TestClient_GetTribes(t *testing.T) {
} }
assert.True(t, checkErr(err)) assert.True(t, checkErr(err))
assert.Len(t, tribes, len(tt.expectedTribes)) require.Len(t, tribes, len(tt.expectedTribes))
for i, tribe := range tt.expectedTribes {
for _, tribe := range tt.expectedTribes { assert.Equal(t, tribe, tt.expectedTribes[i])
var expectedTribe domain.BaseTribe
for _, tribe2 := range tribes {
if tribe.ID == tribe2.ID {
expectedTribe = tribe2
break
}
}
assert.Equal(t, expectedTribe, tribe)
} }
}) })
} }
@ -1096,19 +1088,9 @@ func TestClient_GetPlayers(t *testing.T) {
} }
assert.True(t, checkErr(err)) assert.True(t, checkErr(err))
assert.Len(t, players, len(tt.expectedPlayers)) require.Len(t, players, len(tt.expectedPlayers))
for i, player := range tt.expectedPlayers {
for _, player1 := range tt.expectedPlayers { assert.Equal(t, player, tt.expectedPlayers[i])
var expectedPlayer domain.BasePlayer
for _, player2 := range players {
if player1.ID == player2.ID {
expectedPlayer = player2
break
}
}
assert.Equal(t, expectedPlayer, player1)
} }
}) })
} }
@ -1235,19 +1217,9 @@ func TestClient_GetVillages(t *testing.T) {
} }
assert.True(t, checkErr(err)) assert.True(t, checkErr(err))
assert.Len(t, villages, len(tt.expectedVillages)) require.Len(t, villages, len(tt.expectedVillages))
for i, village := range tt.expectedVillages {
for _, village := range tt.expectedVillages { assert.Equal(t, village, tt.expectedVillages[i])
var expectedVillage domain.BaseVillage
for _, village2 := range villages {
if village.ID == village2.ID {
expectedVillage = village2
break
}
}
assert.Equal(t, expectedVillage, village)
} }
}) })
} }