From 48e7b5a9a583c104b4c42dc7eec18b55afdad58b Mon Sep 17 00:00:00 2001 From: Guilherme Rugai Freire Date: Wed, 10 Jul 2024 16:56:46 -0300 Subject: [PATCH] integrate web and mail server now, there is only one binary that starts both servers, making them use the same SQL connection. this commit also added some `defer tx.Commit()` to ensure all the transactions were closed --- Makefile | 10 +++----- cmd/server/main.go | 34 ++++++++++++++++++++++++++++ {cmd => pkg}/mail_server/main.go | 19 ++++++++-------- {cmd => pkg}/web_server/header.templ | 2 +- {cmd => pkg}/web_server/inbox.templ | 2 +- {cmd => pkg}/web_server/index.templ | 2 +- {cmd => pkg}/web_server/mail.templ | 2 +- {cmd => pkg}/web_server/main.go | 22 +++++++++--------- {cmd => pkg}/web_server/styles.templ | 2 +- run-web.sh => run-dev.sh | 6 ++--- 10 files changed, 65 insertions(+), 36 deletions(-) create mode 100644 cmd/server/main.go rename {cmd => pkg}/mail_server/main.go (91%) rename {cmd => pkg}/web_server/header.templ (90%) rename {cmd => pkg}/web_server/inbox.templ (98%) rename {cmd => pkg}/web_server/index.templ (96%) rename {cmd => pkg}/web_server/mail.templ (98%) rename {cmd => pkg}/web_server/main.go (95%) rename {cmd => pkg}/web_server/styles.templ (99%) rename run-web.sh => run-dev.sh (72%) diff --git a/Makefile b/Makefile index bfcdc62..401873f 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,4 @@ -all: mail web - -mail: - go build -o "./bin/$@_server" "./cmd/mail_server" - -web: +all: templ generate - go build -o "./bin/$@_server" "./cmd/web_server" + go build -o ./bin/server ./cmd/server + diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..d47bbd8 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "database/sql" + "github.com/GRFreire/nthmail/pkg/mail_server" + "github.com/GRFreire/nthmail/pkg/web_server" + "log" + "sync" + + _ "github.com/mattn/go-sqlite3" +) + +func main() { + db, err := sql.Open("sqlite3", "./db.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + var wg sync.WaitGroup + wg.Add(1) + go func(db *sql.DB) { + defer wg.Done() + mail_server.Start(db) + }(db) + + wg.Add(1) + go func(db *sql.DB) { + defer wg.Done() + web_server.Start(db) + }(db) + + wg.Wait() +} diff --git a/cmd/mail_server/main.go b/pkg/mail_server/main.go similarity index 91% rename from cmd/mail_server/main.go rename to pkg/mail_server/main.go index 13ead34..a0af9bf 100644 --- a/cmd/mail_server/main.go +++ b/pkg/mail_server/main.go @@ -1,7 +1,8 @@ -package main +package mail_server import ( "database/sql" + "errors" "fmt" "io" "log" @@ -52,6 +53,7 @@ func (session *Session) Rcpt(to string, opts *smtp.RcptOptions) error { } func (session *Session) Data(reader io.Reader) error { + defer session.tx.Rollback() if bytes, err := io.ReadAll(reader); err != nil { return err } else { @@ -85,13 +87,7 @@ func (session *Session) Logout() error { return nil } -func main() { - db, err := sql.Open("sqlite3", "./db.db") - if err != nil { - log.Fatal(err) - } - defer db.Close() - +func Start(db *sql.DB) error { backend := &Backend{ db: db, } @@ -104,11 +100,12 @@ func main() { } var port int + var err error port_str, exists := os.LookupEnv("MAIL_SERVER_PORT") if exists { port, err = strconv.Atoi(port_str) if err != nil { - log.Fatal("env:MAIL_SERVER_PORT is not a number") + return errors.New("env:MAIL_SERVER_PORT is not a number") } } else { port = 1025 @@ -124,6 +121,8 @@ func main() { log.Println("Starting server at", server.Addr) if err := server.ListenAndServe(); err != nil { - log.Fatal(err) + return err } + + return nil } diff --git a/cmd/web_server/header.templ b/pkg/web_server/header.templ similarity index 90% rename from cmd/web_server/header.templ rename to pkg/web_server/header.templ index cca29cd..14ea7fa 100644 --- a/cmd/web_server/header.templ +++ b/pkg/web_server/header.templ @@ -1,4 +1,4 @@ -package main +package web_server templ header(rcpt_addr string) {
diff --git a/cmd/web_server/inbox.templ b/pkg/web_server/inbox.templ similarity index 98% rename from cmd/web_server/inbox.templ rename to pkg/web_server/inbox.templ index fe3cac2..0388063 100644 --- a/cmd/web_server/inbox.templ +++ b/pkg/web_server/inbox.templ @@ -1,4 +1,4 @@ -package main +package web_server import ( "fmt" diff --git a/cmd/web_server/index.templ b/pkg/web_server/index.templ similarity index 96% rename from cmd/web_server/index.templ rename to pkg/web_server/index.templ index 67165e3..94506f8 100644 --- a/cmd/web_server/index.templ +++ b/pkg/web_server/index.templ @@ -1,4 +1,4 @@ -package main +package web_server templ index_page() { diff --git a/cmd/web_server/mail.templ b/pkg/web_server/mail.templ similarity index 98% rename from cmd/web_server/mail.templ rename to pkg/web_server/mail.templ index 5a6fedc..106eb52 100644 --- a/cmd/web_server/mail.templ +++ b/pkg/web_server/mail.templ @@ -1,4 +1,4 @@ -package main +package web_server import ( "github.com/russross/blackfriday/v2" diff --git a/cmd/web_server/main.go b/pkg/web_server/main.go similarity index 95% rename from cmd/web_server/main.go rename to pkg/web_server/main.go index aa0f401..6058f37 100644 --- a/cmd/web_server/main.go +++ b/pkg/web_server/main.go @@ -1,7 +1,8 @@ -package main +package web_server import ( "database/sql" + "errors" "fmt" "log" "net/http" @@ -15,15 +16,9 @@ import ( _ "github.com/mattn/go-sqlite3" ) -func main() { +func Start(db *sql.DB) error { server := &ServerResouces{} - - db, err := sql.Open("sqlite3", "./db.db") - if err != nil { - log.Fatal(err) - } - server.db = db - defer db.Close() + server.db = db domain, exists := os.LookupEnv("MAIL_SERVER_DOMAIN") if !exists { @@ -32,11 +27,12 @@ func main() { server.domain = domain var port int + var err error port_str, exists := os.LookupEnv("WEB_SERVER_PORT") if exists { port, err = strconv.Atoi(port_str) if err != nil { - log.Fatal("env:MAIL_SERVER_PORT is not a number") + return errors.New("env:WEB_SERVER_PORT is not a number") } } else { port = 3000 @@ -47,8 +43,10 @@ func main() { log.Println("Listening on port", port) err = http.ListenAndServe(fmt.Sprintf(":%d", port), router) if err != nil { - log.Fatal(err) + return err } + + return nil } type ServerResouces struct { @@ -100,6 +98,7 @@ func (sr ServerResouces) handleInbox(res http.ResponseWriter, req *http.Request) log.Println("could not begin db transaction") return } + defer tx.Commit() stmt, err := tx.Prepare("SELECT mails.id, mails.arrived_at, mails.rcpt_addr, mails.from_addr, mails.data FROM mails WHERE mails.rcpt_addr = ?") if err != nil { @@ -175,6 +174,7 @@ func (sr ServerResouces) handleMail(res http.ResponseWriter, req *http.Request) log.Println("could not begin db transaction") return } + defer tx.Commit() stmt, err := tx.Prepare("SELECT mails.id, mails.arrived_at, mails.rcpt_addr, mails.from_addr, mails.data FROM mails WHERE mails.rcpt_addr = ? AND mails.id = ?") if err != nil { diff --git a/cmd/web_server/styles.templ b/pkg/web_server/styles.templ similarity index 99% rename from cmd/web_server/styles.templ rename to pkg/web_server/styles.templ index c93e368..05a921a 100644 --- a/cmd/web_server/styles.templ +++ b/pkg/web_server/styles.templ @@ -1,4 +1,4 @@ -package main +package web_server templ styles() {