add log
This commit is contained in:
parent
321381c8d7
commit
71cd11920b
@ -1,13 +1,15 @@
|
|||||||
package handler_products
|
package handler_products
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
"online-order/entity"
|
"online-order/entity"
|
||||||
"online-order/repository/product"
|
"online-order/repository/product"
|
||||||
"online-order/usecase/product"
|
"online-order/usecase/product"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewProductRouters(server *entity.Routers) {
|
func NewProductRouters(server *entity.Routers) {
|
||||||
productRepo := repository_product.NewProductClient(server.Database)
|
log.Printf("server: %v", server.ActiveBusiness)
|
||||||
|
productRepo := repository_product.NewProductClient(server.Database, &server.ActiveBusiness)
|
||||||
|
|
||||||
productService := service_product.NewProductService(productRepo)
|
productService := service_product.NewProductService(productRepo)
|
||||||
|
|
||||||
|
13
api/middlewares/log/defineLogFile.go
Normal file
13
api/middlewares/log/defineLogFile.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package middlewares_log
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetOutputLogFile() {
|
||||||
|
logFile, _ := OpenFile("storage/logs/app.log")
|
||||||
|
|
||||||
|
if logFile != nil {
|
||||||
|
log.SetOutput(logFile)
|
||||||
|
}
|
||||||
|
}
|
18
api/middlewares/log/fileHandler.go
Normal file
18
api/middlewares/log/fileHandler.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package middlewares_log
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func OpenFile(path string) (*os.File, error) {
|
||||||
|
|
||||||
|
logFile, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error in Open Log File:", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return logFile, nil
|
||||||
|
}
|
26
api/middlewares/log/requestLoggerMiddleware.go
Normal file
26
api/middlewares/log/requestLoggerMiddleware.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package middlewares_log
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func RequestLogger(logFile *os.File) gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
start := time.Now()
|
||||||
|
c.Next()
|
||||||
|
end := time.Now()
|
||||||
|
|
||||||
|
status := c.Writer.Status()
|
||||||
|
method := c.Request.Method
|
||||||
|
path := c.Request.URL.Path
|
||||||
|
host := c.Request.Host
|
||||||
|
latency := end.Sub(start)
|
||||||
|
|
||||||
|
logLine := fmt.Sprintf("%s | %3d | %s | %s | %s | %13v \n", end.Format("2006/01/02 - 15:04:05"), status, latency, method, host, path)
|
||||||
|
|
||||||
|
logFile.WriteString(logLine)
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,6 @@ package middlewares
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"log"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"online-order/configs"
|
"online-order/configs"
|
||||||
"online-order/domain"
|
"online-order/domain"
|
||||||
@ -31,15 +30,20 @@ func DomainMiddleware(server *entity.Routers) gin.HandlerFunc {
|
|||||||
// get domain from database
|
// get domain from database
|
||||||
domainModel, err := domain.DomainService.GetByDomain(domainService, domainName)
|
domainModel, err := domain.DomainService.GetByDomain(domainService, domainName)
|
||||||
|
|
||||||
log.Printf("domainModel name: %v", domainModel)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusNotFound, gin.H{"error": "domain not Found"})
|
c.JSON(http.StatusNotFound, gin.H{"error": "domain not Found"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Set("domain", domainModel)
|
server.ActiveBusiness = entity.ActiveBusiness{
|
||||||
|
BusinessID: domainModel.BusinessID,
|
||||||
|
Domain: domainModel.Domain,
|
||||||
|
DomainID: domainModel.ID,
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Set("activeBusiness", &server.ActiveBusiness)
|
||||||
|
|
||||||
c.Next()
|
c.Next()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
52
api/router.go
Normal file
52
api/router.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
logger "github.com/rs/zerolog/log"
|
||||||
|
swaggerfiles "github.com/swaggo/files"
|
||||||
|
ginSwagger "github.com/swaggo/gin-swagger"
|
||||||
|
handler_products "online-order/api/handlers/products"
|
||||||
|
"online-order/api/middlewares"
|
||||||
|
middlewares_log "online-order/api/middlewares/log"
|
||||||
|
docs "online-order/docs"
|
||||||
|
"online-order/ent"
|
||||||
|
"online-order/entity"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Router(app *gin.Engine, db *ent.Client) {
|
||||||
|
docs.SwaggerInfo.BasePath = "/api/v1"
|
||||||
|
|
||||||
|
api_v1 := app.Group("api/v1")
|
||||||
|
api_restricted := app.Group("api/v1/in")
|
||||||
|
|
||||||
|
router_base := &entity.RouterBase{
|
||||||
|
Database: db,
|
||||||
|
OpenApp: api_v1,
|
||||||
|
}
|
||||||
|
|
||||||
|
router := &entity.Routers{
|
||||||
|
RouterBase: *router_base,
|
||||||
|
RestrictedApp: api_restricted,
|
||||||
|
}
|
||||||
|
|
||||||
|
middlewares_log.SetOutputLogFile()
|
||||||
|
|
||||||
|
logFile, _ := middlewares_log.OpenFile("storage/logs/request.log")
|
||||||
|
if logFile != nil {
|
||||||
|
api_v1.Use(middlewares_log.RequestLogger(logFile))
|
||||||
|
}
|
||||||
|
|
||||||
|
api_v1.Use(gin.Logger())
|
||||||
|
api_v1.Use(gin.Recovery())
|
||||||
|
api_v1.Use(middlewares.DomainMiddleware(router))
|
||||||
|
//middlewareController := middlewares.NewMiddlewareRouters(router)
|
||||||
|
//api_restricted.Use(middlewareController.JwAuthtMiddleware())
|
||||||
|
|
||||||
|
handler_products.NewProductRouters(router)
|
||||||
|
|
||||||
|
logger.Info().Msg("Server ready to go ...")
|
||||||
|
|
||||||
|
app.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler,
|
||||||
|
ginSwagger.URL("http://localhost:9000/swagger/doc.json"),
|
||||||
|
ginSwagger.DefaultModelsExpandDepth(-1)))
|
||||||
|
}
|
7
entity/active_business.go
Normal file
7
entity/active_business.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package entity
|
||||||
|
|
||||||
|
type ActiveBusiness struct {
|
||||||
|
BusinessID int
|
||||||
|
Domain string
|
||||||
|
DomainID int
|
||||||
|
}
|
@ -10,7 +10,12 @@ type RouterBase struct {
|
|||||||
OpenApp *gin.RouterGroup
|
OpenApp *gin.RouterGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RouterActiveBusiness struct {
|
||||||
|
ActiveBusiness ActiveBusiness
|
||||||
|
}
|
||||||
|
|
||||||
type Routers struct {
|
type Routers struct {
|
||||||
RouterBase
|
RouterBase
|
||||||
|
RouterActiveBusiness
|
||||||
RestrictedApp *gin.RouterGroup
|
RestrictedApp *gin.RouterGroup
|
||||||
}
|
}
|
||||||
|
34
main.go
34
main.go
@ -5,15 +5,10 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
logger "github.com/rs/zerolog/log"
|
logger "github.com/rs/zerolog/log"
|
||||||
swaggerfiles "github.com/swaggo/files"
|
|
||||||
ginSwagger "github.com/swaggo/gin-swagger"
|
|
||||||
"log"
|
"log"
|
||||||
handler_products "online-order/api/handlers/products"
|
"online-order/api"
|
||||||
"online-order/api/middlewares"
|
|
||||||
"online-order/configs"
|
"online-order/configs"
|
||||||
docs "online-order/docs"
|
|
||||||
"online-order/ent/migrate"
|
"online-order/ent/migrate"
|
||||||
"online-order/entity"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// To load .env file
|
// To load .env file
|
||||||
@ -61,32 +56,7 @@ func main() {
|
|||||||
|
|
||||||
app := gin.Default()
|
app := gin.Default()
|
||||||
|
|
||||||
docs.SwaggerInfo.BasePath = "/api/v1"
|
api.Router(app, db)
|
||||||
|
|
||||||
api_v1 := app.Group("api/v1")
|
|
||||||
api_restricted := app.Group("api/v1/in")
|
|
||||||
|
|
||||||
router_base := &entity.RouterBase{
|
|
||||||
Database: db,
|
|
||||||
OpenApp: api_v1,
|
|
||||||
}
|
|
||||||
router := &entity.Routers{
|
|
||||||
RouterBase: *router_base,
|
|
||||||
RestrictedApp: api_restricted,
|
|
||||||
}
|
|
||||||
|
|
||||||
api_v1.Use(middlewares.DomainMiddleware(router))
|
|
||||||
|
|
||||||
//middlewareController := middlewares.NewMiddlewareRouters(router)
|
|
||||||
//api_restricted.Use(middlewareController.JwAuthtMiddleware())
|
|
||||||
|
|
||||||
handler_products.NewProductRouters(router)
|
|
||||||
|
|
||||||
logger.Info().Msg("Server ready to go ...")
|
|
||||||
|
|
||||||
app.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler,
|
|
||||||
ginSwagger.URL("http://localhost:9000/swagger/doc.json"),
|
|
||||||
ginSwagger.DefaultModelsExpandDepth(-1)))
|
|
||||||
|
|
||||||
app.Run(":" + conf.ServerPort)
|
app.Run(":" + conf.ServerPort)
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ func (c *DomainClient) GetByDomain(d string) (*entity.DomainDisplay, error) {
|
|||||||
if len(resp) > 0 {
|
if len(resp) > 0 {
|
||||||
p.ID = resp[0].ID
|
p.ID = resp[0].ID
|
||||||
p.Domain = resp[0].Domain
|
p.Domain = resp[0].Domain
|
||||||
|
p.BusinessID = *resp[0].BusinessID
|
||||||
p.Status = resp[0].Status
|
p.Status = resp[0].Status
|
||||||
p.CreatedAt = resp[0].CreatedAt
|
p.CreatedAt = resp[0].CreatedAt
|
||||||
p.UpdatedAt = resp[0].UpdatedAt
|
p.UpdatedAt = resp[0].UpdatedAt
|
||||||
|
@ -8,15 +8,27 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type ProductClient struct {
|
type ProductClient struct {
|
||||||
client *ent.Client
|
client *ent.Client
|
||||||
|
activeBusiness *entity.ActiveBusiness
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProductClient(client *ent.Client) *ProductClient {
|
func NewProductClient(client *ent.Client, activeBusiness *entity.ActiveBusiness) *ProductClient {
|
||||||
return &ProductClient{
|
return &ProductClient{
|
||||||
client: client,
|
client: client,
|
||||||
|
activeBusiness: activeBusiness,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//type ProductClient struct {
|
||||||
|
// client *ent.Client
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//func NewProductClient(client *ent.Client) *ProductClient {
|
||||||
|
// return &ProductClient{
|
||||||
|
// client: client,
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
// List all products
|
// List all products
|
||||||
func (c *ProductClient) List() ([]*entity.ProductDisplay, error) {
|
func (c *ProductClient) List() ([]*entity.ProductDisplay, error) {
|
||||||
var u []*entity.ProductDisplay
|
var u []*entity.ProductDisplay
|
||||||
@ -24,6 +36,7 @@ func (c *ProductClient) List() ([]*entity.ProductDisplay, error) {
|
|||||||
|
|
||||||
err := c.client.Product.
|
err := c.client.Product.
|
||||||
Query().
|
Query().
|
||||||
|
Where(product.BusinessID(c.activeBusiness.BusinessID)).
|
||||||
Select(product.FieldID, product.FieldName, product.FieldDescription, product.FieldOriginalPrice, product.FieldPrice, product.FieldQuantity, product.FieldStatus, product.FieldCreatedAt, product.FieldUpdatedAt).
|
Select(product.FieldID, product.FieldName, product.FieldDescription, product.FieldOriginalPrice, product.FieldPrice, product.FieldQuantity, product.FieldStatus, product.FieldCreatedAt, product.FieldUpdatedAt).
|
||||||
Scan(ctx, &u)
|
Scan(ctx, &u)
|
||||||
|
|
||||||
@ -41,6 +54,7 @@ func (c *ProductClient) Create(p *entity.ProductCreateUpdate) error {
|
|||||||
resp, err := c.client.Product.
|
resp, err := c.client.Product.
|
||||||
Create().
|
Create().
|
||||||
SetName(p.Name).
|
SetName(p.Name).
|
||||||
|
SetBusinessID(c.activeBusiness.BusinessID).
|
||||||
SetNillableDescription(p.Description).
|
SetNillableDescription(p.Description).
|
||||||
SetPrice(p.Price).
|
SetPrice(p.Price).
|
||||||
SetOriginalPrice(p.OriginalPrice).
|
SetOriginalPrice(p.OriginalPrice).
|
||||||
@ -64,6 +78,7 @@ func (c *ProductClient) GetByID(id int) (*entity.ProductDisplay, error) {
|
|||||||
|
|
||||||
resp := c.client.Product.
|
resp := c.client.Product.
|
||||||
Query().
|
Query().
|
||||||
|
Where(product.BusinessID(c.activeBusiness.BusinessID)).
|
||||||
Where(product.ID(id)).
|
Where(product.ID(id)).
|
||||||
AllX(ctx)
|
AllX(ctx)
|
||||||
|
|
||||||
@ -106,7 +121,8 @@ func (c *ProductClient) Update(p *entity.ProductCreateUpdate) error {
|
|||||||
func (c *ProductClient) Delete(id int) error {
|
func (c *ProductClient) Delete(id int) error {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
err := c.client.Product.DeleteOneID(id).
|
err := c.client.Product.
|
||||||
|
DeleteOneID(id).
|
||||||
Exec(ctx)
|
Exec(ctx)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -118,6 +134,7 @@ func (c *ProductClient) SearchProduct(identifier string) (*entity.ProductDisplay
|
|||||||
|
|
||||||
resp := c.client.Product.
|
resp := c.client.Product.
|
||||||
Query().
|
Query().
|
||||||
|
Where(product.BusinessID(c.activeBusiness.BusinessID)).
|
||||||
Where(
|
Where(
|
||||||
product.NameContains(identifier),
|
product.NameContains(identifier),
|
||||||
).
|
).
|
||||||
|
1
storage/logs/.gitignore
vendored
Normal file
1
storage/logs/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*.log
|
Loading…
Reference in New Issue
Block a user