debian-forge-composer/internal/community/community_manager.go
robojerk 4eeaa43c39
Some checks failed
Tests / 🛃 Unit tests (push) Failing after 13s
Tests / 🗄 DB tests (push) Failing after 19s
Tests / 🐍 Lint python scripts (push) Failing after 1s
Tests / ⌨ Golang Lint (push) Failing after 1s
Tests / 📦 Packit config lint (push) Failing after 1s
Tests / 🔍 Check source preparation (push) Failing after 1s
Tests / 🔍 Check for valid snapshot urls (push) Failing after 1s
Tests / 🔍 Check for missing or unused runner repos (push) Failing after 1s
Tests / 🐚 Shellcheck (push) Failing after 1s
Tests / 📦 RPMlint (push) Failing after 1s
Tests / Gitlab CI trigger helper (push) Failing after 1s
Tests / 🎀 kube-linter (push) Failing after 1s
Tests / 🧹 cloud-cleaner-is-enabled (push) Successful in 3s
Tests / 🔍 Check spec file osbuild/images dependencies (push) Failing after 1s
did stuff
2025-08-26 10:34:42 -07:00

827 lines
26 KiB
Go

package community
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
"time"
"github.com/sirupsen/logrus"
)
// CommunityManager handles community features and ecosystem integration
type CommunityManager struct {
logger *logrus.Logger
config *CommunityConfig
users *UserCommunity
contributors *ContributorTools
ecosystem *EcosystemIntegration
mu sync.RWMutex
}
// CommunityConfig holds community configuration
type CommunityConfig struct {
Enabled bool `json:"enabled"`
CommunityPath string `json:"community_path"`
ForumEnabled bool `json:"forum_enabled"`
BlueprintSharing bool `json:"blueprint_sharing"`
FeedbackEnabled bool `json:"feedback_enabled"`
ContributorTools bool `json:"contributor_tools"`
Metadata map[string]string `json:"metadata"`
}
// UserCommunity manages user community features
type UserCommunity struct {
config *UserCommunityConfig
forums map[string]Forum
blueprints map[string]Blueprint
feedback map[string]Feedback
logger *logrus.Logger
}
// UserCommunityConfig holds user community configuration
type UserCommunityConfig struct {
Enabled bool `json:"enabled"`
ForumEnabled bool `json:"forum_enabled"`
BlueprintSharing bool `json:"blueprint_sharing"`
FeedbackEnabled bool `json:"feedback_enabled"`
ModerationEnabled bool `json:"moderation_enabled"`
Metadata map[string]string `json:"metadata"`
}
// Forum represents a community forum
type Forum struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Category string `json:"category"`
Topics []ForumTopic `json:"topics"`
Moderators []string `json:"moderators"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// ForumTopic represents a forum topic
type ForumTopic struct {
ID string `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Author string `json:"author"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Replies []ForumReply `json:"replies"`
Tags []string `json:"tags"`
Status string `json:"status"`
Metadata map[string]interface{} `json:"metadata"`
}
// ForumReply represents a forum reply
type ForumReply struct {
ID string `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
ParentID string `json:"parent_id"`
Status string `json:"status"`
Metadata map[string]interface{} `json:"metadata"`
}
// Blueprint represents a community blueprint
type Blueprint struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Author string `json:"author"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Version string `json:"version"`
Content string `json:"content"`
Tags []string `json:"tags"`
Rating float64 `json:"rating"`
Downloads int `json:"downloads"`
Status string `json:"status"`
Metadata map[string]interface{} `json:"metadata"`
}
// Feedback represents user feedback
type Feedback struct {
ID string `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Content string `json:"content"`
Author string `json:"author"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Priority string `json:"priority"`
Status string `json:"status"`
Category string `json:"category"`
Metadata map[string]interface{} `json:"metadata"`
}
// ContributorTools manages contributor tools and workflows
type ContributorTools struct {
config *ContributorConfig
environments map[string]DevEnvironment
guidelines map[string]Guideline
workflows map[string]Workflow
testing map[string]TestingTool
logger *logrus.Logger
}
// ContributorConfig holds contributor tools configuration
type ContributorConfig struct {
Enabled bool `json:"enabled"`
DevSetup bool `json:"dev_setup"`
Guidelines bool `json:"guidelines"`
Workflows bool `json:"workflows"`
Testing bool `json:"testing"`
Onboarding bool `json:"onboarding"`
Metadata map[string]string `json:"metadata"`
}
// DevEnvironment represents a development environment
type DevEnvironment struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
SetupScript string `json:"setup_script"`
Requirements []string `json:"requirements"`
Platforms []string `json:"platforms"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// Guideline represents a contribution guideline
type Guideline struct {
ID string `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
Category string `json:"category"`
Content string `json:"content"`
Version string `json:"version"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Required bool `json:"required"`
Metadata map[string]interface{} `json:"metadata"`
}
// Workflow represents a contribution workflow
type Workflow struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Steps []WorkflowStep `json:"steps"`
Triggers []string `json:"triggers"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// WorkflowStep represents a workflow step
type WorkflowStep struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Action string `json:"action"`
Parameters map[string]interface{} `json:"parameters"`
Required bool `json:"required"`
Order int `json:"order"`
Metadata map[string]interface{} `json:"metadata"`
}
// TestingTool represents a testing tool
type TestingTool struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Command string `json:"command"`
Args []string `json:"args"`
Config map[string]interface{} `json:"config"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// EcosystemIntegration manages third-party integrations
type EcosystemIntegration struct {
config *EcosystemConfig
ciCd map[string]CICDPlatform
cloud map[string]CloudProvider
devTools map[string]DevTool
apis map[string]API
logger *logrus.Logger
}
// EcosystemConfig holds ecosystem integration configuration
type EcosystemConfig struct {
Enabled bool `json:"enabled"`
CICDEnabled bool `json:"cicd_enabled"`
CloudEnabled bool `json:"cloud_enabled"`
DevToolsEnabled bool `json:"dev_tools_enabled"`
APIEnabled bool `json:"api_enabled"`
Metadata map[string]string `json:"metadata"`
}
// CICDPlatform represents a CI/CD platform integration
type CICDPlatform struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Config map[string]interface{} `json:"config"`
Webhooks []string `json:"webhooks"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// CloudProvider represents a cloud provider integration
type CloudProvider struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Credentials map[string]interface{} `json:"credentials"`
Regions []string `json:"regions"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// DevTool represents a development tool integration
type DevTool struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Config map[string]interface{} `json:"config"`
Commands []string `json:"commands"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// API represents an API integration
type API struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Type string `json:"type"`
Endpoint string `json:"endpoint"`
Auth map[string]interface{} `json:"auth"`
Version string `json:"version"`
Enabled bool `json:"enabled"`
Metadata map[string]interface{} `json:"metadata"`
}
// NewCommunityManager creates a new community manager
func NewCommunityManager(config *CommunityConfig, logger *logrus.Logger) *CommunityManager {
manager := &CommunityManager{
logger: logger,
config: config,
users: NewUserCommunity(config.CommunityPath, logger),
contributors: NewContributorTools(logger),
ecosystem: NewEcosystemIntegration(logger),
}
return manager
}
// NewUserCommunity creates a new user community manager
func NewUserCommunity(communityPath string, logger *logrus.Logger) *UserCommunity {
community := &UserCommunity{
config: &UserCommunityConfig{},
forums: make(map[string]Forum),
blueprints: make(map[string]Blueprint),
feedback: make(map[string]Feedback),
logger: logger,
}
// Initialize community features
community.initializeForums()
community.initializeBlueprints()
community.initializeFeedback()
return community
}
// NewContributorTools creates a new contributor tools manager
func NewContributorTools(logger *logrus.Logger) *ContributorTools {
tools := &ContributorTools{
config: &ContributorConfig{},
environments: make(map[string]DevEnvironment),
guidelines: make(map[string]Guideline),
workflows: make(map[string]Workflow),
testing: make(map[string]TestingTool),
logger: logger,
}
// Initialize contributor tools
tools.initializeDevEnvironments()
tools.initializeGuidelines()
tools.initializeWorkflows()
tools.initializeTestingTools()
return tools
}
// NewEcosystemIntegration creates a new ecosystem integration manager
func NewEcosystemIntegration(logger *logrus.Logger) *EcosystemIntegration {
ecosystem := &EcosystemIntegration{
config: &EcosystemConfig{},
ciCd: make(map[string]CICDPlatform),
cloud: make(map[string]CloudProvider),
devTools: make(map[string]DevTool),
apis: make(map[string]API),
logger: logger,
}
// Initialize ecosystem integrations
ecosystem.initializeCICDPlatforms()
ecosystem.initializeCloudProviders()
ecosystem.initializeDevTools()
ecosystem.initializeAPIs()
return ecosystem
}
// Initialize community features
func (uc *UserCommunity) initializeForums() {
// General discussion forum
uc.forums["general"] = Forum{
ID: "general",
Name: "General Discussion",
Description: "General discussion about Debian Forge and atomic systems",
Category: "general",
Topics: []ForumTopic{},
Moderators: []string{"admin"},
Enabled: true,
}
// Technical support forum
uc.forums["support"] = Forum{
ID: "support",
Name: "Technical Support",
Description: "Technical support and troubleshooting",
Category: "support",
Topics: []ForumTopic{},
Moderators: []string{"admin", "moderator"},
Enabled: true,
}
// Blueprint sharing forum
uc.forums["blueprints"] = Forum{
ID: "blueprints",
Name: "Blueprint Sharing",
Description: "Share and discuss blueprints",
Category: "blueprints",
Topics: []ForumTopic{},
Moderators: []string{"admin", "moderator"},
Enabled: true,
}
}
func (uc *UserCommunity) initializeBlueprints() {
// Example blueprint
uc.blueprints["debian-minimal"] = Blueprint{
ID: "debian-minimal",
Name: "Debian Minimal",
Description: "Minimal Debian system with essential packages",
Author: "debian-forge-team",
Created: time.Now(),
Updated: time.Now(),
Version: "1.0.0",
Content: "# Minimal Debian Blueprint\npackages:\n - systemd\n - openssh-server\n - vim",
Tags: []string{"minimal", "server", "debian"},
Rating: 4.5,
Downloads: 150,
Status: "active",
}
}
func (uc *UserCommunity) initializeFeedback() {
// Feedback categories
uc.feedback["feature-request"] = Feedback{
ID: "feature-request",
Type: "feature-request",
Title: "Feature Request Template",
Description: "Template for feature requests",
Author: "system",
Created: time.Now(),
Updated: time.Now(),
Priority: "medium",
Status: "template",
Category: "feature",
}
}
// Initialize contributor tools
func (ct *ContributorTools) initializeDevEnvironments() {
// Docker development environment
ct.environments["docker"] = DevEnvironment{
ID: "docker",
Name: "Docker Development Environment",
Description: "Docker-based development environment for Debian Forge",
Type: "docker",
SetupScript: "scripts/setup-docker-dev.sh",
Requirements: []string{"docker", "docker-compose"},
Platforms: []string{"linux", "macos", "windows"},
Enabled: true,
}
// Local development environment
ct.environments["local"] = DevEnvironment{
ID: "local",
Name: "Local Development Environment",
Description: "Local development environment setup",
Type: "local",
SetupScript: "scripts/setup-local-dev.sh",
Requirements: []string{"go", "python3", "git"},
Platforms: []string{"linux", "macos"},
Enabled: true,
}
}
func (ct *ContributorTools) initializeGuidelines() {
// Code contribution guidelines
ct.guidelines["code-contribution"] = Guideline{
ID: "code-contribution",
Title: "Code Contribution Guidelines",
Description: "Guidelines for contributing code to Debian Forge",
Category: "development",
Content: "# Code Contribution Guidelines\n\n1. Follow Go coding standards\n2. Write tests for new features\n3. Update documentation\n4. Use conventional commits",
Version: "1.0.0",
Created: time.Now(),
Updated: time.Now(),
Required: true,
}
// Blueprint contribution guidelines
ct.guidelines["blueprint-contribution"] = Guideline{
ID: "blueprint-contribution",
Title: "Blueprint Contribution Guidelines",
Description: "Guidelines for contributing blueprints",
Category: "blueprints",
Content: "# Blueprint Contribution Guidelines\n\n1. Use YAML format\n2. Include documentation\n3. Test your blueprints\n4. Follow naming conventions",
Version: "1.0.0",
Created: time.Now(),
Updated: time.Now(),
Required: true,
}
}
func (ct *ContributorTools) initializeWorkflows() {
// Pull request workflow
ct.workflows["pull-request"] = Workflow{
ID: "pull-request",
Name: "Pull Request Workflow",
Description: "Standard workflow for pull requests",
Type: "pull-request",
Steps: []WorkflowStep{
{
ID: "create-branch",
Name: "Create Feature Branch",
Description: "Create a feature branch from main",
Action: "git_checkout",
Parameters: map[string]interface{}{"branch": "feature/new-feature"},
Required: true,
Order: 1,
},
{
ID: "run-tests",
Name: "Run Tests",
Description: "Run all tests to ensure quality",
Action: "run_tests",
Parameters: map[string]interface{}{"test_type": "all"},
Required: true,
Order: 2,
},
{
ID: "create-pr",
Name: "Create Pull Request",
Description: "Create pull request with description",
Action: "create_pull_request",
Parameters: map[string]interface{}{"template": "pull_request_template.md"},
Required: true,
Order: 3,
},
},
Triggers: []string{"pull_request", "manual"},
Enabled: true,
}
}
func (ct *ContributorTools) initializeTestingTools() {
// Unit testing tool
ct.testing["unit-tests"] = TestingTool{
ID: "unit-tests",
Name: "Unit Tests",
Description: "Run unit tests for Go packages",
Type: "testing",
Command: "go",
Args: []string{"test", "./..."},
Config: map[string]interface{}{"timeout": "5m"},
Enabled: true,
}
// Integration testing tool
ct.testing["integration-tests"] = TestingTool{
ID: "integration-tests",
Name: "Integration Tests",
Description: "Run integration tests",
Type: "testing",
Command: "go",
Args: []string{"test", "-tags=integration", "./..."},
Config: map[string]interface{}{"timeout": "15m"},
Enabled: true,
}
}
// Initialize ecosystem integrations
func (ei *EcosystemIntegration) initializeCICDPlatforms() {
// GitHub Actions integration
ei.ciCd["github-actions"] = CICDPlatform{
ID: "github-actions",
Name: "GitHub Actions",
Description: "GitHub Actions CI/CD integration",
Type: "github",
Config: map[string]interface{}{"workflow_path": ".github/workflows"},
Webhooks: []string{"push", "pull_request"},
Enabled: true,
}
// GitLab CI integration
ei.ciCd["gitlab-ci"] = CICDPlatform{
ID: "gitlab-ci",
Name: "GitLab CI",
Description: "GitLab CI/CD integration",
Type: "gitlab",
Config: map[string]interface{}{"config_file": ".gitlab-ci.yml"},
Webhooks: []string{"push", "merge_request"},
Enabled: true,
}
}
func (ei *EcosystemIntegration) initializeCloudProviders() {
// AWS integration
ei.cloud["aws"] = CloudProvider{
ID: "aws",
Name: "Amazon Web Services",
Description: "AWS cloud provider integration",
Type: "aws",
Credentials: map[string]interface{}{"region": "us-east-1"},
Regions: []string{"us-east-1", "us-west-2", "eu-west-1"},
Enabled: true,
}
// Azure integration
ei.cloud["azure"] = CloudProvider{
ID: "azure",
Name: "Microsoft Azure",
Description: "Azure cloud provider integration",
Type: "azure",
Credentials: map[string]interface{}{"subscription": "default"},
Regions: []string{"eastus", "westus2", "westeurope"},
Enabled: true,
}
}
func (ei *EcosystemIntegration) initializeDevTools() {
// VS Code integration
ei.devTools["vscode"] = DevTool{
ID: "vscode",
Name: "Visual Studio Code",
Description: "VS Code development environment",
Type: "editor",
Config: map[string]interface{}{"extensions": []string{"go", "yaml"}},
Commands: []string{"code", "code-server"},
Enabled: true,
}
// Docker integration
ei.devTools["docker"] = DevTool{
ID: "docker",
Name: "Docker",
Description: "Docker containerization",
Type: "container",
Config: map[string]interface{}{"compose_file": "docker-compose.yml"},
Commands: []string{"docker", "docker-compose"},
Enabled: true,
}
}
func (ei *EcosystemIntegration) initializeAPIs() {
// REST API
ei.apis["rest"] = API{
ID: "rest",
Name: "REST API",
Description: "RESTful API for Debian Forge",
Type: "rest",
Endpoint: "/api/v1",
Auth: map[string]interface{}{"type": "jwt"},
Version: "1.0.0",
Enabled: true,
}
// GraphQL API
ei.apis["graphql"] = API{
ID: "graphql",
Name: "GraphQL API",
Description: "GraphQL API for Debian Forge",
Type: "graphql",
Endpoint: "/graphql",
Auth: map[string]interface{}{"type": "jwt"},
Version: "1.0.0",
Enabled: true,
}
}
// User community methods
func (uc *UserCommunity) CreateForumTopic(forumID string, topic ForumTopic) error {
forum, exists := uc.forums[forumID]
if !exists {
return fmt.Errorf("forum not found: %s", forumID)
}
if !forum.Enabled {
return fmt.Errorf("forum is disabled: %s", forumID)
}
topic.ID = generateTopicID()
topic.Created = time.Now()
topic.Updated = time.Now()
topic.Status = "active"
forum.Topics = append(forum.Topics, topic)
uc.forums[forumID] = forum
uc.logger.Infof("Created forum topic: %s in forum: %s", topic.ID, forumID)
return nil
}
func (uc *UserCommunity) ShareBlueprint(blueprint Blueprint) error {
blueprint.ID = generateBlueprintID()
blueprint.Created = time.Now()
blueprint.Updated = time.Now()
blueprint.Status = "active"
blueprint.Downloads = 0
blueprint.Rating = 0.0
uc.blueprints[blueprint.ID] = blueprint
uc.logger.Infof("Shared blueprint: %s by author: %s", blueprint.ID, blueprint.Author)
return nil
}
func (uc *UserCommunity) SubmitFeedback(feedback Feedback) error {
feedback.ID = generateFeedbackID()
feedback.Created = time.Now()
feedback.Updated = time.Now()
feedback.Status = "submitted"
uc.feedback[feedback.ID] = feedback
uc.logger.Infof("Submitted feedback: %s of type: %s", feedback.ID, feedback.Type)
return nil
}
// Contributor tools methods
func (ct *ContributorTools) SetupDevEnvironment(envID string) error {
env, exists := ct.environments[envID]
if !exists {
return fmt.Errorf("development environment not found: %s", envID)
}
if !env.Enabled {
return fmt.Errorf("development environment is disabled: %s", envID)
}
ct.logger.Infof("Setting up development environment: %s", env.Name)
// In production, this would execute the setup script
return nil
}
func (ct *ContributorTools) GetGuideline(guidelineID string) (*Guideline, error) {
guideline, exists := ct.guidelines[guidelineID]
if !exists {
return nil, fmt.Errorf("guideline not found: %s", guidelineID)
}
return &guideline, nil
}
func (ct *ContributorTools) ExecuteWorkflow(workflowID string, params map[string]interface{}) error {
workflow, exists := ct.workflows[workflowID]
if !exists {
return fmt.Errorf("workflow not found: %s", workflowID)
}
if !workflow.Enabled {
return fmt.Errorf("workflow is disabled: %s", workflowID)
}
ct.logger.Infof("Executing workflow: %s", workflow.Name)
// Execute workflow steps in order
for _, step := range workflow.Steps {
if err := ct.executeWorkflowStep(step, params); err != nil {
return fmt.Errorf("workflow step failed: %s - %w", step.ID, err)
}
}
return nil
}
func (ct *ContributorTools) executeWorkflowStep(step WorkflowStep, params map[string]interface{}) error {
ct.logger.Infof("Executing workflow step: %s", step.Name)
// This is a placeholder for step execution
// In production, implement actual step execution logic
ct.logger.Infof("Step %s completed: %s", step.ID, step.Description)
return nil
}
func (ct *ContributorTools) RunTests(testID string) error {
test, exists := ct.testing[testID]
if !exists {
return fmt.Errorf("testing tool not found: %s", testID)
}
if !test.Enabled {
return fmt.Errorf("testing tool is disabled: %s", testID)
}
ct.logger.Infof("Running tests with tool: %s", test.Name)
// In production, this would execute the test command
return nil
}
// Ecosystem integration methods
func (ei *EcosystemIntegration) ConfigureCICD(platformID string, config map[string]interface{}) error {
platform, exists := ei.ciCd[platformID]
if !exists {
return fmt.Errorf("CI/CD platform not found: %s", platformID)
}
platform.Config = config
ei.ciCd[platformID] = platform
ei.logger.Infof("Configured CI/CD platform: %s", platform.Name)
return nil
}
func (ei *EcosystemIntegration) DeployToCloud(providerID string, deployment map[string]interface{}) error {
provider, exists := ei.cloud[providerID]
if !exists {
return fmt.Errorf("cloud provider not found: %s", providerID)
}
if !provider.Enabled {
return fmt.Errorf("cloud provider is disabled: %s", providerID)
}
ei.logger.Infof("Deploying to cloud provider: %s", provider.Name)
// In production, this would execute the deployment
return nil
}
func (ei *EcosystemIntegration) ConfigureDevTool(toolID string, config map[string]interface{}) error {
tool, exists := ei.devTools[toolID]
if !exists {
return fmt.Errorf("development tool not found: %s", toolID)
}
tool.Config = config
ei.devTools[toolID] = tool
ei.logger.Infof("Configured development tool: %s", tool.Name)
return nil
}
func (ei *EcosystemIntegration) EnableAPI(apiID string) error {
api, exists := ei.apis[apiID]
if !exists {
return fmt.Errorf("API not found: %s", apiID)
}
api.Enabled = true
ei.apis[apiID] = api
ei.logger.Infof("Enabled API: %s", api.Name)
return nil
}
// Helper functions
func generateTopicID() string {
return fmt.Sprintf("topic-%d", time.Now().UnixNano())
}
func generateBlueprintID() string {
return fmt.Sprintf("blueprint-%d", time.Now().UnixNano())
}
func generateFeedbackID() string {
return fmt.Sprintf("feedback-%d", time.Now().UnixNano())
}