diff --git a/cmd/api/main.go b/cmd/api/main.go index 87f5e19..54f4aa1 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -72,12 +72,14 @@ func main() { mux.HandleFunc("GET /login", authHandler.LoginView) mux.HandleFunc("GET /signup", authHandler.SignupHandler) mux.HandleFunc("GET /admin/addcard", adminHanlder.AddCardsView) + mux.HandleFunc("GET /admin/deactivatecard", adminHanlder.DeactivateView) // POST Request: Processes the form // This matches
in your HTML mux.HandleFunc("POST /loginauth", authHandler.LoginAuthHandler) mux.HandleFunc("POST /signupauth", authHandler.SignupHandler) mux.HandleFunc("POST /admin/addcardauth", adminHanlder.AddCardHandler) + mux.HandleFunc("POST /admin/deactivatecardauth", adminHanlder.DeactivateCardHanlder) // Dashboard mux.HandleFunc("/dashboard", dashboardHandler) diff --git a/internal/admin/deactivateCard.go b/internal/admin/deactivateCard.go new file mode 100644 index 0000000..3aa6760 --- /dev/null +++ b/internal/admin/deactivateCard.go @@ -0,0 +1,93 @@ +package adminauth + +import ( + "fmt" + "net/http" + "strings" +) + +// This struct is used to pass data to the HTML template for the Deactivate Card page. +// It allows us to easily display error or success messages when we process the form submission for deactivating a card. +type CardData struct { + Error string + Success string +} + +// This struct represents the details of a card that we want to deactivate. +// We can use it to easily pass card data around in our functions. +// It also helps to keep our code organized and makes it easier to manage card-related data when we process the deactivation form submission. +type CardDetails struct { + CardNumber string + CardType string +} + +// This function renders the deactivateCard.html template when the admin visits the /admin/deactivatecard page. +// It doesn't do any processing yet, it just shows the form to the admin. +// We can also pass an empty CardData struct to the template, which allows us to easily display error or success messages later on when we process the form submission. +func (h *Handler) DeactivateView(w http.ResponseWriter, r *http.Request) { + fmt.Println("DeactivateView running...") + // Render the deactivateCard.html template + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{}) +} + +// This function handles the form submission from the deactivateCard.html page. +func (h *Handler) DeactivateCardHanlder(w http.ResponseWriter, r *http.Request) { + fmt.Println("Deactivate card handler running...") + + if err := r.ParseForm(); err != nil { + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{Error: "Failed to parse form"}) + return + } + + cardNumber := strings.TrimSpace(r.PostFormValue("cardNumber")) + cardHolder := strings.TrimSpace(r.PostFormValue("name")) + cardType := strings.TrimSpace(r.PostFormValue("cardType")) + + if cardNumber == "" || cardHolder == "" || cardType == "" { + fmt.Println("Missing required fields:", cardNumber, cardHolder, cardType) + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{Error: "Please fill in all required fields."}) + return + } + + // Check if the card exists and is active, then deactivate it + ok, err := h.deactivateCardIfActive(cardNumber, cardHolder, cardType) + if err != nil { + fmt.Println("Error while deactivating card:", err) + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{Error: "Failed to deactivate card."}) + return + } + + if !ok { + fmt.Printf("Card not found or already inactive: %s with Card Type: %s\n", cardNumber, cardType) + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{Error: "Card not found or already inactive."}) + return + } + + fmt.Println("Card deactivated successfully:", cardNumber, cardType) + h.Tpl.ExecuteTemplate(w, "deactivateCard.html", CardData{Success: "Card deactivated successfully!"}) +} + +// --- Helper functions --- + +// This function checks if a card with the given number and type is active, +// and if so, it deactivates it by updating its status in the database. +func (h *Handler) deactivateCardIfActive(cardNumber, cardHolder, cardType string) (bool, error) { + result, err := h.DB.Exec(` + UPDATE cards + SET status = 'Blocked' + WHERE card_number = ? + AND card_holder = ? + AND card_type = ? + AND status = 'Active' + `, cardNumber, cardHolder, cardType) + if err != nil { + return false, err + } + + rows, err := result.RowsAffected() + if err != nil { + return false, err + } + + return rows > 0, nil +} diff --git a/templates/addCards.html b/templates/addCards.html index c752f62..13d2ed1 100644 --- a/templates/addCards.html +++ b/templates/addCards.html @@ -3,8 +3,8 @@ + Add Card -

Add Card

@@ -14,7 +14,7 @@

Add Card

{{if .Success}}
{{.Success}}
{{end}} - +
diff --git a/templates/deactivateCard.html b/templates/deactivateCard.html new file mode 100644 index 0000000..fe3ce5c --- /dev/null +++ b/templates/deactivateCard.html @@ -0,0 +1,44 @@ + + + + + + + + Deactivate Card + + + +

Deactivate Card

+ {{if .Error}} +
{{.Error}}
+ {{end}} + {{if .Success}} +
{{.Success}}
+ {{end}} + +
+ + +
+
+ + +
+
+ + +
+ + + + + + + \ No newline at end of file