PHP code example of andydefer / laravel-reports

1. Go to this page and download the library: Download andydefer/laravel-reports library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

andydefer / laravel-reports example snippets


'providers' => [
    // ...
    AndyDefer\LaravelReports\ReportsServiceProvider::class,
],



return [
    /*
    |--------------------------------------------------------------------------
    | Enum Casts
    |--------------------------------------------------------------------------
    |
    | Define enum casts for specific tables and columns.
    | Each entry maps a table name and column to an enum class.
    |
    | The enum class must implement EnumerableInterface.
    |
    */
    'enum_casts' => [
        'reports' => [
            'type' => App\Enums\ReportType::class,
            'status' => App\Enums\ReportStatus::class,
        ],
    ],
];



namespace App\Enums;

use AndyDefer\Repository\Contracts\EnumerableInterface;

enum ReportType: string implements EnumerableInterface  // ⚠️ Interface obligatoire
{
    case SPAM = 'spam';
    case ABUSE = 'abuse';
    case OTHER = 'other';
    
    /**
     * Obligatoire - Retourne la valeur brute de l'énumération
     */
    public function getValue(): string
    {
        return $this->value;
    }
    
    /**
     * Optionnel - Méthode utilitaire pour l'affichage
     */
    public function getLabel(): string
    {
        return match ($this) {
            self::SPAM => 'Spam',
            self::ABUSE => 'Abus',
            self::OTHER => 'Autre',
        };
    }
}



namespace App\Enums;

use AndyDefer\Repository\Contracts\EnumerableInterface;

enum ReportStatus: string implements EnumerableInterface  // ⚠️ Interface obligatoire
{
    case PENDING = 'pending';
    case RESOLVED = 'resolved';
    case REJECTED = 'rejected';
    
    /**
     * Obligatoire - Retourne la valeur brute de l'énumération
     */
    public function getValue(): string
    {
        return $this->value;
    }
    
    /**
     * Optionnel - Méthode utilitaire pour l'affichage
     */
    public function getLabel(): string
    {
        return match ($this) {
            self::PENDING => 'En attente',
            self::RESOLVED => 'Résolu',
            self::REJECTED => 'Rejeté',
        };
    }
}

// config/repository.php
'enum_casts' => [
    'reports' => [
        'type' => App\Enums\ReportType::class,     // Votre enum de type
        'status' => App\Enums\ReportStatus::class, // Votre enum de statut
    ],
],

use AndyDefer\LaravelReports\Services\ReportService;
use App\Enums\ReportType;
use App\Enums\ReportStatus;
use AndyDefer\DomainStructures\Utils\StrictDataObject;

class PostController extends Controller
{
    public function report(ReportService $reportService, Post $post)
    {
        $user = auth()->user();
        
        // Signalement simple
        $report = $reportService->report(
            $user,                          // Utilisateur qui signale
            $post,                          // Contenu signalé
            ReportType::SPAM,               // Votre enum de type
            ReportStatus::PENDING,          // Votre enum de statut
            'Contenu promotionnel non sollicité'
        );
        
        // Signalement avec métadonnées
        $metadata = StrictDataObject::from([
            'ip' => request()->ip(),
            'user_agent' => request()->userAgent(),
            'page_url' => request()->url(),
        ]);
        
        $report = $reportService->report(
            $user,
            $post,
            ReportType::ABUSE,
            ReportStatus::PENDING,
            'Commentaires insultants',
            $metadata
        );
        
        return response()->json($report);
    }
}

// Vérifier si l'utilisateur a déjà signalé
$hasReported = $reportService->hasReported($user, $post);

if ($hasReported) {
    // L'utilisateur a déjà signalé ce contenu
}

// Récupérer tous les signalements pour un contenu
$reports = $reportService->getReportsFor($post);

// Récupérer uniquement les signalements en attente
$pendingReports = $reportService->getReportsFor($post, true);

// Récupérer les signalements d'un utilisateur
$userReports = $reportService->getReportsBy($user);

// Récupérer tous les signalements en attente
$pending = $reportService->getPendingReports();

// Récupérer les signalements par statut
$resolved = $reportService->getReportsByStatus(ReportStatus::RESOLVED);

// Récupérer les signalements par type
$spamReports = $reportService->getReportsByType(ReportType::SPAM);

// Mettre à jour le statut
$report = $reportService->updateStatus($reportId, ReportStatus::RESOLVED);

// Mettre à jour le type
$report = $reportService->updateType($reportId, ReportType::OTHER);

// Trouver un signalement par ID
$report = $reportService->find($reportId);

// Supprimer un signalement (soft delete)
$reportService->delete($reportId);

// Compter tous les signalements pour un contenu
$total = $reportService->countReports($post);

// Compter uniquement les signalements en attente
$pendingCount = $reportService->countReports($post, true);

// Compter par statut
$resolvedCount = $reportService->countByStatus(ReportStatus::RESOLVED);

// Compter par type
$spamCount = $reportService->countByType(ReportType::SPAM);

use AndyDefer\PhpVo\ValueObjects\DateTimeVO;

$date = DateTimeVO::from('2024-01-01 00:00:00');

// Récupérer les signalements mis à jour après une date
$recentReports = $reportService->getReportsUpdatedAfter($date);

$report = Report::find(1);

// Accès sous forme de Value Objects
$createdAt = $report->getCreatedAt();    // DateTimeVO
$updatedAt = $report->getUpdatedAt();    // DateTimeVO
$deletedAt = $report->getDeletedAt();    // DateTimeVO
$reviewedAt = $report->getReviewedAt();  // DateTimeVO
$metadata = $report->getMetadata();      // StrictDataObject
$type = $report->getType();              // EnumerableInterface (votre enum)
$status = $report->getStatus();          // EnumerableInterface (votre enum)

// Relations
$reporter = $report->reporter;    // Auteur (User, Admin, etc.)
$reportable = $report->reportable; // Objet signalé (Post, Article, etc.)

use AndyDefer\LaravelReports\Services\ReportService;
use App\Enums\ReportType;
use App\Enums\ReportStatus;

class ReportController extends Controller
{
    public function __construct(
        private readonly ReportService $reportService
    ) {}

    public function store(Request $request, Post $post)
    {
        $user = $request->user();
        $type = ReportType::tryFrom($request->input('type'));
        $reason = $request->input('reason');

        if (!$type) {
            return response()->json(['error' => 'Type de signalement invalide'], 400);
        }

        try {
            $report = $this->reportService->report(
                $user,
                $post,
                $type,
                ReportStatus::PENDING,
                $reason
            );

            return response()->json([
                'message' => 'Signalement créé avec succès',
                'report' => $report,
            ]);
        } catch (\RuntimeException $e) {
            return response()->json([
                'error' => $e->getMessage(),
            ], 422);
        }
    }

    public function stats(Post $post)
    {
        return response()->json([
            'total' => $this->reportService->countReports($post),
            'pending' => $this->reportService->countReports($post, true),
        ]);
    }

    public function resolve(int $id)
    {
        $report = $this->reportService->updateStatus($id, ReportStatus::RESOLVED);

        return response()->json([
            'message' => 'Signalement résolu',
            'report' => $report,
        ]);
    }
}
bash
php artisan vendor:publish --tag=reports-migrations
bash
php artisan migrate