remib18 / webtoon-like

Projet de second semestre de L1 informatique.
1 stars 1 forks source link

Data Verification System #39

Closed remib18 closed 2 years ago

remib18 commented 2 years ago

Objectif Créer un système de vérification des données qui doit être modulaire pour s'adapter à chaque entité. S'exécute lors de l'enregistrement ou de la modification d'une donnée dans la BDD (cf. /src/utils/Database). En cas d'échec d'un test, renvoie une nouvelle erreur FailDataTestException sinon renvoie true.

Appel Uniquement dans /src/utils/Database. Il est conseillé de prévoir une méthode dédié à la vérification que l'on pourrait appeler runTests par exemple et qui serait appelée dans Database::create et Database::edit.

private static function runTests(EntityInterface $entity): bool {
        $res =true;
        foreach ($entity->getTypes() as $key => $type) {
            $res &= DataVerification::verify($entity->__toArray()[$key], ...$type);
        }
        return $res;
 }

Définition

Classe /src/utils/DataTesting/DataVerification :

class DataVerification {

    private function __construct(
        private mixed $data,
        private bool $nullable,
        private int $minLength,
        private int $maxLength,
        private ?string $regex
    ) {}

    public static function verify(mixed $data, DataType $type, bool $nullable, int|\DateTime|null $minLength = null, int|\DateTime|null $maxLength = null, ?string $regex = null) {
        $instance = new DataVerification($data, $nullable, $minLength, $maxLength, $regex);

        switch ($type) {
            case Data::string:
                return $instance->verifyString();
            case Data::email:
                return $instance->verifyEmail();
            ...
        }
    }

    private function verifyString(): bool {

    }

    private function verifyEmail(): bool {

    }

    ...

}

Enum /src/utils/DataTesting/DataType :

enum DataType
{

    case string;
    case email;
    case int;
    case float;
    case bool;
    case date;

}
remib18 commented 2 years ago

N'oubliez pas de modifier la méthode getTypes des différentes entités de la sorte : (exemple de User

public static function getTypes(): array
    {
        return [
            'userID' => ['type' => DataType::int, 'nullable' => false, 'minLength' => 0],
            'username' => ['type' => DataType::string, 'nullable' => false, 'minLength' => 5, 'maxLength' => 30],
            'email' => ['type' => DataType::email, 'nullable' => false],
            'registeredAt' => ['type' => DataType::date, 'nullable' => false]
        ];
    }

Il pourrait être pertinent de remplacer par la suite ces tableaux par des objets.

g4bey commented 2 years ago

@MPXH T'es dipo quand en voc? ca serait bien qu'on regarde ca ensemble samedi ou dimanche.

g4bey commented 2 years ago

N'oubliez pas de modifier la méthode getTypes des différentes entités de la sorte : (exemple de User

public static function getTypes(): array
    {
        return [
            'userID' => ['type' => DataType::int, 'nullable' => false, 'minLength' => 0],
            'username' => ['type' => DataType::string, 'nullable' => false, 'minLength' => 5, 'maxLength' => 30],
            'email' => ['type' => DataType::email, 'nullable' => false],
            'registeredAt' => ['type' => DataType::date, 'nullable' => false]
        ];
    }

Il pourrait être pertinent de remplacer par la suite ces tableaux par des objets.

Je propose:

enum Regex : string {
    case username = '^[a-zA-Z0-9_\-]';
}

class DataField {

    public DataType $type;
    public bool $nullable;
    public int $minLength;
    public int $maxLength;
    public Regex $pattern;

    public function __construct(DataType $type, bool $nullable, int $minLength, int $maxLength, regex $pattern) {
        ...
    }
}

Thoughts @remib18 je pense que preset des regex dans une enum serait propre. On pourrait avoir Regex::username dans le consctructeur, et les changements se rependent.

Je pense aussi que ca aiderait à verif de facon elegante car on a pas tes skills. xD

remib18 commented 2 years ago

N'oubliez pas de modifier la méthode getTypes des différentes entités de la sorte : (exemple de User


public static function getTypes(): array

    {

        return [

            'userID' => ['type' => DataType::int, 'nullable' => false, 'minLength' => 0],

            'username' => ['type' => DataType::string, 'nullable' => false, 'minLength' => 5, 'maxLength' => 30],

            'email' => ['type' => DataType::email, 'nullable' => false],

            'registeredAt' => ['type' => DataType::date, 'nullable' => false]

        ];

    }

Il pourrait être pertinent de remplacer par la suite ces tableaux par des objets.

Je propose:


enum Regex : string {

    case username = '^[a-zA-Z0-9_\-]';

}

class DataField {

    public DataType $type;

    public bool $nullable;

    public int $minLength;

    public int $maxLength;

    public Regex $pattern;

    public function __construct(DataType $type, bool $nullable, int $minLength, int $maxLength, regex $pattern) {

        ...

    }

}

Thoughts @remib18

je pense que preset des regex dans une enum serait propre.

On pourrait avoir Regex::username dans le consctructeur, et les changements se rependent.

Je pense aussi que ca aiderait à verif de facon elegante car on a pas tes skills. xD

A part un problème de typage au niveau des min/max (dans le cas d'une date, possibilité d'être non définit), ça me semble correcte.

En revanche, de mémoire les énumérations en php ne permettent pas le comportement que tu souhaites implémenter pour les regex. Essaies toujours car comme je l'ai dit c'est de mémoire. Sinon, utilise une classe avec des variables publiques statiques pour avoir le même comportement au niveau de l'appel.

Cependant, je pense que passer la regex en chaîne de caractères permet d'avoir plus de flexibilité et aussi une implémentation un peu plus simple... Libre à vous de décider comment procéder.