feat: add more filters to ListTribeChangesParams
This commit is contained in:
parent
48f6a56a5e
commit
4bae71da47
|
@ -110,6 +110,25 @@ func (a listTribeChangesParamsApplier) apply(q *bun.SelectQuery) *bun.SelectQuer
|
||||||
q = q.Where("tc.server_key IN (?)", bun.In(serverKeys))
|
q = q.Where("tc.server_key IN (?)", bun.In(serverKeys))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if playerIDs := a.params.PlayerIDs(); len(playerIDs) > 0 {
|
||||||
|
q = q.Where("tc.player_id IN (?)", bun.In(playerIDs))
|
||||||
|
}
|
||||||
|
|
||||||
|
if tribeIDs := a.params.TribeIDs(); len(tribeIDs) > 0 {
|
||||||
|
q = q.WhereGroup(" AND ", func(q *bun.SelectQuery) *bun.SelectQuery {
|
||||||
|
return q.Where("tc.new_tribe_id IN (?)", bun.In(tribeIDs)).
|
||||||
|
WhereOr("tc.old_tribe_id IN (?)", bun.In(tribeIDs))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if since := a.params.Since(); since.Valid {
|
||||||
|
q = q.Where("tc.created_at >= ?", since.V)
|
||||||
|
}
|
||||||
|
|
||||||
|
if before := a.params.Before(); before.Valid {
|
||||||
|
q = q.Where("tc.created_at < ?", before.V)
|
||||||
|
}
|
||||||
|
|
||||||
for _, s := range a.params.Sort() {
|
for _, s := range a.params.Sort() {
|
||||||
switch s {
|
switch s {
|
||||||
case domain.TribeChangeSortCreatedAtASC:
|
case domain.TribeChangeSortCreatedAtASC:
|
||||||
|
|
|
@ -373,6 +373,90 @@ func testEnnoblementRepository(t *testing.T, newRepos func(t *testing.T) reposit
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "OK: tribeIDs (new tribe) serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListEnnoblementsParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListEnnoblementsParams()
|
||||||
|
|
||||||
|
res, err := repos.ennoblement.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, res.Ennoblements())
|
||||||
|
|
||||||
|
var randEnnoblement domain.Ennoblement
|
||||||
|
for _, e := range res.Ennoblements() {
|
||||||
|
if e.NewTribeID() > 0 {
|
||||||
|
randEnnoblement = e
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randEnnoblement.ServerKey()}))
|
||||||
|
require.NoError(t, params.SetTribeIDs([]int{randEnnoblement.NewTribeID()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListEnnoblementsParams, res domain.ListEnnoblementsResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
tribeIDs := params.TribeIDs()
|
||||||
|
|
||||||
|
ennoblements := res.Ennoblements()
|
||||||
|
assert.NotZero(t, ennoblements)
|
||||||
|
for _, e := range ennoblements {
|
||||||
|
assert.True(t, slices.Contains(serverKeys, e.ServerKey()))
|
||||||
|
assert.True(t, slices.Contains(tribeIDs, e.NewTribeID()) || slices.Contains(tribeIDs, e.OldTribeID()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "OK: tribeIDs (old tribe) serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListEnnoblementsParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListEnnoblementsParams()
|
||||||
|
|
||||||
|
res, err := repos.ennoblement.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, res.Ennoblements())
|
||||||
|
|
||||||
|
var randEnnoblement domain.Ennoblement
|
||||||
|
for _, e := range res.Ennoblements() {
|
||||||
|
if e.OldTribeID() > 0 {
|
||||||
|
randEnnoblement = e
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randEnnoblement.ServerKey()}))
|
||||||
|
require.NoError(t, params.SetTribeIDs([]int{randEnnoblement.OldTribeID()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListEnnoblementsParams, res domain.ListEnnoblementsResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
tribeIDs := params.TribeIDs()
|
||||||
|
|
||||||
|
ennoblements := res.Ennoblements()
|
||||||
|
assert.NotZero(t, ennoblements)
|
||||||
|
for _, e := range ennoblements {
|
||||||
|
assert.True(t, slices.Contains(serverKeys, e.ServerKey()))
|
||||||
|
assert.True(t, slices.Contains(tribeIDs, e.NewTribeID()) || slices.Contains(tribeIDs, e.OldTribeID()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "OK: since before",
|
name: "OK: since before",
|
||||||
params: func(t *testing.T) domain.ListEnnoblementsParams {
|
params: func(t *testing.T) domain.ListEnnoblementsParams {
|
||||||
|
|
|
@ -277,6 +277,170 @@ func testTribeChangeRepository(t *testing.T, newRepos func(t *testing.T) reposit
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "OK: playerIDs serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListTribeChangesParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
|
||||||
|
res, err := repos.tribeChange.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, res.TribeChanges())
|
||||||
|
randTC := res.TribeChanges()[0]
|
||||||
|
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randTC.ServerKey()}))
|
||||||
|
require.NoError(t, params.SetPlayerIDs([]int{randTC.PlayerID()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListTribeChangesParams, res domain.ListTribeChangesResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
playerIDs := params.PlayerIDs()
|
||||||
|
|
||||||
|
tcs := res.TribeChanges()
|
||||||
|
assert.NotZero(t, tcs)
|
||||||
|
for _, tc := range tcs {
|
||||||
|
assert.True(t, slices.Contains(serverKeys, tc.ServerKey()))
|
||||||
|
assert.True(t, slices.Contains(playerIDs, tc.PlayerID()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "OK: tribeIDs (new tribe) serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListTribeChangesParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
|
||||||
|
res, err := repos.tribeChange.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, res.TribeChanges())
|
||||||
|
|
||||||
|
var randTC domain.TribeChange
|
||||||
|
for _, tc := range res.TribeChanges() {
|
||||||
|
if tc.NewTribeID() > 0 {
|
||||||
|
randTC = tc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randTC.ServerKey()}))
|
||||||
|
require.NoError(t, params.SetTribeIDs([]int{randTC.NewTribeID()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListTribeChangesParams, res domain.ListTribeChangesResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
tribeIDs := params.TribeIDs()
|
||||||
|
|
||||||
|
tcs := res.TribeChanges()
|
||||||
|
assert.NotZero(t, tcs)
|
||||||
|
for _, tc := range tcs {
|
||||||
|
assert.True(t, slices.Contains(serverKeys, tc.ServerKey()))
|
||||||
|
assert.True(t, slices.Contains(tribeIDs, tc.NewTribeID()) || slices.Contains(tribeIDs, tc.OldTribeID()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "OK: tribeIDs (old tribe) serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListTribeChangesParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
|
||||||
|
res, err := repos.tribeChange.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, res.TribeChanges())
|
||||||
|
|
||||||
|
var randTC domain.TribeChange
|
||||||
|
for _, tc := range res.TribeChanges() {
|
||||||
|
if tc.OldTribeID() > 0 {
|
||||||
|
randTC = tc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randTC.ServerKey()}))
|
||||||
|
require.NoError(t, params.SetTribeIDs([]int{randTC.OldTribeID()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListTribeChangesParams, res domain.ListTribeChangesResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
tribeIDs := params.TribeIDs()
|
||||||
|
|
||||||
|
tcs := res.TribeChanges()
|
||||||
|
assert.NotZero(t, tcs)
|
||||||
|
for _, tc := range tcs {
|
||||||
|
assert.True(t, slices.Contains(serverKeys, tc.ServerKey()))
|
||||||
|
assert.True(t, slices.Contains(tribeIDs, tc.NewTribeID()) || slices.Contains(tribeIDs, tc.OldTribeID()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "OK: since before",
|
||||||
|
params: func(t *testing.T) domain.ListTribeChangesParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
require.NoError(t, params.SetSort([]domain.TribeChangeSort{
|
||||||
|
domain.TribeChangeSortCreatedAtASC,
|
||||||
|
domain.TribeChangeSortIDASC,
|
||||||
|
}))
|
||||||
|
|
||||||
|
res, err := repos.tribeChange.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.GreaterOrEqual(t, len(res.TribeChanges()), 4)
|
||||||
|
|
||||||
|
params = domain.NewListTribeChangesParams()
|
||||||
|
require.NoError(t, params.SetSince(domain.NullTime{
|
||||||
|
V: res.TribeChanges()[1].CreatedAt(),
|
||||||
|
Valid: true,
|
||||||
|
}))
|
||||||
|
require.NoError(t, params.SetBefore(domain.NullTime{
|
||||||
|
V: res.TribeChanges()[3].CreatedAt(),
|
||||||
|
Valid: true,
|
||||||
|
}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListTribeChangesParams, res domain.ListTribeChangesResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
since := params.Since().V
|
||||||
|
before := params.Before().V
|
||||||
|
|
||||||
|
tcs := res.TribeChanges()
|
||||||
|
assert.NotZero(t, tcs)
|
||||||
|
for _, tc := range tcs {
|
||||||
|
assert.True(t, tc.CreatedAt().After(since) || tc.CreatedAt().Equal(since))
|
||||||
|
assert.True(t, tc.CreatedAt().Before(before))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "OK: cursor serverKeys sort=[id ASC]",
|
name: "OK: cursor serverKeys sort=[id ASC]",
|
||||||
params: func(t *testing.T) domain.ListTribeChangesParams {
|
params: func(t *testing.T) domain.ListTribeChangesParams {
|
||||||
|
|
|
@ -387,6 +387,10 @@ func (tcc TribeChangeCursor) Encode() string {
|
||||||
|
|
||||||
type ListTribeChangesParams struct {
|
type ListTribeChangesParams struct {
|
||||||
serverKeys []string
|
serverKeys []string
|
||||||
|
playerIDs []int
|
||||||
|
tribeIDs []int // TribeChange.NewTribeID or TribeChange.OldTribeID
|
||||||
|
since NullTime
|
||||||
|
before NullTime
|
||||||
sort []TribeChangeSort
|
sort []TribeChangeSort
|
||||||
cursor TribeChangeCursor
|
cursor TribeChangeCursor
|
||||||
limit int
|
limit int
|
||||||
|
@ -429,6 +433,66 @@ func (params *ListTribeChangesParams) SetServerKeys(serverKeys []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) PlayerIDs() []int {
|
||||||
|
return params.playerIDs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) SetPlayerIDs(playerIDs []int) error {
|
||||||
|
for i, id := range playerIDs {
|
||||||
|
if err := validateIntInRange(id, 1, math.MaxInt); err != nil {
|
||||||
|
return SliceElementValidationError{
|
||||||
|
Model: listTribeChangesParamsModelName,
|
||||||
|
Field: "playerIDs",
|
||||||
|
Index: i,
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
params.playerIDs = playerIDs
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) TribeIDs() []int {
|
||||||
|
return params.tribeIDs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) SetTribeIDs(tribeIDs []int) error {
|
||||||
|
for i, id := range tribeIDs {
|
||||||
|
if err := validateIntInRange(id, 1, math.MaxInt); err != nil {
|
||||||
|
return SliceElementValidationError{
|
||||||
|
Model: listTribeChangesParamsModelName,
|
||||||
|
Field: "tribeIDs",
|
||||||
|
Index: i,
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
params.tribeIDs = tribeIDs
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) Since() NullTime {
|
||||||
|
return params.since
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) SetSince(since NullTime) error {
|
||||||
|
params.since = since
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) Before() NullTime {
|
||||||
|
return params.before
|
||||||
|
}
|
||||||
|
|
||||||
|
func (params *ListTribeChangesParams) SetBefore(before NullTime) error {
|
||||||
|
params.before = before
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (params *ListTribeChangesParams) Sort() []TribeChangeSort {
|
func (params *ListTribeChangesParams) Sort() []TribeChangeSort {
|
||||||
return params.sort
|
return params.sort
|
||||||
}
|
}
|
||||||
|
|
|
@ -416,6 +416,126 @@ func TestListTribeChangesParams_SetServerKeys(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListTribeChangesParams_SetPlayerIDs(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
type args struct {
|
||||||
|
playerIDs []int
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "OK",
|
||||||
|
args: args{
|
||||||
|
playerIDs: []int{
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ERR: value < 1",
|
||||||
|
args: args{
|
||||||
|
playerIDs: []int{
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
0,
|
||||||
|
domaintest.RandID(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedErr: domain.SliceElementValidationError{
|
||||||
|
Model: "ListTribeChangesParams",
|
||||||
|
Field: "playerIDs",
|
||||||
|
Index: 3,
|
||||||
|
Err: domain.MinGreaterEqualError{
|
||||||
|
Min: 1,
|
||||||
|
Current: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
|
||||||
|
require.ErrorIs(t, params.SetPlayerIDs(tt.args.playerIDs), tt.expectedErr)
|
||||||
|
if tt.expectedErr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.Equal(t, tt.args.playerIDs, params.PlayerIDs())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestListTribeChangesParams_SetTribeIDs(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
type args struct {
|
||||||
|
tribeIDs []int
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "OK",
|
||||||
|
args: args{
|
||||||
|
tribeIDs: []int{
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ERR: value < 1",
|
||||||
|
args: args{
|
||||||
|
tribeIDs: []int{
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
domaintest.RandID(),
|
||||||
|
0,
|
||||||
|
domaintest.RandID(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedErr: domain.SliceElementValidationError{
|
||||||
|
Model: "ListTribeChangesParams",
|
||||||
|
Field: "tribeIDs",
|
||||||
|
Index: 3,
|
||||||
|
Err: domain.MinGreaterEqualError{
|
||||||
|
Min: 1,
|
||||||
|
Current: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
params := domain.NewListTribeChangesParams()
|
||||||
|
|
||||||
|
require.ErrorIs(t, params.SetTribeIDs(tt.args.tribeIDs), tt.expectedErr)
|
||||||
|
if tt.expectedErr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.Equal(t, tt.args.tribeIDs, params.TribeIDs())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestListTribeChangesParams_SetSort(t *testing.T) {
|
func TestListTribeChangesParams_SetSort(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user