feat: add carpet

This commit is contained in:
2026-07-03 21:58:28 +03:30
parent d290ba86bb
commit 413fca68cc
20 changed files with 421 additions and 16 deletions
+29
View File
@@ -17,6 +17,9 @@ import (
//go:embed cards
var cardsFS embed.FS
//go:embed carpets
var carpetsFS embed.FS
// CardsHandler یک http.Handler برای سرویس‌دهیِ فایل‌های کارت زیر /cards/ است.
// diskDir پوشه‌ی اسکین‌های آپلودی است (می‌تواند خالی/ناموجود باشد).
// CORS باز است تا نسخهٔ وب (Flutter web / canvaskit) هم بتواند تصاویر را بکشد.
@@ -45,3 +48,29 @@ func CardsHandler(diskDir string) http.Handler {
embedded.ServeHTTP(w, r)
})
}
// CarpetsHandler تصاویرِ فرش را سرو می‌کند: GET /carpets/<id>.jpg
// ابتدا از پوشه‌ی دیسکی (آپلودِ ادمین)، سپس از فرش‌های embed‌شده‌ی پیش‌فرض.
// اگر هیچ‌کدام نبود ۴۰۴ (اپ به میزِ ترسیمیِ classic برمی‌گردد).
func CarpetsHandler(diskDir string) http.Handler {
sub, err := fs.Sub(carpetsFS, "carpets")
if err != nil {
panic(err)
}
embedded := http.StripPrefix("/carpets/", http.FileServer(http.FS(sub)))
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Cache-Control", "public, max-age=604800")
// تلاشِ اول: پوشه‌ی دیسکی (آپلودِ ادمین).
if diskDir != "" {
rel := filepath.Clean("/" + strings.TrimPrefix(r.URL.Path, "/carpets/"))
full := filepath.Join(diskDir, rel)
if st, err := os.Stat(full); err == nil && !st.IsDir() {
http.ServeFile(w, r, full)
return
}
}
// تلاشِ دوم: فرش‌های embed‌شده.
embedded.ServeHTTP(w, r)
})
}