Taobin-Recipe-Manager/server/tus_server.go
2024-02-05 11:45:54 +07:00

135 lines
3 KiB
Go

package main
import (
"context"
"encoding/json"
"fmt"
"net/http"
"recipe-manager/config"
"recipe-manager/data"
"recipe-manager/helpers"
"recipe-manager/services/logger"
"recipe-manager/services/oauth"
"regexp"
"strconv"
"strings"
"github.com/jmoiron/sqlx"
"github.com/tus/tusd/v2/pkg/filestore"
tusd "github.com/tus/tusd/v2/pkg/handler"
"go.uber.org/zap"
)
type TusServer struct {
cfg *config.ServerConfig
oauth oauth.OAuthService
server *http.Server
handler *tusd.Handler
taoLogger *logger.TaoLogger
database *sqlx.DB
}
func NewTusServer(cfg *config.ServerConfig, oauth oauth.OAuthService) *TusServer {
taoLogger := logger.NewTaoLogger(cfg)
taoLogger.Log = taoLogger.Log.Named("TusServer")
store := filestore.FileStore{
Path: "./uploads",
}
composer := tusd.NewStoreComposer()
store.UseIn(composer)
handler, err := tusd.NewHandler(tusd.Config{
BasePath: "/files/",
StoreComposer: composer,
NotifyCompleteUploads: true,
Cors: &tusd.CorsConfig{
AllowOrigin: regexp.MustCompile(strings.Replace(cfg.AllowedOrigins, ",", "|", -1)),
AllowCredentials: true,
AllowMethods: tusd.DefaultCorsConfig.AllowMethods,
AllowHeaders: tusd.DefaultCorsConfig.AllowHeaders,
ExposeHeaders: tusd.DefaultCorsConfig.ExposeHeaders,
MaxAge: tusd.DefaultCorsConfig.MaxAge,
},
})
if err != nil {
panic(fmt.Errorf("unable to create handler: %s", err))
}
go func() {
for {
event := <-handler.CompleteUploads
fmt.Printf("Upload %s finished\n", event.Upload.ID)
}
}()
return &TusServer{
server: &http.Server{Addr: ":" + strconv.Itoa(int(cfg.TusServerPort))},
cfg: cfg,
handler: handler,
taoLogger: taoLogger,
oauth: oauth,
database: data.NewSqliteDatabase(),
}
}
func (ts *TusServer) Run() error {
mux := http.NewServeMux()
ts.taoLogger.Log.Info("Server running", zap.String("addr", ts.server.Addr))
// User Service
// userService := user.NewUserService(ts.cfg, ts.database, ts.taoLogger)
mux.Handle("/files/", http.StripPrefix("/files/", ts.handler))
mux.HandleFunc("/list", listFiles)
port := strconv.Itoa(int(ts.cfg.TusServerPort))
if port == "" {
port = "8090"
}
return http.ListenAndServe(":"+strconv.Itoa(int(ts.cfg.TusServerPort)), mux)
}
func (ts *TusServer) Shutdown(ctx context.Context) error {
return ts.server.Shutdown(ctx)
}
func listFiles(w http.ResponseWriter, r *http.Request) {
// read all file in ./uploads/*.info file
// unmarshal json and return the list of files
// add cors
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Content-Type", "application/json")
files := helpers.ListFile("./uploads/*.info")
var result []interface{}
for _, file := range files {
fileContent, err := helpers.ReadFile(file)
if err != nil {
fmt.Println(err)
continue
}
var data interface{}
if err := json.Unmarshal([]byte(fileContent), &data); err != nil {
fmt.Println(err)
}
result = append(result, data)
}
json.NewEncoder(w).Encode(result)
}