From 6070adcae18c0014c1d9eb9286474e3442e78f47 Mon Sep 17 00:00:00 2001 From: Ivann LARUELLE Date: Mon, 13 Feb 2023 00:25:01 +0100 Subject: [PATCH] first commit --- .gitignore | 5 ++ .php-version | 1 + Dockerfile | 3 ++ README.md | 75 ++++++++++++++++++++++++++++++ captainhook.json | 52 +++++++++++++++++++++ conventional-commits.json | 22 +++++++++ docker-compose.dev.yml | 57 +++++++++++++++++++++++ docker-compose.prod.yml | 8 ++++ docker-compose.yml | 36 +++++++++++++++ src/Service/MailSender.php | 34 ++++++++++++++ src/Trait/TimestampableEntity.php | 76 +++++++++++++++++++++++++++++++ 11 files changed, 369 insertions(+) create mode 100644 .gitignore create mode 100644 .php-version create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 captainhook.json create mode 100644 conventional-commits.json create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.yml create mode 100644 src/Service/MailSender.php create mode 100644 src/Trait/TimestampableEntity.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1eb8db4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.vscode/ +.idea/ + +docker-compose.override.yml +docker-compose.override.yaml \ No newline at end of file diff --git a/.php-version b/.php-version new file mode 100644 index 0000000..0dc0f32 --- /dev/null +++ b/.php-version @@ -0,0 +1 @@ +8.2 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9b7bc7b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM larueli/php-symfony-base-image:8.2 + +RUN echo 'cd /var/www/html && /usr/local/bin/php -d memory_limit=-1 bin/console messenger:consume async &' > /docker-entrypoint-init.d/messenger_queue.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..93b5520 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +php -v + +composer --version + +composer selfupdate + +sudo update-alternatives --set php /usr/bin/php8.2 + +symfony new gift_manager_api '--version=6.2.*' --webapp + +composer require api + +composer require symfony/apache-pack + +composer require gedmo/doctrine-extensions "^3.10" + +dans config/services.yaml + +``` + +parameters: + app.from_email.address: "%env(APP_FROM_EMAIL_ADDRESS)%" + app.from_email.name: "%env(APP_FROM_EMAIL_NAME)%" + +services: + App\Service\MailSender: + arguments: + $fromEmailAddress: "%app.from_email.address%" + $fromEmailName: "%app.from_email.name%" + + gedmo.listener.timestampable: + class: Gedmo\Timestampable\TimestampableListener + tags: + - { name: doctrine.event_subscriber, connection: default } + calls: + - [ setAnnotationReader, [ "@annotation_reader" ] ] +``` + +Dans le .env + +``` +APP_FROM_EMAIL_ADDRESS=noreply@noreply.com +APP_FROM_EMAIL_NAME="NO REPLY" +MESSENGER_TRANSPORT_DSN=doctrine://default +``` + +APP_SECRET à changer + +Paquets + +``` + "require-dev": { + "roave/security-advisories": "dev-latest", + "captainhook/captainhook": "^5.10", + "marcocesarato/php-conventional-changelog": "^1.15", + "ramsey/conventional-commits": "^1.3", + } + +``` + +# Exposition reverse proxy + +S'assurer que le reverse proxy renvoie bien `http-forwarded-prefix` + +Configurer les trusted proxies + +``` +# config/packages/framework.yml + +framework: + trusted_proxies: '%env(TRUSTED_PROXIES)%' + trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-prefix'] +``` + +définir la variable d'env TRUSTED_PROXIES avec le/les réseaux ou IP spécfiques (séparés par des virgules, réseaux en notation CIDR) \ No newline at end of file diff --git a/captainhook.json b/captainhook.json new file mode 100644 index 0000000..2707815 --- /dev/null +++ b/captainhook.json @@ -0,0 +1,52 @@ +{ + "commit-msg": { + "enabled": true, + "actions": [ + { + "action": "\\Ramsey\\CaptainHook\\ValidateConventionalCommit", + "options": { + "configFile": "./conventional-commits.json" + } + } + ] + }, + "pre-push": { + "enabled": false, + "actions": [] + }, + "pre-commit": { + "enabled": false, + "actions": [] + }, + "prepare-commit-msg": { + "enabled": true, + "actions": [ + { + "action": "\\Ramsey\\CaptainHook\\ValidateConventionalCommit", + "options": { + "configFile": "./conventional-commits.json" + } + } + ] + }, + "post-commit": { + "enabled": false, + "actions": [] + }, + "post-merge": { + "enabled": false, + "actions": [] + }, + "post-checkout": { + "enabled": false, + "actions": [] + }, + "post-rewrite": { + "enabled": false, + "actions": [] + }, + "post-change": { + "enabled": false, + "actions": [] + } +} diff --git a/conventional-commits.json b/conventional-commits.json new file mode 100644 index 0000000..5fe21d2 --- /dev/null +++ b/conventional-commits.json @@ -0,0 +1,22 @@ +{ + "typeCase": "kebab", + "types": [ + "chore", + "ci", + "docs", + "feat", + "fix", + "refactor", + "security", + "style", + "test" + ], + "scopeCase": "kebab", + "scopeRequired": false, + "scopes": [], + "descriptionCase": null, + "descriptionEndMark": "", + "bodyRequired": false, + "bodyWrapWidth": 72, + "requiredFooters": [] +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..ec3370c --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,57 @@ +version: '3' + +services: + application: + image: larueli/php-symfony-base-image:8.2 + user: "1000:0" + environment: + DATABASE_URL: "postgresql://app:app@database:5432/app?serverVersion=14&charset=utf8" + MAILER_DSN: "smtp://mailer:1025" + PHP_IDE_CONFIG: "serverName=docker" + XDEBUG_MODE: "develop,debug" # profile,coverage + XDEBUG_CONFIG: "client_host=host.docker.internal" + XDEBUG_TRIGGER: "yes" + volumes: + - ./:/var/www/html + #ports: + # - "8000:8080" + #extra_hosts: + # - host.docker.internal:${HOST_IP:-172.17.0.1} + + #database: + # ports: + # - "5432:5432" + + adminer: + image: adminer + networks: + - traefik + environment: + ADMINER_DEFAULT_DB_HOST: database + ADMINER_DEFAULT_DB_NAME: app + ADMINER_DESIGN: lucas-sandery + #ports: + # - "8080:8080" + labels: + - "traefik.http.routers.app_adminer.rule=Host(`localhost`) && PathPrefix(`/adminer/`)" + - "traefik.http.services.app_adminer.loadbalancer.server.port=8080" + - "traefik.http.routers.app_adminer.middlewares=app_adminer_strip" + - "traefik.http.middlewares.app_adminer_strip.stripprefix.prefixes=/adminer" + - "traefik.http.middlewares.app_adminer_strip.stripprefix.forceslash=false" + + mailer: + image: sj26/mailcatcher + environment: + HTTPPATH: "mailer" + networks: + - traefik + command: + - "--ip" + - "0.0.0.0" + - "--http-path" + - "mailer" + #ports: + # - "8081:1080" + labels: + - "traefik.http.routers.app_mailer.rule=Host(`localhost`) && PathPrefix(`/mailer`)" + - "traefik.http.services.app_mailer.loadbalancer.server.port=1080" diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..b289f14 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,8 @@ +version: '3' + +services: + application: + restart: always + + database: + restart: always \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a17f6b6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,36 @@ +version: '3' + +services: + application: + image: larueli/app + networks: + - traefik + environment: + APACHE_DOCUMENT_ROOT: /var/www/html/public + TZ: Europe/Paris + depends_on: + database: + condition: service_healthy + labels: + - "traefik.http.routers.app.rule=Host(`localhost`) && PathPrefix(`/api`)" + - "traefik.http.services.app.loadbalancer.server.port=8080" + - "traefik.http.routers.app.middlewares=app_strip" + - "traefik.http.middlewares.app.stripprefix.prefixes=/api" + - "traefik.http.middlewares.app.stripprefix.forceslash=false" + + database: + image: postgres:15.1 + environment: + POSTGRES_DB: app + POSTGRES_PASSWORD: app + POSTGRES_USER: app + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + volumes: + - db-data:/var/lib/postgresql/data:rw + +volumes: + db-data: diff --git a/src/Service/MailSender.php b/src/Service/MailSender.php new file mode 100644 index 0000000..17736cb --- /dev/null +++ b/src/Service/MailSender.php @@ -0,0 +1,34 @@ +subject($subject) + ->to(...$to) + ->from(new Address($this->fromEmail, $this->fromEmailName)) + ->html($content); + try { + $this->mailer->send($message); + } catch (Exception $exception) { + $this->logger->critical($exception->getMessage()); + } + + } + +} diff --git a/src/Trait/TimestampableEntity.php b/src/Trait/TimestampableEntity.php new file mode 100644 index 0000000..f68e7cd --- /dev/null +++ b/src/Trait/TimestampableEntity.php @@ -0,0 +1,76 @@ + http://www.gediminasm.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Trait; + +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping as ORM; +use Gedmo\Mapping\Annotation as Gedmo; + +/** + * Timestampable Trait, usable with PHP >= 5.4 + * + * @author Gediminas Morkevicius + */ +trait TimestampableEntity +{ + + #[Gedmo\Timestampable(on: 'create')] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] + private ?\DateTimeImmutable $createdAt = null; + + + #[Gedmo\Timestampable(on: 'update')] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] + private ?\DateTimeImmutable $updatedAt = null; + + /** + * Sets createdAt. + * + * @return $this + */ + public function setCreatedAt(\DateTimeImmutable $createdAt) + { + $this->createdAt = $createdAt; + + return $this; + } + + /** + * Returns createdAt. + * + * @return \DateTimeImmutable + */ + public function getCreatedAt() + { + return $this->createdAt; + } + + /** + * Sets updatedAt. + * + * @return $this + */ + public function setUpdatedAt(\DateTimeImmutable $updatedAt) + { + $this->updatedAt = $updatedAt; + + return $this; + } + + /** + * Returns updatedAt. + * + * @return \DateTimeImmutable + */ + public function getUpdatedAt() + { + return $this->updatedAt; + } +}