Save link history
This commit is contained in:
55
main.go
55
main.go
@@ -119,14 +119,9 @@ func (sl *ShortLinks) serveSet(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = sl.db.Exec(`
|
_, err = sl.db.Exec(`SELECT update_link($1, $2);`, short, long)
|
||||||
INSERT INTO links (short, long)
|
|
||||||
VALUES ($1, $2)
|
|
||||||
ON CONFLICT (short)
|
|
||||||
DO UPDATE SET long = $2;
|
|
||||||
`, short, long)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendError(w, http.StatusInternalServerError, "upsert: %s", err)
|
sendError(w, http.StatusInternalServerError, "update_link: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,13 +207,53 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = db.Exec(`
|
stmts := []string{
|
||||||
|
`
|
||||||
CREATE TABLE IF NOT EXISTS links (
|
CREATE TABLE IF NOT EXISTS links (
|
||||||
short VARCHAR(100) PRIMARY KEY,
|
short VARCHAR(100) PRIMARY KEY,
|
||||||
long TEXT NOT NULL
|
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 {
|
if err != nil {
|
||||||
log.Fatalf("Failed to create table: %v", err)
|
log.Fatalf("Failed to create tables & functions: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sl, err := NewShortLinks(db)
|
sl, err := NewShortLinks(db)
|
||||||
|
|||||||
Reference in New Issue
Block a user