// 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 conf import ( "log" "time" "github.com/alimy/cfg" ) var ( loggerSetting *loggerConf loggerFileSetting *loggerFileConf loggerZincSetting *loggerZincConf loggerMeiliSetting *loggerMeiliConf sentrySetting *sentryConf redisSetting *redisConf PyroscopeSetting *pyroscopeConf DatabaseSetting *databaseConf MysqlSetting *mysqlConf PostgresSetting *postgresConf Sqlite3Setting *sqlite3Conf WebServerSetting *httpServerConf AdminServerSetting *httpServerConf SpaceXServerSetting *httpServerConf BotServerSetting *httpServerConf LocalossServerSetting *httpServerConf FrontendWebSetting *httpServerConf DocsServerSetting *httpServerConf MobileServerSetting *grpcServerConf AppSetting *appConf CacheIndexSetting *cacheIndexConf SimpleCacheIndexSetting *simpleCacheIndexConf BigCacheIndexSetting *bigCacheIndexConf RedisCacheIndexSetting *redisCacheIndexConf SmsJuheSetting *smsJuheConf AlipaySetting *alipayConf TweetSearchSetting *tweetSearchConf ZincSetting *zincConf MeiliSetting *meiliConf ObjectStorage *objectStorageConf AliOSSSetting *aliOSSConf COSSetting *cosConf HuaweiOBSSetting *huaweiOBSConf MinIOSetting *minioConf S3Setting *s3Conf LocalOSSSetting *localossConf JWTSetting *jwtConf ) func setupSetting(suite []string, noDefault bool) error { vp, err := newViper() if err != nil { return err } // initialize features configure ss, kv := featuresInfoFrom(vp, "Features") cfg.Initial(ss, kv) if len(suite) > 0 { cfg.Use(suite, noDefault) } objects := map[string]any{ "App": &AppSetting, "WebServer": &WebServerSetting, "AdminServer": &AdminServerSetting, "SpaceXServer": &SpaceXServerSetting, "BotServer": &BotServerSetting, "LocalossServer": &LocalossServerSetting, "FrontendWebServer": &FrontendWebSetting, "DocsServer": &DocsServerSetting, "MobileServer": &MobileServerSetting, "CacheIndex": &CacheIndexSetting, "SimpleCacheIndex": &SimpleCacheIndexSetting, "BigCacheIndex": &BigCacheIndexSetting, "RedisCacheIndex": &RedisCacheIndexSetting, "Alipay": &AlipaySetting, "SmsJuhe": &SmsJuheSetting, "Pyroscope": &PyroscopeSetting, "Sentry": &sentrySetting, "Logger": &loggerSetting, "LoggerFile": &loggerFileSetting, "LoggerZinc": &loggerZincSetting, "LoggerMeili": &loggerMeiliSetting, "Database": &DatabaseSetting, "MySQL": &MysqlSetting, "Postgres": &PostgresSetting, "Sqlite3": &Sqlite3Setting, "TweetSearch": &TweetSearchSetting, "Zinc": &ZincSetting, "Meili": &MeiliSetting, "Redis": &redisSetting, "JWT": &JWTSetting, "ObjectStorage": &ObjectStorage, "AliOSS": &AliOSSSetting, "COS": &COSSetting, "HuaweiOBS": &HuaweiOBSSetting, "MinIO": &MinIOSetting, "LocalOSS": &LocalOSSSetting, "S3": &S3Setting, } for k, v := range objects { err := vp.UnmarshalKey(k, v) if err != nil { return err } } JWTSetting.Expire *= time.Second SimpleCacheIndexSetting.CheckTickDuration *= time.Second SimpleCacheIndexSetting.ExpireTickDuration *= time.Second BigCacheIndexSetting.ExpireInSecond *= time.Second RedisCacheIndexSetting.ExpireInSecond *= time.Second redisSetting.ConnWriteTimeout *= time.Second return nil } func Initial(suite []string, noDefault bool) { err := setupSetting(suite, noDefault) if err != nil { log.Fatalf("init.setupSetting err: %v", err) } setupLogger() initSentry() } func GetOssDomain() string { uri := "https://" if cfg.If("AliOSS") { return uri + AliOSSSetting.Domain + "/" } else if cfg.If("COS") { return uri + COSSetting.Domain + "/" } else if cfg.If("HuaweiOBS") { return uri + HuaweiOBSSetting.Domain + "/" } else if cfg.If("MinIO") { if !MinIOSetting.Secure { uri = "http://" } return uri + MinIOSetting.Domain + "/" + MinIOSetting.Bucket + "/" } else if cfg.If("S3") { if !S3Setting.Secure { uri = "http://" } // TODO: will not work well need test in real world return uri + S3Setting.Domain + "/" + S3Setting.Bucket + "/" } else if cfg.If("LocalOSS") { if !LocalOSSSetting.Secure { uri = "http://" } return uri + LocalOSSSetting.Domain + "/oss/" + LocalOSSSetting.Bucket + "/" } return uri + AliOSSSetting.Domain + "/" } func RunMode() string { return AppSetting.RunMode } func UseSentryGin() bool { return cfg.If("Sentry") && sentrySetting.AttachGin }