Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified app.exe
Binary file not shown.
29 changes: 16 additions & 13 deletions backend/cmd/app/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"log"
"net/http"
"os"
"strings"
"unicard-go/backend/internal/admin"
authentication "unicard-go/backend/internal/auth"
"unicard-go/backend/internal/user"
Expand Down Expand Up @@ -88,7 +87,21 @@ func main() {
mux.HandleFunc("POST /v1/forgot-password/send-otp", authHandler.ForgotPasswordSendOTP)
mux.HandleFunc("POST /v1/forgot-password/verify-otp", authHandler.ForgotPasswordVerifyOTP)
mux.HandleFunc("POST /v1/reset-password", authHandler.ResetPassword)
mux.HandleFunc("GET /{username}", userHandler.DashboardView)
mux.HandleFunc("GET /u/{username}", userHandler.ProfileView)
mux.HandleFunc("GET /u/{username}/dashboard", userHandler.DashboardView)
mux.HandleFunc("GET /u/{username}/card", userHandler.CardView)
mux.HandleFunc("GET /u/{username}/topup", userHandler.TopUpView)
// Your frontend calls this to get the Stripe URL
mux.HandleFunc("POST /api/topup/create-session/{username}", userHandler.CreateStripeCheckoutSession)

// Payment gateway endpoints
// STRIPE'S servers call this behind the scenes when the payment is done
mux.HandleFunc("POST /api/webhooks/stripe", userHandler.StripeWebhook)
mux.HandleFunc("POST /v1/user/{username}/topup/checkout", userHandler.CreateStripeCheckoutSession) //
//mux.HandleFunc("GET /v1/user/{username}/topup/success", userHandler.TopUpSuccessHandler)
mux.HandleFunc("GET /u/{username}/transaction", userHandler.TransactionView)
mux.HandleFunc("GET /u/{username}/transactions", userHandler.TransactionView)

mux.HandleFunc("GET /v1/user/{username}", userHandler.DashboardHandler)
mux.HandleFunc("GET /v1/user/{username}/transactions", userHandler.TransactionsJSONHandler)
//mux.HandleFunc("GET /logout",)
Expand Down Expand Up @@ -120,7 +133,7 @@ func main() {
mux.HandleFunc("POST /v1/admin/{username}/deletecardauth", adminHanlder.DeleteCardHandler)
mux.HandleFunc("GET /admin/{username}/delete-cards", adminHanlder.DeleteCardView)

// terminal simulation endpoints
// terminal endpoints for Fare and Retails.
mux.HandleFunc("GET /terminal-sim", adminHanlder.TerminalSimView)
mux.HandleFunc("POST /v1/terminal-sim/transact", adminHanlder.TerminalSimTransactionHandler)

Expand All @@ -131,16 +144,6 @@ func main() {
return
}

// Handle GET /{username}/transaction(s) manually to avoid ServeMux conflict with /assets/
parts := strings.Split(r.URL.Path, "/")
if len(parts) == 3 && (parts[2] == "transaction" || parts[2] == "transactions") && r.Method == http.MethodGet {
if parts[1] != "assets" && parts[1] != "storage" && parts[1] != "v1" && parts[1] != "admin" {
r.SetPathValue("username", parts[1])
userHandler.TransactionView(w, r)
return
}
}

mux.ServeHTTP(w, r)
})

