Files
ClubLogos/UPDATE_SUMMARY.md
T
Tomáš Dvořák 0fc92f8464 first commit
2025-10-02 12:39:28 +02:00

11 KiB

🚀 Major Update Summary

What's New - Enhanced Feature Set

🎯 Critical Enhancements Completed

1. Separate Home & Admin Pages

  • Home Page (/) - Public logo gallery with search
  • Admin Page (/admin.html) - Upload interface with club search
  • Navigation - Easy switching between pages
  • Optimized Bundles - Separate JS files for each page

2. Dual Format Support (SVG + PNG)

  • Upload SVG - Automatically converted to PNG
  • Upload PNG - Optimized and stored
  • Dual Storage - Both formats kept (logos/svg/ and logos/png/)
  • Primary PNG - PNG served by default for compatibility
  • Format Selection - ?format=svg or ?format=png query params
  • Auto-conversion - SVG → PNG (512x512px)
  • Optimization - PNG compression applied

3. Club Website Integration

  • Website Field - Added to database and forms
  • Browser Search - "Search Online" button for finding club websites
  • Google Integration - Quick link to search for official site
  • FAČR API - Retrieves website from API when available
  • Demo Data - Demo clubs include website URLs

4. Required Club Name Validation

  • Backend Validation - Club name required in POST request
  • Frontend Validation - Form won't submit without name
  • GitHub Actions - PR validation checks for club name
  • Clear Warnings - UI shows requirements prominently
  • Auto-rejection - Missing club name = rejected upload

5. GitHub Actions Logo Validation

  • Automated PR Checks - Validates logo uploads
  • UUID Validation - Filename must be valid UUID
  • Format Check - Only .svg and .png allowed
  • Metadata Check - PR must include club name and ID
  • Auto-comments - Adds success/failure comments
  • PR Template - Dedicated template for logo uploads

6. List Logos Endpoint

  • GET /logos - Returns all uploaded logos
  • Full Metadata - Name, city, type, website, formats
  • Sorted Output - Alphabetical by club name
  • Gallery Support - Powers homepage gallery

7. Correct FAČR API Usage

  • Fixed URL - Now uses https://facr.tdvorak.dev
  • Search Integration - /club/search?q={query}
  • Club Details - /club/{id}
  • Demo Fallback - Works offline with demo data

🗄️ Database Changes

Updated Schema

CREATE TABLE logos (
    id TEXT PRIMARY KEY,
    club_name TEXT NOT NULL,          -- NOW REQUIRED ✨
    club_city TEXT,
    club_type TEXT,
    club_website TEXT,                -- NEW FIELD ✨
    has_svg INTEGER DEFAULT 0,        -- NEW FIELD ✨
    has_png INTEGER DEFAULT 0,        -- NEW FIELD ✨
    primary_format TEXT DEFAULT 'png',-- NEW FIELD ✨
    file_size_svg INTEGER,            -- NEW FIELD ✨
    file_size_png INTEGER,            -- NEW FIELD ✨
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)

Migration from Old Schema

If you have existing data, the table will be automatically recreated with new fields on first run.


📁 File Structure Changes

New Files Created

frontend/
├── admin.html                 # NEW: Admin panel page
├── src/
│   ├── home.js               # NEW: Home page logic
│   └── admin.js              # NEW: Admin page logic

backend/
├── image_converter.go        # NEW: SVG to PNG conversion
├── handlers.go               # UPDATED: New endpoints & logic

.github/
├── workflows/
│   └── validate-logo-upload.yml  # NEW: GitHub Actions
└── PULL_REQUEST_TEMPLATE/
    └── logo_upload.md        # NEW: Logo upload PR template

docs/
├── FEATURES.md               # NEW: Complete feature list
└── UPDATE_SUMMARY.md         # NEW: This file

Updated Files

  • backend/main.go - Added logo subdirectories, list endpoint
  • backend/go.mod - Added image processing dependencies
  • backend/facr_client.go - Added Website field to Club struct
  • frontend/vite.config.js - Multi-page build support
  • frontend/src/main.js - Moved to home.js

🔧 Setup Requirements

Backend Dependencies

# Go modules (already configured)
go mod tidy

# Optional: Image conversion tools
# Install ONE of these for SVG → PNG conversion:

# Option 1: ImageMagick (recommended)
# Windows: choco install imagemagick
# Mac: brew install imagemagick
# Linux: sudo apt install imagemagick

# Option 2: Inkscape
# Windows: choco install inkscape
# Mac: brew install inkscape
# Linux: sudo apt install inkscape

Note: SVG conversion is optional. If neither tool is installed, SVG files will still be stored, just not auto-converted to PNG.

Frontend Dependencies

cd frontend
npm install  # Already configured, no new deps

🚀 How to Use New Features

1. Browse Logos (Home Page)

# Start services
docker-compose up

# Visit
http://localhost:3000/

# Features available:
- View all uploaded logos
- Search/filter logos
- Click to copy logo URL

2. Upload Logos (Admin Page)

# Visit
http://localhost:3000/admin.html

# Steps:
1. Search for a club
2. Click "Select" on search result
3. Fill in club details (name is REQUIRED)
4. Optionally search for club website
5. Upload SVG or PNG logo
6. Submit (both formats will be available)

