231 lines
No EOL
5.4 KiB
Rust
231 lines
No EOL
5.4 KiB
Rust
/// Module Creator pour outils créateurs SoundCloud-like
|
|
use std::collections::HashMap;
|
|
use std::time::SystemTime;
|
|
use serde::{Serialize, Deserialize};
|
|
use crate::error::AppError;
|
|
|
|
/// Dashboard créateur principal
|
|
#[derive(Debug, Clone)]
|
|
pub struct CreatorDashboard {
|
|
pub analytics: CreatorAnalytics,
|
|
pub monetization: CreatorMonetization,
|
|
pub tools: CreatorTools,
|
|
}
|
|
|
|
/// Analytics pour créateurs
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct CreatorAnalytics {
|
|
pub total_plays: u64,
|
|
pub total_likes: u64,
|
|
pub follower_count: u64,
|
|
pub monthly_revenue: f64,
|
|
pub top_tracks: Vec<TrackStats>,
|
|
}
|
|
|
|
/// Statistiques de track
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct TrackStats {
|
|
pub track_id: u64,
|
|
pub title: String,
|
|
pub plays: u64,
|
|
pub likes: u64,
|
|
pub revenue: f64,
|
|
}
|
|
|
|
/// Monétisation créateur
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct CreatorMonetization {
|
|
pub total_earnings: f64,
|
|
pub monthly_earnings: f64,
|
|
pub payout_threshold: f64,
|
|
pub next_payout_date: SystemTime,
|
|
}
|
|
|
|
/// Outils créateurs
|
|
#[derive(Debug, Clone)]
|
|
pub struct CreatorTools {
|
|
pub audio_editor: AudioEditor,
|
|
pub collaboration_tools: CollaborationTools,
|
|
}
|
|
|
|
/// Éditeur audio intégré
|
|
#[derive(Debug, Clone)]
|
|
pub struct AudioEditor {
|
|
pub available_effects: Vec<AudioEffect>,
|
|
pub presets: Vec<AudioPreset>,
|
|
}
|
|
|
|
/// Effet audio
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct AudioEffect {
|
|
pub name: String,
|
|
pub effect_type: EffectType,
|
|
pub parameters: HashMap<String, f32>,
|
|
}
|
|
|
|
/// Types d'effets
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub enum EffectType {
|
|
Reverb,
|
|
Delay,
|
|
Chorus,
|
|
EQ,
|
|
Compressor,
|
|
}
|
|
|
|
/// Preset audio
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct AudioPreset {
|
|
pub name: String,
|
|
pub description: String,
|
|
pub genre: String,
|
|
}
|
|
|
|
/// Outils de collaboration
|
|
#[derive(Debug, Clone)]
|
|
pub struct CollaborationTools {
|
|
pub projects: Vec<CollaborationProject>,
|
|
pub invitations: Vec<CollabInvitation>,
|
|
}
|
|
|
|
/// Projet de collaboration
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct CollaborationProject {
|
|
pub id: u64,
|
|
pub name: String,
|
|
pub owner_id: u64,
|
|
pub collaborators: Vec<u64>,
|
|
pub status: ProjectStatus,
|
|
pub created_at: SystemTime,
|
|
}
|
|
|
|
/// Statut de projet
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub enum ProjectStatus {
|
|
Draft,
|
|
InProgress,
|
|
Completed,
|
|
Published,
|
|
}
|
|
|
|
/// Invitation de collaboration
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct CollabInvitation {
|
|
pub id: u64,
|
|
pub project_id: u64,
|
|
pub inviter_id: u64,
|
|
pub invitee_id: u64,
|
|
pub status: InvitationStatus,
|
|
pub expires_at: SystemTime,
|
|
}
|
|
|
|
/// Statut d'invitation
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub enum InvitationStatus {
|
|
Pending,
|
|
Accepted,
|
|
Declined,
|
|
Expired,
|
|
}
|
|
|
|
impl CreatorDashboard {
|
|
pub fn new(creator_id: u64) -> Self {
|
|
Self {
|
|
analytics: CreatorAnalytics::new(creator_id),
|
|
monetization: CreatorMonetization::new(),
|
|
tools: CreatorTools::new(),
|
|
}
|
|
}
|
|
|
|
pub async fn get_analytics_summary(&self) -> Result<AnalyticsSummary, AppError> {
|
|
Ok(AnalyticsSummary {
|
|
total_plays: self.analytics.total_plays,
|
|
total_likes: self.analytics.total_likes,
|
|
follower_count: self.analytics.follower_count,
|
|
monthly_revenue: self.analytics.monthly_revenue,
|
|
top_track: self.analytics.top_tracks.first().map(|t| t.title.clone()),
|
|
})
|
|
}
|
|
}
|
|
|
|
/// Résumé analytics
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct AnalyticsSummary {
|
|
pub total_plays: u64,
|
|
pub total_likes: u64,
|
|
pub follower_count: u64,
|
|
pub monthly_revenue: f64,
|
|
pub top_track: Option<String>,
|
|
}
|
|
|
|
impl CreatorAnalytics {
|
|
pub fn new(_creator_id: u64) -> Self {
|
|
Self {
|
|
total_plays: 0,
|
|
total_likes: 0,
|
|
follower_count: 0,
|
|
monthly_revenue: 0.0,
|
|
top_tracks: Vec::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CreatorMonetization {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
total_earnings: 0.0,
|
|
monthly_earnings: 0.0,
|
|
payout_threshold: 100.0,
|
|
next_payout_date: SystemTime::now(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CreatorTools {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
audio_editor: AudioEditor::new(),
|
|
collaboration_tools: CollaborationTools::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl AudioEditor {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
available_effects: vec![
|
|
AudioEffect {
|
|
name: "Reverb".to_string(),
|
|
effect_type: EffectType::Reverb,
|
|
parameters: HashMap::new(),
|
|
},
|
|
AudioEffect {
|
|
name: "Compressor".to_string(),
|
|
effect_type: EffectType::Compressor,
|
|
parameters: HashMap::new(),
|
|
}
|
|
],
|
|
presets: Vec::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CollaborationTools {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
projects: Vec::new(),
|
|
invitations: Vec::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_creator_dashboard() {
|
|
let dashboard = CreatorDashboard::new(123);
|
|
assert_eq!(dashboard.analytics.total_plays, 0);
|
|
}
|
|
}
|