Files
MyClub/DOCS/FILES_MANAGEMENT_SYSTEM.md
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

268 lines
7.3 KiB
Markdown

# Files Management System
## Overview
A comprehensive files management system has been implemented to track, manage, and analyze all uploaded files on the server. The system provides:
- **Complete file inventory** with metadata tracking
- **Usage tracking** - know where each file is used across the system
- **Unused files detection** - identify orphaned files
- **Duplicate detection** - find duplicate files based on MD5 hash
- **Safe deletion** - warnings when deleting files that are in use
## Features
### 1. All Files Management
- View all uploaded files with metadata (filename, size, type, upload date, uploader)
- Search and filter by filename and MIME type
- Copy file URLs to clipboard
- Delete files with usage warnings
### 2. Unused Files Detection
- Automatically detects files that aren't referenced by any entity
- Helps clean up disk space by identifying orphaned files
- Safe to delete without breaking functionality
### 3. Duplicate Files Detection
- Identifies files with identical content using MD5 hashing
- Groups duplicates together for easy management
- Helps optimize storage by removing redundant files
### 4. File Usage Tracking
The system automatically tracks file usage across:
- **Articles** - image_url, attachments
- **Players** - image_url
- **Sponsors** - logo_url
- **Events** - image_url, file_url
- **Contacts** - image_url
- **Settings** - club_logo_url, default_og_image_url
- **Teams** - logo_url
### 5. Safe Deletion
- Before deleting, the system shows where the file is used
- Prevents accidental deletion of files in use
- Force delete option available with warnings
## Database Schema
### uploaded_files Table
```sql
- id: Primary key
- filename: Original filename
- file_path: Physical path on server
- file_url: Public URL
- file_size: Size in bytes
- mime_type: MIME type (image/jpeg, etc.)
- uploaded_by_id: User who uploaded (nullable)
- created_at, updated_at, deleted_at: Timestamps
```
### file_usages Table
```sql
- id: Primary key
- file_id: Reference to uploaded_files
- entity_type: Type of entity (article, player, sponsor, etc.)
- entity_id: ID of the entity
- field_name: Field where file is used (image_url, logo_url, etc.)
- created_at, updated_at: Timestamps
```
## API Endpoints
### Admin Routes (require admin role)
#### GET /api/v1/admin/files
List all files with usage information
- Query params: `search`, `mime_type`, `sort_by`, `sort_order`
#### GET /api/v1/admin/files/unused
Get files with no usage records
#### GET /api/v1/admin/files/duplicates
Get duplicate files grouped by MD5 hash
#### GET /api/v1/admin/files/:id/usages
Get detailed usage information for a specific file
#### DELETE /api/v1/admin/files/:id
Delete a file
- Query param: `force=true` to force delete even if in use
#### POST /api/v1/admin/files/scan
Scan uploads directory and sync with database
- Finds new files not in database
- Identifies orphaned database records
## Frontend
### Admin Page: /admin/soubory
The files management interface has three tabs:
1. **Všechny soubory (All Files)**
- Searchable and filterable file list
- Shows usage count for each file
- Quick actions: copy URL, delete
2. **Nepoužívané (Unused)**
- Lists files with zero usage
- Safe to delete without breaking functionality
- Helps with storage cleanup
3. **Duplicity (Duplicates)**
- Groups files by content hash
- Shows all duplicates in a group
- Helps identify redundant files
### Menu Location
Admin sidebar → Settings section → Soubory
## Automatic File Tracking
The system automatically tracks files when:
1. **File Upload** (`POST /api/v1/upload`)
- Creates database record for uploaded file
- Records uploader and metadata
2. **Entity Creation/Update**
- Articles: Tracks when saved with image_url or attachments
- Players: Tracks when saved with image_url
- Sponsors: Tracks when saved with logo_url
- Events: Tracks when saved with image_url or file_url
- Contacts: Tracks when saved with image_url
- Settings: Tracks when saved with logo or OG image
## File Tracker Service
Located in `internal/services/file_tracker.go`
### Key Functions
- `TrackFileUpload()` - Record new file upload
- `TrackFileUsage()` - Record file usage by entity
- `RemoveFileUsage()` - Remove usage record
- `UpdateFileUsages()` - Update all usages for an entity
- `TrackArticleFiles()` - Track files in articles
- `TrackPlayerFiles()` - Track files in players
- `TrackSponsorFiles()` - Track files in sponsors
- `TrackEventFiles()` - Track files in events
- `TrackContactFiles()` - Track files in contacts
- `TrackSettingsFiles()` - Track files in settings
- `TrackTeamFiles()` - Track files in teams
## Migration
Run database migration to create the tables:
```bash
# The migration will run automatically if RUN_MIGRATIONS=true in .env
# Or manually run:
migrate -path database/migrations -database "your-db-url" up
```
Migration files:
- `000010_create_files_table.up.sql` - Creates tables
- `000010_create_files_table.down.sql` - Drops tables
## Usage Examples
### Scan and sync files
```bash
POST /api/v1/admin/files/scan
```
### Find unused files
```bash
GET /api/v1/admin/files/unused
```
### Find duplicates
```bash
GET /api/v1/admin/files/duplicates
```
### Check where a file is used
```bash
GET /api/v1/admin/files/123/usages
```
### Delete a file (with warning if in use)
```bash
DELETE /api/v1/admin/files/123
```
### Force delete a file even if in use
```bash
DELETE /api/v1/admin/files/123?force=true
```
## Storage Optimization
1. **Scan for unused files**
- Navigate to Files admin page → Unused tab
- Review list of unused files
- Delete unused files safely
2. **Remove duplicates**
- Navigate to Files admin page → Duplicates tab
- Review duplicate groups
- Keep one copy, delete others
- Update references if needed
3. **Regular maintenance**
- Run periodic scans to sync database with filesystem
- Monitor file usage to identify patterns
- Clean up old unused files
## Security
- All file management endpoints require admin authentication
- File deletion shows usage warnings
- Force delete requires explicit confirmation
- Upload tracking includes user attribution
- Deleted files are soft-deleted in database (deleted_at timestamp)
## Technical Implementation
### Backend Components
1. **Models** (`internal/models/uploaded_file.go`)
- `UploadedFile` model
- `FileUsage` model
2. **Controller** (`internal/controllers/files_controller.go`)
- File listing and filtering
- Usage tracking
- Duplicate detection
- File deletion
3. **Service** (`internal/services/file_tracker.go`)
- Automatic tracking utilities
- Entity-specific tracking methods
4. **Routes** (`internal/routes/routes.go`)
- Admin routes for file management
### Frontend Components
1. **Service** (`frontend/src/services/files.ts`)
- API client functions
- Type definitions
2. **Admin Page** (`frontend/src/pages/admin/FilesAdminPage.tsx`)
- Files listing with tabs
- Search and filter UI
- Delete modals with warnings
- Usage display
3. **Navigation** (`frontend/src/components/admin/AdminSidebar.tsx`)
- Menu item in Settings section
## Future Enhancements
Potential improvements:
- Bulk operations (delete multiple files)
- File replacement (update all references)
- Storage statistics and analytics
- Automatic cleanup of old unused files
- Image optimization on upload
- CDN integration support
- File versioning