package main import ( "encoding/json" "flag" "fmt" "log" "net/http" "os" "github.com/joho/godotenv" ) type Config struct { Job string `json:"job"` Emails []string `json:"emails"` } func loadConfig() (*Config, error) { data, err := os.ReadFile("data.json") if err != nil { return nil, err } var c Config return &c, json.Unmarshal(data, &c) } func saveConfig(c *Config) error { data, err := json.MarshalIndent(c, "", " ") if err != nil { return err } return os.WriteFile("data.json", data, 0644) } // ---------- Main ---------- func main() { err := godotenv.Load() if err != nil { log.Fatal("Error loading .env file") } port := flag.String("port", "8081", "port to listen on") flag.Parse() fs := http.FileServer(http.Dir("static")) http.Handle("/static/", http.StripPrefix("/static/", fs)) http.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/index.html") }) http.HandleFunc("GET /infra", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/infra.html") }) http.HandleFunc("GET /finance", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/finance.html") }) http.HandleFunc("GET /cinema", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/cinema.html") }) http.HandleFunc("GET /engine", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/engine.html") }) http.HandleFunc("GET /42", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/42.html") }) http.HandleFunc("GET /secret", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/secret.html") }) http.HandleFunc("GET /favicon.ico", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/icon.png") }) http.HandleFunc("GET /login", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "./static/login.html") }) http.HandleFunc("POST /newsletter/subscribe", func(w http.ResponseWriter, r *http.Request) { var req struct { Email string `json:"email"` } err := json.NewDecoder(r.Body).Decode(&req) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } double := false conf, err := loadConfig() for _, e := range conf.Emails { if e == req.Email { double = true } } if !double { conf.Emails = append(conf.Emails, req.Email) } saveConfig(conf) }) http.HandleFunc("GET /status", func(w http.ResponseWriter, r *http.Request) { config, err := loadConfig() if err != nil { http.Error(w, "failed to load config", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/html") if config.Job == "" || config.Job == "none" { fmt.Fprint(w, `available for work`) } else { fmt.Fprintf(w, `working at: %s`, config.Job) } }) //http.HandleFunc("/portfolio", Portfolio) http.HandleFunc("/git", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "https://git.samantha42.xyz", http.StatusFound) }) fmt.Printf("running on http://localhost:%s/\n", *port) if err := http.ListenAndServe(":"+*port, nil); err != nil { log.Fatal(err) } }