From 276338b05aa52eec8e1c006995c2cfc2c5738d52 Mon Sep 17 00:00:00 2001 From: Amudieshwar A G Date: Tue, 21 Jul 2026 12:22:38 +0530 Subject: [PATCH] feat: database scaffolding, docker-compose and schema DDL --- docker-compose.yml | 35 ++++++++++++ schema.sql | 140 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 docker-compose.yml create mode 100644 schema.sql diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c23613f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,35 @@ +version: '3.8' + +services: + postgres: + image: ankane/pgvector:latest + container_name: rit-postgres + environment: + POSTGRES_USER: rit_admin + POSTGRES_PASSWORD: rit_password + POSTGRES_DB: rit_freshers_hub + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + restart: unless-stopped + + minio: + image: minio/minio:latest + container_name: rit-minio + environment: + MINIO_ROOT_USER: minio_admin + MINIO_ROOT_PASSWORD: minio_password + ports: + - "9000:9000" + - "9001:9001" + volumes: + - miniodata:/data + command: server /data --console-address ":9001" + restart: unless-stopped + +volumes: + pgdata: + driver: local + miniodata: + driver: local diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..ab05cdb --- /dev/null +++ b/schema.sql @@ -0,0 +1,140 @@ +-- ─── DATABASE INITIALIZATION SCHEMA FOR RIT FRESHERS HUB ─── +-- Stack: PostgreSQL 16 + pgvector + +-- Enable the pgvector extension for AI semantic search capabilities +CREATE EXTENSION IF NOT EXISTS vector; + +-- 1. Notes & PYQs Module Table +CREATE TABLE IF NOT EXISTS notes_pyqs ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + subject VARCHAR(250) NOT NULL, + department VARCHAR(250) NOT NULL, + semester INT NOT NULL CHECK (semester BETWEEN 1 AND 8), + file_type VARCHAR(50) NOT NULL, -- 'notes', 'pyq', 'syllabus', 'assignment' + download_url TEXT NOT NULL, + file_size VARCHAR(50) NOT NULL, + downloads_count INT DEFAULT 0, + uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 2. AI Assistant Chat History Table (RAG System) +CREATE TABLE IF NOT EXISTS ai_chat_messages ( + id SERIAL PRIMARY KEY, + conversation_id VARCHAR(100) NOT NULL, + sender_role VARCHAR(20) NOT NULL CHECK (sender_role IN ('user', 'assistant')), + content TEXT NOT NULL, + embedding vector(1536), -- Vector representation of message for semantic search (e.g. OpenAI/Gemini embeddings) + timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 3. Campus Map Module Table +CREATE TABLE IF NOT EXISTS campus_locations ( + id SERIAL PRIMARY KEY, + location_key VARCHAR(100) UNIQUE NOT NULL, -- e.g., 'library', 'cse_block' + name VARCHAR(255) NOT NULL, + description TEXT, + coordinates_x VARCHAR(50), -- Map coordinates + coordinates_y VARCHAR(50), + block_info VARCHAR(150), + amenities TEXT[] -- List of amenities +); + +-- 4. Bus Routes Module Tables +CREATE TABLE IF NOT EXISTS bus_routes ( + id SERIAL PRIMARY KEY, + route_number VARCHAR(50) UNIQUE NOT NULL, -- e.g., 'RIT-01' + route_name VARCHAR(255) NOT NULL, + start_point VARCHAR(150) NOT NULL, + end_point VARCHAR(150) NOT NULL, + departure_time VARCHAR(50) NOT NULL, + arrival_time VARCHAR(50) NOT NULL, + color_code VARCHAR(7) DEFAULT '#F97316' +); + +CREATE TABLE IF NOT EXISTS bus_stops ( + id SERIAL PRIMARY KEY, + route_id INT REFERENCES bus_routes(id) ON DELETE CASCADE, + stop_name VARCHAR(150) NOT NULL, + arrival_time VARCHAR(50) NOT NULL, + stop_order INT NOT NULL +); + +-- 5. Faculty Directory Module Table +CREATE TABLE IF NOT EXISTS faculty ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + designation VARCHAR(255) NOT NULL, + department VARCHAR(255) NOT NULL, + email VARCHAR(255) UNIQUE NOT NULL, + office_location VARCHAR(255), + specialization VARCHAR(255), + phone VARCHAR(50), + avatar_url TEXT +); + +-- 6. Freshers Q&A Module Tables +CREATE TABLE IF NOT EXISTS community_questions ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + body TEXT NOT NULL, + author VARCHAR(150) NOT NULL, + upvotes INT DEFAULT 0, + tags TEXT[], + is_answered BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS community_answers ( + id SERIAL PRIMARY KEY, + question_id INT REFERENCES community_questions(id) ON DELETE CASCADE, + body TEXT NOT NULL, + author VARCHAR(150) NOT NULL, + upvotes INT DEFAULT 0, + is_accepted BOOLEAN DEFAULT FALSE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 7. Clubs & Events Module Tables +CREATE TABLE IF NOT EXISTS clubs ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) UNIQUE NOT NULL, + description TEXT, + category VARCHAR(100), -- 'Technical', 'Cultural', 'Social', etc. + members_count INT DEFAULT 0, + contact_email VARCHAR(255) +); + +CREATE TABLE IF NOT EXISTS events ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description TEXT, + event_date DATE NOT NULL, + event_time VARCHAR(50) NOT NULL, + venue VARCHAR(255) NOT NULL, + organizer VARCHAR(255) NOT NULL, + category VARCHAR(100), -- 'technical', 'cultural', 'seminar', etc. + registration_url TEXT, + is_upcoming BOOLEAN DEFAULT TRUE, + club_id INT REFERENCES clubs(id) ON DELETE SET NULL +); + +-- 8. Student Toolkit Table +CREATE TABLE IF NOT EXISTS toolkit_items ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description TEXT, + resource_type VARCHAR(50) NOT NULL, -- 'pdf', 'link', 'form' + download_url TEXT NOT NULL, + category VARCHAR(100) NOT NULL, -- 'Academic', 'Administrative', etc. + icon_name VARCHAR(100) +); + +-- 9. Anonymous Confessions Table +CREATE TABLE IF NOT EXISTS confessions ( + id SERIAL PRIMARY KEY, + content TEXT NOT NULL, + category VARCHAR(100) DEFAULT 'General', -- 'Funny', 'Crush', 'Wholesome' + reactions_count INT DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +);