package api //go:generate go run github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen --config=api.cfg.yaml ../../docs/openapi.yaml import ( "database/sql" "errors" "log" "net/http" "reflect" "github.com/labstack/echo/v4" openapi_types "github.com/oapi-codegen/runtime/types" ) type PersonalFinanceImpl struct { db *sql.DB } func (*PersonalFinanceImpl) GetBanks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusNotImplemented) } func (*PersonalFinanceImpl) GetBanksById(ctx echo.Context, bankId int64) error { return echo.NewHTTPError(http.StatusNotImplemented) } func (pf *PersonalFinanceImpl) GetTransactions(ctx echo.Context, params GetTransactionsParams) error { rows, err := pf.db.Query("SELECT t.id, t.date, t.description, t.amount, tc.category FROM pfbudget.transactions t LEFT JOIN pfbudget.transactions_categorized tc ON t.id = tc.id") if err != nil { log.Fatal(err) } return ctx.JSON(http.StatusOK, convert[Transaction](rows)) } func (*PersonalFinanceImpl) GetTransactionsById(ctx echo.Context, transactionId int64) error { return echo.NewHTTPError(http.StatusNotImplemented) } func convert[T any](rows *sql.Rows) []T { var ans []T for rows.Next() { var r T s := reflect.ValueOf(&r).Elem() log.Println(s) numCols := s.NumField() columns := make([]interface{}, numCols) log.Println(columns) for i := 0; i < numCols; i++ { field := s.Field(i) columns[i] = field.Addr().Interface() } if err := rows.Scan(columns...); err != nil { log.Fatal(err) } ans = append(ans, r) } return ans } func (d *openapi_types.Date) Scan(value interface{}) error { if value == nil { return errors.New("Null date") } // if bv, err := driver. }