veza/veza-backend-api/internal/models/admin.go
2025-12-03 20:29:37 +01:00

158 lines
7.1 KiB
Go

// veza-backend-api/internal/models/admin.go
package models
import (
"database/sql"
"time"
"github.com/google/uuid"
)
// DashboardStats represents admin dashboard statistics
type DashboardStats struct {
TotalUsers int `db:"total_users" json:"total_users"`
ActiveUsers int `db:"active_users" json:"active_users"`
TotalTracks int `db:"total_tracks" json:"total_tracks"`
PublicTracks int `db:"public_tracks" json:"public_tracks"`
TotalSharedResources int `db:"total_shared_resources" json:"total_shared_resources"`
TotalListings int `db:"total_listings" json:"total_listings"`
ActiveListings int `db:"active_listings" json:"active_listings"`
TotalOffers int `db:"total_offers" json:"total_offers"`
PendingOffers int `db:"pending_offers" json:"pending_offers"`
TotalMessages int `db:"total_messages" json:"total_messages"`
TotalRooms int `db:"total_rooms" json:"total_rooms"`
TotalProducts int `db:"total_products" json:"total_products"`
TotalCategories int `db:"total_categories" json:"total_categories"`
LastUpdated time.Time `json:"last_updated"`
}
// UserAnalytics represents detailed user analytics for admin
type UserAnalytics struct {
UserID uuid.UUID `db:"user_id" json:"user_id"`
Username string `db:"username" json:"username"`
Email string `db:"email" json:"email"`
Role string `db:"role" json:"role"`
TracksCount int `db:"tracks_count" json:"tracks_count"`
ResourcesCount int `db:"resources_count" json:"resources_count"`
ListingsCount int `db:"listings_count" json:"listings_count"`
MessagesCount int `db:"messages_count" json:"messages_count"`
ProductsCount int `db:"products_count" json:"products_count"`
RegistrationDate time.Time `db:"registration_date" json:"registration_date"`
LastActivity sql.NullTime `db:"last_activity" json:"last_activity,omitempty"`
IsActive bool `db:"is_active" json:"is_active"`
StorageUsed int64 `db:"storage_used" json:"storage_used,omitempty"`
}
// AdminContentAnalytics represents content analytics for admin dashboard
// (anciennement ContentAnalytics)
type AdminContentAnalytics struct {
TracksByMonth []MonthlyCount `json:"tracks_by_month"`
ResourcesByMonth []MonthlyCount `json:"resources_by_month"`
UsersByMonth []MonthlyCount `json:"users_by_month"`
PopularTags []TagCount `json:"popular_tags"`
TopUploaders []UploaderStats `json:"top_uploaders"`
CategoryStats []CategoryStats `json:"category_stats,omitempty"`
}
// MonthlyCount represents count data by month
type MonthlyCount struct {
Month string `db:"month" json:"month"`
Count int `db:"count" json:"count"`
}
// TagCount represents tag usage statistics
type TagCount struct {
Tag string `db:"tag" json:"tag"`
Count int `db:"count" json:"count"`
}
// UploaderStats represents uploader statistics
type UploaderStats struct {
UserID uuid.UUID `db:"user_id" json:"user_id"`
Username string `db:"username" json:"username"`
TracksCount int `db:"tracks_count" json:"tracks_count"`
ResourcesCount int `db:"resources_count" json:"resources_count"`
TotalUploads int `db:"total_uploads" json:"total_uploads"`
TotalDownloads int `db:"total_downloads" json:"total_downloads"`
}
// CategoryStats represents category statistics
type CategoryStats struct {
CategoryID int `db:"category_id" json:"category_id"`
CategoryName string `db:"category_name" json:"category_name"`
ProductCount int `db:"product_count" json:"product_count"`
UserCount int `db:"user_count" json:"user_count"`
}
// SystemHealth represents system health metrics
type SystemHealth struct {
DatabaseStatus string `json:"database_status"`
StorageUsed int64 `json:"storage_used"`
StorageAvailable int64 `json:"storage_available"`
MemoryUsage float64 `json:"memory_usage"`
CPUUsage float64 `json:"cpu_usage"`
ActiveConnections int `json:"active_connections"`
Uptime time.Duration `json:"uptime"`
LastBackup sql.NullTime `json:"last_backup,omitempty"`
ErrorCount int `json:"error_count"`
LastChecked time.Time `json:"last_checked"`
}
// AuditLog represents admin audit log entries
type AuditLog struct {
ID uuid.UUID `db:"id" json:"id"`
UserID uuid.UUID `db:"user_id" json:"user_id"`
Action string `db:"action" json:"action"`
ResourceType string `db:"resource_type" json:"resource_type"`
ResourceID *uuid.UUID `db:"resource_id" json:"resource_id,omitempty"`
Details sql.NullString `db:"details" json:"details,omitempty"`
IPAddress sql.NullString `db:"ip_address" json:"ip_address,omitempty"`
UserAgent sql.NullString `db:"user_agent" json:"user_agent,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
}
// AuditLogWithUser represents audit log with user information
type AuditLogWithUser struct {
AuditLog
Username string `db:"username" json:"username,omitempty"`
UserRole string `db:"user_role" json:"user_role,omitempty"`
}
// AdminSettings represents system settings manageable by admin
type AdminSettings struct {
ID uuid.UUID `db:"id" json:"id"`
Key string `db:"key" json:"key"`
Value string `db:"value" json:"value"`
Type string `db:"type" json:"type"` // string, int, bool, json
Description sql.NullString `db:"description" json:"description,omitempty"`
Category string `db:"category" json:"category"` // system, features, limits, etc.
IsPublic bool `db:"is_public" json:"is_public"`
UpdatedBy *uuid.UUID `db:"updated_by" json:"updated_by,omitempty"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
// ProductRequest types for admin operations
type CreateProductRequest struct {
Name string `json:"name" validate:"required,min=2,max=100"`
Description string `json:"description" validate:"max=500"`
Price float64 `json:"price" validate:"min=0"`
CategoryID int `json:"category_id" validate:"required,min=1"`
Brand string `json:"brand" validate:"max=50"`
Status string `json:"status" validate:"required,oneof=active inactive"`
}
type UpdateProductRequest struct {
Name *string `json:"name,omitempty" validate:"omitempty,min=2,max=100"`
Description *string `json:"description,omitempty" validate:"omitempty,max=500"`
Price *float64 `json:"price,omitempty" validate:"omitempty,min=0"`
CategoryID *int `json:"category_id,omitempty" validate:"omitempty,min=1"`
Brand *string `json:"brand,omitempty" validate:"omitempty,max=50"`
Status *string `json:"status,omitempty" validate:"omitempty,oneof=active inactive"`
}
type BulkUpdateRequest struct {
ProductIDs []int `json:"product_ids" validate:"required,min=1"`
Updates UpdateProductRequest `json:"updates"`
}
// Product est défini dans models/product.go