mirror of
https://codeberg.org/likwid/likwid.git
synced 2026-02-09 21:13:09 +00:00
- Backend: Rust/Axum with PostgreSQL, plugin architecture - Frontend: Astro with polished UI - Voting methods: Approval, Ranked Choice, Schulze, STAR, Quadratic - Features: Liquid delegation, transparent moderation, structured deliberation - Documentation: User and admin guides in /docs - Deployment: Docker/Podman compose files for production and demo - Demo: Seeded data with 3 communities, 13 users, 7 proposals License: AGPLv3
116 lines
4.4 KiB
PL/PgSQL
116 lines
4.4 KiB
PL/PgSQL
-- Instance-level settings for platform configuration
|
|
-- Determines how the platform operates globally
|
|
|
|
CREATE TABLE IF NOT EXISTS instance_settings (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
|
|
-- Setup status
|
|
setup_completed BOOLEAN NOT NULL DEFAULT FALSE,
|
|
setup_completed_at TIMESTAMPTZ,
|
|
setup_completed_by UUID REFERENCES users(id),
|
|
|
|
-- Instance identity
|
|
instance_name VARCHAR(100) NOT NULL DEFAULT 'Likwid',
|
|
instance_description TEXT,
|
|
instance_logo_url TEXT,
|
|
|
|
-- Platform mode: 'open', 'approval', 'admin_only', 'single_community'
|
|
-- open: Any user can create communities
|
|
-- approval: Users can request to create communities, admin approves
|
|
-- admin_only: Only admins can create communities
|
|
-- single_community: Platform is dedicated to one community (no creation UI)
|
|
platform_mode VARCHAR(20) NOT NULL DEFAULT 'open',
|
|
|
|
-- Single community mode settings
|
|
single_community_id UUID REFERENCES communities(id),
|
|
|
|
-- Registration settings
|
|
registration_enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
registration_mode VARCHAR(20) NOT NULL DEFAULT 'open', -- 'open', 'invite_only', 'approval'
|
|
require_email_verification BOOLEAN NOT NULL DEFAULT TRUE,
|
|
|
|
-- Community creation settings (when platform_mode allows)
|
|
default_community_visibility VARCHAR(20) NOT NULL DEFAULT 'public', -- 'public', 'private'
|
|
allow_private_communities BOOLEAN NOT NULL DEFAULT TRUE,
|
|
max_communities_per_user INT, -- NULL = unlimited
|
|
|
|
-- Plugin policy defaults
|
|
default_plugin_policy VARCHAR(20) NOT NULL DEFAULT 'curated', -- 'open', 'curated', 'admin_only'
|
|
allow_unsigned_plugins BOOLEAN NOT NULL DEFAULT FALSE,
|
|
|
|
-- Moderation defaults
|
|
default_moderation_mode VARCHAR(20) NOT NULL DEFAULT 'standard', -- 'minimal', 'standard', 'strict'
|
|
|
|
-- Metadata
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Ensure only one row exists
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_instance_settings_singleton ON instance_settings ((TRUE));
|
|
|
|
-- Community-specific settings that override instance defaults
|
|
CREATE TABLE IF NOT EXISTS community_settings (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
community_id UUID NOT NULL UNIQUE REFERENCES communities(id) ON DELETE CASCADE,
|
|
|
|
-- Membership
|
|
membership_mode VARCHAR(20) NOT NULL DEFAULT 'open', -- 'open', 'approval', 'invite_only'
|
|
allow_member_invites BOOLEAN NOT NULL DEFAULT TRUE,
|
|
max_members INT, -- NULL = unlimited
|
|
|
|
-- Content & Moderation
|
|
moderation_mode VARCHAR(20) NOT NULL DEFAULT 'standard', -- 'minimal', 'standard', 'strict', 'custom'
|
|
require_post_approval BOOLEAN NOT NULL DEFAULT FALSE,
|
|
allow_anonymous_viewing BOOLEAN NOT NULL DEFAULT TRUE,
|
|
|
|
-- Governance
|
|
governance_model VARCHAR(20) NOT NULL DEFAULT 'standard', -- 'standard', 'democratic', 'delegated', 'custom'
|
|
voting_threshold_percent INT NOT NULL DEFAULT 50,
|
|
proposal_duration_days INT NOT NULL DEFAULT 7,
|
|
quorum_percent INT, -- NULL = no quorum required
|
|
|
|
-- Plugins
|
|
plugin_policy VARCHAR(20) NOT NULL DEFAULT 'inherit', -- 'inherit', 'open', 'curated', 'admin_only', 'disabled'
|
|
allowed_plugin_ids UUID[], -- If curated, list of allowed plugin package IDs
|
|
|
|
-- Features toggles
|
|
features_enabled JSONB NOT NULL DEFAULT '{
|
|
"proposals": true,
|
|
"voting": true,
|
|
"comments": true,
|
|
"notifications": true,
|
|
"plugins": true
|
|
}'::jsonb,
|
|
|
|
-- Custom rules (JSON schema for flexibility)
|
|
custom_rules JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
|
|
-- Metadata
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_community_settings_community ON community_settings(community_id);
|
|
|
|
-- Insert default instance settings row
|
|
INSERT INTO instance_settings (id)
|
|
VALUES (uuid_generate_v4())
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Trigger to update updated_at
|
|
CREATE OR REPLACE FUNCTION update_settings_timestamp()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER instance_settings_updated
|
|
BEFORE UPDATE ON instance_settings
|
|
FOR EACH ROW EXECUTE FUNCTION update_settings_timestamp();
|
|
|
|
CREATE TRIGGER community_settings_updated
|
|
BEFORE UPDATE ON community_settings
|
|
FOR EACH ROW EXECUTE FUNCTION update_settings_timestamp();
|