60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
|
|
"git.keircn.com/keiran/termcloud/internal/config"
|
|
"git.keircn.com/keiran/termcloud/internal/db"
|
|
"git.keircn.com/keiran/termcloud/internal/handlers"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
"golang.org/x/time/rate"
|
|
)
|
|
|
|
func main() {
|
|
ctx := context.Background()
|
|
cfg := config.Load()
|
|
|
|
pool, err := db.NewPool(ctx, cfg)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create database pool: %v", err)
|
|
}
|
|
defer db.ClosePool(pool)
|
|
|
|
bucketService := db.NewBucketService(pool, cfg)
|
|
h := handlers.NewHandlers(bucketService)
|
|
|
|
e := echo.New()
|
|
|
|
e.Use(middleware.BodyLimit(fmt.Sprintf("%dM", cfg.MaxFileSize/1024/1024)))
|
|
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
|
|
AllowOrigins: cfg.CORSOrigins,
|
|
AllowMethods: []string{echo.GET, echo.POST, echo.PUT, echo.DELETE},
|
|
AllowHeaders: []string{"*"},
|
|
}))
|
|
e.Use(middleware.GzipWithConfig(middleware.GzipConfig{
|
|
Level: cfg.GzipLevel,
|
|
}))
|
|
e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(rate.Limit(cfg.RateLimit))))
|
|
|
|
e.Static("/storage", cfg.StorageDir)
|
|
|
|
e.GET("/", h.RootHandler)
|
|
|
|
api := e.Group("/api/v1")
|
|
api.Use(h.AuthMiddleware)
|
|
|
|
api.GET("/user", h.GetUserInfoHandler)
|
|
api.GET("/buckets", h.ListBucketsHandler)
|
|
api.POST("/buckets", h.CreateBucketHandler)
|
|
api.DELETE("/buckets/:bucket", h.DeleteBucketHandler)
|
|
api.GET("/buckets/:bucket/objects", h.ListObjectsHandler)
|
|
api.PUT("/buckets/:bucket/objects/*", h.UploadObjectHandler)
|
|
api.GET("/buckets/:bucket/objects/*", h.GetObjectHandler)
|
|
api.DELETE("/buckets/:bucket/objects/*", h.DeleteObjectHandler)
|
|
|
|
e.Logger.Fatal(e.Start(":" + cfg.Port))
|
|
}
|