Merge remote-tracking branch 'origin/master'
This commit is contained in:
101
svc/main.go
101
svc/main.go
@@ -10,7 +10,6 @@ import (
|
||||
"bssapp-backend/routes"
|
||||
"database/sql"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
@@ -165,7 +164,6 @@ InitRoutes — FULL V3 (Method-aware) PERMISSION EDITION
|
||||
func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router {
|
||||
|
||||
r := mux.NewRouter()
|
||||
mountUploads(r)
|
||||
mountSPA(r)
|
||||
|
||||
/*
|
||||
@@ -450,24 +448,21 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router
|
||||
"finance", "view",
|
||||
wrapV3(http.HandlerFunc(routes.GetStatementAgingHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/finance/account-aging-statement/rebuild-cache", "POST",
|
||||
"finance", "update",
|
||||
wrapV3(http.HandlerFunc(routes.RebuildStatementAgingCacheHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/finance/account-aging-statement/export-pdf", "GET",
|
||||
"finance", "export",
|
||||
wrapV3(routes.ExportStatementAgingPDFHandler(mssql)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/finance/account-aging-statement/export-excel", "GET",
|
||||
"finance", "export",
|
||||
wrapV3(routes.ExportStatementAgingExcelHandler(mssql)),
|
||||
)
|
||||
bindV3(r, pgDB,
|
||||
"/api/finance/aged-customer-balance-list", "GET",
|
||||
"finance", "view",
|
||||
wrapV3(http.HandlerFunc(routes.GetAgedCustomerBalanceListHandler)),
|
||||
)
|
||||
|
||||
// ============================================================
|
||||
// REPORT (STATEMENTS)
|
||||
@@ -508,7 +503,6 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router
|
||||
{"/api/orders/close-ready", "GET", "update", routes.OrderCloseReadyListRoute(mssql)},
|
||||
{"/api/orders/bulk-close", "POST", "update", routes.OrderBulkCloseRoute(mssql)},
|
||||
{"/api/orders/export", "GET", "export", routes.OrderListExcelRoute(mssql)},
|
||||
{"/api/orders/export-pdf", "GET", "export", routes.OrderListPDFRoute(mssql)},
|
||||
{"/api/order/check/{id}", "GET", "view", routes.OrderExistsHandler(mssql)},
|
||||
{"/api/order/validate", "POST", "insert", routes.ValidateOrderHandler(mssql)},
|
||||
{"/api/order/pdf/{id}", "GET", "export", routes.OrderPDFHandler(mssql)},
|
||||
@@ -558,36 +552,6 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router
|
||||
wrapV3(http.HandlerFunc(routes.GetProductSecondColorsHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/product-stock-query", "GET",
|
||||
"order", "view",
|
||||
wrapV3(http.HandlerFunc(routes.GetProductStockQueryHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/product-stock-attribute-options", "GET",
|
||||
"order", "view",
|
||||
wrapV3(http.HandlerFunc(routes.GetProductStockAttributeOptionsHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/product-stock-query-by-attributes", "GET",
|
||||
"order", "view",
|
||||
wrapV3(http.HandlerFunc(routes.GetProductStockQueryByAttributesHandler)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/product-images", "GET",
|
||||
"order", "view",
|
||||
wrapV3(routes.GetProductImagesHandler(pgDB)),
|
||||
)
|
||||
|
||||
bindV3(r, pgDB,
|
||||
"/api/product-images/{id}/content", "GET",
|
||||
"order", "view",
|
||||
http.HandlerFunc(routes.GetProductImageContentHandler(pgDB)),
|
||||
)
|
||||
|
||||
// ============================================================
|
||||
// ROLE MANAGEMENT
|
||||
// ============================================================
|
||||
@@ -645,35 +609,7 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router
|
||||
return r
|
||||
}
|
||||
|
||||
func setupSlog() {
|
||||
level := new(slog.LevelVar)
|
||||
switch strings.ToLower(strings.TrimSpace(os.Getenv("LOG_LEVEL"))) {
|
||||
case "debug":
|
||||
level.Set(slog.LevelDebug)
|
||||
case "warn", "warning":
|
||||
level.Set(slog.LevelWarn)
|
||||
case "error":
|
||||
level.Set(slog.LevelError)
|
||||
default:
|
||||
level.Set(slog.LevelInfo)
|
||||
}
|
||||
|
||||
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
|
||||
Level: level,
|
||||
})
|
||||
slog.SetDefault(slog.New(handler))
|
||||
}
|
||||
|
||||
func mountUploads(r *mux.Router) {
|
||||
root := uploadsRootDir()
|
||||
log.Printf("🖼️ uploads root: %s", root)
|
||||
r.PathPrefix("/uploads/").Handler(
|
||||
http.StripPrefix("/uploads/", http.FileServer(http.Dir(root))),
|
||||
)
|
||||
}
|
||||
|
||||
func main() {
|
||||
setupSlog()
|
||||
log.Println("🔥🔥🔥 BSSAPP BACKEND STARTED — LOGIN ROUTE SHOULD EXIST 🔥🔥🔥")
|
||||
|
||||
// -------------------------------------------------------
|
||||
@@ -838,30 +774,3 @@ func uiRootDir() string {
|
||||
|
||||
return "../ui/dist/spa"
|
||||
}
|
||||
|
||||
func uploadsRootDir() string {
|
||||
if root := strings.TrimSpace(os.Getenv("BLOB_ROOT")); root != "" {
|
||||
candidates := []string{
|
||||
root,
|
||||
filepath.Join(root, "uploads"),
|
||||
}
|
||||
for _, d := range candidates {
|
||||
if fi, err := os.Stat(d); err == nil && fi.IsDir() {
|
||||
return d
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
candidates := []string{
|
||||
"./uploads",
|
||||
"../uploads",
|
||||
"../../uploads",
|
||||
}
|
||||
for _, d := range candidates {
|
||||
if fi, err := os.Stat(d); err == nil && fi.IsDir() {
|
||||
return d
|
||||
}
|
||||
}
|
||||
|
||||
return "./uploads"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user