Expand Down
6 changes: 3 additions & 3 deletions backend/internal/admin/admin_merchant.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func (h *Handler) MerchantManagementDataHandler(w http.ResponseWriter, r *http.R
termQuery := fmt.Sprintf(`
SELECT m.merchant_id, t.terminal_id, t.terminal_sn, t.device_name, t.status
FROM terminals t
JOIN merchants m ON t.merchant_id = m.user_id
JOIN merchants m ON t.merchant_id = m.merchant_id
WHERE m.merchant_id IN (%s)`, strings.Join(placeholders, ","))

termRows, err := h.DB.Query(termQuery, termArgs...)
Expand Down Expand Up @@ -262,7 +262,7 @@ func (h *Handler) ApproveMerchantHandler(w http.ResponseWriter, r *http.Request)
var businessAddress string
_ = tx.QueryRow("SELECT business_address FROM merchants WHERE merchant_id = ?", merchantID).Scan(&businessAddress)

_, err = tx.Exec("UPDATE terminals SET merchant_id = ?, location_details = ?, status = 'active' WHERE terminal_sn = ?", merchantUserID, businessAddress, req.TerminalSn)
_, err = tx.Exec("UPDATE terminals SET merchant_id = ?, device_name = ?, location_details = ?, status = 'active' WHERE terminal_sn = ?", merchantID, req.DeviceName, businessAddress, req.TerminalSn)
if err != nil {
jsonwrite.WriteJSON(w, http.StatusInternalServerError, jsonwrite.APIResponse{Success: false, Message: "Failed to assign terminal"})
return
Expand Down Expand Up @@ -489,7 +489,7 @@ func (h *Handler) DeleteMerchantHandler(w http.ResponseWriter, r *http.Request)
}

// Update terminals assigned to this merchant
_, err = tx.Exec("UPDATE terminals SET merchant_id = NULL, location_details = '', status = 'inactive' WHERE merchant_id = ?", merchantUserID)
_, err = tx.Exec("UPDATE terminals SET merchant_id = NULL, location_details = '', status = 'inactive' WHERE merchant_id = ?", merchantID)
if err != nil {
jsonwrite.WriteJSON(w, http.StatusInternalServerError, jsonwrite.APIResponse{Success: false, Message: "Failed to reset terminals"})
return
Expand Down
2 changes: 1 addition & 1 deletion backend/internal/admin/admin_terminal.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (h *Handler) TerminalRegistryDataHandler(w http.ResponseWriter, r *http.Req
offset := (page - 1) * limit

// Build query
baseQuery := `FROM terminals t LEFT JOIN merchants m ON t.merchant_id = m.user_id`
baseQuery := `FROM terminals t LEFT JOIN merchants m ON t.merchant_id = m.merchant_id`
var args []interface{}
var conditions []string

Expand Down
8 changes: 4 additions & 4 deletions backend/internal/admin/terminal_sim.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func (h *Handler) TerminalSimView(w http.ResponseWriter, r *http.Request) {
}
var merchants []Merchant

rows, err := h.DB.Query("SELECT user_id, business_name FROM merchants")
rows, err := h.DB.Query("SELECT merchant_id, business_name FROM merchants")
if err == nil {
defer rows.Close()
for rows.Next() {
Expand Down Expand Up @@ -121,7 +121,7 @@ func (h *Handler) TerminalSimTransactionHandler(w http.ResponseWriter, r *http.R

// 2.5 Get merchant commission rate
var commissionRate float64
err = h.DB.QueryRow("SELECT commission_rate FROM merchants WHERE user_id = ?", req.MerchantID).Scan(&commissionRate)
err = h.DB.QueryRow("SELECT commission_rate FROM merchants WHERE merchant_id = ?", req.MerchantID).Scan(&commissionRate)
if err != nil {
commissionRate = 2.00 // default fallback
}
Expand Down Expand Up @@ -203,8 +203,8 @@ func (h *Handler) TerminalSimTransactionHandler(w http.ResponseWriter, r *http.R
}

jsonwrite.WriteJSON(w, http.StatusOK, map[string]interface{}{
"success": true,
"message": "Transaction successful",
"success": true,
"message": "Transaction successful",
"service_fee": serviceFee,
})
}
2 changes: 1 addition & 1 deletion backend/internal/auth/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func (h *Handler) LoginAuthHandler(w http.ResponseWriter, r *http.Request) {
}

// Determine redirect based on role
redirectURL := "/" + userName // Default for customer
redirectURL := "/u/" + userName + "/dashboard" // Default for customer
switch role {
case "super_admin":
redirectURL = "/admin/" + userName // Super admin dashboard
Expand Down
2 changes: 1 addition & 1 deletion backend/internal/auth/signup.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ func (h *Handler) SignupHandler(w http.ResponseWriter, r *http.Request) {
Phone: req.ContactNumber,
CreatedAt: createdAt,
Balance: balance,
Role: "Customer",
Role: "customer", // Lowercase to perfectly match ENUM('customer') in unicardv3.sql
Status: "active",
}

Expand Down
19 changes: 19 additions & 0 deletions backend/internal/user/customer_card.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package user

import (
"fmt"
"net/http"
)

func (h *Handler) CardView(w http.ResponseWriter, r *http.Request) {
fmt.Println("Card view is running...")

username := r.PathValue("username")
data := struct {
Username string
}{
Username: username,
}

h.Tpl.ExecuteTemplate(w, "card.html", data)
}
19 changes: 19 additions & 0 deletions backend/internal/user/customer_profile.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package user

import (
"fmt"
"net/http"
)

func (h *Handler) ProfileView(w http.ResponseWriter, r *http.Request) {
fmt.Println("Profile view is running...")

username := r.PathValue("username")
data := struct {
Username string
}{
Username: username,
}

h.Tpl.ExecuteTemplate(w, "profile.html", data)
}
Loading