Assets Schema
Database tabellen voor de asset pipeline en ticket systeem.
Overzicht
Het asset systeem beheert:
- Asset categories - Organisatie van asset types
- Spec templates - Technische specificaties
- Tickets - Asset requests en status
- Files - Geüploade bestanden met versies
- Placeholders - Tijdelijke assets tracking
AssetCategory
│
└── AssetSpecTemplate
│
└── AssetTicket
│
├── AssetTicketComment
│
└── AssetFile (versies)
Designer (beheerders)
AssetPlaceholder (tracking)
Tabellen
asset_category
Asset categorieën voor organisatie.
#[table(name = asset_category, public)]
pub struct AssetCategory {
#[primary_key]
pub category_id: String, // "character", "item", "map"
pub display_name: String, // "Characters"
pub description: String,
pub icon: String, // Emoji of icon
pub sort_order: u8,
}
Categorieën:
| ID | Naam | Beschrijving |
|---|---|---|
| character | Characters | Speelbare karakters en NPCs |
| item | Items | Inventory items en tools |
| ui | UI | Interface elementen |
| map | Maps | Achtergronden en tilemaps |
| effect | Effects | Animaties en particles |
| audio | Audio | Muziek en geluiden |
asset_spec_template
Herbruikbare specificatie templates.
#[table(name = asset_spec_template, public)]
pub struct AssetSpecTemplate {
#[primary_key]
#[auto_inc]
pub id: u64,
pub category_id: String,
pub template_name: String, // "Character Sprite Sheet"
pub width: u32, // Pixels
pub height: u32,
pub format: String, // "png", "svg", "aseprite"
pub color_mode: String, // "rgba", "indexed"
pub max_file_size_kb: u32,
pub frame_count: Option<u32>, // Voor animaties
pub frame_columns: Option<u32>, // Sprite sheet columns
pub notes: String, // Extra vereisten
pub example_path: String, // Voorbeeld asset
}
Voorbeelden:
| Template | Dimensies | Format |
|---|---|---|
| Character Walk Cycle | 512x128 | PNG |
| Item Icon | 64x64 | PNG |
| UI Button | 200x60 | SVG |
| Background | 1920x1080 | PNG |
asset_ticket
Asset requests/tickets.
#[table(name = asset_ticket, public)]
pub struct AssetTicket {
#[primary_key]
#[auto_inc]
pub id: u64,
pub ticket_code: String, // "CHAR-001", "ITEM-042"
pub category_id: String,
pub spec_template_id: Option<u64>,
pub title: String, // "Player Character - Girl V2"
pub description: String,
pub reference_urls: String, // JSON array van URLs
pub style_notes: String, // Art style requirements
pub priority: u8, // 0=low, 1=normal, 2=high, 3=urgent
pub status: String, // Status enum
pub created_by: Identity,
pub assigned_to: Option<String>, // Designer email
pub created_at: Timestamp,
pub updated_at: Timestamp,
pub due_date: Option<String>,
pub tags: String, // JSON: ["forest", "cute"]
pub related_item_id: Option<String>,
pub related_map_id: Option<String>,
pub game_path: String, // "res://assets/characters/girl_v2.png"
}
Status Flow:
┌─────────┐
│ open │ ← Nieuw ticket
└────┬────┘
│ assign
▼
┌───────────────┐
│ in_progress │ ← Designer werkt eraan
└───────┬───────┘
│ submit
▼
┌──────────┐
│ review │ ← Wacht op review
└────┬─────┘
│
┌─────┴─────┐
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ approved │ │ revision │ → terug naar in_progress
└──────────┘ └──────────┘
asset_ticket_comment
Commentaar en feedback op tickets.
#[table(name = asset_ticket_comment, public)]
pub struct AssetTicketComment {
#[primary_key]
#[auto_inc]
pub id: u64,
pub ticket_id: u64,
pub author: Identity,
pub author_name: String,
pub content: String,
pub comment_type: String, // "comment", "revision_request", "approval"
pub created_at: Timestamp,
}
asset_file
Geüploade bestanden met versiebeheer.
#[table(name = asset_file, public)]
pub struct AssetFile {
#[primary_key]
#[auto_inc]
pub id: u64,
pub ticket_id: u64,
pub version: u32, // 1, 2, 3... voor revisies
pub filename: String, // Originele bestandsnaam
pub file_path: String, // Storage URL
pub file_size_bytes: u64,
pub width: u32,
pub height: u32,
pub mime_type: String,
pub uploaded_by: Identity,
pub uploaded_at: Timestamp,
pub is_approved: bool,
pub notes: String,
}
asset_placeholder
Tracking van placeholder vs echte assets.
#[table(name = asset_placeholder, public)]
pub struct AssetPlaceholder {
#[primary_key]
pub game_path: String, // "res://assets/items/honey_jar.png"
pub ticket_id: Option<u64>, // Linked ticket
pub placeholder_type: String, // "color", "text", "simple_shape"
pub placeholder_color: String, // "#FF5733"
pub description: String, // Wat dit moet worden
pub is_replaced: bool,
pub replaced_at: Option<Timestamp>,
}
designer
Designer accounts (apart van spelers).
#[table(name = designer, public)]
pub struct Designer {
#[primary_key]
pub email: String,
pub display_name: String,
pub role: String, // "artist", "animator", "lead"
pub specialties: String, // JSON: ["characters", "ui"]
pub is_active: bool,
pub created_at: Timestamp,
pub last_active: Timestamp,
}
Workflow
1. Ticket Aanmaken
{
"ticket_code": "CHAR-015",
"category_id": "character",
"title": "NPC - Bakker",
"description": "Vriendelijke bakker NPC voor het dorp",
"reference_urls": "[\"https://example.com/ref1.jpg\"]",
"style_notes": "Warm, uitnodigend, draagt schort",
"priority": 1,
"status": "open",
"game_path": "res://assets/characters/npc_baker.png"
}
2. Designer Toewijzen
UPDATE asset_ticket
SET assigned_to = 'designer@example.com',
status = 'in_progress'
WHERE id = 15
3. Asset Uploaden
{
"ticket_id": 15,
"version": 1,
"filename": "npc_baker_v1.png",
"file_path": "https://r2.storage/assets/...",
"file_size_bytes": 45600,
"width": 256,
"height": 512
}
4. Review & Approve
-- Na goedkeuring
UPDATE asset_ticket SET status = 'approved' WHERE id = 15;
UPDATE asset_file SET is_approved = true WHERE ticket_id = 15 AND version = 2;
UPDATE asset_placeholder SET is_replaced = true WHERE game_path = 'res://...';
Queries
Open tickets per categorie
SELECT category_id, COUNT(*) as count
FROM asset_ticket
WHERE status IN ('open', 'in_progress')
GROUP BY category_id
Designer workload
SELECT assigned_to, COUNT(*) as active_tickets
FROM asset_ticket
WHERE status = 'in_progress'
GROUP BY assigned_to