Commit a88f8a0d authored by Anthony Gautreau's avatar Anthony Gautreau
Browse files

Bundle unicaen/mail-bundle : portage Symfony de unicaen/mail

parents
Loading
Loading
Loading
Loading
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
+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