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: タグ(複数の場合カンマ区切り) 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..36f760dc 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,32 @@ 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 + } + 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") @@ -95,6 +123,8 @@ func (h Handlers) GetTransactions(c echo.Context) error { Target: target, Since: since, Until: until, + Limit: limit, + Offset: offset, Tag: tag, Group: group, Request: request, diff --git a/router/transaction_test.go b/router/transaction_test.go index 30024988..218a3478 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) @@ -575,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) {