diff --git a/README.MD b/README.MD
index 4eb08d0..f8204c9 100644
--- a/README.MD
+++ b/README.MD
@@ -19,7 +19,7 @@
## APPOINTMENT
-````sql
+```sql
create table user_addresses
(
user_id integer not null
@@ -34,5 +34,5 @@ create table user_addresses
created_at timestamp default now(),
updated_at timestamp default now(),
primary key (user_id, address_line1, postal_code)
-);```
-````
+);
+```
diff --git a/app/go.mod b/app/go.mod
index f0122ff..144bad7 100644
--- a/app/go.mod
+++ b/app/go.mod
@@ -7,3 +7,5 @@ require (
github.com/lib/pq v1.10.9
golang.org/x/crypto v0.41.0
)
+
+require github.com/joho/godotenv v1.5.1 // indirect
diff --git a/app/go.sum b/app/go.sum
index 0444594..2073630 100644
--- a/app/go.sum
+++ b/app/go.sum
@@ -1,5 +1,7 @@
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
+github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
+github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
diff --git a/app/internal/handlers/login.go b/app/internal/handlers/login.go
index e8de9e4..ab460e2 100644
--- a/app/internal/handlers/login.go
+++ b/app/internal/handlers/login.go
@@ -4,18 +4,18 @@ import (
"database/sql"
"log"
"net/http"
+ "os"
"strconv"
"time"
"github.com/golang-jwt/jwt/v5"
+ "github.com/joho/godotenv"
"golang.org/x/crypto/bcrypt"
"github.com/patel-mann/poll-system/app/internal/models"
"github.com/patel-mann/poll-system/app/internal/utils"
)
-var jwtKey = []byte("your-secret-key") //TODO: Move to env/config
-
// Helper function to get redirect URL based on role
func getDefaultRedirectURL(role int) string {
switch role {
@@ -49,6 +49,18 @@ func renderRegisterError(w http.ResponseWriter, errorMsg string) {
// Helper function to create and sign JWT token
func createJWTToken(userID, role int) (string, time.Time, error) {
+
+ err := godotenv.Load() // or specify path: godotenv.Load("/path/to/.env")
+ if err != nil {
+ log.Fatalf("Error loading .env file: %v", err)
+ }
+
+ // Get individual components from environment variables
+ jwtSecret := os.Getenv("JWT_SECRET")
+
+ var jwtKey = []byte(jwtSecret) //TODO: Move to env/config
+
+
expirationTime := time.Now().Add(12 * time.Hour)
claims := &models.Claims{
UserID: userID,
diff --git a/app/internal/models/db.go b/app/internal/models/db.go
index e1fc40a..2b6060e 100644
--- a/app/internal/models/db.go
+++ b/app/internal/models/db.go
@@ -4,24 +4,40 @@ import (
"database/sql"
"fmt"
"log"
+ "os"
+ "github.com/joho/godotenv"
_ "github.com/lib/pq"
)
var DB *sql.DB
func InitDB() {
- var err error
+ // Load .env file
+ err := godotenv.Load() // or specify path: godotenv.Load("/path/to/.env")
+ if err != nil {
+ log.Fatalf("Error loading .env file: %v", err)
+ }
- // Example DSN format for PostgreSQL:
- // "postgres://username:password@host:port/dbname?sslmode=disable"
- dsn := "postgres://mannpatel:Admin@localhost:5432/poll_database?sslmode=disable"
+ // Get individual components from environment variables
+ host := os.Getenv("DB_HOST")
+ port := os.Getenv("DB_PORT")
+ user := os.Getenv("DB_USER")
+ password := os.Getenv("DB_PASSWORD")
+ dbname := os.Getenv("DB_NAME")
+ sslmode := os.Getenv("DB_SSLMODE") // optional, default "disable"
+ // Build connection string
+ dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
+ host, port, user, password, dbname, sslmode)
+
+ // Connect to DB
DB, err = sql.Open("postgres", dsn)
if err != nil {
log.Fatalf("Failed to connect to DB: %v", err)
}
+ // Test connection
err = DB.Ping()
if err != nil {
log.Fatalf("Failed to ping DB: %v", err)
diff --git a/app/internal/models/token.go b/app/internal/models/token.go
index 6a66b13..7fe780c 100644
--- a/app/internal/models/token.go
+++ b/app/internal/models/token.go
@@ -5,8 +5,6 @@ import (
"net/http"
)
-var jwtKey = []byte("your-secret-key") //TODO: Move to env/config
-
func GetCurrentUserID(w http.ResponseWriter, r *http.Request)(int){
currentUserID := r.Context().Value("user_id").(int)
return currentUserID
diff --git a/app/internal/templates/layout.html b/app/internal/templates/layout.html
index 9ba4cd3..7dca51c 100644
--- a/app/internal/templates/layout.html
+++ b/app/internal/templates/layout.html
@@ -32,6 +32,9 @@
{{slice .UserName 0 1}}
+
+
+
@@ -48,15 +51,14 @@
Welcome, {{.UserName}}
-
- {{slice .UserName 0 1}}
-
+
+ {{slice .UserName 0 1}}
+
+
+
+
-
-
-
-
@@ -248,7 +243,7 @@
-
+
Streamline Your
Polling Operations
diff --git a/app/internal/utils/render.go b/app/internal/utils/render.go
index dd345e0..c469f73 100644
--- a/app/internal/utils/render.go
+++ b/app/internal/utils/render.go
@@ -2,9 +2,14 @@ package utils
import (
"bytes"
+ "fmt"
"html/template"
+ "log"
"net/http"
+ "os"
"path/filepath"
+
+ "github.com/joho/godotenv"
)
// Helper functions for templates
@@ -44,9 +49,19 @@ var templateFuncs = template.FuncMap{
}
func Render(w http.ResponseWriter, tmpl string, data interface{}) {
+ // Load .env file
+ err := godotenv.Load() // or specify path: godotenv.Load("/path/to/.env")
+ if err != nil {
+ log.Fatalf("Error loading .env file: %v", err)
+ }
+
+ // Get individual components from environment variables
+ TemplatesURL := os.Getenv("TEMPLATES_URL")
+ fmt.Print(TemplatesURL)
+
// Paths for layout + page templates
- layout := filepath.Join("/Users/mannpatel/Desktop/Poll-system/app/internal/templates/", "layout.html")
- page := filepath.Join("/Users/mannpatel/Desktop/Poll-system/app/internal/templates/", tmpl)
+ layout := filepath.Join(TemplatesURL, "layout.html")
+ page := filepath.Join(TemplatesURL, tmpl)
// Parse files with helper functions
tmpls, err := template.New("").Funcs(templateFuncs).ParseFiles(layout, page)
diff --git a/app/main.go b/app/main.go
index acc8497..6836732 100644
--- a/app/main.go
+++ b/app/main.go
@@ -11,6 +11,7 @@ import (
"path/filepath"
"github.com/golang-jwt/jwt/v5"
+ "github.com/joho/godotenv"
"github.com/patel-mann/poll-system/app/internal/handlers"
"github.com/patel-mann/poll-system/app/internal/models"
@@ -19,8 +20,6 @@ import (
_ "github.com/lib/pq" // use PostgreSQL
)
-var jwtSecret = []byte("your-secret-key")
-
// Custom file server with logging
func loggingFileServer(dir string) http.Handler {
fs := http.FileServer(http.Dir(dir))
@@ -71,6 +70,18 @@ func createTemplateData(title, activeSection string, role int, isAuthenticated b
}
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
+
+ err := godotenv.Load() // or specify path: godotenv.Load("/path/to/.env")
+ if err != nil {
+ log.Fatalf("Error loading .env file: %v", err)
+ }
+
+ // Get individual components from environment variables
+ jwtSecret := os.Getenv("JWT_SECRET")
+ var jwtKey = []byte(jwtSecret)
+
+
+
return func(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie("session")
if err != nil {
@@ -80,7 +91,7 @@ func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
claims := &models.Claims{}
token, err := jwt.ParseWithClaims(cookie.Value, claims, func(token *jwt.Token) (interface{}, error) {
- return jwtSecret, nil
+ return jwtKey, nil
})
if err != nil || !token.Valid {
http.Redirect(w, r, "/login", http.StatusSeeOther)
diff --git a/app/tmp/build-errors.log b/app/tmp/build-errors.log
index e01cd56..aab0340 100644
--- a/app/tmp/build-errors.log
+++ b/app/tmp/build-errors.log
@@ -1 +1 @@
-exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1
\ No newline at end of file
+exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1
\ No newline at end of file
diff --git a/app/tmp/main b/app/tmp/main
index 913326d..20a14c9 100755
Binary files a/app/tmp/main and b/app/tmp/main differ