From 26dd09d9c0ed18f32e9816b8f4b4735b25603328 Mon Sep 17 00:00:00 2001 From: uptutu Date: Sun, 9 Oct 2022 15:56:21 +0800 Subject: [PATCH 1/4] refactor: The main functions and some writes have been refactored to bring the project closer to the Go project --- .idea/.gitignore | 8 ++ .idea/go-clean-arch.iml | 9 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ app/main.go | 72 +++++++++------- article/delivery/http/article_handler.go | 4 +- .../delivery/http/middleware/middleware.go | 12 +-- article/repository/helper.go | 5 ++ article/repository/mysql/driver.go | 3 + article/repository/mysql/mysql_article.go | 85 +++++++++++-------- article/usecase/article_ucase.go | 4 +- author/repository/mysql/driver.go | 3 + author/repository/mysql/mysql_repository.go | 24 ++++-- go.mod | 2 +- 14 files changed, 157 insertions(+), 88 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/go-clean-arch.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 article/repository/mysql/driver.go create mode 100644 author/repository/mysql/driver.go diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/go-clean-arch.iml b/.idea/go-clean-arch.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/go-clean-arch.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e3183b8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/main.go b/app/main.go index a2d634f..73ae1f7 100644 --- a/app/main.go +++ b/app/main.go @@ -7,18 +7,32 @@ import ( "net/url" "time" + articleHttpDelivery "github.com/bxcodec/go-clean-arch/article/delivery/http" + httpMiddL "github.com/bxcodec/go-clean-arch/article/delivery/http/middleware" + articleRepo "github.com/bxcodec/go-clean-arch/article/repository/mysql" + articleUcase "github.com/bxcodec/go-clean-arch/article/usecase" + authorRepo "github.com/bxcodec/go-clean-arch/author/repository/mysql" + "github.com/bxcodec/go-clean-arch/domain" + _ "github.com/go-sql-driver/mysql" "github.com/labstack/echo" "github.com/spf13/viper" - - _articleHttpDelivery "github.com/bxcodec/go-clean-arch/article/delivery/http" - _articleHttpDeliveryMiddleware "github.com/bxcodec/go-clean-arch/article/delivery/http/middleware" - _articleRepo "github.com/bxcodec/go-clean-arch/article/repository/mysql" - _articleUcase "github.com/bxcodec/go-clean-arch/article/usecase" - _authorRepo "github.com/bxcodec/go-clean-arch/author/repository/mysql" ) -func init() { +func main() { + setupConfig() + + articleUsecase := InitRepositoriesAndUsecase() + + e := echo.New() + e.Use(httpMiddL.CORS) + + articleHttpDelivery.NewArticleHandler(e, articleUsecase) + + log.Fatal(e.Start(viper.GetString("server.address"))) +} + +func setupConfig() { viper.SetConfigFile(`config.json`) err := viper.ReadInConfig() if err != nil { @@ -30,7 +44,23 @@ func init() { } } -func main() { +func InitRepositoriesAndUsecase() domain.ArticleUsecase { + dbConn := InitMySQL() + defer func() { + if err := dbConn.Close(); err != nil { + log.Fatal(err) + } + }() + + authorRepo := authorRepo.NewMysqlAuthorRepository(dbConn) + ar := articleRepo.NewMysqlArticleRepository(dbConn) + timeoutContext := time.Duration(viper.GetInt("context.timeout")) * time.Second + au := articleUcase.NewArticleUsecase(ar, authorRepo, timeoutContext) + + return au +} + +func InitMySQL() *sql.DB { dbHost := viper.GetString(`database.host`) dbPort := viper.GetString(`database.port`) dbUser := viper.GetString(`database.user`) @@ -41,32 +71,14 @@ func main() { val.Add("parseTime", "1") val.Add("loc", "Asia/Jakarta") dsn := fmt.Sprintf("%s?%s", connection, val.Encode()) - dbConn, err := sql.Open(`mysql`, dsn) + dbConn, err := sql.Open(`mysql`, dsn) if err != nil { log.Fatal(err) } - err = dbConn.Ping() - if err != nil { + + if err = dbConn.Ping(); err != nil { log.Fatal(err) } - - defer func() { - err := dbConn.Close() - if err != nil { - log.Fatal(err) - } - }() - - e := echo.New() - middL := _articleHttpDeliveryMiddleware.InitMiddleware() - e.Use(middL.CORS) - authorRepo := _authorRepo.NewMysqlAuthorRepository(dbConn) - ar := _articleRepo.NewMysqlArticleRepository(dbConn) - - timeoutContext := time.Duration(viper.GetInt("context.timeout")) * time.Second - au := _articleUcase.NewArticleUsecase(ar, authorRepo, timeoutContext) - _articleHttpDelivery.NewArticleHandler(e, au) - - log.Fatal(e.Start(viper.GetString("server.address"))) + return dbConn } diff --git a/article/delivery/http/article_handler.go b/article/delivery/http/article_handler.go index d54a396..a0af5cd 100644 --- a/article/delivery/http/article_handler.go +++ b/article/delivery/http/article_handler.go @@ -3,12 +3,12 @@ package http import ( "net/http" "strconv" + + "github.com/bxcodec/go-clean-arch/domain" "github.com/labstack/echo" "github.com/sirupsen/logrus" validator "gopkg.in/go-playground/validator.v9" - - "github.com/bxcodec/go-clean-arch/domain" ) // ResponseError represent the reseponse error struct diff --git a/article/delivery/http/middleware/middleware.go b/article/delivery/http/middleware/middleware.go index 2424de4..d28ef6f 100644 --- a/article/delivery/http/middleware/middleware.go +++ b/article/delivery/http/middleware/middleware.go @@ -2,20 +2,10 @@ package middleware import "github.com/labstack/echo" -// GoMiddleware represent the data-struct for middleware -type GoMiddleware struct { - // another stuff , may be needed by middleware -} - // CORS will handle the CORS middleware -func (m *GoMiddleware) CORS(next echo.HandlerFunc) echo.HandlerFunc { +func CORS(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { c.Response().Header().Set("Access-Control-Allow-Origin", "*") return next(c) } } - -// InitMiddleware initialize the middleware -func InitMiddleware() *GoMiddleware { - return &GoMiddleware{} -} diff --git a/article/repository/helper.go b/article/repository/helper.go index 576cb6f..2f6a744 100644 --- a/article/repository/helper.go +++ b/article/repository/helper.go @@ -9,6 +9,11 @@ const ( timeFormat = "2006-01-02T15:04:05.999Z07:00" // reduce precision from RFC3339Nano as date format ) +type Repository interface { + Name() string + Driver() string +} + // DecodeCursor will decode cursor from user for mysql func DecodeCursor(encodedTime string) (time.Time, error) { byt, err := base64.StdEncoding.DecodeString(encodedTime) diff --git a/article/repository/mysql/driver.go b/article/repository/mysql/driver.go new file mode 100644 index 0000000..05b0bd1 --- /dev/null +++ b/article/repository/mysql/driver.go @@ -0,0 +1,3 @@ +package mysql + +const DriverMySQL = "mysql" diff --git a/article/repository/mysql/mysql_article.go b/article/repository/mysql/mysql_article.go index 381223a..2943cd9 100644 --- a/article/repository/mysql/mysql_article.go +++ b/article/repository/mysql/mysql_article.go @@ -11,6 +11,9 @@ import ( "github.com/bxcodec/go-clean-arch/domain" ) +var _ repository.Repository = &mysqlArticleRepository{} +var _ domain.ArticleRepository = &mysqlArticleRepository{} + type mysqlArticleRepository struct { Conn *sql.DB } @@ -20,44 +23,12 @@ func NewMysqlArticleRepository(Conn *sql.DB) domain.ArticleRepository { return &mysqlArticleRepository{Conn} } -func (m *mysqlArticleRepository) fetch(ctx context.Context, query string, args ...interface{}) (result []domain.Article, err error) { - rows, err := m.Conn.QueryContext(ctx, query, args...) - if err != nil { - logrus.Error(err) - return nil, err - } - - defer func() { - errRow := rows.Close() - if errRow != nil { - logrus.Error(errRow) - } - }() - - result = make([]domain.Article, 0) - for rows.Next() { - t := domain.Article{} - authorID := int64(0) - err = rows.Scan( - &t.ID, - &t.Title, - &t.Content, - &authorID, - &t.UpdatedAt, - &t.CreatedAt, - ) - - if err != nil { - logrus.Error(err) - return nil, err - } - t.Author = domain.Author{ - ID: authorID, - } - result = append(result, t) - } +func (m *mysqlArticleRepository) Name() string { + return "article_mysql_repo" +} - return result, nil +func (m *mysqlArticleRepository) Driver() string { + return DriverMySQL } func (m *mysqlArticleRepository) Fetch(ctx context.Context, cursor string, num int64) (res []domain.Article, nextCursor string, err error) { @@ -182,3 +153,43 @@ func (m *mysqlArticleRepository) Update(ctx context.Context, ar *domain.Article) return } + +func (m *mysqlArticleRepository) fetch(ctx context.Context, query string, args ...interface{}) (result []domain.Article, err error) { + rows, err := m.Conn.QueryContext(ctx, query, args...) + if err != nil { + logrus.Error(err) + return nil, err + } + + defer func() { + errRow := rows.Close() + if errRow != nil { + logrus.Error(errRow) + } + }() + + result = make([]domain.Article, 0) + for rows.Next() { + t := domain.Article{} + authorID := int64(0) + err = rows.Scan( + &t.ID, + &t.Title, + &t.Content, + &authorID, + &t.UpdatedAt, + &t.CreatedAt, + ) + + if err != nil { + logrus.Error(err) + return nil, err + } + t.Author = domain.Author{ + ID: authorID, + } + result = append(result, t) + } + + return result, nil +} diff --git a/article/usecase/article_ucase.go b/article/usecase/article_ucase.go index 8217688..7fb6f05 100644 --- a/article/usecase/article_ucase.go +++ b/article/usecase/article_ucase.go @@ -3,11 +3,11 @@ package usecase import ( "context" "time" + + "github.com/bxcodec/go-clean-arch/domain" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" - - "github.com/bxcodec/go-clean-arch/domain" ) type articleUsecase struct { diff --git a/author/repository/mysql/driver.go b/author/repository/mysql/driver.go new file mode 100644 index 0000000..05b0bd1 --- /dev/null +++ b/author/repository/mysql/driver.go @@ -0,0 +1,3 @@ +package mysql + +const DriverMySQL = "mysql" diff --git a/author/repository/mysql/mysql_repository.go b/author/repository/mysql/mysql_repository.go index f590b14..4ec2a58 100644 --- a/author/repository/mysql/mysql_repository.go +++ b/author/repository/mysql/mysql_repository.go @@ -4,9 +4,15 @@ import ( "context" "database/sql" + "github.com/bxcodec/go-clean-arch/article/repository" "github.com/bxcodec/go-clean-arch/domain" ) +const AuthorRepoName = "author_mysql_repo" + +var _ repository.Repository = &mysqlAuthorRepo{} +var _ domain.AuthorRepository = &mysqlAuthorRepo{} + type mysqlAuthorRepo struct { DB *sql.DB } @@ -18,6 +24,19 @@ func NewMysqlAuthorRepository(db *sql.DB) domain.AuthorRepository { } } +func (m *mysqlAuthorRepo) Name() string { + return AuthorRepoName +} + +func (m *mysqlAuthorRepo) Driver() string { + return DriverMySQL +} + +func (m *mysqlAuthorRepo) GetByID(ctx context.Context, id int64) (domain.Author, error) { + query := `SELECT id, name, created_at, updated_at FROM author WHERE id=?` + return m.getOne(ctx, query, id) +} + func (m *mysqlAuthorRepo) getOne(ctx context.Context, query string, args ...interface{}) (res domain.Author, err error) { stmt, err := m.DB.PrepareContext(ctx, query) if err != nil { @@ -34,8 +53,3 @@ func (m *mysqlAuthorRepo) getOne(ctx context.Context, query string, args ...inte ) return } - -func (m *mysqlAuthorRepo) GetByID(ctx context.Context, id int64) (domain.Author, error) { - query := `SELECT id, name, created_at, updated_at FROM author WHERE id=?` - return m.getOne(ctx, query, id) -} diff --git a/go.mod b/go.mod index 1aaf67b..253dd3b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/bxcodec/go-clean-arch -go 1.12 +go 1.19 require ( github.com/BurntSushi/toml v0.3.1 // indirect From 58e295fb71ffddd31074252c95989c7c600e349b Mon Sep 17 00:00:00 2001 From: uptutu Date: Sun, 9 Oct 2022 15:56:37 +0800 Subject: [PATCH 2/4] refactor: The main functions and some writes have been refactored to bring the project closer to the Go project --- .idea/.gitignore | 8 -------- .idea/go-clean-arch.iml | 9 --------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/go-clean-arch.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/go-clean-arch.iml b/.idea/go-clean-arch.iml deleted file mode 100644 index 5e764c4..0000000 --- a/.idea/go-clean-arch.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index e3183b8..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From a0afe5616a898e644b1c0e0e6e2dbb9029529a88 Mon Sep 17 00:00:00 2001 From: uptutu Date: Sun, 9 Oct 2022 16:11:57 +0800 Subject: [PATCH 3/4] upgrade go mod --- .idea/.gitignore | 8 +++++++ .idea/go-clean-arch.iml | 9 ++++++++ .idea/modules.xml | 8 +++++++ .idea/vcs.xml | 6 +++++ app/main.go | 12 +++++----- article/delivery/http/article_handler.go | 28 +++++++++++------------ article/repository/helper.go | 5 ---- article/repository/mysql/mysql_article.go | 10 +------- article/usecase/article_ucase.go | 2 +- go.mod | 27 +++++++++++++--------- go.sum | 16 ------------- 11 files changed, 69 insertions(+), 62 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/go-clean-arch.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/go-clean-arch.iml b/.idea/go-clean-arch.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/go-clean-arch.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e3183b8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/main.go b/app/main.go index 73ae1f7..2e8f24e 100644 --- a/app/main.go +++ b/app/main.go @@ -22,12 +22,12 @@ import ( func main() { setupConfig() - articleUsecase := InitRepositoriesAndUsecase() + articleUsecase := initRepositoriesAndUsecase() e := echo.New() e.Use(httpMiddL.CORS) - articleHttpDelivery.NewArticleHandler(e, articleUsecase) + articleHttpDelivery.RegisterHandler(e, articleUsecase) log.Fatal(e.Start(viper.GetString("server.address"))) } @@ -44,8 +44,8 @@ func setupConfig() { } } -func InitRepositoriesAndUsecase() domain.ArticleUsecase { - dbConn := InitMySQL() +func initRepositoriesAndUsecase() domain.ArticleUsecase { + dbConn := initMySQL() defer func() { if err := dbConn.Close(); err != nil { log.Fatal(err) @@ -60,7 +60,7 @@ func InitRepositoriesAndUsecase() domain.ArticleUsecase { return au } -func InitMySQL() *sql.DB { +func initMySQL() *sql.DB { dbHost := viper.GetString(`database.host`) dbPort := viper.GetString(`database.port`) dbUser := viper.GetString(`database.user`) @@ -76,7 +76,7 @@ func InitMySQL() *sql.DB { if err != nil { log.Fatal(err) } - + if err = dbConn.Ping(); err != nil { log.Fatal(err) } diff --git a/article/delivery/http/article_handler.go b/article/delivery/http/article_handler.go index a0af5cd..336a09f 100644 --- a/article/delivery/http/article_handler.go +++ b/article/delivery/http/article_handler.go @@ -3,26 +3,26 @@ package http import ( "net/http" "strconv" - + "github.com/bxcodec/go-clean-arch/domain" "github.com/labstack/echo" "github.com/sirupsen/logrus" - validator "gopkg.in/go-playground/validator.v9" + "gopkg.in/go-playground/validator.v9" ) -// ResponseError represent the reseponse error struct +// ResponseError represent the response error struct type ResponseError struct { Message string `json:"message"` } -// ArticleHandler represent the httphandler for article +// ArticleHandler represent the http handler for article type ArticleHandler struct { AUsecase domain.ArticleUsecase } -// NewArticleHandler will initialize the articles/ resources endpoint -func NewArticleHandler(e *echo.Echo, us domain.ArticleUsecase) { +// RegisterHandler will initialize the articles/ resources endpoint +func RegisterHandler(e *echo.Echo, us domain.ArticleUsecase) { handler := &ArticleHandler{ AUsecase: us, } @@ -33,13 +33,13 @@ func NewArticleHandler(e *echo.Echo, us domain.ArticleUsecase) { } // FetchArticle will fetch the article based on given params -func (a *ArticleHandler) FetchArticle(c echo.Context) error { +func (h *ArticleHandler) FetchArticle(c echo.Context) error { numS := c.QueryParam("num") num, _ := strconv.Atoi(numS) cursor := c.QueryParam("cursor") ctx := c.Request().Context() - listAr, nextCursor, err := a.AUsecase.Fetch(ctx, cursor, int64(num)) + listAr, nextCursor, err := h.AUsecase.Fetch(ctx, cursor, int64(num)) if err != nil { return c.JSON(getStatusCode(err), ResponseError{Message: err.Error()}) } @@ -49,7 +49,7 @@ func (a *ArticleHandler) FetchArticle(c echo.Context) error { } // GetByID will get article by given id -func (a *ArticleHandler) GetByID(c echo.Context) error { +func (h *ArticleHandler) GetByID(c echo.Context) error { idP, err := strconv.Atoi(c.Param("id")) if err != nil { return c.JSON(http.StatusNotFound, domain.ErrNotFound.Error()) @@ -58,7 +58,7 @@ func (a *ArticleHandler) GetByID(c echo.Context) error { id := int64(idP) ctx := c.Request().Context() - art, err := a.AUsecase.GetByID(ctx, id) + art, err := h.AUsecase.GetByID(ctx, id) if err != nil { return c.JSON(getStatusCode(err), ResponseError{Message: err.Error()}) } @@ -76,7 +76,7 @@ func isRequestValid(m *domain.Article) (bool, error) { } // Store will store the article by given request body -func (a *ArticleHandler) Store(c echo.Context) (err error) { +func (h *ArticleHandler) Store(c echo.Context) (err error) { var article domain.Article err = c.Bind(&article) if err != nil { @@ -89,7 +89,7 @@ func (a *ArticleHandler) Store(c echo.Context) (err error) { } ctx := c.Request().Context() - err = a.AUsecase.Store(ctx, &article) + err = h.AUsecase.Store(ctx, &article) if err != nil { return c.JSON(getStatusCode(err), ResponseError{Message: err.Error()}) } @@ -98,7 +98,7 @@ func (a *ArticleHandler) Store(c echo.Context) (err error) { } // Delete will delete article by given param -func (a *ArticleHandler) Delete(c echo.Context) error { +func (h *ArticleHandler) Delete(c echo.Context) error { idP, err := strconv.Atoi(c.Param("id")) if err != nil { return c.JSON(http.StatusNotFound, domain.ErrNotFound.Error()) @@ -107,7 +107,7 @@ func (a *ArticleHandler) Delete(c echo.Context) error { id := int64(idP) ctx := c.Request().Context() - err = a.AUsecase.Delete(ctx, id) + err = h.AUsecase.Delete(ctx, id) if err != nil { return c.JSON(getStatusCode(err), ResponseError{Message: err.Error()}) } diff --git a/article/repository/helper.go b/article/repository/helper.go index 2f6a744..576cb6f 100644 --- a/article/repository/helper.go +++ b/article/repository/helper.go @@ -9,11 +9,6 @@ const ( timeFormat = "2006-01-02T15:04:05.999Z07:00" // reduce precision from RFC3339Nano as date format ) -type Repository interface { - Name() string - Driver() string -} - // DecodeCursor will decode cursor from user for mysql func DecodeCursor(encodedTime string) (time.Time, error) { byt, err := base64.StdEncoding.DecodeString(encodedTime) diff --git a/article/repository/mysql/mysql_article.go b/article/repository/mysql/mysql_article.go index 2943cd9..aa25a03 100644 --- a/article/repository/mysql/mysql_article.go +++ b/article/repository/mysql/mysql_article.go @@ -11,7 +11,6 @@ import ( "github.com/bxcodec/go-clean-arch/domain" ) -var _ repository.Repository = &mysqlArticleRepository{} var _ domain.ArticleRepository = &mysqlArticleRepository{} type mysqlArticleRepository struct { @@ -23,14 +22,6 @@ func NewMysqlArticleRepository(Conn *sql.DB) domain.ArticleRepository { return &mysqlArticleRepository{Conn} } -func (m *mysqlArticleRepository) Name() string { - return "article_mysql_repo" -} - -func (m *mysqlArticleRepository) Driver() string { - return DriverMySQL -} - func (m *mysqlArticleRepository) Fetch(ctx context.Context, cursor string, num int64) (res []domain.Article, nextCursor string, err error) { query := `SELECT id,title,content, author_id, updated_at, created_at FROM article WHERE created_at > ? ORDER BY created_at LIMIT ? ` @@ -51,6 +42,7 @@ func (m *mysqlArticleRepository) Fetch(ctx context.Context, cursor string, num i return } + func (m *mysqlArticleRepository) GetByID(ctx context.Context, id int64) (res domain.Article, err error) { query := `SELECT id,title,content, author_id, updated_at, created_at FROM article WHERE ID = ?` diff --git a/article/usecase/article_ucase.go b/article/usecase/article_ucase.go index 7fb6f05..c87dec6 100644 --- a/article/usecase/article_ucase.go +++ b/article/usecase/article_ucase.go @@ -3,7 +3,7 @@ package usecase import ( "context" "time" - + "github.com/bxcodec/go-clean-arch/domain" "github.com/sirupsen/logrus" diff --git a/go.mod b/go.mod index 253dd3b..7d7cb46 100644 --- a/go.mod +++ b/go.mod @@ -3,38 +3,43 @@ module github.com/bxcodec/go-clean-arch go 1.19 require ( - github.com/BurntSushi/toml v0.3.1 // indirect github.com/bxcodec/faker v1.4.2 + github.com/go-sql-driver/mysql v1.3.0 + github.com/labstack/echo v3.3.5+incompatible + github.com/sirupsen/logrus v1.0.5 + github.com/spf13/viper v1.0.2 + github.com/stretchr/testify v1.2.1 + golang.org/x/sync v0.0.0-20181108010431-42b317875d0f + gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0 + gopkg.in/go-playground/validator.v9 v9.15.0 +) + +require ( + github.com/BurntSushi/toml v0.3.1 // indirect github.com/davecgh/go-spew v1.1.0 // indirect + github.com/fsnotify/fsnotify v1.4.7 // indirect github.com/go-playground/locales v0.12.1 // indirect github.com/go-playground/universal-translator v0.16.0 // indirect - github.com/go-sql-driver/mysql v1.3.0 github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce // indirect - github.com/labstack/echo v3.3.5+incompatible github.com/labstack/gommon v0.0.0-20180426014445-588f4e8bddc6 // indirect github.com/magiconair/properties v1.7.6 // indirect github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.3 // indirect github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238 // indirect - github.com/onsi/ginkgo v1.8.0 // indirect - github.com/onsi/gomega v1.5.0 // indirect github.com/pelletier/go-toml v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.0.5 github.com/spf13/afero v1.1.0 // indirect github.com/spf13/cast v1.2.0 // indirect github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec // indirect github.com/spf13/pflag v1.0.1 // indirect - github.com/spf13/viper v1.0.2 github.com/stretchr/objx v0.1.0 // indirect - github.com/stretchr/testify v1.2.1 github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 // indirect golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94 // indirect - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f - gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0 + golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e // indirect + golang.org/x/text v0.3.0 // indirect gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect - gopkg.in/go-playground/validator.v9 v9.15.0 + gopkg.in/yaml.v2 v2.2.1 // indirect ) diff --git a/go.sum b/go.sum index b77ed38..0b41003 100644 --- a/go.sum +++ b/go.sum @@ -12,12 +12,8 @@ github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rm github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno= github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/labstack/echo v3.3.5+incompatible h1:9PfxPUmasKzeJor9uQTaXLT6WUG/r+vSTmvXxvv3JO4= github.com/labstack/echo v3.3.5+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= github.com/labstack/gommon v0.0.0-20180426014445-588f4e8bddc6 h1:Bhy+PiVd7K95/ZFdGLLT2t/irnSxJmmQi/aa6AHQ5UY= @@ -30,11 +26,6 @@ github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238 h1:+MZW2uvHgN8kYvksEN3f7eFL2wpzk0GxmlFsMybWc7E= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pelletier/go-toml v1.1.0 h1:cmiOvKzEunMsAxyhXSzpL5Q1CRKpVv0KQsnAIcSEVYM= github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -61,9 +52,6 @@ github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 h1:gKMu1Bf6QI github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4/go.mod h1:50wTf68f99/Zt14pr046Tgt3Lp2vLyFZKzbFXTOabXw= golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94 h1:m5xBqfQdnzv6XuV/pJizrLOwUoGzyn1J249cA0cKL4o= golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= @@ -76,15 +64,11 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNat gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.15.0 h1:N4HWJwF5Lu7S5Laom2wkFLkFrjBHtMBwIruWxFybsBI= gopkg.in/go-playground/validator.v9 v9.15.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 5eee4e191cddd4218e38596f52c080135e3ace88 Mon Sep 17 00:00:00 2001 From: uptutu Date: Sun, 9 Oct 2022 16:12:03 +0800 Subject: [PATCH 4/4] upgrade go mod --- .idea/.gitignore | 8 -------- .idea/go-clean-arch.iml | 9 --------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 31 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/go-clean-arch.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/go-clean-arch.iml b/.idea/go-clean-arch.iml deleted file mode 100644 index 5e764c4..0000000 --- a/.idea/go-clean-arch.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index e3183b8..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file