Web App Testing – POST – Database Model

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.

Sharing is caring:

Leave a Comment