From 4343f6214012dbb5b5e46dbc397fd77004a7b4b9 Mon Sep 17 00:00:00 2001 From: "IGNY8 VPS (Salman)" Date: Fri, 9 Jan 2026 22:45:30 +0000 Subject: [PATCH] Plugin packaging and docs --- REVERT-AND-FIX-SUMMARY.md | 218 ------- backend/igny8_core/plugins/apps.py | 3 +- backend/igny8_core/plugins/signals.py | 80 +++ docs/60-PLUGINS/INDEX.md | 37 ++ docs/60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md | 424 +++++++++++++ docs/60-PLUGINS/WORDPRESS-INTEGRATION.md | 598 ++++++++++++++++++ docs/INDEX.md | 18 + .../sites/WordPressIntegrationForm.tsx | 6 +- igny8-wp-bridge.zip | Bin 165426 -> 0 bytes igny8-wp-bridge/tester | 1 - .../admin/assets/css/admin.css | 0 .../igny8-wp-bridge}/admin/assets/js/admin.js | 0 .../admin/assets/js/post-editor.js | 0 .../admin/class-admin-columns.php | 0 .../igny8-wp-bridge}/admin/class-admin.php | 0 .../admin/class-post-meta-boxes.php | 0 .../admin/class-post-meta-boxes.php.bak | 0 .../igny8-wp-bridge}/admin/settings.php | 0 .../igny8-wp-bridge}/data/link-graph.php | 0 .../data/semantic-mapping.php | 0 .../igny8-wp-bridge}/data/site-collection.php | 0 .../igny8-wp-bridge}/data/woocommerce.php | 0 .../docs/ACTIONABLE-IMPLEMENTATION-PLAN.md | 0 .../docs/AUTHENTICATION-AUDIT.md | 0 .../docs/COMPLETE-PUBLICATION-AUDIT.md | 0 .../docs/DEBUGGING-GUIDE-2025-12-01.md | 0 .../docs/FIXES-APPLIED-2025-11-30.md | 0 .../docs/FIXES-APPLIED-2025-12-01.md | 0 .../docs/FIXES-APPLIED-CONTENT-PUBLISHING.md | 0 .../docs/FIXES-PUBLISH-FAILURE.md | 0 .../docs/Plan-based-on-audit.md | 0 .../docs/SYNC-DATA-FLOW-DIAGRAM.md | 0 .../docs/WORDPRESS-PLUGIN-INTEGRATION.md | 0 .../source/igny8-wp-bridge}/igny8-bridge.php | 10 + .../includes/class-igny8-api.php | 0 .../includes/class-igny8-link-queue.php | 0 .../includes/class-igny8-logger.php | 0 .../includes/class-igny8-rest-api.php | 0 .../includes/class-igny8-site.php | 0 .../includes/class-igny8-template-loader.php | 0 .../includes/class-igny8-updater.php | 197 ++++++ .../includes/class-igny8-webhook-logs.php | 0 .../includes/class-igny8-webhooks.php | 0 .../igny8-wp-bridge}/includes/functions.php | 0 .../includes/template-functions.php | 0 .../languages/igny8-bridge.pot | 0 .../source/igny8-wp-bridge}/sync/hooks.php | 0 .../igny8-wp-bridge}/sync/igny8-to-wp.php | 0 .../igny8-wp-bridge}/sync/post-sync.php | 0 .../igny8-wp-bridge}/sync/taxonomy-sync.php | 0 .../igny8-wp-bridge}/templates/README.md | 0 .../assets/css/igny8-content-template.css | 0 .../assets/js/igny8-content-template.js | 0 .../parts/igny8-content-sections.php | 0 .../templates/parts/igny8-featured-image.php | 0 .../templates/parts/igny8-header.php | 0 .../templates/parts/igny8-metadata.php | 0 .../templates/single-igny8-content.php | 0 .../tests/test-api-authentication.php | 0 .../tests/test-revoke-api-key.php | 0 .../tests/test-site-metadata.php | 0 .../tests/test-sync-structure.php | 0 .../source/igny8-wp-bridge}/uninstall.php | 0 63 files changed, 1369 insertions(+), 223 deletions(-) delete mode 100644 REVERT-AND-FIX-SUMMARY.md create mode 100644 backend/igny8_core/plugins/signals.py create mode 100644 docs/60-PLUGINS/INDEX.md create mode 100644 docs/60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md create mode 100644 docs/60-PLUGINS/WORDPRESS-INTEGRATION.md delete mode 100644 igny8-wp-bridge.zip delete mode 100644 igny8-wp-bridge/tester rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/assets/css/admin.css (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/assets/js/admin.js (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/assets/js/post-editor.js (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/class-admin-columns.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/class-admin.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/class-post-meta-boxes.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/class-post-meta-boxes.php.bak (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/admin/settings.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/data/link-graph.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/data/semantic-mapping.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/data/site-collection.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/data/woocommerce.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/ACTIONABLE-IMPLEMENTATION-PLAN.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/AUTHENTICATION-AUDIT.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/COMPLETE-PUBLICATION-AUDIT.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/DEBUGGING-GUIDE-2025-12-01.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/FIXES-APPLIED-2025-11-30.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/FIXES-APPLIED-2025-12-01.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/FIXES-APPLIED-CONTENT-PUBLISHING.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/FIXES-PUBLISH-FAILURE.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/Plan-based-on-audit.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/SYNC-DATA-FLOW-DIAGRAM.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/docs/WORDPRESS-PLUGIN-INTEGRATION.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/igny8-bridge.php (93%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-api.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-link-queue.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-logger.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-rest-api.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-site.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-template-loader.php (100%) create mode 100644 plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-updater.php rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-webhook-logs.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/class-igny8-webhooks.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/functions.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/includes/template-functions.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/languages/igny8-bridge.pot (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/sync/hooks.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/sync/igny8-to-wp.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/sync/post-sync.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/sync/taxonomy-sync.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/README.md (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/assets/css/igny8-content-template.css (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/assets/js/igny8-content-template.js (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/parts/igny8-content-sections.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/parts/igny8-featured-image.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/parts/igny8-header.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/parts/igny8-metadata.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/templates/single-igny8-content.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/tests/test-api-authentication.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/tests/test-revoke-api-key.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/tests/test-site-metadata.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/tests/test-sync-structure.php (100%) rename {igny8-wp-bridge => plugins/wordpress/source/igny8-wp-bridge}/uninstall.php (100%) diff --git a/REVERT-AND-FIX-SUMMARY.md b/REVERT-AND-FIX-SUMMARY.md deleted file mode 100644 index 6679de52..00000000 --- a/REVERT-AND-FIX-SUMMARY.md +++ /dev/null @@ -1,218 +0,0 @@ -# Revert and Fix Summary - -**Date:** January 9, 2026 -**Status:** ✅ COMPLETED - ---- - -## What Was Done - -### 1. ✅ Reverted WordPress Plugin Changes - -**Removed all unplanned WordPress plugin files:** -- Deleted entire `/plugins/wordpress/source/igny8-wp-bridge/` directory (20 files, ~4,600 lines) -- Deleted `/scripts/build-wp-plugin.sh` build script - -**Result:** WordPress plugin directory completely removed from git staging area. - -### 2. ✅ Fixed Plugin Download Issue - -**Problem:** Frontend was trying to download plugin from GitHub instead of using the backend API. - -**Fix Applied:** -```typescript -// File: frontend/src/components/sites/WordPressIntegrationForm.tsx -// Line: ~173 - -// BEFORE: -const handleDownloadPlugin = () => { - const pluginUrl = `https://github.com/igny8/igny8-wp-bridge/releases/latest/download/igny8-wp-bridge.zip`; - window.open(pluginUrl, '_blank'); - toast.success('Plugin download started'); -}; - -// AFTER: -const handleDownloadPlugin = () => { - // Use the backend API endpoint for plugin download - const pluginUrl = `/api/plugins/igny8-wp-bridge/download/`; - window.open(pluginUrl, '_blank'); - toast.success('Plugin download started'); -}; -``` - -**Result:** Download button now points to correct API endpoint: `/api/plugins/igny8-wp-bridge/download/` - -### 3. ⚠️ Plugin File Missing - -**Issue Discovered:** The plugin ZIP file doesn't exist on the server. - -**Evidence:** -```bash -# API endpoint works but returns 404: -curl http://localhost:8011/api/plugins/wordpress/latest/ -# Returns: download_url: "http://localhost:8011/api/plugins/igny8-wp-bridge/download/" - -# But file doesn't exist: -docker exec igny8_backend python manage.py shell -c "..." -# Output: File exists: False -``` - -**Database shows:** -- Plugin: "IGNY8 WordPress Bridge" (version 1.1.1) -- File path: `igny8-wp-bridge-v1.1.1.zip` -- File size: 98706 bytes -- **BUT:** Physical file doesn't exist at `/app/igny8-wp-bridge-v1.1.1.zip` - ---- - -## What Needs to Be Done - -### Step 1: Upload Plugin ZIP File - -The plugin file needs to be manually uploaded to the backend. - -**Option A: Upload via Django Admin** (Recommended) -1. Go to Django Admin: https://api.igny8.com/admin/ -2. Navigate to: Plugins → Plugin Versions -3. Find version 1.1.1 -4. Click edit -5. Upload the ZIP file in the "File" field -6. Save - -**Option B: Upload via Command Line** -```bash -# If you have the plugin ZIP file locally, copy it to the container: -docker cp /path/to/igny8-wp-bridge-v1.1.1.zip igny8_backend:/app/igny8-wp-bridge-v1.1.1.zip - -# Then update the database if needed -``` - -### Step 2: Verify Plugin Path Configuration - -Check that the Plugin Distribution System is configured to store files in the right location. - -**Check settings.py for MEDIA_ROOT:** -```python -# backend/igny8_core/settings.py -# Should have something like: -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -MEDIA_URL = '/media/' -``` - -**Currently:** MEDIA_ROOT is not configured in settings.py, which is why the file path is relative (`igny8-wp-bridge-v1.1.1.zip`) instead of absolute (`/app/media/plugins/igny8-wp-bridge-v1.1.1.zip`). - -### Step 3: Fix Media Configuration (Recommended) - -Add proper media configuration to settings.py: - -```python -# backend/igny8_core/settings.py -# Add after STATIC configuration: - -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -MEDIA_URL = '/media/' -``` - -Then update the plugin file path in the database to use the media directory. - ---- - -## Current Git Status - -``` -Changes not staged for commit: - modified: backend/igny8_core/settings.py - modified: backend/igny8_core/urls.py - modified: docs/plans/FINAL-PRELAUNCH-PENDING.md - modified: docs/plans/PLUGIN-DISTRIBUTION-SYSTEM.md - modified: frontend/src/components/sites/WordPressIntegrationForm.tsx - -Untracked files: - backend/igny8_core/plugins/ -``` - -**What changed:** -1. ✅ `frontend/src/components/sites/WordPressIntegrationForm.tsx` - Fixed download URL -2. ✅ `backend/igny8_core/plugins/` - Plugin Distribution System (new module) -3. ✅ `backend/igny8_core/settings.py` - Added Plugin Management to admin navigation -4. ✅ `backend/igny8_core/urls.py` - Added plugin distribution URLs -5. ✅ Documentation updates - -**What was reverted:** -1. ✅ All WordPress plugin source files (20 files removed) -2. ✅ Build script removed - ---- - -## Testing After Fix - -### Test 1: API Endpoint -```bash -curl http://localhost:8011/api/plugins/wordpress/latest/ -``` -**Expected:** Returns plugin info with download URL -**Status:** ✅ WORKS - -### Test 2: Download Endpoint (After uploading file) -```bash -curl -I http://localhost:8011/api/plugins/igny8-wp-bridge/download/ -``` -**Expected:** Returns 200 OK and starts download -**Status:** ⚠️ Will work after file is uploaded - -### Test 3: Frontend Download Button (After uploading file) -1. Go to: https://app.igny8.com/sites/{id}/settings?tab=integrations -2. Generate API key -3. Click "Download Plugin" button -**Expected:** Plugin downloads -**Status:** ⚠️ Will work after file is uploaded - ---- - -## Summary - -### ✅ Completed -- Reverted all unplanned WordPress plugin changes -- Fixed frontend download button to use correct API endpoint -- Backend plugin distribution system is working -- Admin navigation includes plugin management - -### ⚠️ Pending -- Upload actual plugin ZIP file to backend -- Optionally: Add MEDIA_ROOT configuration to settings.py - -### ❌ Removed -- 20 WordPress plugin template/sync files (~4,600 lines) -- Build script for plugin packaging - ---- - -## Quick Fix Steps - -**To make plugin download work immediately:** - -1. Get the plugin ZIP file (if you have it) -2. Upload via Django Admin: - - URL: https://api.igny8.com/admin/plugins/pluginversion/ - - Find version 1.1.1 - - Upload ZIP file - - Save - -**OR** if you need to create the plugin ZIP: -1. The actual WordPress plugin source should be in a separate repository -2. Create ZIP with proper structure -3. Upload to Django admin - ---- - -## Files Modified in This Session - -1. `/data/app/igny8/frontend/src/components/sites/WordPressIntegrationForm.tsx` - - Changed download URL from GitHub to `/api/plugins/igny8-wp-bridge/download/` - -2. **DELETED**: `/data/app/igny8/plugins/wordpress/source/igny8-wp-bridge/` (entire directory) -3. **DELETED**: `/data/app/igny8/scripts/build-wp-plugin.sh` - ---- - -**End of Summary** diff --git a/backend/igny8_core/plugins/apps.py b/backend/igny8_core/plugins/apps.py index 160147a7..534225e8 100644 --- a/backend/igny8_core/plugins/apps.py +++ b/backend/igny8_core/plugins/apps.py @@ -12,4 +12,5 @@ class PluginsConfig(AppConfig): def ready(self): """Import signal handlers when app is ready.""" - pass + # Import signals to register handlers + from . import signals # noqa: F401 diff --git a/backend/igny8_core/plugins/signals.py b/backend/igny8_core/plugins/signals.py new file mode 100644 index 00000000..a2f785b2 --- /dev/null +++ b/backend/igny8_core/plugins/signals.py @@ -0,0 +1,80 @@ +""" +Plugin Distribution System Signals + +Handles automatic ZIP creation when plugin versions are released. +""" +import logging +from django.db.models.signals import pre_save, post_save +from django.dispatch import receiver +from django.utils import timezone + +from .models import PluginVersion +from .utils import create_plugin_zip + +logger = logging.getLogger(__name__) + + +@receiver(pre_save, sender=PluginVersion) +def auto_build_plugin_on_release(sender, instance, **kwargs): + """ + Automatically build ZIP package when a version is marked as released or update_ready. + + This ensures: + 1. ZIP file is always up-to-date with source code + 2. File size and checksum are auto-calculated + 3. No manual intervention needed for releases + """ + # Skip if this is a new instance (no pk yet) + if not instance.pk: + return + + try: + # Get the old instance to check for status change + old_instance = PluginVersion.objects.get(pk=instance.pk) + except PluginVersion.DoesNotExist: + return + + # Check if status is changing TO 'released' or 'update_ready' + release_statuses = ['released', 'update_ready'] + old_status = old_instance.status + new_status = instance.status + + # Only trigger build if: + # 1. Status is changing + # 2. New status is a release status + # 3. Old status was not a release status (avoid rebuilding on every save) + if old_status == new_status: + return + + if new_status not in release_statuses: + return + + # If moving from one release status to another, don't rebuild + if old_status in release_statuses: + logger.info(f"Plugin {instance.plugin.slug} v{instance.version}: Status changing from {old_status} to {new_status}, no rebuild needed") + return + + logger.info(f"Building plugin ZIP for {instance.plugin.slug} v{instance.version} (status: {old_status} -> {new_status})") + + # Build the ZIP + file_path, checksum, file_size = create_plugin_zip( + platform=instance.plugin.platform, + plugin_slug=instance.plugin.slug, + version=instance.version, + update_version=True + ) + + if not file_path: + logger.error(f"Failed to build ZIP for {instance.plugin.slug} v{instance.version}") + return + + # Update the instance with new file info + instance.file_path = file_path + instance.checksum = checksum + instance.file_size = file_size + + # Set released_at if moving to released status and not already set + if new_status in release_statuses and not instance.released_at: + instance.released_at = timezone.now() + + logger.info(f"Built plugin ZIP: {file_path} ({file_size} bytes, checksum: {checksum[:16]}...)") diff --git a/docs/60-PLUGINS/INDEX.md b/docs/60-PLUGINS/INDEX.md new file mode 100644 index 00000000..c4477a86 --- /dev/null +++ b/docs/60-PLUGINS/INDEX.md @@ -0,0 +1,37 @@ +# Plugin Management Documentation + +This section covers plugin distribution, management, and integration from the IGNY8 app perspective. + +## Contents + +1. [WORDPRESS-INTEGRATION.md](WORDPRESS-INTEGRATION.md) - Complete guide for WordPress integration management +2. [PLUGIN-UPDATE-WORKFLOW.md](PLUGIN-UPDATE-WORKFLOW.md) - How plugin updates work and post-update checklist + +## Quick Reference + +### API Endpoints (Production) + +| Endpoint | Purpose | +|----------|---------| +| `https://api.igny8.com/api/plugins/igny8-wp-bridge/download/` | Download latest plugin ZIP | +| `https://api.igny8.com/api/plugins/igny8-wp-bridge/check-update/` | Check for updates (called by WP plugin) | +| `https://api.igny8.com/api/plugins/igny8-wp-bridge/info/` | Get plugin metadata | + +### Key Directories + +| Path | Purpose | +|------|---------| +| `/data/app/igny8/plugins/wordpress/source/` | Plugin source code | +| `/data/app/igny8/plugins/wordpress/dist/` | Distribution ZIP files | +| `/data/app/igny8/backend/igny8_core/plugins/` | Django plugin management app | + +### Database Models + +- `Plugin` - Plugin registry (name, slug, platform) +- `PluginVersion` - Version tracking with file info +- `PluginInstallation` - Track installations per site +- `PluginDownload` - Download analytics + +--- + +**Note**: For internal plugin details (PHP functions, hooks, code structure), see the documentation inside the plugin directory at `/plugins/wordpress/source/igny8-wp-bridge/docs/`. diff --git a/docs/60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md b/docs/60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md new file mode 100644 index 00000000..21bd22b8 --- /dev/null +++ b/docs/60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md @@ -0,0 +1,424 @@ +# Plugin Update Workflow + +**Last Updated:** January 9, 2026 +**Status:** Production +**Scope:** How to release plugin updates and what happens automatically vs manually + +--- + +## Table of Contents + +1. [Update Workflow Overview](#1-update-workflow-overview) +2. [What Happens Automatically](#2-what-happens-automatically) +3. [What Requires Manual Action](#3-what-requires-manual-action) +4. [Step-by-Step: Releasing a New Version](#4-step-by-step-releasing-a-new-version) +5. [Post-Update Verification Checklist](#5-post-update-verification-checklist) +6. [Version Numbering](#6-version-numbering) +7. [Rollback Procedure](#7-rollback-procedure) +8. [Emergency Updates](#8-emergency-updates) + +--- + +## 1. Update Workflow Overview + +### The Big Picture + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ Plugin Update Lifecycle │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌──────────────┐ │ +│ │ 1. DEVELOP │ Make changes to plugin source code │ +│ │ ↓ │ Location: /plugins/wordpress/source/igny8-wp-bridge/ │ +│ └──────────────┘ │ +│ │ +│ ┌──────────────┐ │ +│ │ 2. VERSION │ Update version in PHP header + constant │ +│ │ ↓ │ File: igny8-bridge.php │ +│ └──────────────┘ │ +│ │ +│ ┌──────────────┐ │ +│ │ 3. RELEASE │ Create PluginVersion in Django admin │ +│ │ ↓ │ Set status = "released" or "update_ready" │ +│ └──────────────┘ │ +│ │ +│ ┌──────────────┐ │ +│ │ 4. AUTO-BUILD│ ✅ AUTOMATIC: ZIP created, checksums calculated │ +│ │ ↓ │ Signal handler builds package on status change │ +│ └──────────────┘ │ +│ │ +│ ┌──────────────┐ │ +│ │ 5. VERIFY │ Test download, check contents, verify endpoints │ +│ │ ↓ │ See verification checklist below │ +│ └──────────────┘ │ +│ │ +│ ┌──────────────┐ │ +│ │ 6. AVAILABLE │ WordPress sites can now see and install update │ +│ │ │ Users update via WP admin or auto-update │ +│ └──────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 2. What Happens Automatically + +When you change a `PluginVersion` status to `released` or `update_ready`, the following happens **automatically** via Django signals: + +### ✅ Automatic Actions + +| Action | Details | +|--------|---------| +| **ZIP Creation** | Source files packaged into distribution ZIP | +| **Version Update** | Version number updated in PHP files inside ZIP | +| **File Cleanup** | Tests, .git, __pycache__, .bak files removed from ZIP | +| **Checksum Calculation** | SHA256 hash generated | +| **File Size Recording** | Byte count stored in database | +| **File Path Update** | `file_path` field populated | +| **Released Date** | `released_at` timestamp set | +| **Symlink Update** | `*-latest.zip` symlink updated | + +### How It Works (Signal Handler) + +```python +# backend/igny8_core/plugins/signals.py + +@receiver(pre_save, sender=PluginVersion) +def auto_build_plugin_on_release(sender, instance, **kwargs): + """ + Triggered when PluginVersion.status changes to: + - 'released' + - 'update_ready' + + Actions: + 1. Calls create_plugin_zip() utility + 2. Updates instance.file_path + 3. Updates instance.file_size + 4. Updates instance.checksum + 5. Sets instance.released_at + """ +``` + +### What WordPress Sites See + +Once released, the `check-update` API returns: + +```json +{ + "update_available": true, + "latest_version": "1.2.0", + "download_url": "https://api.igny8.com/api/plugins/igny8-wp-bridge/download/", + "changelog": "Your changelog here" +} +``` + +WordPress will show "Update Available" in: +- Plugins page +- Dashboard → Updates +- Admin bar (if enabled) + +--- + +## 3. What Requires Manual Action + +### ❌ Manual Steps Required + +| Action | When | How | +|--------|------|-----| +| **Update Source Version** | Before release | Edit `igny8-bridge.php` header | +| **Create PluginVersion Record** | Each release | Django admin or management command | +| **Write Changelog** | Each release | Enter in PluginVersion.changelog | +| **Verify After Release** | After status change | Run verification checklist | +| **Mark Old Version Deprecated** | After successful release | Change old version status | + +### Source Version Update Locations + +When releasing a new version, update these in the source: + +**File:** `/plugins/wordpress/source/igny8-wp-bridge/igny8-bridge.php` + +```php +/** + * Plugin Name: IGNY8 WordPress Bridge + * Version: 1.2.0 ← UPDATE THIS + */ + +define('IGNY8_BRIDGE_VERSION', '1.2.0'); ← AND THIS +``` + +**Note:** The ZIP build process also updates these, but it's good practice to keep source in sync. + +--- + +## 4. Step-by-Step: Releasing a New Version + +### Step 1: Make Code Changes + +```bash +cd /data/app/igny8/plugins/wordpress/source/igny8-wp-bridge/ + +# Make your changes to PHP files +# Test locally if possible +``` + +### Step 2: Update Version Number + +Edit `igny8-bridge.php`: + +```php +/** + * Plugin Name: IGNY8 WordPress Bridge + * Version: 1.2.0 ← New version + */ + +define('IGNY8_BRIDGE_VERSION', '1.2.0'); ← Match here +``` + +### Step 3: Create PluginVersion in Django Admin + +1. Go to: `https://api.igny8.com/backend/` +2. Navigate to: **Plugin Distribution** → **Plugin Versions** +3. Click **Add Plugin Version** +4. Fill in: + - **Plugin:** IGNY8 WordPress Bridge + - **Version:** 1.2.0 + - **Status:** draft (initially) + - **Changelog:** Describe changes + - **Min PHP Version:** 7.4 (or higher if needed) +5. Click **Save** + +### Step 4: Release the Version + +1. Edit the PluginVersion you just created +2. Change **Status** to `released` +3. Click **Save** + +**What happens:** Signal triggers auto-build → ZIP created → database updated + +### Step 5: Verify Release + +Run the [verification checklist](#5-post-update-verification-checklist) below. + +### Step 6: Deprecate Old Version (Optional) + +1. Find the previous version in Django admin +2. Change **Status** to `deprecated` +3. Save + +--- + +## 5. Post-Update Verification Checklist + +### Immediate Checks (Do Every Release) + +```bash +# 1. Verify ZIP exists +ls -lh /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.2.0.zip + +# 2. Verify symlink updated +ls -la /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-latest.zip + +# 3. Test download endpoint +curl -s -o /dev/null -w "%{http_code} - %{size_download} bytes\n" \ + https://api.igny8.com/api/plugins/igny8-wp-bridge/download/ + +# 4. Test check-update endpoint +curl -s "https://api.igny8.com/api/plugins/igny8-wp-bridge/check-update/?current_version=1.0.0" | python3 -m json.tool + +# 5. Test info endpoint +curl -s https://api.igny8.com/api/plugins/igny8-wp-bridge/info/ | python3 -m json.tool + +# 6. Verify version in ZIP +unzip -p /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.2.0.zip \ + igny8-wp-bridge/igny8-bridge.php | grep -E "Version:|IGNY8_BRIDGE_VERSION" + +# 7. Verify API URL in ZIP (must be api.igny8.com) +unzip -p /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.2.0.zip \ + igny8-wp-bridge/igny8-bridge.php | grep "api.igny8.com" +``` + +### Database Verification + +```bash +# Check database has correct values +docker exec igny8_backend python manage.py shell -c " +from igny8_core.plugins.models import Plugin, PluginVersion +p = Plugin.objects.get(slug='igny8-wp-bridge') +v = p.get_latest_version() +print(f'Version: {v.version}') +print(f'Status: {v.status}') +print(f'File path: {v.file_path}') +print(f'File size: {v.file_size}') +print(f'Checksum: {v.checksum[:32]}...') +print(f'Released at: {v.released_at}') +" +``` + +### Expected Results + +| Check | Expected | +|-------|----------| +| Download returns | 200 status, ~150-200KB | +| check-update shows | `"latest_version": "1.2.0"` | +| info shows | `"version": "1.2.0"` | +| ZIP version header | `Version: 1.2.0` | +| API URL | `api.igny8.com` (NOT app.igny8.com) | + +### WordPress Verification (If Possible) + +1. Go to a test WordPress site with plugin installed +2. Navigate to **Dashboard** → **Updates** → **Check Again** +3. Verify "IGNY8 WordPress Bridge" shows update available +4. Click "View version details" → verify changelog appears +5. Click "Update Now" → verify update completes successfully + +--- + +## 6. Version Numbering + +### Semantic Versioning + +Format: `MAJOR.MINOR.PATCH` (e.g., 1.2.3) + +| Part | When to Increment | +|------|-------------------| +| **MAJOR** | Breaking changes, incompatible API changes | +| **MINOR** | New features, backwards compatible | +| **PATCH** | Bug fixes, minor improvements | + +### Version Code Calculation + +Used for numeric comparison in database: + +``` +1.0.0 → 10000 +1.0.1 → 10001 +1.2.0 → 10200 +1.2.3 → 10203 +2.0.0 → 20000 +``` + +Formula: `(MAJOR * 10000) + (MINOR * 100) + PATCH` + +--- + +## 7. Rollback Procedure + +### If Update Causes Issues + +**Option 1: Quick Rollback via Database** + +```bash +# Make old version the "latest" by changing status +docker exec igny8_backend python manage.py shell -c " +from igny8_core.plugins.models import PluginVersion + +# Demote new version +new = PluginVersion.objects.get(plugin__slug='igny8-wp-bridge', version='1.2.0') +new.status = 'deprecated' +new.save() + +# Promote old version back +old = PluginVersion.objects.get(plugin__slug='igny8-wp-bridge', version='1.1.1') +old.status = 'released' +old.save() + +print('Rollback complete') +" +``` + +**Option 2: Keep Old ZIP Files** + +Old ZIP files are preserved in `dist/`. To serve an old version: + +```bash +# Update symlink to point to old version +cd /data/app/igny8/plugins/wordpress/dist/ +ln -sf igny8-wp-bridge-v1.1.1.zip igny8-wp-bridge-latest.zip +``` + +### Retention Policy + +Keep at least 3 previous version ZIPs for emergency rollback: +- Current release +- Previous release +- One before that + +--- + +## 8. Emergency Updates + +### For Critical Security Fixes + +1. **Set `force_update = True`** on the new PluginVersion +2. This flag signals WordPress sites that update is mandatory +3. Sites with auto-updates enabled will update immediately + +### Emergency Release Checklist + +```bash +# 1. Make the fix in source +cd /data/app/igny8/plugins/wordpress/source/igny8-wp-bridge/ +# ... make changes ... + +# 2. Update version (use PATCH increment) +# Edit igny8-bridge.php + +# 3. Create version in Django admin with: +# - Status: update_ready +# - Force Update: ✓ (checked) +# - Changelog: "SECURITY: [description]" + +# 4. Verify immediately +curl https://api.igny8.com/api/plugins/igny8-wp-bridge/check-update/?current_version=1.0.0 + +# Response should include: +# "force_update": true +``` + +--- + +## Quick Reference Card + +### Release New Version + +``` +1. Edit source code +2. Update version in igny8-bridge.php (header + constant) +3. Create PluginVersion in Django admin (status: draft) +4. Change status to "released" → Auto-build triggers +5. Run verification checklist +6. Deprecate old version +``` + +### Verification Commands + +```bash +# Test all endpoints +curl -I https://api.igny8.com/api/plugins/igny8-wp-bridge/download/ +curl https://api.igny8.com/api/plugins/igny8-wp-bridge/check-update/?current_version=1.0.0 +curl https://api.igny8.com/api/plugins/igny8-wp-bridge/info/ + +# Check ZIP contents +unzip -l /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v*.zip | head -20 +``` + +### Emergency Rollback + +```bash +# Swap versions in database +docker exec igny8_backend python manage.py shell -c " +from igny8_core.plugins.models import PluginVersion +PluginVersion.objects.filter(version='NEW').update(status='deprecated') +PluginVersion.objects.filter(version='OLD').update(status='released') +" +``` + +--- + +## Related Documentation + +- [WORDPRESS-INTEGRATION.md](WORDPRESS-INTEGRATION.md) - Full integration guide +- [docs/plans/PLUGIN-DISTRIBUTION-SYSTEM.md](/docs/plans/PLUGIN-DISTRIBUTION-SYSTEM.md) - Original system design diff --git a/docs/60-PLUGINS/WORDPRESS-INTEGRATION.md b/docs/60-PLUGINS/WORDPRESS-INTEGRATION.md new file mode 100644 index 00000000..a1f69e16 --- /dev/null +++ b/docs/60-PLUGINS/WORDPRESS-INTEGRATION.md @@ -0,0 +1,598 @@ +# WordPress Integration Management + +**Last Updated:** January 9, 2026 +**Status:** Production +**Scope:** App-side management of WordPress plugin distribution and site integrations + +--- + +## Table of Contents + +1. [Overview](#1-overview) +2. [Architecture](#2-architecture) +3. [Plugin Distribution System](#3-plugin-distribution-system) +4. [Database Models](#4-database-models) +5. [API Endpoints](#5-api-endpoints) +6. [Django Admin Management](#6-django-admin-management) +7. [Frontend Integration](#7-frontend-integration) +8. [Site Integration Flow](#8-site-integration-flow) +9. [Troubleshooting](#9-troubleshooting) + +--- + +## 1. Overview + +### What This Document Covers + +This document covers the **app-side** management of WordPress integration: + +- How the IGNY8 app distributes the WordPress plugin +- How site integrations are tracked in the database +- API endpoints that WordPress plugins call +- Admin interface for managing plugins and versions +- Frontend components for plugin download + +### What This Document Does NOT Cover + +- Internal plugin PHP code and functions (see `/plugins/wordpress/source/igny8-wp-bridge/docs/`) +- WordPress-side setup and configuration +- Plugin installation on WordPress sites + +--- + +## 2. Architecture + +### System Components + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ IGNY8 App Server │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ +│ │ Django Backend │ │ PostgreSQL │ │ Plugin Files │ │ +│ │ │ │ │ │ │ │ +│ │ - API Views │◄──►│ - Plugin │ │ /plugins/ │ │ +│ │ - Admin │ │ - PluginVersion │ │ └─wordpress/ │ │ +│ │ - Signals │ │ - Installation │ │ ├─source/ │ │ +│ │ │ │ - Downloads │ │ └─dist/ │ │ +│ └────────┬─────────┘ └──────────────────┘ └────────┬─────────┘ │ +│ │ │ │ +│ │ API Routes: api.igny8.com │ │ +│ ▼ ▼ │ +│ ┌──────────────────────────────────────────────────────────────────┐ │ +│ │ API Endpoints │ │ +│ │ │ │ +│ │ /api/plugins/{slug}/download/ → Serve ZIP file │ │ +│ │ /api/plugins/{slug}/check-update/ → Return update info │ │ +│ │ /api/plugins/{slug}/info/ → Return plugin metadata │ │ +│ │ /api/plugins/{slug}/register/ → Register installation │ │ +│ │ /api/plugins/{slug}/health-check/ → Report plugin status │ │ +│ └──────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + │ HTTPS + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ WordPress Sites │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Site A │ │ Site B │ │ Site C │ │ Site N │ │ +│ │ v1.1.1 │ │ v1.1.0 │ │ v1.1.1 │ │ v1.0.0 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### URL Routing + +| Domain | Service | Purpose | +|--------|---------|---------| +| `app.igny8.com` | Frontend (Vite) | User interface | +| `api.igny8.com` | Backend (Django) | API endpoints | + +**Important**: WordPress plugins must call `api.igny8.com`, not `app.igny8.com`. + +--- + +## 3. Plugin Distribution System + +### Directory Structure + +``` +/data/app/igny8/ +├── plugins/ +│ └── wordpress/ +│ ├── source/ # Development source +│ │ └── igny8-wp-bridge/ +│ │ ├── igny8-bridge.php # Main plugin file +│ │ ├── includes/ # PHP classes +│ │ ├── admin/ # Admin interface +│ │ ├── sync/ # Sync functionality +│ │ ├── templates/ # Frontend templates +│ │ └── docs/ # Plugin-internal docs +│ └── dist/ # Distribution files +│ ├── igny8-wp-bridge-v1.1.1.zip # Version ZIP +│ ├── igny8-wp-bridge-v1.1.1.sha256 +│ └── igny8-wp-bridge-latest.zip # Symlink to latest +│ +└── backend/ + └── igny8_core/ + └── plugins/ # Django app + ├── models.py # Database models + ├── views.py # API endpoints + ├── signals.py # Auto-build triggers + ├── utils.py # ZIP creation utilities + ├── admin.py # Django admin config + └── urls.py # URL routing +``` + +### How ZIP Files Are Created + +#### Automatic Build (Recommended) + +When a `PluginVersion` status changes to `released` or `update_ready`, the system **automatically**: + +1. Reads source files from `/plugins/wordpress/source/igny8-wp-bridge/` +2. Updates version numbers in PHP files +3. Removes development files (tests, .git, __pycache__) +4. Creates ZIP in `/plugins/wordpress/dist/` +5. Calculates SHA256 checksum +6. Updates database with `file_path`, `file_size`, `checksum` +7. Updates `*-latest.zip` symlink + +This is handled by `signals.py`: + +```python +# backend/igny8_core/plugins/signals.py + +@receiver(pre_save, sender=PluginVersion) +def auto_build_plugin_on_release(sender, instance, **kwargs): + """Automatically build ZIP when version is released.""" + # Triggered on status change to 'released' or 'update_ready' +``` + +#### Manual Build (If Needed) + +```bash +# From project root +cd /data/app/igny8/plugins/wordpress/source + +# Create ZIP manually +zip -r ../dist/igny8-wp-bridge-v1.2.0.zip igny8-wp-bridge/ \ + -x "*.git*" -x "*__pycache__*" -x "*.DS_Store" -x "*tester*" + +# Update checksum +sha256sum ../dist/igny8-wp-bridge-v1.2.0.zip > ../dist/igny8-wp-bridge-v1.2.0.sha256 + +# Update symlink +ln -sf igny8-wp-bridge-v1.2.0.zip ../dist/igny8-wp-bridge-latest.zip +``` + +--- + +## 4. Database Models + +### Plugin + +Represents a plugin type (WordPress, Shopify, etc.). + +```python +class Plugin(models.Model): + name = models.CharField(max_length=100) # "IGNY8 WordPress Bridge" + slug = models.SlugField(unique=True) # "igny8-wp-bridge" + platform = models.CharField(...) # "wordpress", "shopify", "custom" + description = models.TextField() + homepage_url = models.URLField() + is_active = models.BooleanField(default=True) +``` + +**Current Records:** + +| ID | Name | Slug | Platform | +|----|------|------|----------| +| 1 | IGNY8 WordPress Bridge | igny8-wp-bridge | wordpress | + +### PluginVersion + +Tracks each version of a plugin. + +```python +class PluginVersion(models.Model): + plugin = models.ForeignKey(Plugin, ...) + version = models.CharField(max_length=20) # "1.1.1" + version_code = models.IntegerField() # 10101 (for comparison) + status = models.CharField(...) # "draft", "released", "update_ready" + + # File info (auto-populated on release) + file_path = models.CharField(...) # "igny8-wp-bridge-v1.1.1.zip" + file_size = models.IntegerField() # 167589 (bytes) + checksum = models.CharField(max_length=64) # SHA256 + + # Release info + changelog = models.TextField() + min_php_version = models.CharField(default='7.4') + released_at = models.DateTimeField(null=True) + force_update = models.BooleanField(default=False) +``` + +**Version Status Flow:** + +``` +draft → testing → staged → released → update_ready → deprecated + │ │ + │ └─ Notifies WP sites + └─ Available for download +``` + +### PluginInstallation + +Tracks where plugins are installed. + +```python +class PluginInstallation(models.Model): + site = models.ForeignKey('Site', ...) + plugin = models.ForeignKey(Plugin, ...) + current_version = models.ForeignKey(PluginVersion, ...) + is_active = models.BooleanField(default=True) + last_health_check = models.DateTimeField(null=True) + health_status = models.CharField(...) # "healthy", "outdated", "error" +``` + +### PluginDownload + +Tracks download analytics. + +```python +class PluginDownload(models.Model): + plugin = models.ForeignKey(Plugin, ...) + version = models.ForeignKey(PluginVersion, ...) + ip_address = models.GenericIPAddressField() + user_agent = models.CharField(max_length=500) + download_type = models.CharField(...) # "manual", "auto_update" + created_at = models.DateTimeField(auto_now_add=True) +``` + +--- + +## 5. API Endpoints + +### Public Endpoints (No Auth Required) + +#### Download Plugin + +``` +GET /api/plugins/{slug}/download/ +``` + +Returns the latest released ZIP file. + +**Response:** Binary ZIP file download + +**Example:** +```bash +curl -O https://api.igny8.com/api/plugins/igny8-wp-bridge/download/ +``` + +#### Check for Updates + +``` +GET /api/plugins/{slug}/check-update/?current_version=1.0.0 +``` + +Called by installed WordPress plugins to check for updates. + +**Response:** +```json +{ + "update_available": true, + "current_version": "1.0.0", + "latest_version": "1.1.1", + "latest_version_code": 10101, + "download_url": "https://api.igny8.com/api/plugins/igny8-wp-bridge/download/", + "changelog": "Bug fixes and improvements", + "info_url": "https://api.igny8.com/api/plugins/igny8-wp-bridge/info/", + "force_update": false, + "checksum": "6b9e231c07434df1dcfe81596b57f3571c30b6c2..." +} +``` + +#### Plugin Info + +``` +GET /api/plugins/{slug}/info/ +``` + +Returns plugin metadata for WordPress update modal. + +**Response:** +```json +{ + "name": "IGNY8 WordPress Bridge", + "slug": "igny8-wp-bridge", + "version": "1.1.1", + "author": "IGNY8", + "homepage": "https://igny8.com", + "description": "Lightweight bridge plugin...", + "changelog": "Bug fixes and improvements", + "download_url": "https://api.igny8.com/api/plugins/igny8-wp-bridge/download/", + "file_size": 167589, + "requires_php": "7.4", + "tested_wp": "6.7" +} +``` + +### Authenticated Endpoints + +#### Register Installation + +``` +POST /api/plugins/{slug}/register/ +Headers: Authorization: Api-Key {site_api_key} +``` + +Called when plugin is activated on a WordPress site. + +**Request Body:** +```json +{ + "site_id": 123, + "version": "1.1.1", + "wp_version": "6.7", + "php_version": "8.2" +} +``` + +#### Health Check + +``` +POST /api/plugins/{slug}/health-check/ +Headers: Authorization: Api-Key {site_api_key} +``` + +Periodic status report from installed plugins. + +**Request Body:** +```json +{ + "site_id": 123, + "version": "1.1.1", + "status": "active", + "last_sync": "2026-01-09T12:00:00Z" +} +``` + +--- + +## 6. Django Admin Management + +### Accessing Plugin Admin + +1. Go to: `https://api.igny8.com/backend/` +2. Login with admin credentials +3. Navigate to **Plugin Distribution** section + +### Admin Sections + +#### Plugins + +View and manage plugin registry. + +| Field | Description | +|-------|-------------| +| Name | Display name | +| Slug | URL identifier (cannot change after creation) | +| Platform | wordpress, shopify, custom | +| Is Active | Whether available for download | + +#### Plugin Versions + +Manage versions and trigger releases. + +| Field | Description | +|-------|-------------| +| Plugin | Parent plugin | +| Version | Semantic version (e.g., 1.1.1) | +| Status | draft, testing, staged, released, update_ready, deprecated | +| File Path | Auto-set on release | +| File Size | Auto-calculated on release | +| Checksum | Auto-calculated on release | +| Changelog | What's new (shown to users) | +| Force Update | Set true for critical security fixes | + +**To Release a New Version:** + +1. Create new PluginVersion record with status `draft` +2. Enter version number, changelog +3. Change status to `released` or `update_ready` +4. Save → ZIP is automatically built + +#### Plugin Installations + +View where plugins are installed. + +| Field | Description | +|-------|-------------| +| Site | IGNY8 site record | +| Plugin | Which plugin | +| Current Version | Installed version | +| Health Status | healthy, outdated, error | +| Last Health Check | Timestamp | + +#### Plugin Downloads + +View download analytics. + +| Field | Description | +|-------|-------------| +| Plugin | Which plugin | +| Version | Which version | +| Download Type | manual, auto_update | +| IP Address | Client IP | +| User Agent | Browser/client info | +| Created At | Timestamp | + +--- + +## 7. Frontend Integration + +### Download Button Location + +**Page:** Site Settings → Integrations → WordPress + +**Component:** `frontend/src/components/sites/WordPressIntegrationForm.tsx` + +### How Download Works + +```typescript +// WordPressIntegrationForm.tsx + +import { API_BASE_URL } from '../../services/api'; + +const handleDownloadPlugin = () => { + // Uses API_BASE_URL which resolves to https://api.igny8.com/api + const pluginUrl = `${API_BASE_URL}/plugins/igny8-wp-bridge/download/`; + window.open(pluginUrl, '_blank'); + toast.success('Plugin download started'); +}; +``` + +### Plugin Information Display + +The frontend shows: + +- Plugin name and version +- File size +- PHP requirements +- Download button +- Changelog (expandable) + +--- + +## 8. Site Integration Flow + +### Integration Creation Flow + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ WordPress Site Setup │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 1. User downloads plugin from IGNY8 app │ +│ └─ GET /api/plugins/igny8-wp-bridge/download/ │ +│ │ +│ 2. User installs and activates plugin in WordPress │ +│ │ +│ 3. User enters Site ID and API Key in WP plugin settings │ +│ └─ These are generated in IGNY8 app │ +│ │ +│ 4. WP Plugin calls IGNY8 to register │ +│ └─ POST /api/plugins/igny8-wp-bridge/register/ │ +│ │ +│ 5. IGNY8 creates SiteIntegration record │ +│ └─ Links WordPress site to IGNY8 site │ +│ │ +│ 6. Integration is now active │ +│ └─ Content can be published from IGNY8 to WordPress │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### Integration Data Model + +```python +# SiteIntegration model (in auth/models.py) + +class SiteIntegration(models.Model): + site = models.ForeignKey(Site, ...) # IGNY8 site + platform = models.CharField(...) # "wordpress" + external_site_url = models.URLField() # WordPress URL + api_key = models.CharField(...) # Encrypted key + sync_enabled = models.BooleanField() + last_sync = models.DateTimeField() + connection_status = models.CharField(...) # "connected", "error" +``` + +--- + +## 9. Troubleshooting + +### Common Issues + +#### "404 Not Found" on Download + +**Cause:** Using wrong domain (app.igny8.com instead of api.igny8.com) + +**Solution:** Ensure URL is `https://api.igny8.com/api/plugins/igny8-wp-bridge/download/` + +#### "Plugin file not found" Error + +**Cause:** ZIP file doesn't exist in dist/ directory + +**Solution:** +```bash +# Check if file exists +ls -la /data/app/igny8/plugins/wordpress/dist/ + +# If missing, rebuild manually or change version status to trigger auto-build +``` + +#### Updates Not Showing in WordPress + +**Cause 1:** WordPress caches plugin update checks + +**Solution:** In WordPress admin, go to Dashboard → Updates → Check Again + +**Cause 2:** Version status is not `released` or `update_ready` + +**Solution:** Check PluginVersion status in Django admin + +#### Wrong File Size/Checksum + +**Cause:** Database values don't match actual file + +**Solution:** +```bash +# Get actual values +stat -c %s /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.1.1.zip +sha256sum /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.1.1.zip + +# Update in Django admin or shell +``` + +### Verification Commands + +```bash +# Test download endpoint +curl -I https://api.igny8.com/api/plugins/igny8-wp-bridge/download/ + +# Test check-update endpoint +curl "https://api.igny8.com/api/plugins/igny8-wp-bridge/check-update/?current_version=1.0.0" + +# Test info endpoint +curl https://api.igny8.com/api/plugins/igny8-wp-bridge/info/ + +# Check ZIP contents +unzip -l /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.1.1.zip + +# Verify API URL in plugin +unzip -p /data/app/igny8/plugins/wordpress/dist/igny8-wp-bridge-v1.1.1.zip \ + igny8-wp-bridge/igny8-bridge.php | grep "api.igny8.com" +``` + +### Log Locations + +| Log | Location | +|-----|----------| +| Django logs | `/data/app/logs/django.log` | +| Plugin build logs | Check Django log for `"Created plugin ZIP"` messages | +| Download tracking | `PluginDownload` model in database | + +--- + +## Related Documentation + +- [PLUGIN-UPDATE-WORKFLOW.md](PLUGIN-UPDATE-WORKFLOW.md) - Post-update checklist +- `/plugins/wordpress/source/igny8-wp-bridge/docs/` - Plugin internal documentation +- [docs/plans/PLUGIN-DISTRIBUTION-SYSTEM.md](/docs/plans/PLUGIN-DISTRIBUTION-SYSTEM.md) - Original implementation plan diff --git a/docs/INDEX.md b/docs/INDEX.md index 40785465..c9d186b3 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -19,6 +19,8 @@ | **Read design guide** | [30-FRONTEND/DESIGN-GUIDE.md](30-FRONTEND/DESIGN-GUIDE.md) | | Understand frontend structure | [30-FRONTEND/PAGES.md](30-FRONTEND/PAGES.md) | | Trace a workflow end-to-end | [40-WORKFLOWS/](#workflows) | +| **Manage WordPress plugin** | [60-PLUGINS/WORDPRESS-INTEGRATION.md](60-PLUGINS/WORDPRESS-INTEGRATION.md) | +| **Release plugin update** | [60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md](60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md) | | Look up model fields | [90-REFERENCE/MODELS.md](90-REFERENCE/MODELS.md) | | **Payment system (Stripe/PayPal/Bank)** | [90-REFERENCE/PAYMENT-SYSTEM.md](90-REFERENCE/PAYMENT-SYSTEM.md) | | See prelaunch checklist | [plans/FINAL-PRELAUNCH.md](plans/FINAL-PRELAUNCH.md) | @@ -133,6 +135,22 @@ --- +## 60-PLUGINS - Plugin Distribution & Management + +| Document | Purpose | +|----------|---------| +| [INDEX.md](60-PLUGINS/INDEX.md) | Plugin management overview | +| [WORDPRESS-INTEGRATION.md](60-PLUGINS/WORDPRESS-INTEGRATION.md) | Complete WordPress integration guide (app-side) | +| [PLUGIN-UPDATE-WORKFLOW.md](60-PLUGINS/PLUGIN-UPDATE-WORKFLOW.md) | How to release updates, verification checklist | + +**Key Points:** +- Plugin source: `/plugins/wordpress/source/igny8-wp-bridge/` +- Distribution: `/plugins/wordpress/dist/` +- Django app: `/backend/igny8_core/plugins/` +- API domain: `api.igny8.com` (not app.igny8.com) + +--- + ## 90-REFERENCE - Quick Lookup | Document | Purpose | diff --git a/frontend/src/components/sites/WordPressIntegrationForm.tsx b/frontend/src/components/sites/WordPressIntegrationForm.tsx index a4072fa5..9e80d400 100644 --- a/frontend/src/components/sites/WordPressIntegrationForm.tsx +++ b/frontend/src/components/sites/WordPressIntegrationForm.tsx @@ -12,7 +12,7 @@ import Checkbox from '../form/input/Checkbox'; import Switch from '../form/switch/Switch'; import { useToast } from '../ui/toast/ToastContainer'; import { integrationApi, SiteIntegration } from '../../services/integration.api'; -import { fetchAPI } from '../../services/api'; +import { fetchAPI, API_BASE_URL } from '../../services/api'; import { CheckCircleIcon, AlertIcon, @@ -171,8 +171,8 @@ export default function WordPressIntegrationForm({ }; const handleDownloadPlugin = () => { - // Use the backend API endpoint for plugin download - const pluginUrl = `/api/plugins/igny8-wp-bridge/download/`; + // Use the backend API endpoint for plugin download (must use full API URL, not relative) + const pluginUrl = `${API_BASE_URL}/plugins/igny8-wp-bridge/download/`; window.open(pluginUrl, '_blank'); toast.success('Plugin download started'); }; diff --git a/igny8-wp-bridge.zip b/igny8-wp-bridge.zip deleted file mode 100644 index 9139c7fabeafa1246792270bf4e88af3a5e39a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165426 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 Vz#JR`xe5Gq0A83B1OFNV`9JRPp(OwS diff --git a/igny8-wp-bridge/tester b/igny8-wp-bridge/tester deleted file mode 100644 index bf7e8990..00000000 --- a/igny8-wp-bridge/tester +++ /dev/null @@ -1 +0,0 @@ -asdasd diff --git a/igny8-wp-bridge/admin/assets/css/admin.css b/plugins/wordpress/source/igny8-wp-bridge/admin/assets/css/admin.css similarity index 100% rename from igny8-wp-bridge/admin/assets/css/admin.css rename to plugins/wordpress/source/igny8-wp-bridge/admin/assets/css/admin.css diff --git a/igny8-wp-bridge/admin/assets/js/admin.js b/plugins/wordpress/source/igny8-wp-bridge/admin/assets/js/admin.js similarity index 100% rename from igny8-wp-bridge/admin/assets/js/admin.js rename to plugins/wordpress/source/igny8-wp-bridge/admin/assets/js/admin.js diff --git a/igny8-wp-bridge/admin/assets/js/post-editor.js b/plugins/wordpress/source/igny8-wp-bridge/admin/assets/js/post-editor.js similarity index 100% rename from igny8-wp-bridge/admin/assets/js/post-editor.js rename to plugins/wordpress/source/igny8-wp-bridge/admin/assets/js/post-editor.js diff --git a/igny8-wp-bridge/admin/class-admin-columns.php b/plugins/wordpress/source/igny8-wp-bridge/admin/class-admin-columns.php similarity index 100% rename from igny8-wp-bridge/admin/class-admin-columns.php rename to plugins/wordpress/source/igny8-wp-bridge/admin/class-admin-columns.php diff --git a/igny8-wp-bridge/admin/class-admin.php b/plugins/wordpress/source/igny8-wp-bridge/admin/class-admin.php similarity index 100% rename from igny8-wp-bridge/admin/class-admin.php rename to plugins/wordpress/source/igny8-wp-bridge/admin/class-admin.php diff --git a/igny8-wp-bridge/admin/class-post-meta-boxes.php b/plugins/wordpress/source/igny8-wp-bridge/admin/class-post-meta-boxes.php similarity index 100% rename from igny8-wp-bridge/admin/class-post-meta-boxes.php rename to plugins/wordpress/source/igny8-wp-bridge/admin/class-post-meta-boxes.php diff --git a/igny8-wp-bridge/admin/class-post-meta-boxes.php.bak b/plugins/wordpress/source/igny8-wp-bridge/admin/class-post-meta-boxes.php.bak similarity index 100% rename from igny8-wp-bridge/admin/class-post-meta-boxes.php.bak rename to plugins/wordpress/source/igny8-wp-bridge/admin/class-post-meta-boxes.php.bak diff --git a/igny8-wp-bridge/admin/settings.php b/plugins/wordpress/source/igny8-wp-bridge/admin/settings.php similarity index 100% rename from igny8-wp-bridge/admin/settings.php rename to plugins/wordpress/source/igny8-wp-bridge/admin/settings.php diff --git a/igny8-wp-bridge/data/link-graph.php b/plugins/wordpress/source/igny8-wp-bridge/data/link-graph.php similarity index 100% rename from igny8-wp-bridge/data/link-graph.php rename to plugins/wordpress/source/igny8-wp-bridge/data/link-graph.php diff --git a/igny8-wp-bridge/data/semantic-mapping.php b/plugins/wordpress/source/igny8-wp-bridge/data/semantic-mapping.php similarity index 100% rename from igny8-wp-bridge/data/semantic-mapping.php rename to plugins/wordpress/source/igny8-wp-bridge/data/semantic-mapping.php diff --git a/igny8-wp-bridge/data/site-collection.php b/plugins/wordpress/source/igny8-wp-bridge/data/site-collection.php similarity index 100% rename from igny8-wp-bridge/data/site-collection.php rename to plugins/wordpress/source/igny8-wp-bridge/data/site-collection.php diff --git a/igny8-wp-bridge/data/woocommerce.php b/plugins/wordpress/source/igny8-wp-bridge/data/woocommerce.php similarity index 100% rename from igny8-wp-bridge/data/woocommerce.php rename to plugins/wordpress/source/igny8-wp-bridge/data/woocommerce.php diff --git a/igny8-wp-bridge/docs/ACTIONABLE-IMPLEMENTATION-PLAN.md b/plugins/wordpress/source/igny8-wp-bridge/docs/ACTIONABLE-IMPLEMENTATION-PLAN.md similarity index 100% rename from igny8-wp-bridge/docs/ACTIONABLE-IMPLEMENTATION-PLAN.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/ACTIONABLE-IMPLEMENTATION-PLAN.md diff --git a/igny8-wp-bridge/docs/AUTHENTICATION-AUDIT.md b/plugins/wordpress/source/igny8-wp-bridge/docs/AUTHENTICATION-AUDIT.md similarity index 100% rename from igny8-wp-bridge/docs/AUTHENTICATION-AUDIT.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/AUTHENTICATION-AUDIT.md diff --git a/igny8-wp-bridge/docs/COMPLETE-PUBLICATION-AUDIT.md b/plugins/wordpress/source/igny8-wp-bridge/docs/COMPLETE-PUBLICATION-AUDIT.md similarity index 100% rename from igny8-wp-bridge/docs/COMPLETE-PUBLICATION-AUDIT.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/COMPLETE-PUBLICATION-AUDIT.md diff --git a/igny8-wp-bridge/docs/DEBUGGING-GUIDE-2025-12-01.md b/plugins/wordpress/source/igny8-wp-bridge/docs/DEBUGGING-GUIDE-2025-12-01.md similarity index 100% rename from igny8-wp-bridge/docs/DEBUGGING-GUIDE-2025-12-01.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/DEBUGGING-GUIDE-2025-12-01.md diff --git a/igny8-wp-bridge/docs/FIXES-APPLIED-2025-11-30.md b/plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-2025-11-30.md similarity index 100% rename from igny8-wp-bridge/docs/FIXES-APPLIED-2025-11-30.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-2025-11-30.md diff --git a/igny8-wp-bridge/docs/FIXES-APPLIED-2025-12-01.md b/plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-2025-12-01.md similarity index 100% rename from igny8-wp-bridge/docs/FIXES-APPLIED-2025-12-01.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-2025-12-01.md diff --git a/igny8-wp-bridge/docs/FIXES-APPLIED-CONTENT-PUBLISHING.md b/plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-CONTENT-PUBLISHING.md similarity index 100% rename from igny8-wp-bridge/docs/FIXES-APPLIED-CONTENT-PUBLISHING.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-APPLIED-CONTENT-PUBLISHING.md diff --git a/igny8-wp-bridge/docs/FIXES-PUBLISH-FAILURE.md b/plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-PUBLISH-FAILURE.md similarity index 100% rename from igny8-wp-bridge/docs/FIXES-PUBLISH-FAILURE.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/FIXES-PUBLISH-FAILURE.md diff --git a/igny8-wp-bridge/docs/Plan-based-on-audit.md b/plugins/wordpress/source/igny8-wp-bridge/docs/Plan-based-on-audit.md similarity index 100% rename from igny8-wp-bridge/docs/Plan-based-on-audit.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/Plan-based-on-audit.md diff --git a/igny8-wp-bridge/docs/SYNC-DATA-FLOW-DIAGRAM.md b/plugins/wordpress/source/igny8-wp-bridge/docs/SYNC-DATA-FLOW-DIAGRAM.md similarity index 100% rename from igny8-wp-bridge/docs/SYNC-DATA-FLOW-DIAGRAM.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/SYNC-DATA-FLOW-DIAGRAM.md diff --git a/igny8-wp-bridge/docs/WORDPRESS-PLUGIN-INTEGRATION.md b/plugins/wordpress/source/igny8-wp-bridge/docs/WORDPRESS-PLUGIN-INTEGRATION.md similarity index 100% rename from igny8-wp-bridge/docs/WORDPRESS-PLUGIN-INTEGRATION.md rename to plugins/wordpress/source/igny8-wp-bridge/docs/WORDPRESS-PLUGIN-INTEGRATION.md diff --git a/igny8-wp-bridge/igny8-bridge.php b/plugins/wordpress/source/igny8-wp-bridge/igny8-bridge.php similarity index 93% rename from igny8-wp-bridge/igny8-bridge.php rename to plugins/wordpress/source/igny8-wp-bridge/igny8-bridge.php index 35ccd1be..513a385c 100644 --- a/igny8-wp-bridge/igny8-bridge.php +++ b/plugins/wordpress/source/igny8-wp-bridge/igny8-bridge.php @@ -85,6 +85,7 @@ class Igny8Bridge { require_once IGNY8_BRIDGE_PLUGIN_DIR . 'includes/class-igny8-api.php'; require_once IGNY8_BRIDGE_PLUGIN_DIR . 'includes/class-igny8-site.php'; require_once IGNY8_BRIDGE_PLUGIN_DIR . 'includes/class-igny8-rest-api.php'; + require_once IGNY8_BRIDGE_PLUGIN_DIR . 'includes/class-igny8-updater.php'; // Webhooks removed - using API key authentication only // Webhook logs (used in admin and frontend) @@ -135,6 +136,15 @@ class Igny8Bridge { if (is_admin()) { Igny8Admin::get_instance(); } + + // Initialize auto-updater + if (class_exists('Igny8_Updater')) { + new Igny8_Updater( + IGNY8_BRIDGE_PLUGIN_FILE, + IGNY8_BRIDGE_VERSION, + 'https://api.igny8.com/api/plugins/' + ); + } } /** diff --git a/igny8-wp-bridge/includes/class-igny8-api.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-api.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-api.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-api.php diff --git a/igny8-wp-bridge/includes/class-igny8-link-queue.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-link-queue.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-link-queue.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-link-queue.php diff --git a/igny8-wp-bridge/includes/class-igny8-logger.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-logger.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-logger.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-logger.php diff --git a/igny8-wp-bridge/includes/class-igny8-rest-api.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-rest-api.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-rest-api.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-rest-api.php diff --git a/igny8-wp-bridge/includes/class-igny8-site.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-site.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-site.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-site.php diff --git a/igny8-wp-bridge/includes/class-igny8-template-loader.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-template-loader.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-template-loader.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-template-loader.php diff --git a/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-updater.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-updater.php new file mode 100644 index 00000000..77c1c79c --- /dev/null +++ b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-updater.php @@ -0,0 +1,197 @@ +plugin_file = $plugin_file; + $this->version = $version; + $this->api_url = trailingslashit($api_url); + + // Hook into WordPress update system + add_filter('pre_set_site_transient_update_plugins', array($this, 'check_for_updates')); + add_filter('plugins_api', array($this, 'plugin_info'), 10, 3); + } + + /** + * Check for plugin updates + * + * @param object $transient Update transient + * @return object Modified transient + */ + public function check_for_updates($transient) { + if (empty($transient->checked)) { + return $transient; + } + + // Get update info from IGNY8 API + $update_info = $this->get_update_info(); + + if (!$update_info || !isset($update_info['update_available'])) { + return $transient; + } + + if ($update_info['update_available'] === true) { + $plugin_basename = plugin_basename($this->plugin_file); + + $transient->response[$plugin_basename] = (object) array( + 'slug' => $this->plugin_slug, + 'new_version' => $update_info['latest_version'], + 'package' => $update_info['download_url'], + 'url' => $update_info['info_url'] ?? '', + 'tested' => $update_info['tested'] ?? '', + 'requires_php' => $update_info['requires_php'] ?? '', + ); + } + + return $transient; + } + + /** + * Provide plugin information for update screen + * + * @param false|object|array $result The result object or array + * @param string $action The type of information being requested + * @param object $args Plugin API arguments + * @return false|object Modified result + */ + public function plugin_info($result, $action, $args) { + if ($action !== 'plugin_information') { + return $result; + } + + if (!isset($args->slug) || $args->slug !== $this->plugin_slug) { + return $result; + } + + // Get plugin info from IGNY8 API + $info = $this->get_plugin_info(); + + if (!$info) { + return $result; + } + + return (object) array( + 'name' => $info['name'] ?? 'IGNY8 WordPress Bridge', + 'slug' => $this->plugin_slug, + 'version' => $info['version'] ?? $this->version, + 'author' => 'IGNY8', + 'author_profile' => 'https://igny8.com', + 'homepage' => 'https://igny8.com', + 'sections' => array( + 'description' => $info['description'] ?? '', + 'changelog' => $info['changelog'] ?? '', + ), + 'download_link' => $info['download_url'] ?? '', + 'tested' => $info['tested'] ?? '', + 'requires_php' => $info['requires_php'] ?? '7.4', + ); + } + + /** + * Get update information from IGNY8 API + * + * @return array|false Update info or false on failure + */ + private function get_update_info() { + $url = $this->api_url . $this->plugin_slug . '/check-update/'; + + $response = wp_remote_get($url, array( + 'timeout' => 10, + 'headers' => array( + 'X-IGNY8-Site-ID' => get_option('igny8_site_id'), + 'X-IGNY8-API-Key' => get_option('igny8_api_key'), + ), + 'body' => array( + 'current_version' => $this->version, + ), + )); + + if (is_wp_error($response)) { + return false; + } + + $code = wp_remote_retrieve_response_code($response); + if ($code !== 200) { + return false; + } + + $body = wp_remote_retrieve_body($response); + $data = json_decode($body, true); + + return $data ?: false; + } + + /** + * Get plugin information from IGNY8 API + * + * @return array|false Plugin info or false on failure + */ + private function get_plugin_info() { + $url = $this->api_url . $this->plugin_slug . '/info/'; + + $response = wp_remote_get($url, array( + 'timeout' => 10, + )); + + if (is_wp_error($response)) { + return false; + } + + $code = wp_remote_retrieve_response_code($response); + if ($code !== 200) { + return false; + } + + $body = wp_remote_retrieve_body($response); + $data = json_decode($body, true); + + return $data ?: false; + } +} diff --git a/igny8-wp-bridge/includes/class-igny8-webhook-logs.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-webhook-logs.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-webhook-logs.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-webhook-logs.php diff --git a/igny8-wp-bridge/includes/class-igny8-webhooks.php b/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-webhooks.php similarity index 100% rename from igny8-wp-bridge/includes/class-igny8-webhooks.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-webhooks.php diff --git a/igny8-wp-bridge/includes/functions.php b/plugins/wordpress/source/igny8-wp-bridge/includes/functions.php similarity index 100% rename from igny8-wp-bridge/includes/functions.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/functions.php diff --git a/igny8-wp-bridge/includes/template-functions.php b/plugins/wordpress/source/igny8-wp-bridge/includes/template-functions.php similarity index 100% rename from igny8-wp-bridge/includes/template-functions.php rename to plugins/wordpress/source/igny8-wp-bridge/includes/template-functions.php diff --git a/igny8-wp-bridge/languages/igny8-bridge.pot b/plugins/wordpress/source/igny8-wp-bridge/languages/igny8-bridge.pot similarity index 100% rename from igny8-wp-bridge/languages/igny8-bridge.pot rename to plugins/wordpress/source/igny8-wp-bridge/languages/igny8-bridge.pot diff --git a/igny8-wp-bridge/sync/hooks.php b/plugins/wordpress/source/igny8-wp-bridge/sync/hooks.php similarity index 100% rename from igny8-wp-bridge/sync/hooks.php rename to plugins/wordpress/source/igny8-wp-bridge/sync/hooks.php diff --git a/igny8-wp-bridge/sync/igny8-to-wp.php b/plugins/wordpress/source/igny8-wp-bridge/sync/igny8-to-wp.php similarity index 100% rename from igny8-wp-bridge/sync/igny8-to-wp.php rename to plugins/wordpress/source/igny8-wp-bridge/sync/igny8-to-wp.php diff --git a/igny8-wp-bridge/sync/post-sync.php b/plugins/wordpress/source/igny8-wp-bridge/sync/post-sync.php similarity index 100% rename from igny8-wp-bridge/sync/post-sync.php rename to plugins/wordpress/source/igny8-wp-bridge/sync/post-sync.php diff --git a/igny8-wp-bridge/sync/taxonomy-sync.php b/plugins/wordpress/source/igny8-wp-bridge/sync/taxonomy-sync.php similarity index 100% rename from igny8-wp-bridge/sync/taxonomy-sync.php rename to plugins/wordpress/source/igny8-wp-bridge/sync/taxonomy-sync.php diff --git a/igny8-wp-bridge/templates/README.md b/plugins/wordpress/source/igny8-wp-bridge/templates/README.md similarity index 100% rename from igny8-wp-bridge/templates/README.md rename to plugins/wordpress/source/igny8-wp-bridge/templates/README.md diff --git a/igny8-wp-bridge/templates/assets/css/igny8-content-template.css b/plugins/wordpress/source/igny8-wp-bridge/templates/assets/css/igny8-content-template.css similarity index 100% rename from igny8-wp-bridge/templates/assets/css/igny8-content-template.css rename to plugins/wordpress/source/igny8-wp-bridge/templates/assets/css/igny8-content-template.css diff --git a/igny8-wp-bridge/templates/assets/js/igny8-content-template.js b/plugins/wordpress/source/igny8-wp-bridge/templates/assets/js/igny8-content-template.js similarity index 100% rename from igny8-wp-bridge/templates/assets/js/igny8-content-template.js rename to plugins/wordpress/source/igny8-wp-bridge/templates/assets/js/igny8-content-template.js diff --git a/igny8-wp-bridge/templates/parts/igny8-content-sections.php b/plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-content-sections.php similarity index 100% rename from igny8-wp-bridge/templates/parts/igny8-content-sections.php rename to plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-content-sections.php diff --git a/igny8-wp-bridge/templates/parts/igny8-featured-image.php b/plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-featured-image.php similarity index 100% rename from igny8-wp-bridge/templates/parts/igny8-featured-image.php rename to plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-featured-image.php diff --git a/igny8-wp-bridge/templates/parts/igny8-header.php b/plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-header.php similarity index 100% rename from igny8-wp-bridge/templates/parts/igny8-header.php rename to plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-header.php diff --git a/igny8-wp-bridge/templates/parts/igny8-metadata.php b/plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-metadata.php similarity index 100% rename from igny8-wp-bridge/templates/parts/igny8-metadata.php rename to plugins/wordpress/source/igny8-wp-bridge/templates/parts/igny8-metadata.php diff --git a/igny8-wp-bridge/templates/single-igny8-content.php b/plugins/wordpress/source/igny8-wp-bridge/templates/single-igny8-content.php similarity index 100% rename from igny8-wp-bridge/templates/single-igny8-content.php rename to plugins/wordpress/source/igny8-wp-bridge/templates/single-igny8-content.php diff --git a/igny8-wp-bridge/tests/test-api-authentication.php b/plugins/wordpress/source/igny8-wp-bridge/tests/test-api-authentication.php similarity index 100% rename from igny8-wp-bridge/tests/test-api-authentication.php rename to plugins/wordpress/source/igny8-wp-bridge/tests/test-api-authentication.php diff --git a/igny8-wp-bridge/tests/test-revoke-api-key.php b/plugins/wordpress/source/igny8-wp-bridge/tests/test-revoke-api-key.php similarity index 100% rename from igny8-wp-bridge/tests/test-revoke-api-key.php rename to plugins/wordpress/source/igny8-wp-bridge/tests/test-revoke-api-key.php diff --git a/igny8-wp-bridge/tests/test-site-metadata.php b/plugins/wordpress/source/igny8-wp-bridge/tests/test-site-metadata.php similarity index 100% rename from igny8-wp-bridge/tests/test-site-metadata.php rename to plugins/wordpress/source/igny8-wp-bridge/tests/test-site-metadata.php diff --git a/igny8-wp-bridge/tests/test-sync-structure.php b/plugins/wordpress/source/igny8-wp-bridge/tests/test-sync-structure.php similarity index 100% rename from igny8-wp-bridge/tests/test-sync-structure.php rename to plugins/wordpress/source/igny8-wp-bridge/tests/test-sync-structure.php diff --git a/igny8-wp-bridge/uninstall.php b/plugins/wordpress/source/igny8-wp-bridge/uninstall.php similarity index 100% rename from igny8-wp-bridge/uninstall.php rename to plugins/wordpress/source/igny8-wp-bridge/uninstall.php