136 lines
3 KiB
Go
136 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)
|
||
|
|
}
|