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