From 1d9e7078876e604a13adaf9d2547e186df1de54f Mon Sep 17 00:00:00 2001
From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr>
Date: Wed, 18 Sep 2019 14:23:45 +0200
Subject: [PATCH] Version avec une bdd postgres dans un service docker

---
 Dockerfile                           |  12 +---
 README.md                            |  23 ++++---
 composer.json                        |  12 ++--
 composer.lock                        |  79 ++++++++++-----------
 config/autoload/global.php           |   8 +--
 data/.gitignore                      |   1 +
 docker-compose.yml                   |  19 ++++++
 docker/db/1-schema.sql               |  64 +++++++++++++++++
 docker/db/2-data.sql                 |  30 ++++++++
 module/Demo/bin/create_demo_db.sh    |   8 ---
 module/Demo/config/module.config.php |  14 +++-
 module/Demo/data/db/demo.sqlite      | Bin 24576 -> 0 bytes
 module/Demo/data/demo.sqlite.sql     |  98 ---------------------------
 13 files changed, 185 insertions(+), 183 deletions(-)
 create mode 100644 docker/db/1-schema.sql
 create mode 100644 docker/db/2-data.sql
 delete mode 100755 module/Demo/bin/create_demo_db.sh
 delete mode 100755 module/Demo/data/db/demo.sqlite
 delete mode 100644 module/Demo/data/demo.sqlite.sql

diff --git a/Dockerfile b/Dockerfile
index 06ad62a..61f7e51 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,3 @@
-###########################################################################################
-#
-#                               Image pour le dev.
-#
-###########################################################################################
-
 ARG PHP_VERSION
 
 FROM unicaen-dev-php${PHP_VERSION}-apache
@@ -18,11 +12,7 @@ ENV APACHE_CONF_DIR=/etc/apache2 \
 ## Installation de packages requis.
 RUN apt-get update -qq && \
     apt-get install -y \
