You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
paopao-ce/internal/dao/dao.go

132 lines
3.5 KiB

// Copyright 2022 ROC. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package dao
import (
"sync"
"github.com/alimy/cfg"
"github.com/rocboss/paopao-ce/internal/core"
"github.com/rocboss/paopao-ce/internal/dao/jinzhu"
"github.com/rocboss/paopao-ce/internal/dao/sakila"
"github.com/rocboss/paopao-ce/internal/dao/search"
"github.com/rocboss/paopao-ce/internal/dao/slonik"
"github.com/rocboss/paopao-ce/internal/dao/storage"
"github.com/sirupsen/logrus"
)
var (
ts core.TweetSearchService
ds core.DataService
oss core.ObjectStorageService
webDsa core.WebDataServantA
_onceInitial sync.Once
)
func DataService() core.DataService {
lazyInitial()
return ds
}
func WebDataServantA() core.WebDataServantA {
lazyInitial()
return webDsa
}
func ObjectStorageService() core.ObjectStorageService {
lazyInitial()
return oss
}
func TweetSearchService() core.TweetSearchService {
lazyInitial()
return ts
}
func newAuthorizationManageService() (ams core.AuthorizationManageService) {
if cfg.If("Gorm") {
ams = jinzhu.NewAuthorizationManageService()
} else if cfg.If("Sqlx") {
ams = sakila.NewAuthorizationManageService()
} else if cfg.If("Sqlc") && cfg.Any("Postgres", "PostgreSQL") {
ams = slonik.NewAuthorizationManageService()
} else {
ams = jinzhu.NewAuthorizationManageService()
}
return
}
// lazyInitial do some package lazy initialize for performance
func lazyInitial() {
_onceInitial.Do(func() {
initDsX()
initOSS()
initTsX()
})
}
func initDsX() {
var dsVer, dsaVer core.VersionInfo
if cfg.If("Gorm") {
ds, dsVer = jinzhu.NewDataService()
webDsa, dsaVer = jinzhu.NewWebDataServantA()
} else if cfg.If("Sqlx") {
ds, dsVer = sakila.NewDataService()
webDsa, dsaVer = sakila.NewWebDataServantA()
} else if cfg.If("Sqlc") && cfg.Any("Postgres", "PostgreSQL") {
ds, dsVer = slonik.NewDataService()
webDsa, dsaVer = slonik.NewWebDataServantA()
} else {
// default use gorm as orm for sql database
ds, dsVer = jinzhu.NewDataService()
webDsa, dsaVer = jinzhu.NewWebDataServantA()
}
logrus.Infof("use %s as core.DataService with version %s", dsVer.Name(), dsVer.Version())
logrus.Infof("use %s as core.ServantA with version %s", dsaVer.Name(), dsaVer.Version())
}
func initOSS() {
var v core.VersionInfo
if cfg.If("AliOSS") {
oss, v = storage.MustAliossService()
} else if cfg.If("COS") {
oss, v = storage.NewCosService()
} else if cfg.If("HuaweiOBS") {
oss, v = storage.MustHuaweiobsService()
} else if cfg.If("MinIO") {
oss, v = storage.MustMinioService()
} else if cfg.If("S3") {
oss, v = storage.MustS3Service()
logrus.Infof("use S3 as object storage by version %s", v.Version())
return
} else if cfg.If("LocalOSS") {
oss, v = storage.MustLocalossService()
} else {
// default use AliOSS as object storage service
oss, v = storage.MustAliossService()
logrus.Infof("use default AliOSS as object storage by version %s", v.Version())
return
}
logrus.Infof("use %s as object storage by version %s", v.Name(), v.Version())
}
func initTsX() {
var v core.VersionInfo
ams := newAuthorizationManageService()
cfg.On(cfg.Actions{
"Zinc": func() {
ts, v = search.NewZincTweetSearchService(ams)
},
"Meili": func() {
ts, v = search.NewMeiliTweetSearchService(ams)
},
}, func() {
ts, v = search.NewZincTweetSearchService(ams)
})
logrus.Infof("use %s as tweet search serice by version %s", v.Name(), v.Version())
ts = search.NewBridgeTweetSearchService(ts)
}