started working on database design

This commit is contained in:
Valentijn van der Jagt
2026-03-08 21:10:10 +01:00
parent b938be9745
commit 8005bd6993
4 changed files with 136 additions and 14 deletions

112
main.go
View File

@@ -1,24 +1,110 @@
package main
// https://stackoverflow.com/questions/61080317/go-lang-very-simple-http-post-requests-and-response-endpoint (simple post endpoint)
// https://stackoverflow.com/questions/16466320/is-there-a-way-to-do-repetitive-tasks-at-intervals
import (
"log"
"net/http"
/*
Author: Valentijn van der Jagt
_ "github.com/mattn/go-sqlite3"
In this project i play around with go. This is my first time writing go, and im using a lot of help from sources. all useful sources are listed in the comments below.
*/
// https://stackoverflow.com/questions/61080317/go-lang-very-simple-http-post-requests-and-response-endpoint, HTTP Server example
// https://stackoverflow.com/questions/16466320/is-there-a-way-to-do-repetitive-tasks-at-intervals, How timer intervals work in GoLang
// https://pkg.go.dev/modernc.org/sqlite#section-documentation, how to interface with specifically sqlite in GoLang
// https://github.com/mattn/go-sqlite3/blob/v1.14.34/_example/simple/simple.go, How to inferface with a database in GoLang.
import (
"database/sql"
"log"
_ "modernc.org/sqlite"
)
func checkRequestHeader(req *http.Request, res http.ResponseWriter, method string) bool {
if req.Method == method {
return true
func executeQuery(db *sql.DB, query string) {
_, err := db.Exec(query)
if err != nil {
log.Printf("%q: %s\n", err, query)
return
}
res.WriteHeader(http.StatusMethodNotAllowed)
return false
}
func createTables(db *sql.DB) {
executeQuery(db, `
CREATE TABLE shipments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tracking_number TEXT NOT NULL UNIQUE,
service TEXT NOT NULL,
sender_name TEXT,
receiver_name TEXT,
origin_country TEXT,
origin_city TEXT,
origin_postal TEXT,
origin_address TEXT,
destination_country TEXT,
destination_city TEXT,
destination_postal TEXT,
destination_address TEXT,
pickup_date TEXT,
estimated_delivery_from TEXT,
estimated_delivery_to TEXT,
current_status TEXT,
last_update TEXT DEFAULT (datetime('now')),
created_at TEXT DEFAULT (datetime('now'))
);
-- Status Events: history of status updates
CREATE TABLE shipment_events (
id INTEGER PRIMARY KEY,
shipment_id INTEGER NOT NULL,
event_time TEXT NOT NULL,
status_code TEXT NOT NULL,
status_desc TEXT,
description TEXT,
remark TEXT,
next_steps TEXT,
location_country TEXT,
location_city TEXT,
location_postal TEXT,
FOREIGN KEY (shipment_id) REFERENCES shipments(id)
);
CREATE INDEX idx_events_shipment_time ON shipment_events(shipment_id, event_time);
CREATE TABLE shipment_updates (
id INTEGER PRIMARY KEY,
shipment_id INTEGER NOT NULL,
update_time TEXT DEFAULT (datetime('now')),
service TEXT,
location_country TEXT,
location_city TEXT,
status_code TEXT,
status_desc TEXT,
estimated_from TEXT,
estimated_to TEXT,
FOREIGN KEY (shipment_id) REFERENCES shipments(id)
);
CREATE INDEX idx_updates_shipment_time ON shipment_updates(shipment_id, update_time);
`)
log.Printf("[Database] tables created")
}
func dropTables(db *sql.DB) {
executeQuery(db, `
DROP TABLE IF EXISTS shipments;
DROP TABLE IF EXISTS shipment_events;
DROP TABLE IF EXISTS shipment_updates;
`)
log.Printf("[Database] tables dropped")
}
func main() {
db, err := sql.Open("sqlite", "./dhl.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
log.Println("[Main] now serving 0.0.0.0:8090")
http.ListenAndServe(":8090", nil)
dropTables(db) // temporarely for debugging
createTables(db)
}