mirror of
https://github.com/pezkuwichain/pezkuwi-telegram-miniapp.git
synced 2026-07-19 23:35:41 +00:00
Initial commit - PezkuwiChain Telegram MiniApp
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
import { createClient } from '@supabase/supabase-js';
|
||||
|
||||
const supabaseUrl = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
|
||||
const supabaseKey = process.env.SUPABASE_SERVICE_KEY;
|
||||
|
||||
if (!supabaseUrl || !supabaseKey) {
|
||||
console.error('Missing: SUPABASE_URL and SUPABASE_SERVICE_KEY required');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const supabase = createClient(supabaseUrl, supabaseKey);
|
||||
|
||||
async function createForumTables() {
|
||||
console.log('Creating forum tables in DKSapp Supabase...\n');
|
||||
|
||||
// Create tables using raw SQL via Supabase's pg_catalog or rpc
|
||||
// Since we can't run raw SQL directly, let's check if tables exist and create data
|
||||
|
||||
// First, let's try to query the tables to see if they exist
|
||||
console.log('Checking existing tables...');
|
||||
|
||||
const { data: categories, error: catError } = await supabase
|
||||
.from('forum_categories')
|
||||
.select('*')
|
||||
.limit(1);
|
||||
|
||||
if (catError && catError.message.includes('does not exist')) {
|
||||
console.log('\n❌ Forum tables do not exist in this Supabase project.');
|
||||
console.log('\nYou need to create them in Supabase SQL Editor:');
|
||||
console.log('Go to your Supabase dashboard SQL editor\n');
|
||||
console.log('Run this SQL:\n');
|
||||
console.log(`
|
||||
-- Forum Categories Table
|
||||
CREATE TABLE IF NOT EXISTS forum_categories (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
icon TEXT DEFAULT '💬',
|
||||
color TEXT DEFAULT '#3B82F6',
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
display_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Forum Discussions Table
|
||||
CREATE TABLE IF NOT EXISTS forum_discussions (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
category_id UUID REFERENCES forum_categories(id),
|
||||
proposal_id TEXT,
|
||||
title TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
image_url TEXT,
|
||||
author_id TEXT NOT NULL,
|
||||
author_name TEXT NOT NULL,
|
||||
author_address TEXT,
|
||||
is_pinned BOOLEAN DEFAULT false,
|
||||
is_locked BOOLEAN DEFAULT false,
|
||||
views_count INTEGER DEFAULT 0,
|
||||
replies_count INTEGER DEFAULT 0,
|
||||
tags TEXT[] DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
last_activity_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Forum Replies Table
|
||||
CREATE TABLE IF NOT EXISTS forum_replies (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
discussion_id UUID REFERENCES forum_discussions(id) ON DELETE CASCADE,
|
||||
parent_reply_id UUID REFERENCES forum_replies(id),
|
||||
content TEXT NOT NULL,
|
||||
author_id TEXT NOT NULL,
|
||||
author_name TEXT NOT NULL,
|
||||
author_address TEXT,
|
||||
is_edited BOOLEAN DEFAULT false,
|
||||
edited_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Forum Reactions Table
|
||||
CREATE TABLE IF NOT EXISTS forum_reactions (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
discussion_id UUID REFERENCES forum_discussions(id) ON DELETE CASCADE,
|
||||
reply_id UUID REFERENCES forum_replies(id) ON DELETE CASCADE,
|
||||
user_id TEXT NOT NULL,
|
||||
reaction_type TEXT NOT NULL CHECK (reaction_type IN ('upvote', 'downvote')),
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
UNIQUE(discussion_id, user_id),
|
||||
UNIQUE(reply_id, user_id)
|
||||
);
|
||||
|
||||
-- Admin Announcements Table
|
||||
CREATE TABLE IF NOT EXISTS admin_announcements (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
title TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
type TEXT DEFAULT 'info' CHECK (type IN ('info', 'warning', 'success', 'critical')),
|
||||
priority INTEGER DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
expires_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Enable RLS
|
||||
ALTER TABLE forum_categories ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE forum_discussions ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE forum_replies ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE forum_reactions ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE admin_announcements ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- RLS Policies (allow all for now - can be restricted later)
|
||||
CREATE POLICY "Allow all on forum_categories" ON forum_categories FOR ALL USING (true) WITH CHECK (true);
|
||||
CREATE POLICY "Allow all on forum_discussions" ON forum_discussions FOR ALL USING (true) WITH CHECK (true);
|
||||
CREATE POLICY "Allow all on forum_replies" ON forum_replies FOR ALL USING (true) WITH CHECK (true);
|
||||
CREATE POLICY "Allow all on forum_reactions" ON forum_reactions FOR ALL USING (true) WITH CHECK (true);
|
||||
CREATE POLICY "Allow all on admin_announcements" ON admin_announcements FOR ALL USING (true) WITH CHECK (true);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_discussions_category ON forum_discussions(category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_discussions_pinned ON forum_discussions(is_pinned);
|
||||
CREATE INDEX IF NOT EXISTS idx_discussions_activity ON forum_discussions(last_activity_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_replies_discussion ON forum_replies(discussion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_reactions_discussion ON forum_reactions(discussion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_reactions_reply ON forum_reactions(reply_id);
|
||||
`);
|
||||
return false;
|
||||
} else if (catError) {
|
||||
console.error('Error checking tables:', catError.message);
|
||||
return false;
|
||||
} else {
|
||||
console.log('✅ Forum tables exist!');
|
||||
console.log(' Categories found:', categories?.length || 0);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
createForumTables().then(exists => {
|
||||
if (exists) {
|
||||
console.log('\nTables ready. Now run seed-admin-post.mjs');
|
||||
}
|
||||
}).catch(console.error);
|
||||
Reference in New Issue
Block a user