Utilisateur mis à jour avec succès.
"))
}
}
-
-
-
-
-
func AdminConversationPage(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
idStr := mux.Vars(r)["id"]
data := map[string]interface{}{
"UserID": idStr,
}
- renderTemplate(w, "adminconversations", data)
+ renderTemplate(w,r, "adminconversations", data,db)
}
}
-
func AdminConversationRows(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// 1. Récupérer SSOID depuis le contexte
@@ -264,9 +255,6 @@ func AdminConversationRows(db *gorm.DB) http.HandlerFunc {
renderPartial(w, "admin_conversations_rows", data)
}
}
-
-
-
func AdminConversationThread(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
idStr := mux.Vars(r)["id"]
@@ -338,32 +326,45 @@ func Dashboard(db *gorm.DB) http.HandlerFunc {
"Conversations": conversations,
}
- renderTemplate(w, "dashboard", data)
+ renderTemplate(w,r ,"dashboard", data,db)
}
}
-func renderTemplate(w http.ResponseWriter, templ string, data map[string]interface{}) {
- t, err := template.ParseFiles(
+func renderTemplate(w http.ResponseWriter, r *http.Request, templ string, data map[string]interface{}, db *gorm.DB) {
+ // Initialiser la map si elle est nil
+ if data == nil {
+ data = make(map[string]interface{})
+ }
+
+ // Si "User" absent mais SSOID présent dans le contexte, on charge l'utilisateur
+ if _, exists := data["User"]; !exists {
+ if val := r.Context().Value("ssoid"); val != nil {
+ ssoid := val.(string)
+ var user models.User
+ if err := db.Where("sso_id = ?", ssoid).First(&user).Error; err == nil {
+ data["User"] = user
+ }
+ }
+ }
+
+ t, err := template.ParseFiles(
"./frontend/templates/head.pages.tmpl",
"./frontend/templates/sidebar.pages.tmpl",
"./frontend/templates/" + templ + ".pages.tmpl",
- )
+ )
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
- }
-
- // Exécutez explicitement le template principal
- err = t.ExecuteTemplate(w, templ+".pages.tmpl", data)
-
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- }
+ if err := t.ExecuteTemplate(w, templ+".pages.tmpl", data); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ }
}
+
func renderPartial(w http.ResponseWriter, templ string, data map[string]interface{}) {
t, err := template.ParseFiles("./frontend/templates/" + templ + ".pages.tmpl")
if err != nil {
diff --git a/backend/routes/routes.go b/backend/routes/routes.go
index 3f51b11..1d93885 100644
--- a/backend/routes/routes.go
+++ b/backend/routes/routes.go
@@ -11,41 +11,67 @@ import (
// Routes non protégées
func RoutesPublic(r *mux.Router, db *gorm.DB) {
-
- // Fichiers statiques (CSS, JS, etc.)
+ // Assets statiques
staticDir := "./frontend/assets/"
r.PathPrefix("/frontend/assets/").Handler(
http.StripPrefix("/frontend/assets/", http.FileServer(http.Dir(staticDir))),
)
- // Page de login
- r.HandleFunc("/login", renders.Login)
- r.HandleFunc("/api/whatsapp/webhook", handlers.WebhookVerifyHandler()).Methods("GET")
- r.HandleFunc("/api/whatsapp/webhook", handlers.WebhookReceiveHandler(db)).Methods("POST")
-
- // Endpoint d'API pour se logger
+ // Login
+ r.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
+ renders.Login(w, r, db)
+ })
r.HandleFunc("/api/login", handlers.LoginHandler(db)).Methods("POST")
+ // Webhook WhatsApp (vérification + réception)
+ r.HandleFunc("/api/whatsapp/webhook", handlers.WebhookVerifyHandler()).Methods("GET")
+ r.HandleFunc("/api/whatsapp/webhook", handlers.WebhookReceiveHandler(db)).Methods("POST")
}
+
// Routes protégées
func RoutesProtected(r *mux.Router, db *gorm.DB) {
- r.HandleFunc("/jwt", renders.JwtTest)
- r.HandleFunc("/api/message/send", handlers.SendWhatsAppMessage(db)).Methods("POST")
- r.HandleFunc("/admin/user/{id}/conversations", renders.AdminConversationPage(db))
- r.HandleFunc("/api/user/{id}/conversations", renders.AdminConversationRows(db))
- r.HandleFunc("/admin/user/{id}/edit", renders.AdminUserEdit(db)).Methods("GET")
- r.HandleFunc("/admin/user", renders.AdminUserList(db))
- r.HandleFunc("/api/user/delete/{id}", handlers.AdminUserDelete(db)).Methods("DELETE")
- r.HandleFunc("/api/user/update/{id}", renders.AdminUserUpdate(db)).Methods("PUT")
- r.HandleFunc("/api/user/create", renders.CreateUserHandler(db)).Methods("POST")
- r.HandleFunc("/admin/user/create-form", renders.AdminUserCreateForm()).Methods("GET")
+ // Dashboard (admin ou client)
+ r.HandleFunc("/dashboard", func(w http.ResponseWriter, r *http.Request) {
+ renders.Dashboard(db)
+ })
- r.HandleFunc("/dashboard", renders.Dashboard(db))
- r.HandleFunc("/test/send", renders.TestMessagesPages)
- r.HandleFunc("/test/send2", renders.TestMessagesPages2)
- r.HandleFunc("/admin/user/{id}/conversation-thread", renders.AdminConversationThread(db)).Methods("GET")
+ // Test d'envoi de message (simples & templates)
+ r.HandleFunc("/test/send", func(w http.ResponseWriter, r *http.Request) {renders.TestMessagesPages(w, r, db)})
+ r.HandleFunc("/test/send2", func(w http.ResponseWriter, r *http.Request) {renders.TestMessagesPages2(w, r, db)})
+ r.HandleFunc("/api/message/send", handlers.SendWhatsAppMessage(db)).Methods("POST")
r.HandleFunc("/api/message/send2", handlers.HandleTemplateTest(db)).Methods("POST")
+
+ // Conversations (admin/client)
+ r.HandleFunc("/admin/user/{id}/conversations", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminConversationPage(db)
+ })
+ r.HandleFunc("/api/user/{id}/conversations", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminConversationRows(db)
+ })
+ r.HandleFunc("/admin/user/{id}/conversation-thread", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminConversationThread(db)
+ })
+
+ // Utilisateurs (admin)
+ r.HandleFunc("/admin/user", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminUserList(db)
+ })
+ r.HandleFunc("/admin/user/create-form", renders.AdminUserCreateForm()).Methods("GET")
+ r.HandleFunc("/admin/user/{id}/edit", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminUserEdit(db)
+ }).Methods("GET")
+
+ r.HandleFunc("/api/user/create", renders.CreateUserHandler(db)).Methods("POST")
+ r.HandleFunc("/api/user/update/{id}", func(w http.ResponseWriter, r *http.Request) {
+ renders.AdminUserUpdate(db)
+ }).Methods("PUT")
+ r.HandleFunc("/api/user/delete/{id}", handlers.AdminUserDelete(db)).Methods("DELETE")
+
+ // Test JWT
+ r.HandleFunc("/jwt", func(w http.ResponseWriter, r *http.Request){renders.JwtTest(w, r, db)})
+
+ // Déconnexion
r.HandleFunc("/logout", func(w http.ResponseWriter, r *http.Request) {
http.SetCookie(w, &http.Cookie{
Name: "token",
@@ -56,35 +82,4 @@ func RoutesProtected(r *mux.Router, db *gorm.DB) {
})
http.Redirect(w, r, "/login", http.StatusSeeOther)
})
-
-
-
- // // Ici on place les vues et API qui doivent être protégées
- // r.HandleFunc("/stream", StreamHandler)
- // r.HandleFunc("/dashboard", renders.Dashboard(bd))
- // r.HandleFunc("/settings", renders.Settings)
- // r.HandleFunc("/library", renders.Library)
- // r.HandleFunc("/menuLibary", renders.Library)
- // r.HandleFunc("/godownloader/downloads", renders.GoDownload)
- // r.HandleFunc("/godownloader/linkcollectors", renders.GoDownloadLinkCollectors)
- // r.HandleFunc("/godownloader/settings", renders.GoDownloadSetting)
- // // API user
- // r.HandleFunc("/api/user/create", users.CreateUser(bd)).Methods("POST")
- // r.HandleFunc("/api/user/update/{id}", users.UpdateUser(bd)).Methods("PUT")
- // r.HandleFunc("/api/user/delete/{id}", users.DeleteUser(bd)).Methods("DELETE")
- // r.HandleFunc("/api/user/all/", users.ReadAllUser(bd)).Methods("GET")
- // r.HandleFunc("/api/user/{id}", users.FindUserById(bd)).Methods("GET")
-
- // // API download
- // r.HandleFunc("/api/pathDownload/create", download.CreateSavePath(bd)).Methods("POST")
- // r.HandleFunc("/api/pathDownload/update/{id}", download.UpdateSavePath(bd)).Methods("PUT")
- // r.HandleFunc("/api/pathDownload/delete/{id}", download.DeleteSavePath(bd)).Methods("DELETE")
- // r.HandleFunc("/api/pathDownload/all/", download.ReadAllSavePath(bd)).Methods("GET")
-
- // //API Check path
- // r.HandleFunc("/validate-path", download.PathValidationHandler)
-
- //API Scan folder
-
-
-}
\ No newline at end of file
+}