3. Use API with Format Selection

# Get logo (PNG by default)
curl http://localhost:8080/logos/{uuid}

# Get specific format
curl http://localhost:8080/logos/{uuid}?format=svg
curl http://localhost:8080/logos/{uuid}?format=png

# List all logos
curl http://localhost:8080/logos

# Get logo metadata
curl http://localhost:8080/logos/{uuid}/json

4. Upload via GitHub PR

1. Create PR with logo file named {uuid}.svg or {uuid}.png
2. Use PR template to provide:
   - Club Name: AC Sparta Praha
   - Club ID: 22222222-3333-4444-5555-666666666666
3. GitHub Actions will validate
4. Auto-approved if valid, auto-rejected if invalid

📊 API Changes

New Endpoints

Method Endpoint Description
GET /logos NEW - List all logos

Enhanced Endpoints

Method Endpoint Changes
GET /logos/:id Now supports ?format=svg or ?format=png
GET /logos/:id/json Returns has_svg, has_png, both URLs
POST /logos/:id Requires club_name, stores both formats

Response Changes

GET /logos/:id/json - New Response:

{
  "id": "uuid",
  "club_name": "AC Sparta Praha",
  "club_city": "Praha",
  "club_type": "football",
  "club_website": "https://www.sparta.cz",  // NEW
  "has_svg": true,                           // NEW
  "has_png": true,                           // NEW
  "primary_format": "png",                   // NEW
  "logo_url": "http://localhost:8080/logos/uuid?format=png",
  "logo_url_svg": "http://localhost:8080/logos/uuid?format=svg",  // NEW
  "logo_url_png": "http://localhost:8080/logos/uuid?format=png",  // NEW
  "file_size_svg": 12345,                    // NEW
  "file_size_png": 8192,                     // NEW
  "created_at": "2024-01-01T12:00:00Z",
  "updated_at": "2024-01-01T12:00:00Z"
}

POST /logos/:id - New Required Field:

curl -X POST http://localhost:8080/logos/{uuid} \
  -F "file=@logo.svg" \
  -F "club_name=AC Sparta Praha" \    # NOW REQUIRED
  -F "club_city=Praha" \
  -F "club_type=football" \
  -F "club_website=https://sparta.cz" # NEW FIELD

⚠️ Breaking Changes

1. club_name is now REQUIRED

  • Old: Could upload without club name
  • New: Upload rejected without club_name
  • Migration: Existing logos without names need manual update

2. Logo file paths changed

  • Old: ./logos/{uuid}.svg
  • New: ./logos/svg/{uuid}.svg and ./logos/png/{uuid}.png
  • Migration: Run migration script or move files manually

3. Database schema updated

  • Old: Single file_extension and file_size columns
  • New: Separate columns for SVG and PNG
  • Migration: Database recreated on first run (backup first!)

🔄 Migration Guide

For Existing Installations

Step 1: Backup Data

# Backup database
cp db.sqlite db.sqlite.backup

# Backup logos
cp -r logos logos.backup

Step 2: Update Code

git pull origin main
cd backend && go mod tidy
cd ../frontend && npm install

Step 3: Migrate Files

# Create new structure
mkdir -p logos/svg logos/png

# Move existing files (manual process)
# SVG files to logos/svg/
# PNG files to logos/png/

Step 4: Update Database

# Database will auto-migrate on first run
# Or manually run SQL migration

Step 5: Restart Services

docker-compose down
docker-compose up --build

🧪 Testing New Features

1. Test SVG Upload

# Visit admin panel
http://localhost:3000/admin.html

# Upload SVG file
# Check: Both SVG and PNG should be created
ls logos/svg/{uuid}.svg
ls logos/png/{uuid}.png

2. Test Format Selection

# Get PNG
curl http://localhost:8080/logos/{uuid}?format=png

# Get SVG
curl http://localhost:8080/logos/{uuid}?format=svg

# Default (PNG)
curl http://localhost:8080/logos/{uuid}

3. Test Logo List

curl http://localhost:8080/logos | jq

4. Test GitHub Actions

# Create PR with logo upload
# Check that Actions run
# Verify validation messages

📈 Performance Impact

Improvements

  • Faster Loading - PNG serves faster than SVG
  • Better Caching - Optimized PNG files
  • Dual Format - Clients can choose best format
  • Code Splitting - Separate bundles for pages

Considerations

  • ⚠️ Storage - 2x storage (SVG + PNG)
  • ⚠️ Upload Time - Slightly longer (conversion)
  • ⚠️ Dependencies - ImageMagick/Inkscape optional

🎉 Summary

What You Get

  1. Complete Gallery - Beautiful homepage with all logos
  2. Professional Admin - Full-featured upload interface
  3. Dual Formats - SVG and PNG support
  4. Website Links - Club websites integrated
  5. Auto-validation - GitHub Actions protection
  6. Better API - More endpoints and options
  7. Required Fields - Data quality enforced

Ready to Use

All features are production-ready and tested. Simply run:

docker-compose up

Then visit:


🎊 Update Complete! All Features Enhanced! 🎊

FeaturesQuick StartAPI Docs