Loading .gitignore 0 → 100644 +14 −0 Changes for .gitignore: 14 added lines, 0 removed lines. Original line number Diff line number Diff line .idea .vscode .env vendor api/vendor api/composer.lock frontend/node_modules frontend/dist ###> friendsofphp/php-cs-fixer ### /.php-cs-fixer.php /.php-cs-fixer.cache api/.php-cs-fixer.php api/.php-cs-fixer.cache ###< friendsofphp/php-cs-fixer ### .gitlab-ci.yml 0 → 100644 +50 −0 Changes for .gitlab-ci.yml: 50 added lines, 0 removed lines. Original line number Diff line number Diff line image: node:22.14 stages: - build - publish variables: PHP_DIR: api JS_DIR: frontend # La variable de proxy héritée du groupe n'a pas de schéma, npm la refuse : on lui donne la sienne. npm_config_proxy: http://proxy.unicaen.fr:3128 npm_config_https_proxy: http://proxy.unicaen.fr:3128 npm_config_noproxy: unicaen.fr default: artifacts: paths: - frontend/dist build_js: stage: build script: - cd $JS_DIR - npm ci - npm run build rules: - exists: - frontend/package.json needs: [] # Publier sur le packagist publish_php: stage: publish image: alpine/curl rules: - if: '$CI_COMMIT_TAG' script: - export NO_PROXY=unicaen.fr ; curl 'https://packagist.unicaen.fr/build?name=unicaen/mail-bundle' # Publier sur GitLab Registry publish_js: stage: publish rules: - if: '$CI_COMMIT_TAG' script: - cd $JS_DIR - npm ci - echo "@unicaen:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc - echo "${CI_API_V4_URL#https:}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc - npm publish --access public CHANGELOG.md 0 → 100644 +8 −0 Changes for CHANGELOG.md: 8 added lines, 0 removed lines. Original line number Diff line number Diff line ## 1.0.0 - Portage Symfony de unicaen/mail (Laminas) : envoi par le mailer de Symfony, journal `unicaen_mail_mail`, profils d'envoi, redirection et non-envoi - Redirection appliquée à tous les mails remis au mailer, enveloppe SMTP comprise, `journaliser_tout` pour ceux envoyés hors de `MailService` - API d'administration (liste filtrée, détail, suppression, réenvoi, test, configuration) sous unicaen/privilege-bundle - Commandes `unicaen:mail:purge` (`--dry-run`) et `unicaen:mail:test` - Page d'administration `@unicaen/mail` (Vue 3, Quasar) - Script de migration de la table de unicaen/mail, données existantes conservées README.md 0 → 100644 +76 −0 Changes for README.md: 76 added lines, 0 removed lines. Original line number Diff line number Diff line # Unicaen Mail Envoi, journal et administration des courriers électroniques d'une application Symfony. Successeur de [unicaen/mail](https://git.unicaen.fr/lib/unicaen/mail) (Laminas), dont il reprend les principes et la table. ## En deux minutes ```php $mail = $mailService->envoyerSimple('jean.dupont@exemple.fr', 'Réunion', '<p>Bonjour…</p>', motsClefs: ['REUNION_12']); $mail->getStatut(); // StatutMail::Envoye, Echec ou NonEnvoye ``` Chaque mail est enregistré dans `unicaen_mail_mail` avec ses destinataires, son sujet, son corps et son statut. Un **profil d'envoi** de la configuration fixe l'expéditeur, le préfixe du sujet, la mention d'envoi automatique et surtout la **redirection** : hors production, tous les mails partent vers une adresse de test, avec en pied la liste des destinataires prévus. La redirection s'applique à tous les mails remis au mailer de Symfony, y compris ceux des autres bundles ou de Monolog. Une page d'administration (Vue 3 et Quasar) liste les mails, les affiche, les réenvoie, envoie un mail de test et montre la configuration. ## Installation ```bash composer require unicaen/mail-bundle npm install @unicaen/mail ``` Configuration, usage, API et privilèges : **[api/README.md](api/README.md)**. ### Front ```js import { MailPlugin, MailRouter } from '@unicaen/mail' const router = createRouter({ routes: [...autoRoutes, ...MailRouter] }) // page /mail app.use(MailPlugin, { axios: api, useUserStore }) ``` `axios` est obligatoire : c'est l'instance de l'application, avec son authentification. `useUserStore` est facultatif : s'il est fourni, sa méthode `isAuthorized(code)` masque les actions non autorisées. Sans lui, tout est affiché et l'API refuse ce qui n'est pas permis. Le plugin Quasar `Notify` et `Dialog` doit être installé dans l'application : le paquet utilise le Quasar de l'application, il n'en embarque pas de copie. Le composant `MailPage` peut aussi être monté sur une autre route. --- ## Structure du dépôt ``` /api # Bundle Symfony (paquet unicaen/mail-bundle) /frontend # Page d'administration Vue 3 et Quasar (paquet @unicaen/mail) /docs # Exemple de référentiel des privilèges, migration SQL depuis unicaen/mail ``` ## Publication ```bash ./release-api.sh 1.0.0 # version explicite, pour la première release ./release-api.sh patch # 1.0.0 -> 1.0.1 ``` Le script aligne `api/.version` et `frontend/package.json`, commite, produit un `git subtree split --prefix=api` poussé sur la branche `split-api` et y pose le tag de version. La branche courante reçoit un tag `m-<version>`, qui déclenche la CI : publication sur le packagist Unicaen et sur le registre npm du projet. À lancer sur l'hôte, avec npm, working tree propre. ## Licence MIT api/.php-cs-fixer.dist.php 0 → 100644 +13 −0 Changes for api/.php-cs-fixer.dist.php: 13 added lines, 0 removed lines. Original line number Diff line number Diff line <?php $finder = (new PhpCsFixer\Finder()) ->in(__DIR__.'/src') ->exclude('vendor') ; return (new PhpCsFixer\Config()) ->setRules([ '@Symfony' => true, ]) ->setFinder($finder) ; Loading
.gitignore 0 → 100644 +14 −0 Changes for .gitignore: 14 added lines, 0 removed lines. Original line number Diff line number Diff line .idea .vscode .env vendor api/vendor api/composer.lock frontend/node_modules frontend/dist ###> friendsofphp/php-cs-fixer ### /.php-cs-fixer.php /.php-cs-fixer.cache api/.php-cs-fixer.php api/.php-cs-fixer.cache ###< friendsofphp/php-cs-fixer ###
.gitlab-ci.yml 0 → 100644 +50 −0 Changes for .gitlab-ci.yml: 50 added lines, 0 removed lines. Original line number Diff line number Diff line image: node:22.14 stages: - build - publish variables: PHP_DIR: api JS_DIR: frontend # La variable de proxy héritée du groupe n'a pas de schéma, npm la refuse : on lui donne la sienne. npm_config_proxy: http://proxy.unicaen.fr:3128 npm_config_https_proxy: http://proxy.unicaen.fr:3128 npm_config_noproxy: unicaen.fr default: artifacts: paths: - frontend/dist build_js: stage: build script: - cd $JS_DIR - npm ci - npm run build rules: - exists: - frontend/package.json needs: [] # Publier sur le packagist publish_php: stage: publish image: alpine/curl rules: - if: '$CI_COMMIT_TAG' script: - export NO_PROXY=unicaen.fr ; curl 'https://packagist.unicaen.fr/build?name=unicaen/mail-bundle' # Publier sur GitLab Registry publish_js: stage: publish rules: - if: '$CI_COMMIT_TAG' script: - cd $JS_DIR - npm ci - echo "@unicaen:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/" > .npmrc - echo "${CI_API_V4_URL#https:}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc - npm publish --access public
CHANGELOG.md 0 → 100644 +8 −0 Changes for CHANGELOG.md: 8 added lines, 0 removed lines. Original line number Diff line number Diff line ## 1.0.0 - Portage Symfony de unicaen/mail (Laminas) : envoi par le mailer de Symfony, journal `unicaen_mail_mail`, profils d'envoi, redirection et non-envoi - Redirection appliquée à tous les mails remis au mailer, enveloppe SMTP comprise, `journaliser_tout` pour ceux envoyés hors de `MailService` - API d'administration (liste filtrée, détail, suppression, réenvoi, test, configuration) sous unicaen/privilege-bundle - Commandes `unicaen:mail:purge` (`--dry-run`) et `unicaen:mail:test` - Page d'administration `@unicaen/mail` (Vue 3, Quasar) - Script de migration de la table de unicaen/mail, données existantes conservées
README.md 0 → 100644 +76 −0 Changes for README.md: 76 added lines, 0 removed lines. Original line number Diff line number Diff line # Unicaen Mail Envoi, journal et administration des courriers électroniques d'une application Symfony. Successeur de [unicaen/mail](https://git.unicaen.fr/lib/unicaen/mail) (Laminas), dont il reprend les principes et la table. ## En deux minutes ```php $mail = $mailService->envoyerSimple('jean.dupont@exemple.fr', 'Réunion', '<p>Bonjour…</p>', motsClefs: ['REUNION_12']); $mail->getStatut(); // StatutMail::Envoye, Echec ou NonEnvoye ``` Chaque mail est enregistré dans `unicaen_mail_mail` avec ses destinataires, son sujet, son corps et son statut. Un **profil d'envoi** de la configuration fixe l'expéditeur, le préfixe du sujet, la mention d'envoi automatique et surtout la **redirection** : hors production, tous les mails partent vers une adresse de test, avec en pied la liste des destinataires prévus. La redirection s'applique à tous les mails remis au mailer de Symfony, y compris ceux des autres bundles ou de Monolog. Une page d'administration (Vue 3 et Quasar) liste les mails, les affiche, les réenvoie, envoie un mail de test et montre la configuration. ## Installation ```bash composer require unicaen/mail-bundle npm install @unicaen/mail ``` Configuration, usage, API et privilèges : **[api/README.md](api/README.md)**. ### Front ```js import { MailPlugin, MailRouter } from '@unicaen/mail' const router = createRouter({ routes: [...autoRoutes, ...MailRouter] }) // page /mail app.use(MailPlugin, { axios: api, useUserStore }) ``` `axios` est obligatoire : c'est l'instance de l'application, avec son authentification. `useUserStore` est facultatif : s'il est fourni, sa méthode `isAuthorized(code)` masque les actions non autorisées. Sans lui, tout est affiché et l'API refuse ce qui n'est pas permis. Le plugin Quasar `Notify` et `Dialog` doit être installé dans l'application : le paquet utilise le Quasar de l'application, il n'en embarque pas de copie. Le composant `MailPage` peut aussi être monté sur une autre route. --- ## Structure du dépôt ``` /api # Bundle Symfony (paquet unicaen/mail-bundle) /frontend # Page d'administration Vue 3 et Quasar (paquet @unicaen/mail) /docs # Exemple de référentiel des privilèges, migration SQL depuis unicaen/mail ``` ## Publication ```bash ./release-api.sh 1.0.0 # version explicite, pour la première release ./release-api.sh patch # 1.0.0 -> 1.0.1 ``` Le script aligne `api/.version` et `frontend/package.json`, commite, produit un `git subtree split --prefix=api` poussé sur la branche `split-api` et y pose le tag de version. La branche courante reçoit un tag `m-<version>`, qui déclenche la CI : publication sur le packagist Unicaen et sur le registre npm du projet. À lancer sur l'hôte, avec npm, working tree propre. ## Licence MIT
api/.php-cs-fixer.dist.php 0 → 100644 +13 −0 Changes for api/.php-cs-fixer.dist.php: 13 added lines, 0 removed lines. Original line number Diff line number Diff line <?php $finder = (new PhpCsFixer\Finder()) ->in(__DIR__.'/src') ->exclude('vendor') ; return (new PhpCsFixer\Config()) ->setRules([ '@Symfony' => true, ]) ->setFinder($finder) ;