- Add full admin CRUD routes for users, companies, listings, oil-prices protected behind auth middleware (/admin/*) - Add public /stats endpoint returning latest market price aggregates - Add /health and / health check endpoints - Add `url` field to listings (struct, all SQL queries, create/update) - Add `phone` and `url` fields to OilPrice struct - Remove deprecated company CRUD handlers (get_company, create_company) - Update schema.sql; remove one-off alter/drop migration scripts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
93 lines
2.6 KiB
SQL
Executable File
93 lines
2.6 KiB
SQL
Executable File
CREATE TABLE users (
|
|
id SERIAL PRIMARY KEY,
|
|
username VARCHAR(255) UNIQUE NOT NULL,
|
|
password TEXT NOT NULL,
|
|
created TIMESTAMPTZ,
|
|
email VARCHAR(255),
|
|
last_login TIMESTAMPTZ,
|
|
owner INTEGER
|
|
);
|
|
|
|
CREATE TABLE service_categories (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT NOT NULL,
|
|
clicks_total INTEGER DEFAULT 0,
|
|
total_companies INTEGER DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE company (
|
|
id SERIAL PRIMARY KEY,
|
|
active BOOLEAN DEFAULT true,
|
|
created DATE NOT NULL DEFAULT CURRENT_DATE,
|
|
name VARCHAR(255) NOT NULL,
|
|
address VARCHAR(255),
|
|
town VARCHAR(255),
|
|
state VARCHAR(2),
|
|
phone VARCHAR(20),
|
|
owner_name VARCHAR(255),
|
|
owner_phone_number VARCHAR(20),
|
|
email VARCHAR(255),
|
|
user_id INTEGER
|
|
);
|
|
|
|
-- Counties (populated by scripts/add_county_to_db.py)
|
|
CREATE TABLE county (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
state VARCHAR(2) NOT NULL,
|
|
UNIQUE(name, state)
|
|
);
|
|
|
|
CREATE TABLE listings (
|
|
id SERIAL PRIMARY KEY,
|
|
company_name VARCHAR(255) NOT NULL,
|
|
is_active BOOLEAN DEFAULT true,
|
|
price_per_gallon DOUBLE PRECISION NOT NULL,
|
|
price_per_gallon_cash DOUBLE PRECISION,
|
|
note TEXT,
|
|
minimum_order INTEGER,
|
|
service BOOLEAN DEFAULT false,
|
|
bio_percent INTEGER NOT NULL,
|
|
phone VARCHAR(20),
|
|
online_ordering VARCHAR(20) NOT NULL DEFAULT 'none',
|
|
county_id INTEGER NOT NULL,
|
|
town VARCHAR(100),
|
|
url VARCHAR(255),
|
|
user_id INTEGER NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
last_edited TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Oil prices (scraped from NewEnglandOil.com / MaineOil.com)
|
|
CREATE TABLE oil_prices (
|
|
id SERIAL PRIMARY KEY,
|
|
state VARCHAR(100),
|
|
zone INTEGER,
|
|
name VARCHAR(255),
|
|
price DOUBLE PRECISION,
|
|
date VARCHAR(20),
|
|
scrapetimestamp TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
company_id INTEGER,
|
|
county_id INTEGER
|
|
);
|
|
|
|
-- If the table already exists, add county_id
|
|
-- ALTER TABLE oil_prices ADD COLUMN county_id INTEGER;
|
|
|
|
-- If the table already exists, add the new columns
|
|
-- ALTER TABLE listings ADD COLUMN price_per_gallon_cash DOUBLE PRECISION;
|
|
-- ALTER TABLE listings ADD COLUMN note TEXT;
|
|
-- ALTER TABLE listings ADD COLUMN minimum_order INTEGER;
|
|
-- ALTER TABLE listings ADD COLUMN last_edited TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP;
|
|
|
|
-- If the table already exists, drop the company_id column
|
|
-- ALTER TABLE listings DROP COLUMN company_id;
|
|
|
|
CREATE TABLE stats_prices (
|
|
id SERIAL PRIMARY KEY,
|
|
state VARCHAR(2) NOT NULL,
|
|
price DOUBLE PRECISION NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
);
|