Selanjutnya Kita perlu membuat kode yang berisi model untuk database. Untuk kemudahan tutorial, package sudah disediakan, silakan download di https://drive.google.com/file/d/1-GptKAPNrYBkTnk7ACiECErn-B5LQnSM/view?usp=sharing
Kemudian ekstrak di app root direktori. File tersebut akan berisi model dan method untuk melakukan CRUD operation.
Silakan Anda telusuri kode yang dibuat, didalamnya terdapat fungsi untuk menarik data user, menambahkan user, menghapus user serta model dari table users.
Setelah package ditambahkan, kita perlu melakukan sedikit modifikasi pada file cmd/web/main.go agar terhubung dengan Package database model dengan mengubah struct dan connection.
Buka file cmd/web/main.go, lalu ubah seperti berikut:
package main
import (
"flag"
"log"
"net/http"
"webapp/pkg/db"
"github.com/alexedwards/scs/v2"
)
type application struct {
DSN string
DB db.PostgresConn //ubah struc menggunakan pacakge db
Session *scs.SessionManager
}
func main() {
//setup app config
app := application{}
//database connection string
flag.StringVar(&app.DSN, "dsn", "host=localhost port=5432 user=postgres password=postgres dbname=users sslmode=disable timezone=UTC connect_timeout=5", "Postgres Connection")
flag.Parse()
//connection to database
conn, err := app.connectToDB()
if err != nil {
log.Fatal(err)
}
app.DB = db.PostgresConn{DB: conn} //ubah menggunakan package db
//get session manager
app.Session = getSession()
//start server
log.Println("Starting server on port 8080...")
err = http.ListenAndServe(":8080", app.routes())
if err != nil {
log.Fatal(err)
}
}
Untuk melakukan testing, buka file cmd/web/handlers.go, lalu modifikasi fungsi login seperti dibawah:
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"path"
"time"
)
var templatePath = "./templates/"
func (app *application) Home(w http.ResponseWriter, r *http.Request) {
var td = make(map[string]any)
if app.Session.Exists(r.Context(), "test") {
msg := app.Session.GetString(r.Context(), "test")
td["test"] = msg
} else {
app.Session.Put(r.Context(), "test", "Page visit at "+time.Now().UTC().String())
}
_ = app.render(w, r, "home.page.gohtml", &TemplateData{Data: td})
}
type TemplateData struct {
IP string
Data map[string]any
}
func (app *application) render(w http.ResponseWriter, r *http.Request, t string, data *TemplateData) error {
//parse template
parsedTemplate, err := template.ParseFiles(path.Join(templatePath, t), path.Join(templatePath, "base.layout.gohtml"))
if err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return err
}
//gunakan middleware yang telah kita buat.
data.IP = app.ipFromContext(r.Context())
//execute template
err = parsedTemplate.Execute(w, data)
if err != nil {
return err
}
return nil
}
func (app *application) Login(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Println(err)
http.Error(w, "bad request", http.StatusBadRequest)
return
}
//validation goes here
form := NewForm(r.PostForm)
form.Required("email", "password")
if !form.Valid() {
fmt.Fprint(w, "Invalid form")
return
}
email := r.Form.Get("email")
password := r.Form.Get("password")
user, err := app.DB.GetUserByEmail(email)
if err != nil {
log.Println(err)
}
log.Println("From Database: ", user.FirstName, user.LastName)
log.Println(email, password)
fmt.Fprint(w, email)
}
Jalankan aplikasi dengan perintah:
$ go run ./cmd/web
2022/10/24 18:51:47 Connected to Postgres!
2022/10/24 18:51:47 Starting server on port 8080...
Kemudian buka web browser, lalu masukan alamat localhost:8080. Pada form login masukan email: admin@example.com dan password: secret.
Dapat dilihat pada console log nama user ditampilkan.
2022/10/24 18:52:26 From Database: Admin User
2022/10/24 18:52:26 admin@example.com secret
Sampai disini kita sudah berhasil menambahkan model databse dan menghubungkannya.
Pada modul selanjutnya kita akan melakukan authentication.