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
101 lines
4.5 KiB
SQL
101 lines
4.5 KiB
SQL
-- Plugin Registry System
|
|
-- Enables plugin upload, registry install, and community-level plugin management
|
|
|
|
-- Plugin sources
|
|
CREATE TYPE plugin_source AS ENUM ('builtin', 'upload', 'registry');
|
|
|
|
-- Add source and security fields to plugins table
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS source plugin_source DEFAULT 'builtin';
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS wasm_hash VARCHAR(64); -- SHA256 of WASM binary
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS signature TEXT; -- Plugin signature for verification
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS signed_by VARCHAR(255); -- Signer identity
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS is_verified BOOLEAN DEFAULT FALSE;
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS manifest JSONB; -- Full plugin manifest
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS permissions JSONB DEFAULT '[]'; -- Required permissions
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS author VARCHAR(255);
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS homepage VARCHAR(500);
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS repository VARCHAR(500);
|
|
ALTER TABLE plugins ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT NOW();
|
|
|
|
-- Plugin files storage (for uploaded plugins)
|
|
CREATE TABLE plugin_files (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
plugin_id UUID NOT NULL REFERENCES plugins(id) ON DELETE CASCADE,
|
|
file_type VARCHAR(20) NOT NULL, -- 'wasm', 'manifest', 'icon', 'readme'
|
|
file_name VARCHAR(255) NOT NULL,
|
|
file_size BIGINT NOT NULL,
|
|
content_type VARCHAR(100),
|
|
storage_path VARCHAR(500) NOT NULL,
|
|
uploaded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
uploaded_by UUID REFERENCES users(id)
|
|
);
|
|
|
|
-- Plugin versions (for upgrade management)
|
|
CREATE TABLE plugin_versions (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
plugin_id UUID NOT NULL REFERENCES plugins(id) ON DELETE CASCADE,
|
|
version VARCHAR(20) NOT NULL,
|
|
changelog TEXT,
|
|
wasm_hash VARCHAR(64),
|
|
is_current BOOLEAN NOT NULL DEFAULT FALSE,
|
|
released_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(plugin_id, version)
|
|
);
|
|
|
|
-- Plugin reviews/ratings
|
|
CREATE TABLE plugin_reviews (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
plugin_id UUID NOT NULL REFERENCES plugins(id) ON DELETE CASCADE,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
rating INT NOT NULL CHECK (rating >= 1 AND rating <= 5),
|
|
review TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(plugin_id, user_id)
|
|
);
|
|
|
|
-- Plugin install log
|
|
CREATE TABLE plugin_installs (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
plugin_id UUID NOT NULL REFERENCES plugins(id) ON DELETE CASCADE,
|
|
community_id UUID REFERENCES communities(id) ON DELETE CASCADE,
|
|
installed_by UUID NOT NULL REFERENCES users(id),
|
|
action VARCHAR(20) NOT NULL, -- 'install', 'uninstall', 'update', 'enable', 'disable'
|
|
from_version VARCHAR(20),
|
|
to_version VARCHAR(20),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Plugin capabilities/permissions
|
|
CREATE TABLE plugin_capabilities (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
name VARCHAR(100) NOT NULL UNIQUE,
|
|
description TEXT,
|
|
risk_level VARCHAR(20) NOT NULL DEFAULT 'low', -- 'low', 'medium', 'high'
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Insert default capabilities
|
|
INSERT INTO plugin_capabilities (name, description, risk_level) VALUES
|
|
('http_outbound', 'Make HTTP requests to external services', 'high'),
|
|
('database_read', 'Read data from the database', 'medium'),
|
|
('database_write', 'Write data to the database', 'high'),
|
|
('user_data', 'Access user profile data', 'medium'),
|
|
('notifications', 'Send notifications to users', 'low'),
|
|
('hooks_register', 'Register hooks for actions/filters', 'low'),
|
|
('background_jobs', 'Schedule background tasks', 'medium'),
|
|
('file_storage', 'Store and retrieve files', 'medium')
|
|
ON CONFLICT (name) DO NOTHING;
|
|
|
|
-- Indexes
|
|
CREATE INDEX idx_plugin_files_plugin ON plugin_files(plugin_id);
|
|
CREATE INDEX idx_plugin_versions_plugin ON plugin_versions(plugin_id);
|
|
CREATE INDEX idx_plugin_reviews_plugin ON plugin_reviews(plugin_id);
|
|
CREATE INDEX idx_plugin_installs_plugin ON plugin_installs(plugin_id);
|
|
CREATE INDEX idx_plugin_installs_community ON plugin_installs(community_id);
|
|
CREATE INDEX idx_plugins_source ON plugins(source);
|
|
CREATE INDEX idx_plugins_verified ON plugins(is_verified);
|
|
|
|
-- Triggers
|
|
CREATE TRIGGER plugin_reviews_updated_at BEFORE UPDATE ON plugin_reviews
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|