-        sqlite3 \
-        php${PHP_VERSION}-pdo-sqlite
-
-RUN pecl install ast && \
-    echo "extension=ast.so" > ${PHP_CONF_DIR}/cli/conf.d/ast.ini
+        php${PHP_VERSION}-pgsql
 
 # Nettoyage
 RUN apt-get autoremove -y && apt-get clean && rm -rf /tmp/* /var/tmp/*
diff --git a/README.md b/README.md
index 3c82b89..b42359a 100644
--- a/README.md
+++ b/README.md
@@ -11,20 +11,20 @@
 
 ## Module Demo
 
-Le module démo fournit une base de données de démonstration permettant d'avoir une authentification locale
-qui fonctionne.
+Le squelette d'application possède un module "démo" qui utilise une base de données PostgreSQL de démonstration 
+permettant d'avoir une authentification locale qui fonctionne. 
 
-Jetez un oeil à la base de données de démo présente dans le module 'Demo' :
-    
-    $ docker-compose run skeleton-application sqlite3 module/Demo/data/db/demo.sqlite ".schema"
-
-Interrogez la table `user` pour vérifier la présence de l'utilisateur local `demo`, exemple :
-    
-    $ docker-compose run skeleton-application sqlite3 module/Demo/data/db/demo.sqlite "select * from user;"
+Cette base de données est fournie par le service `db` (fichier de config `docker-compose.yml`).
+Il y a également un service `adminer` fournissant de quoi explorer la base de données avec l'outil 
+["Adminer"](https://www.adminer.org) en vous rendant à l'adresse `localhost:8432` et en utilisant les informations
+ de connexion à la bdd présentes dans le `docker-compose.yml`.
 
 ## Configuration du projet
 
-- Renommez `config/autoload/local.php.dist` en `local.php`. 
+- Renommez `config/autoload/local.php.dist` en `local.php` :
+```bash
+mv config/autoload/local.php.dist config/autoload/local.php
+```
 
 - Copiez dans votre dossier `config/autoload` les fichiers de configuration locaux et globaux `.dist`
   des bibliothèques utilisées sans leur extension `.dist` :
@@ -35,7 +35,8 @@ cp vendor/unicaen/auth/config/unicaen-auth.global.php.dist config/autoload/unica
 cp vendor/unicaen/auth/config/unicaen-auth.local.php.dist  config/autoload/unicaen-auth.local.php
 ```
 
-- Le cas échéant, reportez-vous aux docs des modules concernés pour adapter ces fichiers de configuration à vos besoins :
+- Le cas échéant, reportez-vous aux docs des modules concernés pour adapter ces fichiers de configuration 
+à vos besoins :
   - [unicaen/app](https://git.unicaen.fr/lib/unicaen/app)
   - [unicaen/auth](https://git.unicaen.fr/lib/unicaen/auth)
 
diff --git a/composer.json b/composer.json
index 3c38369..47d81d0 100755
--- a/composer.json
+++ b/composer.json
@@ -8,14 +8,14 @@
         }
     ],
     "require": {
-        "unicaen/app":           "dev-zf-3.x",
-        "unicaen/auth":          "dev-zf-3.x",
-        "unicaen/bjy-authorize": "dev-zf-3.x",
-        "unicaen/faq":           "dev-zf-3.x",
-        "unicaen/ldap":          "dev-zf-3.x"
+        "unicaen/app":           "^3.0",
+        "unicaen/auth":          "^3.0",
+        "unicaen/bjy-authorize": "^3.0",
+        "unicaen/faq":           "^3.0",
+        "unicaen/ldap":          "^3.0"
     },
     "require-dev": {
-        "zendframework/zend-test":              ">=2.3",
+        "zendframework/zend-test":              "^3.2",
         "phpunit/phpunit":                      ">=3.7",
         "zendframework/zend-developer-tools":   ">=1.0"
     },
diff --git a/composer.lock b/composer.lock
index 43d9a74..120ed69 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "472fe5bd83d98e8ce14043b863c18ace",
+    "content-hash": "a868570eddc575aa0674ec170b0b473f",
     "packages": [
         {
             "name": "beberlei/assert",
@@ -2176,11 +2176,11 @@
         },
         {
             "name": "unicaen/app",
-            "version": "dev-zf-3.x",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/app.git",
-                "reference": "f18f3a9ae51144c0bf5dc07b6139fba07314fc6a"
+                "reference": "fe92dcafbefbfdcdea019ef0c963b8b5efca4037"
             },
             "require": {
                 "beberlei/assert": "^2.9",
@@ -2236,22 +2236,22 @@
                 ]
             },
             "description": "Module de base des applications unicaen",
-            "time": "2019-09-16T09:49:44+00:00"
+            "time": "2019-09-16T13:15:55+00:00"
         },
         {
             "name": "unicaen/auth",
-            "version": "dev-zf-3.x",
+            "version": "3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/auth.git",
-                "reference": "12c05066041f8c305c1c95ac933ed95eb128401a"
+                "reference": "433bbe5a7d3f5089cfc390ea5cbef90b9a56186e"
             },
             "require": {
-                "beberlei/assert": "^2.9",
                 "jasig/phpcas": "^1.3",
+                "php": "7.3.*",
                 "ramsey/uuid": "^3.7",
-                "unicaen/app": "dev-zf-3.x",
-                "unicaen/bjy-authorize": "dev-zf-3.x"
+                "unicaen/app": "^3.0",
+                "unicaen/bjy-authorize": "^3.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "^5.6"
@@ -2267,19 +2267,19 @@
                 ]
             },
             "description": "Module d'authentification pour les applications Unicaen",
-            "time": "2019-09-11T09:05:45+00:00"
+            "time": "2019-09-18T12:02:04+00:00"
         },
         {
             "name": "unicaen/bjy-authorize",
-            "version": "dev-zf-3.x",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/bjy-authorize.git",
-                "reference": "790c5fddb1a3a89ed904faa633722c57c5c472f5"
+                "reference": "9480124324d8b1c6de56cdf27ab687fea2216c84"
             },
             "require": {
                 "doctrine/common": "^2.7",
-                "php": ">=5.6 || >=7.0",
+                "php": "7.3.*",
                 "zendframework/zend-cache": "^2.8",
                 "zendframework/zend-eventmanager": "^3.2",
                 "zendframework/zend-http": "^2.10",
@@ -2328,24 +2328,23 @@
                 "zf2",
                 "zfc-user"
             ],
-            "time": "2019-03-21T09:05:22+00:00"
+            "time": "2019-09-18T07:15:38+00:00"
         },
         {
             "name": "unicaen/faq",
-            "version": "dev-zf-3.x",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/faq.git",
-                "reference": "c6f03783941b0dd0c553a0e01cd84519959550e2"
+                "reference": "1caeeb64aa47aeaba737e06e221d1b82b380dd46"
             },
             "require": {
-                "unicaen/app": "dev-zf-3.x"
+                "unicaen/app": "^3.0"
             },
             "require-dev": {
                 "phpspec/prophecy": "^1.6",
                 "phpunit/phpunit": "^5.6",
-                "snapshotpl/zf-snap-event-debugger": "1.*",
-                "zendframework/zend-test": "^2.4 || ^3.0"
+                "zendframework/zend-test": "^3.0"
             },
             "type": "library",
             "autoload": {
@@ -2357,18 +2356,18 @@
                 ]
             },
             "description": "Module de foire aux questions",
-            "time": "2019-03-20T15:37:21+00:00"
+            "time": "2019-09-18T08:11:53+00:00"
         },
         {
             "name": "unicaen/ldap",
-            "version": "dev-zf-3.x",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
                 "url": "https://git.unicaen.fr/lib/unicaen/ldap.git",
-                "reference": "2dca4963d882e9e9ea590a34ed22de3b6d922941"
+                "reference": "26bcaef4f761087a975139b2d1e54e935869b78c"
             },
             "require": {
-                "php": "^5.6 || ^7.0",
+                "php": "7.3.*",
                 "zendframework/zend-config": "^3.2",
                 "zendframework/zend-i18n": "^2.9",
                 "zendframework/zend-ldap": "^2.10",
@@ -2380,7 +2379,7 @@
             },
             "require-dev": {
                 "phpunit/phpunit": ">=3.7",
-                "zendframework/zend-test": ">=2.2"
+                "zendframework/zend-test": "^3.2"
             },
             "type": "library",
             "autoload": {
@@ -2394,7 +2393,7 @@
                 ]
             },
             "description": "Module Ldap des applications Unicaen",
-            "time": "2019-05-23T13:04:14+00:00"
+            "time": "2019-09-18T09:15:50+00:00"
         },
         {
             "name": "zendframework/zend-authentication",
@@ -5452,16 +5451,16 @@
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "7.0.7",
+            "version": "7.0.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "7743bbcfff2a907e9ee4a25be13d0f8ec5e73800"
+                "reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7743bbcfff2a907e9ee4a25be13d0f8ec5e73800",
-                "reference": "7743bbcfff2a907e9ee4a25be13d0f8ec5e73800",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa0d179a13284c7420fc281fc32750e6cc7c9e2f",
+                "reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f",
                 "shasum": ""
             },
             "require": {
@@ -5470,7 +5469,7 @@
                 "php": "^7.2",
                 "phpunit/php-file-iterator": "^2.0.2",
                 "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-token-stream": "^3.1.0",
+                "phpunit/php-token-stream": "^3.1.1",
                 "sebastian/code-unit-reverse-lookup": "^1.0.1",
                 "sebastian/environment": "^4.2.2",
                 "sebastian/version": "^2.0.1",
@@ -5511,7 +5510,7 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2019-07-25T05:31:54+00:00"
+            "time": "2019-09-17T06:24:36+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
@@ -5655,16 +5654,16 @@
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "3.1.0",
+            "version": "3.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a"
+                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e899757bb3df5ff6e95089132f32cd59aac2220a",
-                "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
+                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
                 "shasum": ""
             },
             "require": {
@@ -5700,7 +5699,7 @@
             "keywords": [
                 "tokenizer"
             ],
-            "time": "2019-07-25T05:29:42+00:00"
+            "time": "2019-09-17T06:23:10+00:00"
         },
         {
             "name": "phpunit/phpunit",
@@ -6735,13 +6734,7 @@
     ],
     "aliases": [],
     "minimum-stability": "stable",
-    "stability-flags": {
-        "unicaen/app": 20,
-        "unicaen/auth": 20,
-        "unicaen/bjy-authorize": 20,
-        "unicaen/faq": 20,
-        "unicaen/ldap": 20
-    },
+    "stability-flags": [],
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": [],
diff --git a/config/autoload/global.php b/config/autoload/global.php
index 2ff1954..823bb91 100755
--- a/config/autoload/global.php
+++ b/config/autoload/global.php
@@ -1,6 +1,6 @@
 <?php
-return array(
-    'translator' => array(
+return [
+    'translator' => [
         'locale' => 'fr_FR',
-    ),
-);
+    ],
+];
diff --git a/data/.gitignore b/data/.gitignore
index ae8c28a..d20dcaf 100644
--- a/data/.gitignore
+++ b/data/.gitignore
@@ -1 +1,2 @@
 DoctrineORMModule/
+db/
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 1d96644..79216a4 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -14,3 +14,22 @@ services:
     volumes:
      - .:/app
     working_dir: /app
+
+  db:
+    image: postgres
+    restart: always
+    environment:
+      POSTGRES_USER: admin
+      POSTGRES_PASSWORD: admin
+      POSTGRES_DB: demo
+    ports:
+      - 8432:5432
+    volumes:
+      - ./data/db:/var/lib/postgresql/data
+      - ./docker/db/:/docker-entrypoint-initdb.d/
+
+  adminer:
+    image: adminer
+    restart: always
+    ports:
+      - 9080:8080
diff --git a/docker/db/1-schema.sql b/docker/db/1-schema.sql
new file mode 100644
index 0000000..4bb92b1
--- /dev/null
+++ b/docker/db/1-schema.sql
@@ -0,0 +1,64 @@
+CREATE TABLE "user" (
+                        id BIGSERIAL PRIMARY KEY,
+                        username VARCHAR(255) DEFAULT NULL,
+                        email VARCHAR(255) DEFAULT NULL,
+                        display_name VARCHAR(64) DEFAULT NULL,
+                        password VARCHAR(128) NOT NULL,
+                        state SMALLINT default 1
+) ;
+CREATE UNIQUE INDEX user_username_unique ON "user" (username);
+
+alter table "user" add PASSWORD_RESET_TOKEN varchar(256) default null;
+
+create unique index USER_PASSWORD_RESET_TOKEN_UN on "user" (PASSWORD_RESET_TOKEN);
+
+CREATE TABLE user_role (
+                           id BIGSERIAL PRIMARY KEY,
+                           role_id VARCHAR(64) NOT NULL,
+                           is_default SMALLINT NOT NULL DEFAULT 0,
+                           parent_id BIGINT DEFAULT NULL,
+                           ldap_filter varchar(255) DEFAULT NULL,
+                           FOREIGN KEY (parent_id) REFERENCES user_role (id) ON DELETE SET NULL
+);
+CREATE UNIQUE INDEX user_role_roleid_unique ON user_role (role_id);
+
+
+CREATE TABLE user_role_linker (
+                                  user_id BIGINT NOT NULL,
+                                  role_id BIGINT NOT NULL,
+                                  PRIMARY KEY (user_id, role_id),
+                                  FOREIGN KEY (user_id) REFERENCES "user" (id) ON DELETE CASCADE,
+                                  FOREIGN KEY (role_id) REFERENCES user_role (id) ON DELETE CASCADE
+);
+CREATE UNIQUE INDEX user_role_linker_unique ON user_role_linker (user_id, role_id);
+
+
+
+
+CREATE TABLE  IF NOT EXISTS categorie_privilege (
+  id      BIGSERIAL PRIMARY KEY,
+  code    VARCHAR(150) NOT NULL,
+  libelle VARCHAR(200) NOT NULL,
+  ordre   INT
+);
+CREATE UNIQUE INDEX categorie_privilege_unique ON categorie_privilege (code);
+
+
+CREATE TABLE IF NOT EXISTS privilege (
+  id            BIGSERIAL PRIMARY KEY,
+  categorie_id  BIGINT NOT NULL,
+  code          VARCHAR(150) NOT NULL,
+  libelle       VARCHAR(200) NOT NULL,
+  ordre         INT,
+  FOREIGN KEY (categorie_id) REFERENCES categorie_privilege (id) ON DELETE CASCADE
+);
+CREATE UNIQUE INDEX privilege_unique ON privilege (code);
+
+CREATE TABLE IF NOT EXISTS role_privilege (
+  role_id       BIGINT NOT NULL,
+  privilege_id  BIGINT NOT NULL,
+  PRIMARY KEY (role_id, privilege_id),
+  FOREIGN KEY (role_id) REFERENCES user_role (id) ON DELETE CASCADE,
+  FOREIGN KEY (privilege_id) REFERENCES privilege (id) ON DELETE CASCADE
+);
+CREATE UNIQUE INDEX role_privilege_unique ON role_privilege (role_id, privilege_id);
diff --git a/docker/db/2-data.sql b/docker/db/2-data.sql
new file mode 100644
index 0000000..c3433d0
--- /dev/null
+++ b/docker/db/2-data.sql
@@ -0,0 +1,30 @@
+
+-- Données
+
+INSERT INTO user_role (id, role_id, is_default, parent_id) VALUES
+(1, 'Standard', 1, NULL),
+(2, 'Gestionnaire', 0, 1),
+(3, 'Super-gestionnaire', 0, 2),
+(4, 'Administrateur', 0, 3);
+
+INSERT INTO categorie_privilege (id, code, libelle, ordre) VALUES
+(1, 'droit', 'Gestion des droits', 1);
+
+INSERT INTO privilege (id, categorie_id, code, libelle, ordre) VALUES
+(1, 1, 'role-visualisation', 'Rôles - Visualisation', 1),
+(2, 1, 'role-edition', 'Rôles - Édition', 2),
+(3, 1, 'privilege-visualisation', 'Privilèges - Visualisation', 3),
+(4, 1, 'privilege-edition', 'Privilèges - Édition', 4);
+
+INSERT INTO role_privilege (role_id, privilege_id) VALUES
+(4, 1),
+(4, 2),
+(4, 3),
+(4, 4);
+
+INSERT INTO "user" (username, email, display_name, password, state) VALUES
+    -- utilisateur demo/azerty
+    ('demo', 'demo@mail.fr', 'Demo Crite', '$2y$10$PxXnVLYnGEzEnfqPqRKJSe9AabocES2H4bBK5VzzJlzuj1rVt7Lwu', 1);
+
+INSERT INTO user_role_linker(user_id, role_id)
+SELECT u.id, r.id FROM "user" u, user_role r WHERE u.username = 'demo' and r.role_id = 'Standard';
diff --git a/module/Demo/bin/create_demo_db.sh b/module/Demo/bin/create_demo_db.sh
deleted file mode 100755
index 33ce16f..0000000
--- a/module/Demo/bin/create_demo_db.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-DIR=$(cd `dirname $0` && pwd)
-DBPATH=${DIR}/../data/db/demo.sqlite
-
-sqlite3 ${DBPATH} < ${DIR}/../data/demo.sqlite.sql && \
-chmod 777 ${DBPATH} && \
-chmod 777 `dirname ${DBPATH}`
diff --git a/module/Demo/config/module.config.php b/module/Demo/config/module.config.php
index 0466979..ae6f72a 100755
--- a/module/Demo/config/module.config.php
+++ b/module/Demo/config/module.config.php
@@ -3,16 +3,26 @@
 namespace Demo;
 
 return [
+    //
+    // ATTENTION: config Doctrine à déplacer dans `APP/config/autoload/`.
+    //
     'doctrine' => [
         'connection' => [
             'orm_default' => [
-                'driverClass' => 'Doctrine\DBAL\Driver\PDOSqlite\Driver',
+                'driverClass' => \Doctrine\DBAL\Driver\PDOPgSql\Driver::class,
                 'params' => [
-                    'path' => __DIR__ . '/../data/db/demo.sqlite',
+                    'host' => 'db',        //
+                    'user' => 'admin',     // cf. docker-compose.yml
+                    'password' => 'admin', //
+                    'dbname' => 'demo',    //
+                    'port' => '5432',
+                    'charset' => 'utf8',
+                    'driverOptions' => [1002 => 'SET NAMES utf8']
                 ],
             ],
         ],
     ],
+
     'bjyauthorize'    => [
         'guards'                => [
             'BjyAuthorize\Guard\Controller'         => [
diff --git a/module/Demo/data/db/demo.sqlite b/module/Demo/data/db/demo.sqlite
deleted file mode 100755
index cede42626ca8e68f5f2e81258866701abacae6d7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 24576
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
A$N&HU

diff --git a/module/Demo/data/demo.sqlite.sql b/module/Demo/data/demo.sqlite.sql
deleted file mode 100644
index 7de5346..0000000
--- a/module/Demo/data/demo.sqlite.sql
+++ /dev/null
@@ -1,98 +0,0 @@
-CREATE TABLE IF NOT EXISTS user
-(
-    id           INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-    username     VARCHAR(255) DEFAULT NULL,
-    email        VARCHAR(255) DEFAULT NULL,
-    display_name VARCHAR(64)  DEFAULT NULL,
-    password     VARCHAR(128)                      NOT NULL,
-    state        SMALLINT     default 1
-);
-ALTER TABLE user ADD PASSWORD_RESET_TOKEN varchar(256) DEFAULT NULL;
-CREATE UNIQUE INDEX user_unique_username ON user(username);
-CREATE UNIQUE INDEX USER_PASSWORD_RESET_TOKEN_UN ON user (PASSWORD_RESET_TOKEN);
-
-
-CREATE TABLE IF NOT EXISTS user_role (
-    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-    role_id VARCHAR(64) NOT NULL,
-    is_default TINYINT(1) NOT NULL DEFAULT 0,
-    parent_id INTEGER NULL DEFAULT NULL,
-    ldap_filter varchar(255) DEFAULT NULL,
-
-    FOREIGN KEY (parent_id) REFERENCES user_role (id) ON DELETE SET NULL
-);
-CREATE UNIQUE INDEX role_unique_role_id ON user_role(role_id);
-CREATE INDEX role_idx_parent_id ON user_role(parent_id);
-
-
-CREATE TABLE IF NOT EXISTS user_role_linker (
-    user_id INTEGER NOT NULL,
-    role_id INTEGER NOT NULL,
-    PRIMARY KEY (user_id, role_id),
-    FOREIGN KEY (role_id) REFERENCES user_role (id) ON DELETE CASCADE,
-    FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE
-);
-CREATE INDEX user_role_linker_idx_role_id ON user_role_linker(role_id);
-CREATE INDEX user_role_linker_idx_user_id ON user_role_linker(user_id);
-
-
-CREATE TABLE IF NOT EXISTS categorie_privilege (
-    id            INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-    code          VARCHAR(150) NOT NULL,
-    libelle       VARCHAR(200) NOT NULL,
-    ordre         INTEGER
-);
-CREATE UNIQUE INDEX categorie_unique_code ON categorie_privilege(code);
-
-
-CREATE TABLE IF NOT EXISTS privilege (
-    id            INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-    categorie_id  INTEGER NOT NULL,
-    code          VARCHAR(150) NOT NULL,
-    libelle       VARCHAR(200) NOT NULL,
-    ordre         INTEGER,
-    FOREIGN KEY (categorie_id) REFERENCES categorie_privilege (id) ON DELETE CASCADE
-);
-CREATE UNIQUE INDEX privilege_unique_code ON privilege(code);
-
-
-CREATE TABLE IF NOT EXISTS role_privilege (
-    role_id       INTEGER NOT NULL,
-    privilege_id  INTEGER NOT NULL,
-    PRIMARY KEY (role_id,privilege_id),
-    FOREIGN KEY (role_id) REFERENCES user_role (id) ON DELETE CASCADE,
-    FOREIGN KEY (privilege_id) REFERENCES privilege (id) ON DELETE CASCADE
-);
-CREATE INDEX idx_role_id on role_privilege(role_id);
-CREATE INDEX idx_privilege_id on role_privilege(privilege_id);
-
-
--- Données
-
-INSERT INTO user_role (id, role_id, is_default, parent_id) VALUES
-    (1, 'Standard', 1, NULL),
-    (2, 'Gestionnaire', 0, 1),
-    (3, 'Super-gestionnaire', 0, 2),
-    (4, 'Administrateur', 0, 3);
-
-INSERT INTO categorie_privilege (id, code, libelle, ordre) VALUES
-    (1, 'droit', 'Gestion des droits', 1);
-
-INSERT INTO privilege (id, categorie_id, code, libelle, ordre) VALUES
-    (1, 1, 'role-visualisation', 'Rôles - Visualisation', 1),
-    (2, 1, 'role-edition', 'Rôles - Édition', 2),
-    (3, 1, 'privilege-visualisation', 'Privilèges - Visualisation', 3),
-    (4, 1, 'privilege-edition', 'Privilèges - Édition', 4);
-
-INSERT INTO role_privilege (role_id, privilege_id) VALUES
-    (4, 1),
-    (4, 2),
-    (4, 3),
-    (4, 4);
-
-INSERT INTO user (username, email, display_name, password, state) VALUES
-    -- utilisateur demo/azerty
-    ('demo', 'demo@mail.fr', 'Demo', '$2y$10$PxXnVLYnGEzEnfqPqRKJSe9AabocES2H4bBK5VzzJlzuj1rVt7Lwu', 1);
-
-INSERT INTO user_role_linker(user_id, role_id)
-SELECT u.id, r.id FROM user u, user_role r WHERE u.username = 'demo' and r.role_id = 'Standard';
-- 
GitLab