diff --git a/main.go b/main.go index a170dab..9f55e3e 100644 --- a/main.go +++ b/main.go @@ -37,17 +37,38 @@ const ( dbName = "gomatic" ) +// type Agent struct { +// agentId int +// agentName string +// initialContact string +// lastContact string +// } + type Agent struct { - agentId int - agentName string - initialContact string - lastContact string + AgentID int `json:"agentId"` + AgentName string `json:"agentName"` + InitialContact string `json:"initialContact"` + LastContact string `json:"lastContact"` } func init() { tmpl, _ = template.ParseGlob("templates/*.html") } +func renderTemplate(w http.ResponseWriter, tmpl string, data interface{}) { + t, err := template.ParseFiles(tmpl) + if err != nil { + log.Printf("Failed to load template %s: %v", tmpl, err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + if err := t.Execute(w, data); err != nil { + log.Printf("Failed to render template %s: %v", tmpl, err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } +} + func initDB () { var err error dbOpen := fmt.Sprintf("%s:%s@(%s:%d)/%s?parseTime=true", dbUser,dbPassword, dbHost, dbPort, dbName) @@ -82,7 +103,7 @@ func getAgents(dbPointer *sql.DB) ([]Agent, error) { for rows.Next() { var agent Agent - rowErr := rows.Scan(&agent.agentId, &agent.agentName, &agent.initialContact, &agent.lastContact) + rowErr := rows.Scan(&agent.AgentID, &agent.AgentName, &agent.InitialContact, &agent.LastContact) if rowErr != nil { return nil, err } @@ -141,6 +162,140 @@ func getHomepage(w http.ResponseWriter, r *http.Request) { tmpl.ExecuteTemplate(w, "index.html", nil) } +func agentsHandler(w http.ResponseWriter, r *http.Request) { + // if r.URL.Path == "/agents" { + // if r.Method == http.MethodGet{ + // agents, err := getAgentsFromDB() + // if err != nil { + // http.Error(w, "Failed to fetch agents", http.StatusInternalServerError) + // return + // } + // renderTemplate(w, "templates/partials/agent_list.html", agents) + // } else { + // http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + // } + // return + // } + + parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/agents/"), "/") + agentId := "" + if len(parts) > 0 && parts[0] != "" { + agentId = parts[0] + } + + // if len (parts) < 1 || parts[0] == "" { + // http.Error(w, "Agent ID required", http.StatusBadRequest) + // return + // } + + // agentId := parts[0] + + switch r.Method { + case http.MethodDelete: + deleteAgent(w, r, agentId) + case http.MethodGet: + if agentId == "" { + listAgents(w, r) + } else { + getAgent(w, r, agentId) + } + case http.MethodPost: + createAgent(w, r) + case http.MethodPut: + updateAgent(w, r, agentId) + default: + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + } +} + +func listAgents(w http.ResponseWriter, r *http.Request) { + agents, err := getAgentsFromDB() + if err != nil { + http.Error(w, "Failed to fetch agents", http.StatusInternalServerError) + return + } + + renderTemplate(w, "templates/partials/agent_list.html", agents) +} + +func deleteAgent(w http.ResponseWriter, r *http.Request, agentID string) { + query := "DELETE FROM agents WHERE agentId = ?" + _, err := db.Exec(query, agentID) + if err != nil { + http.Error(w, "Failed to delete agent", http.StatusInternalServerError) + return + } + + agents, err := getAgentsFromDB() + if err != nil { + http.Error(w, "Failed to fetch agents", http.StatusInternalServerError) + return + } + + renderTemplate(w, "templates/partials/agent_list.html", agents) +} + +func createAgent(w http.ResponseWriter, r * http.Request) { + err := r.ParseForm() + if err != nil { + http.Error(w, "Invalid form data", http.StatusBadRequest) + } + + agentName := r.FormValue("agentName") + agentId := 42 + // initalContact := r.FormValue("initialContact") + // lastContact := r.FormValue("lastContact") + + query := "INSERT INTO agents (agentId, agentName, initialContact, lastContact) VALUES (?, ?, NOW(), NOW())" + _, err = db.Exec(query, agentId, agentName) + if err != nil { + http.Error(w, "Failed to create agent", http.StatusInternalServerError) + return + } + + listAgents(w, r) +} + +func updateAgent(w http.ResponseWriter, r *http.Request, agentId string) { + err := r.ParseForm() + if err != nil { + http.Error(w, "Invalid form data", http.StatusBadRequest) + return + } + + agentName := r.FormValue("agentName") + lastContact := r.FormValue("lastContact") + + query := "UPDATE agents SET agentName = ?, lastContact = ? where agentId = ?" + _, err = db.Exec(query, agentName, lastContact, agentId) + if err != nil { + http.Error(w, "Failed to update agent", http.StatusInternalServerError) + return + } + + listAgents(w, r,) +} + +func getAgentsFromDB() ([]Agent, error) { + query := "SELECT agentId, agentName, initialContact, lastContact FROM agents" + rows, err := db.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + var agents []Agent + for rows.Next() { + var agent Agent + err := rows.Scan(&agent.AgentID, &agent.AgentName, &agent.InitialContact, &agent.LastContact) + if err != nil { + return nil, err + } + agents = append(agents, agent) + } + return agents, rows.Err() +} + func agentHandler(w http.ResponseWriter, r *http.Request) { parts := strings.Split(strings.TrimPrefix(r.URL.Path, "/agents/"), "/") if len (parts) < 1 || parts[0] == "" { @@ -171,7 +326,7 @@ type webSocketHandler struct { func getAgent(w http.ResponseWriter, r *http.Request, agentId string) { query := "Select agentId, agentName, initialContact, lastContact from agents where agentId = ?" var agent Agent - err := db.QueryRow(query, agentId).Scan(&agentId, &agent.agentName, &agent.initialContact, &agent.lastContact) + err := db.QueryRow(query, agentId).Scan(&agent.AgentID, &agent.AgentName, &agent.InitialContact, &agent.LastContact) if err == sql.ErrNoRows { http.Error(w, "Agent not found", http.StatusNotFound) return @@ -181,6 +336,8 @@ func getAgent(w http.ResponseWriter, r *http.Request, agentId string) { } // return agent, nil + // TODO: Add agent_detail.html + renderTemplate(w, "templates/partials/agent_detail.html", agent) } @@ -226,12 +383,13 @@ func main() { webMux := http.NewServeMux() webMux.HandleFunc("/", getHomepage) - webMux.HandleFunc("/index", getRoot) - webMux.HandleFunc("/hello", getHello) - webMux.HandleFunc("/agents", fetchAgents) + // webMux.HandleFunc("/index", getRoot) + // webMux.HandleFunc("/hello", getHello) + // webMux.HandleFunc("/agents", fetchAgents) + webMux.HandleFunc("/agents", agentsHandler) // webMux.HandleFunc("/newagentform", getAgentForm) // webMux.HandleFunc("/getagentupdateform/{agentId}", getAgentUpdateForm) - webMux.HandleFunc("/agents/{agentId}", agentHandler) + webMux.HandleFunc("/agents/{agentId}", agentsHandler) // webMux.HandleFunc diff --git a/templates/agentList.html b/templates/agentList.html index d11a95f..545a575 100644 --- a/templates/agentList.html +++ b/templates/agentList.html @@ -1,14 +1,21 @@ -{{define "agentList"}} -
Select an agent to view details.
+