feat: add the DeletedAt field to Player and Tribe
This commit is contained in:
parent
8cb279f4c9
commit
4b976580a6
|
@ -7,7 +7,6 @@ linters:
|
|||
- bodyclose
|
||||
- deadcode
|
||||
- depguard
|
||||
- dupl
|
||||
- errcheck
|
||||
- gocritic
|
||||
- gofmt
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Reference in New Issue
Block a user