81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package svc
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"git.cialloo.com/CiallooWeb/Blog/app/internal/config"
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
|
awsconfig "github.com/aws/aws-sdk-go-v2/config"
|
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
type ServiceContext struct {
|
|
Config config.Config
|
|
S3Client *s3.Client
|
|
DB *sql.DB
|
|
}
|
|
|
|
func NewServiceContext(c config.Config) *ServiceContext {
|
|
return &ServiceContext{
|
|
Config: c,
|
|
S3Client: initS3Client(c.S3),
|
|
DB: initDatabase(c.Database),
|
|
}
|
|
}
|
|
|
|
func initDatabase(dbConfig config.DatabaseConfig) *sql.DB {
|
|
db, err := sql.Open("postgres", dbConfig.DSN)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Verify connection
|
|
if err := db.Ping(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return db
|
|
}
|
|
|
|
func initS3Client(s3Config config.S3Config) *s3.Client {
|
|
var cfg aws.Config
|
|
var err error
|
|
|
|
if s3Config.Endpoint != "" {
|
|
// Custom endpoint (e.g., MinIO)
|
|
cfg, err = awsconfig.LoadDefaultConfig(context.Background(),
|
|
awsconfig.WithRegion(s3Config.Region),
|
|
awsconfig.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
|
|
s3Config.AccessKeyID,
|
|
s3Config.SecretAccessKey,
|
|
"",
|
|
)),
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return s3.NewFromConfig(cfg, func(o *s3.Options) {
|
|
o.BaseEndpoint = aws.String(s3Config.Endpoint)
|
|
o.UsePathStyle = true
|
|
})
|
|
}
|
|
|
|
// Standard AWS S3
|
|
cfg, err = awsconfig.LoadDefaultConfig(context.Background(),
|
|
awsconfig.WithRegion(s3Config.Region),
|
|
awsconfig.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
|
|
s3Config.AccessKeyID,
|
|
s3Config.SecretAccessKey,
|
|
"",
|
|
)),
|
|
)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return s3.NewFromConfig(cfg)
|
|
}
|