From 236e6ad8c438d39d4bbb45ab8521da1f878b6b3f Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 1 Dec 2024 13:05:16 -0800 Subject: [PATCH] Save link history --- main.go | 63 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/main.go b/main.go index b2defd7..8cb117e 100644 --- a/main.go +++ b/main.go @@ -119,14 +119,9 @@ func (sl *ShortLinks) serveSet(w http.ResponseWriter, r *http.Request) { return } - _, err = sl.db.Exec(` -INSERT INTO links (short, long) -VALUES ($1, $2) -ON CONFLICT (short) -DO UPDATE SET long = $2; - `, short, long) + _, err = sl.db.Exec(`SELECT update_link($1, $2);`, short, long) if err != nil { - sendError(w, http.StatusInternalServerError, "upsert: %s", err) + sendError(w, http.StatusInternalServerError, "update_link: %s", err) return } @@ -212,13 +207,53 @@ func main() { log.Fatal(err) } - _, err = db.Exec(` -CREATE TABLE IF NOT EXISTS links ( - short VARCHAR(100) PRIMARY KEY, - long TEXT NOT NULL -);`) - if err != nil { - log.Fatalf("Failed to create table: %v", err) + stmts := []string{ + ` + CREATE TABLE IF NOT EXISTS links ( + short VARCHAR(100) PRIMARY KEY, + long TEXT NOT NULL + ); + `, + + ` + CREATE TABLE IF NOT EXISTS links_history ( + short VARCHAR(100), + long TEXT NOT NULL, + until TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP + ); + `, + + ` + CREATE OR REPLACE FUNCTION update_link( + _short VARCHAR(100), + _long TEXT + ) RETURNS void AS $$ + DECLARE + old RECORD; + BEGIN + SELECT * INTO old FROM links WHERE short = _short; + + IF old IS NOT NULL THEN + INSERT INTO links_history (short, long) + VALUES (old.short, old.long); + + UPDATE links + SET long = _long + WHERE short = _short; + ELSE + INSERT INTO links (short, long) + VALUES (_short, _long); + END IF; + END; + $$ LANGUAGE plpgsql; + `, + } + + for _, stmt := range stmts { + _, err := db.Exec(stmt) + if err != nil { + log.Fatalf("Failed to create tables & functions: %v", err) + } } sl, err := NewShortLinks(db)