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) }