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
- deadcode
- depguard
- dupl
- errcheck
- gocritic
- gofmt

View File

@ -3,12 +3,15 @@ package service
import (
"context"
"fmt"
"sort"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
)
type PlayerRepository interface {
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 {
@ -30,6 +33,17 @@ func (p *Player) Refresh(ctx context.Context, key, url string) (int64, error) {
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))
for _, player := range players {
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)
}
//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
}

View File

@ -3,6 +3,7 @@ package service
import (
"context"
"fmt"
"sort"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
)
@ -10,6 +11,8 @@ import (
type TribeRepository interface {
CreateOrUpdate(ctx context.Context, params ...domain.CreateTribeParams) 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 {
@ -31,6 +34,17 @@ func (t *Tribe) Refresh(ctx context.Context, key, url string) (int64, error) {
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))
for _, tribe := range tribes {
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)
}
//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
}

View File

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

View File

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