From 6e20082fb3d4d59f534012facf5532ecad87faa7 Mon Sep 17 00:00:00 2001 From: H1rono Date: Fri, 7 Jun 2024 11:44:24 +0900 Subject: [PATCH 1/5] :pencil: Add query parameters in swagger.yaml --- docs/swagger.yaml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index b6af63a7..5035e029 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -49,6 +49,8 @@ paths: - $ref: "#/components/parameters/targetQuery" - $ref: "#/components/parameters/sinceQuery" - $ref: "#/components/parameters/untilQuery" + - $ref: "#/components/parameters/limitQuery" + - $ref: "#/components/parameters/offsetQuery" - $ref: "#/components/parameters/tagQuery" - $ref: "#/components/parameters/groupQuery" - $ref: "#/components/parameters/requestQuery" @@ -1421,6 +1423,24 @@ components: schema: type: string format: date + limitQuery: + name: limit + description: 取得する最大個数 + required: false + in: query + schema: + type: integer + minimum: 0 + default: 100 + offsetQuery: + name: offset + description: スキップする個数 + required: false + in: query + schema: + type: integer + minimum: 0 + default: 0 tagQuery: name: tag description: タグ(複数の場合カンマ区切り) From 09cfe80fefd8533aa4d25eedee70bbd6e415f0fc Mon Sep 17 00:00:00 2001 From: H1rono Date: Fri, 7 Jun 2024 11:45:25 +0900 Subject: [PATCH 2/5] :sparkles: Add fields in `model.TransactionQuery` --- model/transaction.go | 2 ++ model/transaction_impl.go | 2 ++ router/transaction.go | 16 ++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/model/transaction.go b/model/transaction.go index 4c1ba12e..f4d046b3 100644 --- a/model/transaction.go +++ b/model/transaction.go @@ -36,6 +36,8 @@ type TransactionQuery struct { Target *string Since *time.Time Until *time.Time + Limit int + Offset int Tag *string Group *string Request *uuid.UUID diff --git a/model/transaction_impl.go b/model/transaction_impl.go index 66faf90d..8c5a784a 100644 --- a/model/transaction_impl.go +++ b/model/transaction_impl.go @@ -83,6 +83,8 @@ func (repo *EntRepository) GetTransactions(ctx context.Context, query Transactio Where(transaction.CreatedAtLT(*query.Until)) } + transactionsq = transactionsq.Limit(query.Limit).Offset(query.Offset) + if query.Tag != nil { transactionsq = transactionsq. Where(transaction.HasTagWith( diff --git a/router/transaction.go b/router/transaction.go index 20c2d394..e7068073 100644 --- a/router/transaction.go +++ b/router/transaction.go @@ -1,7 +1,9 @@ package router import ( + "fmt" "net/http" + "strconv" "time" "github.com/google/uuid" @@ -70,6 +72,19 @@ func (h Handlers) GetTransactions(c echo.Context) error { } until = &u } + limit := 100 + if limitQuery := c.QueryParam("limit"); limitQuery != "" { + limitI, err := strconv.Atoi(limitQuery) + if err != nil { + h.Logger.Info("could not parse limit as integer", zap.Error(err)) + return echo.NewHTTPError(http.StatusBadRequest, err) + } + if limitI < 0 { + h.Logger.Info("received negative limit", zap.Int("limit", limitI)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("negative limit(=%d) is invalid", limitI)) + } + limit = limitI + } var tag *string if c.QueryParam("tag") != "" { t := c.QueryParam("tag") @@ -95,6 +110,7 @@ func (h Handlers) GetTransactions(c echo.Context) error { Target: target, Since: since, Until: until, + Limit: limit, Tag: tag, Group: group, Request: request, From 838895ccd1dec181a1f164ae266b8b32c827a9d7 Mon Sep 17 00:00:00 2001 From: H1rono Date: Fri, 7 Jun 2024 22:23:50 +0900 Subject: [PATCH 3/5] :white_check_mark: Pass tests --- router/transaction_test.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/router/transaction_test.go b/router/transaction_test.go index 30024988..4c426286 100644 --- a/router/transaction_test.go +++ b/router/transaction_test.go @@ -93,6 +93,8 @@ func TestHandlers_GetTransactions(t *testing.T) { Target: nil, Since: nil, Until: nil, + Limit: 100, + Offset: 0, Tag: nil, Group: nil, }). @@ -206,7 +208,9 @@ func TestHandlers_GetTransactions(t *testing.T) { h.Repository.MockTransactionRepository. EXPECT(). GetTransactions(c.Request().Context(), model.TransactionQuery{ - Sort: &sortQuery, + Sort: &sortQuery, + Limit: 100, + Offset: 0, }). Return(txs, nil) @@ -319,7 +323,9 @@ func TestHandlers_GetTransactions(t *testing.T) { h.Repository.MockTransactionRepository. EXPECT(). GetTransactions(c.Request().Context(), model.TransactionQuery{ - Sort: &sortQuery, + Sort: &sortQuery, + Limit: 100, + Offset: 0, }). Return(txs, nil) @@ -435,6 +441,8 @@ func TestHandlers_GetTransactions(t *testing.T) { EXPECT(). GetTransactions(c.Request().Context(), model.TransactionQuery{ Target: &targetQuery, + Limit: 100, + Offset: 0, }). Return(txs, nil) @@ -532,8 +540,10 @@ func TestHandlers_GetTransactions(t *testing.T) { h.Repository.MockTransactionRepository. EXPECT(). GetTransactions(c.Request().Context(), model.TransactionQuery{ - Since: &since, - Until: &until, + Since: &since, + Until: &until, + Limit: 100, + Offset: 0, }). Return(txs, nil) From c2f0a101fe569c510dd83552faf191ff5470b3b5 Mon Sep 17 00:00:00 2001 From: H1rono Date: Fri, 7 Jun 2024 22:25:09 +0900 Subject: [PATCH 4/5] :pencil: Write TODO comment --- router/transaction_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/router/transaction_test.go b/router/transaction_test.go index 4c426286..218a3478 100644 --- a/router/transaction_test.go +++ b/router/transaction_test.go @@ -585,6 +585,8 @@ func TestHandlers_GetTransactions(t *testing.T) { assert.Equal(t, string(resBody), strings.TrimRight(rec.Body.String(), "\n")) } }) + + // TODO: SuccessWithLimit, SuccessWithOffset } func TestHandlers_PostTransaction(t *testing.T) { From 6badb6adb6b60367f15432ab331b717d4a96801b Mon Sep 17 00:00:00 2001 From: H1rono Date: Fri, 7 Jun 2024 22:34:09 +0900 Subject: [PATCH 5/5] :sparkles: Impl query parameter `offset` --- router/transaction.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/router/transaction.go b/router/transaction.go index e7068073..36f760dc 100644 --- a/router/transaction.go +++ b/router/transaction.go @@ -85,6 +85,19 @@ func (h Handlers) GetTransactions(c echo.Context) error { } limit = limitI } + offset := 0 + if offsetQuery := c.QueryParam("offset"); offsetQuery != "" { + offsetI, err := strconv.Atoi(offsetQuery) + if err != nil { + h.Logger.Info("could not parse limit as integer", zap.Error(err)) + return echo.NewHTTPError(http.StatusBadRequest, err) + } + if offsetI < 0 { + h.Logger.Info("received negative offset", zap.Int("offset", offsetI)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Errorf("negative offset(=%d) is invalid", offsetI)) + } + offset = offsetI + } var tag *string if c.QueryParam("tag") != "" { t := c.QueryParam("tag") @@ -111,6 +124,7 @@ func (h Handlers) GetTransactions(c echo.Context) error { Since: since, Until: until, Limit: limit, + Offset: offset, Tag: tag, Group: group, Request: request,