Initial Database Schema

This commit is contained in:
2026-06-02 19:18:02 +02:00
parent 53f02b6f2a
commit 6ab31c2c1b
9 changed files with 358 additions and 0 deletions

12
sql/queries/click_log.sql Normal file
View File

@@ -0,0 +1,12 @@
-- name: TrackClick :one
INSERT INTO click_logs (url_id, referrer, user_agent, ip_address)
VALUES (
$1,
$2,
$3,
$4
)
RETURNING *;
-- name: GetClicks :many
SELECT * FROM click_logs;

22
sql/queries/urls.sql Normal file
View File

@@ -0,0 +1,22 @@
-- name: CreateURL :one
INSERT INTO urls (created_at, expires_at, long_url, short_code, is_active)
VALUES (
$1,
$2,
$3,
$4,
$5
)
RETURNING *;
-- name: GetURLs :many
SELECT * FROM urls;
-- name: GetURLByShortCode :one
SELECT url_id, long_url FROM urls WHERE is_active = true AND short_code = $1;
-- name: SetActive :one
UPDATE urls SET is_active = $1 WHERE url_id = $2 RETURNING *;
-- name: DeleteURL :one
DELETE FROM urls WHERE url_id = $1 RETURNING *;

View File

@@ -0,0 +1,16 @@
-- +goose Up
CREATE TABLE urls (
url_id SERIAL PRIMARY KEY,
long_url TEXT NOT NULL,
short_code VARCHAR(10) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
expires_at TIMESTAMP WITH TIME ZONE,
is_active BOOLEAN DEFAULT TRUE NOT NULL
);
-- Crucial index for lightning-fast lookups when redirecting
CREATE INDEX idx_urls_short_code ON urls(short_code);
-- +goose Down
DROP INDEX idx_urls_short_code;
DROP TABLE urls;

View File

@@ -0,0 +1,16 @@
-- +goose Up
CREATE TABLE click_logs (
click_id BIGSERIAL PRIMARY KEY,
url_id INT NOT NULL REFERENCES urls(url_id) ON DELETE CASCADE,
clicked_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
referrer VARCHAR(255),
user_agent TEXT,
ip_address VARCHAR(45) -- Accommodates both IPv4 and IPv6
);
-- Index to optimize analytics queries for a specific link
CREATE INDEX idx_click_logs_url_id ON click_logs(url_id);
-- +goose Down
DROP INDEX idx_click_logs_url_id;
DROP TABLE click_logs;