github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/entrepository/repository.go (about)

     1  package entrepository
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"log"
     7  
     8  	"ariga.io/sqlcomment"
     9  	"entgo.io/ent/dialect"
    10  	"entgo.io/ent/dialect/sql"
    11  	_ "github.com/go-sql-driver/mysql"
    12  	"github.com/ngocphuongnb/tetua/app/config"
    13  	"github.com/ngocphuongnb/tetua/app/logger"
    14  	"github.com/ngocphuongnb/tetua/app/repositories"
    15  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent"
    16  )
    17  
    18  var Client *ent.Client
    19  
    20  type Config struct {
    21  	DB_DSN    string
    22  	DB_DRIVER string
    23  }
    24  
    25  type Repository struct {
    26  	Client *ent.Client
    27  }
    28  
    29  func New(cfg Config) repositories.Repositories {
    30  	driverName := cfg.DB_DRIVER
    31  	if driverName == "" {
    32  		driverName = "mysql"
    33  	}
    34  	db, err := sql.Open(driverName, cfg.DB_DSN)
    35  
    36  	if err != nil {
    37  		log.Fatal(err)
    38  	}
    39  
    40  	if config.DB_QUERY_LOGGING {
    41  		// Create sqlcomment driver which wraps sqlite driver.
    42  		drv := sqlcomment.NewDriver(db,
    43  			sqlcomment.WithDriverVerTag(),
    44  			sqlcomment.WithTags(sqlcomment.Tags{
    45  				sqlcomment.KeyApplication: "tetua",
    46  				sqlcomment.KeyFramework:   "net/http",
    47  			}),
    48  		)
    49  		drv = dialect.DebugWithContext(drv, func(ctx context.Context, i ...interface{}) {
    50  			requestID := fmt.Sprintf("%v", ctx.Value("request_id"))
    51  			logger.Get().WithContext(logger.Context{"request_id": requestID}).Debug(i...)
    52  		})
    53  		Client = ent.NewClient(ent.Driver(drv))
    54  	} else {
    55  		Client = ent.NewClient(ent.Driver(db))
    56  	}
    57  
    58  	if err := Client.Schema.Create(context.Background()); err != nil {
    59  		log.Fatal(err)
    60  	}
    61  
    62  	return repositories.Repositories{
    63  		File:       CreateFileRepository(Client),
    64  		User:       CreateUserRepository(Client),
    65  		Post:       CreatePostRepository(Client),
    66  		Page:       CreatePageRepository(Client),
    67  		Role:       CreateRoleRepository(Client),
    68  		Topic:      CreateTopicRepository(Client),
    69  		Comment:    CreateCommentRepository(Client),
    70  		Setting:    &SettingRepository{&Repository{Client: Client}},
    71  		Permission: CreatePermissionRepository(Client),
    72  	}
    73  }