diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 30c617c..c7b341c 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -8,7 +8,7 @@ info: license: name: GNU General Public License v3.0 or later url: https://www.gnu.org/licenses/gpl-3.0-standalone.html - version: 0.0.1 + version: 0.1.0 paths: /transactions: @@ -73,23 +73,8 @@ paths: $ref: "#/components/schemas/Transaction" "400": description: Transaction not created - put: - summary: Update an existing transaction - operationId: updateTransaction - requestBody: - content: - application/json: - schema: - allOf: - - $ref: "#/components/schemas/Transaction" - - required: - - id - responses: - "204": - description: Transaction updated successfully - - /transaction/{transactionId}: + /transactions/{transactionId}: get: summary: Find transaction by ID operationId: getTransactionById @@ -112,6 +97,31 @@ paths: description: Invalid ID supplied "404": description: Transaction not found + put: + summary: Update an existing transaction + operationId: updateTransaction + parameters: + - name: transactionId + in: path + description: ID of transaction to update + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Transaction" + responses: + "204": + description: Transaction updated successfully + content: + application/json: + schema: + $ref: "#/components/schemas/Transaction" + "404": + description: Transaction not found /banks: get: @@ -127,7 +137,7 @@ paths: "204": description: No banks - /bank/{bankId}: + /banks/{bankId}: get: summary: Find bank by ID operationId: getBankById diff --git a/internal/api/impl.go b/internal/api/impl.go index 657e89f..5550b7b 100644 --- a/internal/api/impl.go +++ b/internal/api/impl.go @@ -92,7 +92,14 @@ func (server *ServerImpl) CreateTransaction(ctx echo.Context) error { return ctx.JSON(http.StatusCreated, entity2transaction(transaction)) } -func (server *ServerImpl) UpdateTransaction(ctx echo.Context) error { +func (server *ServerImpl) UpdateTransaction(ctx echo.Context, transactionId int64) error { + if exists, err := server.Dal.TransactionExists(uint64(transactionId)); err != nil { + log.Printf("%v", err) + return ctx.NoContent(http.StatusInternalServerError) + } else if !exists { + return ctx.NoContent(http.StatusNotFound) + } + t := new(Transaction) if err := ctx.Bind(t); err != nil { log.Printf("%v", err) @@ -100,22 +107,13 @@ func (server *ServerImpl) UpdateTransaction(ctx echo.Context) error { } transaction := transaction2entity(*t) + transaction.Id = uint64(transactionId) - exists, err := server.Dal.TransactionExists(transaction.Id) + transaction, err := server.Dal.UpdateTransaction(transaction) if err != nil { log.Printf("%v", err) return ctx.NoContent(http.StatusInternalServerError) } - if exists { - transaction, err := server.Dal.UpdateTransaction(transaction) - if err != nil { - log.Printf("%v", err) - return ctx.NoContent(http.StatusInternalServerError) - } - - return ctx.JSON(http.StatusOK, entity2transaction(transaction)) - } else { - return ctx.NoContent(http.StatusNotFound) - } + return ctx.JSON(http.StatusOK, entity2transaction(transaction)) } diff --git a/internal/api/impl_test.go b/internal/api/impl_test.go index 939178f..c97152e 100644 --- a/internal/api/impl_test.go +++ b/internal/api/impl_test.go @@ -297,14 +297,14 @@ func TestServerImpl_UpdateTransaction(t *testing.T) { e := m.EXPECT() type fields struct { - // Dal dal.DAL fn func(any) *gomock.Call args any returns any err error } type args struct { - request string + request string + transactionId int64 } type want struct { status int @@ -323,7 +323,7 @@ func TestServerImpl_UpdateTransaction(t *testing.T) { {e.TransactionExists, gomock.Any(), true, nil}, {e.UpdateTransaction, gomock.Any(), entity.Transaction{Id: 1, Date: date, Description: "freedom", Value: decimal.New(9000, 0)}, nil}, }, - args{`{"date":"1974-04-25","description":"freedom","id":1,"value":9000}`}, + args{`{"date":"1974-04-25","description":"freedom","value":9000}`, 1}, want{200, `{"date":"1974-04-25","description":"freedom","id":1,"value":9000}`}, false, }, @@ -332,7 +332,7 @@ func TestServerImpl_UpdateTransaction(t *testing.T) { []fields{ {e.TransactionExists, gomock.Any(), false, nil}, }, - args{`{"date":"1974-04-25","description":"freedom","id":1,"value":9000}`}, + args{`{"date":"1974-04-25","description":"freedom","id":1,"value":9000}`, 1}, want{404, ""}, false, }, @@ -351,7 +351,7 @@ func TestServerImpl_UpdateTransaction(t *testing.T) { req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) ctx := echo.New().NewContext(req, rec) - if err := server.UpdateTransaction(ctx); (err != nil) != tt.wantErr { + if err := server.UpdateTransaction(ctx, tt.args.transactionId); (err != nil) != tt.wantErr { t.Errorf("ServerImpl.UpdateTransaction() error = %v, wantErr %v", err, tt.wantErr) } if got := rec.Code; !reflect.DeepEqual(got, tt.want.status) { diff --git a/internal/api/server.gen.go b/internal/api/server.gen.go index 0670ce5..5414c75 100644 --- a/internal/api/server.gen.go +++ b/internal/api/server.gen.go @@ -59,41 +59,32 @@ type GetTransactionsParams struct { Sort *string `form:"sort,omitempty" json:"sort,omitempty"` } -// UpdateTransactionJSONBody defines parameters for UpdateTransaction. -type UpdateTransactionJSONBody struct { - Category *string `json:"category,omitempty"` - Date openapi_types.Date `json:"date"` - Description string `json:"description"` - Id int64 `json:"id"` - Value float32 `json:"value"` -} - // CreateTransactionJSONRequestBody defines body for CreateTransaction for application/json ContentType. type CreateTransactionJSONRequestBody = Transaction // UpdateTransactionJSONRequestBody defines body for UpdateTransaction for application/json ContentType. -type UpdateTransactionJSONRequestBody UpdateTransactionJSONBody +type UpdateTransactionJSONRequestBody = Transaction // ServerInterface represents all server handlers. type ServerInterface interface { - // Find bank by ID - // (GET /bank/{bankId}) - GetBankById(ctx echo.Context, bankId string) error // Retrieve existing banks // (GET /banks) GetBanks(ctx echo.Context) error - // Find transaction by ID - // (GET /transaction/{transactionId}) - GetTransactionById(ctx echo.Context, transactionId int64) error + // Find bank by ID + // (GET /banks/{bankId}) + GetBankById(ctx echo.Context, bankId string) error // Retrieve existing transactions // (GET /transactions) GetTransactions(ctx echo.Context, params GetTransactionsParams) error // Create a new transaction // (POST /transactions) CreateTransaction(ctx echo.Context) error + // Find transaction by ID + // (GET /transactions/{transactionId}) + GetTransactionById(ctx echo.Context, transactionId int64) error // Update an existing transaction - // (PUT /transactions) - UpdateTransaction(ctx echo.Context) error + // (PUT /transactions/{transactionId}) + UpdateTransaction(ctx echo.Context, transactionId int64) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -101,6 +92,15 @@ type ServerInterfaceWrapper struct { Handler ServerInterface } +// GetBanks converts echo context to params. +func (w *ServerInterfaceWrapper) GetBanks(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetBanks(ctx) + return err +} + // GetBankById converts echo context to params. func (w *ServerInterfaceWrapper) GetBankById(ctx echo.Context) error { var err error @@ -117,31 +117,6 @@ func (w *ServerInterfaceWrapper) GetBankById(ctx echo.Context) error { return err } -// GetBanks converts echo context to params. -func (w *ServerInterfaceWrapper) GetBanks(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetBanks(ctx) - return err -} - -// GetTransactionById converts echo context to params. -func (w *ServerInterfaceWrapper) GetTransactionById(ctx echo.Context) error { - var err error - // ------------- Path parameter "transactionId" ------------- - var transactionId int64 - - err = runtime.BindStyledParameterWithOptions("simple", "transactionId", ctx.Param("transactionId"), &transactionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter transactionId: %s", err)) - } - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetTransactionById(ctx, transactionId) - return err -} - // GetTransactions converts echo context to params. func (w *ServerInterfaceWrapper) GetTransactions(ctx echo.Context) error { var err error @@ -197,12 +172,35 @@ func (w *ServerInterfaceWrapper) CreateTransaction(ctx echo.Context) error { return err } +// GetTransactionById converts echo context to params. +func (w *ServerInterfaceWrapper) GetTransactionById(ctx echo.Context) error { + var err error + // ------------- Path parameter "transactionId" ------------- + var transactionId int64 + + err = runtime.BindStyledParameterWithOptions("simple", "transactionId", ctx.Param("transactionId"), &transactionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter transactionId: %s", err)) + } + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetTransactionById(ctx, transactionId) + return err +} + // UpdateTransaction converts echo context to params. func (w *ServerInterfaceWrapper) UpdateTransaction(ctx echo.Context) error { var err error + // ------------- Path parameter "transactionId" ------------- + var transactionId int64 + + err = runtime.BindStyledParameterWithOptions("simple", "transactionId", ctx.Param("transactionId"), &transactionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter transactionId: %s", err)) + } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.UpdateTransaction(ctx) + err = w.Handler.UpdateTransaction(ctx, transactionId) return err } @@ -234,35 +232,35 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL Handler: si, } - router.GET(baseURL+"/bank/:bankId", wrapper.GetBankById) router.GET(baseURL+"/banks", wrapper.GetBanks) - router.GET(baseURL+"/transaction/:transactionId", wrapper.GetTransactionById) + router.GET(baseURL+"/banks/:bankId", wrapper.GetBankById) router.GET(baseURL+"/transactions", wrapper.GetTransactions) router.POST(baseURL+"/transactions", wrapper.CreateTransaction) - router.PUT(baseURL+"/transactions", wrapper.UpdateTransaction) + router.GET(baseURL+"/transactions/:transactionId", wrapper.GetTransactionById) + router.PUT(baseURL+"/transactions/:transactionId", wrapper.UpdateTransaction) } // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/8RXTW/jNhD9KwTboyIpcdCDTm0abGCg2A263dM2B1oc2dylSC05tGsY/u/FUIqjr8Qp", - "sNleZEkczsebN4/ygZe2bqwBg54XB+7LDdQi3t4I85V+G2cbcKggvlWSrrhvgBfco1NmzY8JN6KG+QXr", - "pFqDWcZ9lXW1QF7wEJTkydj8mHAH34JyIHnxmUeT6PnhZGpXX6BE8kz5tSkh1PHmZwcVL/hP2VNNWVdQ", - "Fqs5ntwI58Senv9ywnhRorJmWmwpENbW7WcrkwJhUFN8kcwYgi+dah5DTNbVEBpl8JdrnvBaGVWHmhf5", - "yacyCGtwtGkrdBiGr7QV+BTfhHpFpiNMuyT7OT06mwO5B8/rse5jOoGcElKmshFfa1CUSLdQC6WpCmWE", - "KeHXOjgUqYTtBEF+D85bIzR719qyj+C24P6mSrQqwfgITEtJfvf+E7sDA05odh9WWpXsj9aIbRdpzqxj", - "WiA4nvDgKIMNYuOLLNvtdunahNS6dda59dm60ReLNL/wKIwU2hpIN1jrWKZCDXPpXbAPDZjf7pdskeaE", - "NjjfVpKneXpJe20DRjSKF3yR5umCJ7wRuIlAZythvmYHui7lkd6sISJGRBUECY0WvwMkit/slzLudqIG", - "BOd58fkwwm95y2zFyCFDyxxgcASdojUK+zh0BW+D8j6D0AVIOpmYYfPxgYx9YwktWr/K88dOg4l5i6bR", - "qoyZZ198OxNP/s7P8HFCiI+hLMH7Kmh2AoVQvW5jj6o3W6GVZMtb5gOlArK1vZ7aUkBmLLLKBiPjLPlQ", - "14IUgb9TRrYorvZseRtXY7P8uSZ5/sYg+f+C0tVc5e8tW3WO+jX/CegUbIHBP8qjMuueVYZPY58deg9n", - "aNtTi9ezt+f+HIkHmbzI5YkEj2X3Tdk9UM0fSPJe3Je53se8R3kcHRGv6LM/1+RKaQRHUfpBT8dx1+dv", - "AeJD1+je8hPiJmgtViTMbbcnXxzj0O25OeKYn5JsFFyrWuEgsoRKBI28uMzzZMCtxdWZ432ala0qD8gq", - "Z2u224CDLqF2GnEI7Vx+rYP5BC8uZ/I7n1M3iRuIIvBM3G7p+QMjmfYetGS0nfq/26hyQ8V66/CZGN3S", - "/3MoDWj9HWQXh/5eVt+hccIb62eG73cHAqGvL60KgscbK/dvpWDHCeqXP0os+5pWxurls1o51r+T/QD7", - "FkMmmIFdH/aIepgB/VMjvxvoQusPVZTJ1392H8Z/pR6OD7NNOXMkhFiHZP7EY70fYdOWyoSZJWakwr8B", - "AAD//5ap8eBoDgAA", + "H4sIAAAAAAAC/8RWTW/jNhD9KwTboyIpcdCDTm0abGCg2Abd3dN2D7Q4krmlSC05tGsE/u8FSdnRl9cJ", + "ukkutmQO5+O9mTd+oKVuWq1AoaXFA7XlGhoWHm+Y+sd/t0a3YFBA+FVw/4m7FmhBLRqharpPqGINzB9o", + "w0UNahnuVdo0DGlBnROcJmPzfUINfHPCAKfFZxpMgucvR1O9+goles8+v5gSQhMefjZQ0YL+lD3WlHUF", + "ZaGa/dENM4bt/PtHw5RlJQqtpsWWDKHWZjdbGWcIg5rCD8mMIdjSiPYQYnIuhtAIhb9c04Q2QonGNbTI", + "jz6FQqjB+EsbJt0wfCU1w8f4yjUrbzrCtEuyn9PB2RzIPXiejnUf0wnkPiGhKh3w1QpZif4RGiakr0Io", + "pkr4tXEGWcphM0GQ3oOxWjFJ3kVb8gHMBszfvhIpSlA2ABNbkt69/0TuQIFhkty7lRQl+SMakc0izYk2", + "RDIEQxPqjM9gjdjaIsu2221aK5dqU2edW5vVrbxYpPmFRaY4k1pBusZGhjIFSphL74L82YL67X5JFmnu", + "0QZjYyV5epnm/q5uQbFW0IIu0jxd0IS2DNcB6Gx16PMaAlK+QZmHwo8UvQOMg+Bptq32WXqrqzw/IAwq", + "3GNtK0UZbmZfbezFyNhTZsdG5oZMfHBlCdZWTpJjVr6cq/za+xwav9dk1TlKqHVNw/xg0b8AjYANEPhX", + "WBSq7lnF2rMH/7Xk+3Mg3OyWPEBnWAMIxtLi8ziL5S3RVQhBUBMD6IzvG+HPPOYHxSloDEr744PGQdID", + "bSxfX16YhOdwcB1jj6pXGyYFJ8tbYp1PBXi0neHLByRKI6m0U3zE2juheERxtSPL28gWjsTiFFcDUTnD", + "VyUkgvFRet7JUZg75r45CC8ddb3jR3CVk5Kt/IhGGie7Zxw6Kqhvl35h07YZBZeiETiIzKFiTiItLvM8", + "GQj94uqM0E+z0lVlAUlldEO2azDQJRSHCIfQzuUXHcwneHE5k9/5nOJQ4RpCS5yI2x2dnp5kyj1ITvx1", + "z/92Lcq1L9ZqgydidEdvM6GDtv4BaolDf98XzaFxQlttZ4bvdwMMob+fo7yBxRvNdy8BhUdiP0H98qVC", + "jUH/2FeNUD0/qY59Wy98R/sB9hFDwoiCbR/2qQZmD723M/urF/vpa6wviWe22SCT7y61yR/Ryfy/0hC9", + "6rYbc39y6fUx73ZfQls3w+qnlk+G7fmkurb7y/4apL6BEly/hRJEUDmxx3aSu//VGpFrwtSsIofK/wsA", + "AP//Ba56DmsPAAA=", } // GetSwagger returns the content of the embedded swagger specification file