feat: api - GET /api/v2/versions/{versionCode}/servers/{serverKey}/tribes - new query param 'tag'
This commit is contained in:
parent
6e4fe7131a
commit
4ce2131ac4
|
@ -143,6 +143,7 @@ paths:
|
||||||
- $ref: "#/components/parameters/LimitQueryParam"
|
- $ref: "#/components/parameters/LimitQueryParam"
|
||||||
- $ref: "#/components/parameters/TribeDeletedQueryParam"
|
- $ref: "#/components/parameters/TribeDeletedQueryParam"
|
||||||
- $ref: "#/components/parameters/TribeSortQueryParam"
|
- $ref: "#/components/parameters/TribeSortQueryParam"
|
||||||
|
- $ref: "#/components/parameters/TribeTagQueryParam"
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
$ref: "#/components/responses/ListTribesResponse"
|
$ref: "#/components/responses/ListTribesResponse"
|
||||||
|
@ -972,6 +973,14 @@ components:
|
||||||
- deletedAt:ASC
|
- deletedAt:ASC
|
||||||
- deletedAt:DESC
|
- deletedAt:DESC
|
||||||
maxItems: 2
|
maxItems: 2
|
||||||
|
TribeTagQueryParam:
|
||||||
|
name: tag
|
||||||
|
in: query
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
maxItems: 100
|
||||||
VersionCodePathParam:
|
VersionCodePathParam:
|
||||||
in: path
|
in: path
|
||||||
name: versionCode
|
name: versionCode
|
||||||
|
|
|
@ -165,6 +165,10 @@ func (a listTribesParamsApplier) apply(q *bun.SelectQuery) *bun.SelectQuery {
|
||||||
q = q.Where("tribe.server_key IN (?)", bun.In(serverKeys))
|
q = q.Where("tribe.server_key IN (?)", bun.In(serverKeys))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tags := a.params.Tags(); len(tags) > 0 {
|
||||||
|
q = q.Where("tribe.tag IN (?)", bun.In(tags))
|
||||||
|
}
|
||||||
|
|
||||||
if deleted := a.params.Deleted(); deleted.Valid {
|
if deleted := a.params.Deleted(); deleted.Valid {
|
||||||
if deleted.Value {
|
if deleted.Value {
|
||||||
q = q.Where("tribe.deleted_at IS NOT NULL")
|
q = q.Where("tribe.deleted_at IS NOT NULL")
|
||||||
|
|
|
@ -460,6 +460,41 @@ func testTribeRepository(t *testing.T, newRepos func(t *testing.T) repositories)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "OK: tags serverKeys",
|
||||||
|
params: func(t *testing.T) domain.ListTribesParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
params := domain.NewListTribesParams()
|
||||||
|
|
||||||
|
res, err := repos.tribe.List(ctx, params)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, len(res.Tribes()))
|
||||||
|
randTribe := res.Tribes()[0]
|
||||||
|
|
||||||
|
require.NoError(t, params.SetTags([]string{randTribe.Tag()}))
|
||||||
|
require.NoError(t, params.SetServerKeys([]string{randTribe.ServerKey()}))
|
||||||
|
|
||||||
|
return params
|
||||||
|
},
|
||||||
|
assertResult: func(t *testing.T, params domain.ListTribesParams, res domain.ListTribesResult) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
tags := params.Tags()
|
||||||
|
serverKeys := params.ServerKeys()
|
||||||
|
|
||||||
|
tribes := res.Tribes()
|
||||||
|
assert.NotEmpty(t, tribes)
|
||||||
|
for _, tr := range tribes {
|
||||||
|
assert.True(t, slices.Contains(tags, tr.Tag()))
|
||||||
|
assert.True(t, slices.Contains(serverKeys, tr.ServerKey()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
assertError: func(t *testing.T, err error) {
|
||||||
|
t.Helper()
|
||||||
|
require.NoError(t, err)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "OK: deleted=true",
|
name: "OK: deleted=true",
|
||||||
params: func(t *testing.T) domain.ListTribesParams {
|
params: func(t *testing.T) domain.ListTribesParams {
|
||||||
|
|
|
@ -618,6 +618,7 @@ func (tc TribeCursor) Encode() string {
|
||||||
type ListTribesParams struct {
|
type ListTribesParams struct {
|
||||||
ids []int
|
ids []int
|
||||||
serverKeys []string
|
serverKeys []string
|
||||||
|
tags []string
|
||||||
deleted NullBool
|
deleted NullBool
|
||||||
sort []TribeSort
|
sort []TribeSort
|
||||||
cursor TribeCursor
|
cursor TribeCursor
|
||||||
|
@ -669,6 +670,29 @@ func (params *ListTribesParams) SetServerKeys(serverKeys []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (params *ListTribesParams) Tags() []string {
|
||||||
|
return params.tags
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
tribeTagsMinLength = 1
|
||||||
|
tribeTagsMaxLength = 100
|
||||||
|
)
|
||||||
|
|
||||||
|
func (params *ListTribesParams) SetTags(tags []string) error {
|
||||||
|
if err := validateSliceLen(tags, tribeTagsMinLength, tribeTagsMaxLength); err != nil {
|
||||||
|
return ValidationError{
|
||||||
|
Model: listTribesParamsModelName,
|
||||||
|
Field: "tags",
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
params.tags = tags
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (params *ListTribesParams) Deleted() NullBool {
|
func (params *ListTribesParams) Deleted() NullBool {
|
||||||
return params.deleted
|
return params.deleted
|
||||||
}
|
}
|
||||||
|
|
|
@ -430,6 +430,83 @@ func TestListTribesParams_SetIDs(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListTribesParams_SetTags(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
type args struct {
|
||||||
|
tags []string
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "OK",
|
||||||
|
args: args{
|
||||||
|
tags: []string{
|
||||||
|
domaintest.RandTribeTag(),
|
||||||
|
domaintest.RandTribeTag(),
|
||||||
|
domaintest.RandTribeTag(),
|
||||||
|
domaintest.RandTribeTag(),
|
||||||
|
domaintest.RandTribeTag(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ERR: len(tags) < 1",
|
||||||
|
args: args{
|
||||||
|
tags: nil,
|
||||||
|
},
|
||||||
|
expectedErr: domain.ValidationError{
|
||||||
|
Model: "ListTribesParams",
|
||||||
|
Field: "tags",
|
||||||
|
Err: domain.LenOutOfRangeError{
|
||||||
|
Min: 1,
|
||||||
|
Max: 100,
|
||||||
|
Current: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ERR: len(tags) > 100",
|
||||||
|
args: args{
|
||||||
|
tags: func() []string {
|
||||||
|
tags := make([]string, 101)
|
||||||
|
for i := range tags {
|
||||||
|
tags[i] = domaintest.RandTribeTag()
|
||||||
|
}
|
||||||
|
return tags
|
||||||
|
}(),
|
||||||
|
},
|
||||||
|
expectedErr: domain.ValidationError{
|
||||||
|
Model: "ListTribesParams",
|
||||||
|
Field: "tags",
|
||||||
|
Err: domain.LenOutOfRangeError{
|
||||||
|
Min: 1,
|
||||||
|
Max: 100,
|
||||||
|
Current: 101,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
params := domain.NewListTribesParams()
|
||||||
|
|
||||||
|
require.ErrorIs(t, params.SetTags(tt.args.tags), tt.expectedErr)
|
||||||
|
if tt.expectedErr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.Equal(t, tt.args.tags, params.Tags())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestListTribesParams_SetSort(t *testing.T) {
|
func TestListTribesParams_SetSort(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,13 @@ func (h *apiHTTPHandler) ListTribes(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if params.Tag != nil {
|
||||||
|
if err := domainParams.SetTags(*params.Tag); err != nil {
|
||||||
|
apiErrorRenderer{errors: []error{err}, formatErrorPath: formatListTribesParamsErrorPath}.render(w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if params.Deleted != nil {
|
if params.Deleted != nil {
|
||||||
if err := domainParams.SetDeleted(domain.NullBool{
|
if err := domainParams.SetDeleted(domain.NullBool{
|
||||||
Value: *params.Deleted,
|
Value: *params.Deleted,
|
||||||
|
|
Loading…
Reference in New Issue