mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 10:42:57 +00:00
268 lines
7.3 KiB
Markdown
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
|