Merge branch 'feature/assets-s3-sharing'
CI / test (push) Successful in 3s

Integrate asset metadata/storage support, TypeScript client asset APIs, docs updates, and the Leaflet demo while resolving conflicts with recent challenge IP/login persistence changes on main.

Made-with: Cursor
This commit is contained in:
2026-03-02 21:23:31 +00:00
29 changed files with 2128 additions and 69 deletions
+36
View File
@@ -4,11 +4,13 @@ import (
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"momswap/backend/internal/app"
httpapi "momswap/backend/internal/http"
"momswap/backend/internal/storage"
"momswap/backend/internal/store"
)
@@ -47,6 +49,11 @@ func main() {
SessionTTL: 24 * time.Hour,
}, servicePublicKey)
service.BootstrapAdmin(adminPublicKey)
if signer, err := newAssetSignerFromEnv(); err != nil {
log.Printf("asset storage disabled: %v", err)
} else if signer != nil {
service.ConfigureAssetStorage(signer)
}
api := httpapi.NewAPI(service)
h := api.Routes()
@@ -63,6 +70,35 @@ func main() {
}
}
func newAssetSignerFromEnv() (app.AssetURLSigner, error) {
endpoint := os.Getenv("S3_ENDPOINT")
bucket := os.Getenv("S3_BUCKET")
if endpoint == "" || bucket == "" {
return nil, nil
}
useTLS, err := strconv.ParseBool(getEnv("S3_USE_TLS", "false"))
if err != nil {
return nil, err
}
usePathStyle, err := strconv.ParseBool(getEnv("S3_USE_PATH_STYLE", "true"))
if err != nil {
return nil, err
}
signer, err := storage.NewS3Signer(storage.S3Config{
Endpoint: endpoint,
Region: getEnv("S3_REGION", "us-east-1"),
Bucket: bucket,
AccessKey: getEnv("S3_ACCESS_KEY", ""),
SecretKey: getEnv("S3_SECRET_KEY", ""),
UseTLS: useTLS,
PathStyle: usePathStyle,
})
if err != nil {
return nil, err
}
return signer, nil
}
func getEnv(key, fallback string) string {
v := os.Getenv(key)
if v == "" {