From ee64cdc2712a8e7f77c6af02385afd43a2a1e61b Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Sun, 26 Apr 2026 16:52:03 -0400 Subject: refactor: Split Go code into multiple files --- allowed.go | 48 ++++++++++++++++++++++ db.go | 92 +++++++++++++++++++++++++++++++++++++++++ main.go | 128 ++------------------------------------------------------- sql.go.example | 46 --------------------- 4 files changed, 143 insertions(+), 171 deletions(-) create mode 100644 allowed.go create mode 100644 db.go delete mode 100644 sql.go.example diff --git a/allowed.go b/allowed.go new file mode 100644 index 00000000..e6789206 --- /dev/null +++ b/allowed.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "html/template" + "log" + "net/http" + "os" + "regexp" + "slices" +) + +type AllowedFiles struct { + allowedFiles []string +} + +func (a *AllowedFiles) GetFiles(w http.ResponseWriter, r *http.Request) { + log.Println("Request for:", r.URL.String()) + url := fmt.Sprintf("static%s", r.URL.String()) + htmlRegex, err := regexp.Compile("^static/.*\\.html$") + if err != nil { + ErrorPage(w, 500) + return + } + + if url == "static/" { + url = "static/index.html" + } + + if !slices.Contains(a.allowedFiles, url) { + ErrorPage(w, 404) + return + } + + if htmlRegex.MatchString(url) { + t := template.Must(template.ParseFiles("templates/template.html")) + + html, err := os.ReadFile(url) + if err != nil { + ErrorPage(w, 500) + return + } + + t.Execute(w, template.HTML(html)) + } else { + http.ServeFile(w, r, url) + } +} diff --git a/db.go b/db.go new file mode 100644 index 00000000..49e7656a --- /dev/null +++ b/db.go @@ -0,0 +1,92 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + _ "modernc.org/sqlite" + "net/http" + "os" +) + +type Database struct { + DB *sql.DB +} + +type Entry struct { + os string + name string + section int + path string +} + +func (d *Database) GetOS(w http.ResponseWriter, r *http.Request) { + rows, err := d.DB.Query("SELECT DISTINCT os FROM manpages;") + if err != nil { + log.Println(err) + ErrorPage(w, 500) + return + } + defer rows.Close() + + for rows.Next() { + var osName string + + if err := rows.Scan(&osName); err != nil { + log.Println(err) + ErrorPage(w, 500) + return + } + + fmt.Fprintf(w, "", osName, osName) + } +} + +func (d *Database) Search(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + + log.Println("Request for:", r.URL.String()) + + name := query["name"][0] + section := query["section"][0] + osName := query["os"][0] + + log.Println(name) + + rows, err := d.DB.Query("SELECT * FROM manpages WHERE name == ? AND section == ? AND os == ?;", name, section, osName) + if err != nil { + log.Println(err) + ErrorPage(w, 500) + return + } + defer rows.Close() + + var entries []Entry + for rows.Next() { + var entry Entry + + if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil { + log.Println(err) + ErrorPage(w, 500) + return + } + + entries = append(entries, entry) + } + + if len(entries) > 0 { + fmt.Fprintf(w, "
") + for _, e := range entries { + data, err := os.ReadFile(e.path) + if err != nil { + log.Println(err) + ErrorPage(w, 500) + return + } + fmt.Fprintf(w, "%s", data) + } + fmt.Fprintf(w, "
") + } else { + fmt.Fprintf(w, "

No results found for %s %s(%s)

", osName, name, section) + } +} diff --git a/main.go b/main.go index b8a49198..69897f4c 100644 --- a/main.go +++ b/main.go @@ -1,136 +1,14 @@ package main import ( + "database/sql" "fmt" "html/template" "log" "net/http" "os" - "slices" - "regexp" - "database/sql" - _ "modernc.org/sqlite" ) -type Entry struct { - os string - name string - section int - path string -} - -type Database struct { - DB *sql.DB -} - -func (d *Database) GetOS(w http.ResponseWriter, r *http.Request) { - rows, err := d.DB.Query("SELECT DISTINCT os FROM manpages;") - if err != nil { - log.Println(err) - ErrorPage(w, 500) - return - } - defer rows.Close() - - for rows.Next() { - var osName string - - if err := rows.Scan(&osName); err != nil { - log.Println(err) - ErrorPage(w, 500) - return - } - - fmt.Fprintf(w, "", osName, osName) - } -} - -func (d *Database) Search(w http.ResponseWriter, r *http.Request) { - query := r.URL.Query() - - log.Println("Request for:", r.URL.String()) - - name := query["name"][0] - section := query["section"][0] - osName := query["os"][0] - - log.Println(name) - - rows, err := d.DB.Query("SELECT * FROM manpages WHERE name == ? AND section == ? AND os == ?;", name, section, osName) - if err != nil { - log.Println(err) - ErrorPage(w, 500) - return - } - defer rows.Close() - - var entries []Entry - for rows.Next() { - var entry Entry - - if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil { - log.Println(err) - ErrorPage(w, 500) - return - } - - entries = append(entries, entry) - } - - if len(entries) > 0 { - fmt.Fprintf(w, "
") - for _, e := range entries { - data, err := os.ReadFile(e.path) - if err != nil { - log.Println(err) - ErrorPage(w, 500) - return - } - fmt.Fprintf(w, "%s", data) - } - fmt.Fprintf(w, "
") - } else { - fmt.Fprintf(w, "

No results found for %s %s(%s)

", osName, name, section) - } -} - -type AllowedFiles struct { - allowedFiles []string -} - -func (a *AllowedFiles) GetFiles(w http.ResponseWriter, r *http.Request) { - log.Println("Request for:", r.URL.String()) - url := fmt.Sprintf("static%s", r.URL.String()) - htmlRegex, err := regexp.Compile("^static/.*\\.html$") - if err != nil { - ErrorPage(w, 500) - return - } - - if url == "static/" { - url = "static/index.html" - } - - if !slices.Contains(a.allowedFiles, url) { - ErrorPage(w, 404) - return - } - - if htmlRegex.MatchString(url) { - t := template.Must(template.ParseFiles("templates/template.html")) - - html, err := os.ReadFile(url) - if err != nil { - ErrorPage(w, 500) - return - } - - t.Execute(w, template.HTML(html)) - } else { - http.ServeFile(w, r, url) - } -} - func ErrorPage(w http.ResponseWriter, code int) { log.Println(code, http.StatusText(code)) t := template.Must(template.ParseFiles("templates/error.html")) @@ -174,8 +52,8 @@ func main() { log.Fatal(err) } - dbWrapper := &Database{ DB: db } - allowed := &AllowedFiles { + dbWrapper := &Database{DB: db} + allowed := &AllowedFiles{ allowedFiles: []string{ "static/htmx.min.js", "static/index.html", diff --git a/sql.go.example b/sql.go.example deleted file mode 100644 index af73c7ad..00000000 --- a/sql.go.example +++ /dev/null @@ -1,46 +0,0 @@ -package main - -import ( - "database/sql" - _ "modernc.org/sqlite" - "fmt" - "log" - _ "modernc.org/sqlite" -) - -type Entry struct { - os string - name string - section int - path string -} - -func main() { - db, err := sql.Open("sqlite", "man.db") - if err != nil { - log.Fatal(err) - } - - if err := db.Ping(); err != nil { - log.Fatal(err) - } - - r, err := db.Query("SELECT * FROM manpages WHERE name == 'intro';") - if err != nil { - log.Fatal(err) - } - defer r.Close() - - for r.Next() { - var entry Entry - if err := r.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil { - log.Fatal(err) - } - fmt.Println(entry.os, entry.name, entry.section, entry.path) - } - - err = db.Close() - if err != nil { - log.Fatal(err) - } -} -- cgit v1.2.3