diff --git a/contact.go b/contact.go index 6bccded..164fd86 100644 --- a/contact.go +++ b/contact.go @@ -9,6 +9,7 @@ import ( "os" "time" + "github.com/CyCoreSystems/cycore-web/db" "github.com/CyCoreSystems/sendinblue" "github.com/labstack/echo" ) @@ -37,6 +38,9 @@ func contactRequest(c echo.Context) (err error) { } cc.Log.Debugf(`received contact request from "%s" <%s> (%s)`, req.Name, req.Email, c.RealIP()) + if err = db.LogContact(req.Name, req.Email); err != nil { + cc.Log.Warn("failed to write contact record to database") + } if req.Name == "" { cc.Log.Warn("empty name") diff --git a/db/db.go b/db/db.go index 09af4b2..d21d80e 100644 --- a/db/db.go +++ b/db/db.go @@ -32,14 +32,29 @@ func Connect() error { } db, err = sqlx.Open("postgres", dsn) + if err != nil { + return err + } - return err + return db.Ping() +} + +func ensureDatabase() { + if err := Connect(); err != nil { + panic("no database connection: " + err.Error()) + } } // Get returns a database connection handle for the database func Get() *sqlx.DB { - if err := Connect(); err != nil { - panic("no database connection: " + err.Error()) - } + ensureDatabase() return db } + +// LogContact adds a log entry to the database recording a contact request +func LogContact(name, email string) error { + ensureDatabase() + + _, err := db.Exec(`INSERT INTO contact_requests (name,email) VALUES ($1, $2)`, name, email) + return err +} diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..46935f5 --- /dev/null +++ b/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE contact_requests ( + id UUID PRIMARY KEY NOT NULL DEFAULT uuid_v4()::UUID, + name STRING(128) NOT NULL, + email STRING(128) NOT NULL, + received TIMESTAMPTZ DEFAULT now() NOT NULL +); +