sirius/internal/server/app.go

86 lines
1.8 KiB
Go
Raw Normal View History

2023-04-17 05:00:34 +03:00
package server
import (
"context"
"github.com/gin-gonic/gin"
"github.com/minio/minio-go"
"github.com/spf13/viper"
"github.com/zhashkevych/s3-file-uploader/pkg/uploader"
uphttp "github.com/zhashkevych/s3-file-uploader/pkg/uploader/delivery/http"
"github.com/zhashkevych/s3-file-uploader/pkg/uploader/upload"
"github.com/zhashkevych/s3-file-uploader/sidecar/filestorage"
"log"
"net/http"
"os"
"os/signal"
"time"
)
type App struct {
httpServer *http.Server
fileStorage *filestorage.FileStorage
imageUploader uploader.Uploader
}
func NewApp(accessKey, secretKey string) *App {
// Initiate an S3 compatible client
client, err := minio.New(viper.GetString("storage.endpoint"), accessKey, secretKey, false)
if err != nil {
log.Fatal(err)
}
fileStorage := filestorage.NewFileStorage(
client,
viper.GetString("storage.bucket"),
viper.GetString("storage.endpoint"),
)
return &App{
fileStorage: fileStorage,
imageUploader: upload.NewUploader(fileStorage),
}
}
func (a *App) Run(port string) error {
// Init gin handler
router := gin.Default()
router.Use(
gin.Recovery(),
gin.Logger(),
)
// API endpoints
api := router.Group("/api")
uphttp.RegisterHTTPEndpoints(api, a.imageUploader)
// HTTP Server
a.httpServer = &http.Server{
Addr: ":" + port,
Handler: router,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
go func() {
if err := a.httpServer.ListenAndServe(); err != nil {
log.Fatalf("Failed to listen and serve: %+v", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, os.Interrupt)
<-quit
ctx, shutdown := context.WithTimeout(context.Background(), 5*time.Second)
defer shutdown()
return a.httpServer.Shutdown(ctx)
}