{"id":20772226,"url":"https://github.com/ericneves/mysecretmessage","last_synced_at":"2026-01-02T05:20:31.576Z","repository":{"id":253026893,"uuid":"838080115","full_name":"EricNeves/mySecretMessage","owner":"EricNeves","description":"Application developed with PHP, Ports and Adapters Architecture, Postgres, Redis, Tests, Angular, PrimeNG and more...","archived":false,"fork":false,"pushed_at":"2024-11-22T18:05:46.000Z","size":10018,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-14T02:21:07.270Z","etag":null,"topics":["angular","docker","hexagonal-architecture","php","ports-and-adapters","postgresql","primeng","redis"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EricNeves.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-04T22:01:08.000Z","updated_at":"2025-02-17T15:07:41.000Z","dependencies_parsed_at":"2024-09-11T19:49:47.760Z","dependency_job_id":"909d481d-0d7f-4257-b6f2-166472226aaa","html_url":"https://github.com/EricNeves/mySecretMessage","commit_stats":null,"previous_names":["ericneves/mysecretmessage"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricNeves%2FmySecretMessage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricNeves%2FmySecretMessage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricNeves%2FmySecretMessage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricNeves%2FmySecretMessage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EricNeves","download_url":"https://codeload.github.com/EricNeves/mySecretMessage/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253545137,"owners_count":21925340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","docker","hexagonal-architecture","php","ports-and-adapters","postgresql","primeng","redis"],"created_at":"2024-11-17T12:19:48.802Z","updated_at":"2026-01-02T05:20:31.522Z","avatar_url":"https://github.com/EricNeves.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch4 align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003cimg src=\"resources/github/icon.png\"\u003e\n  \u003cbr /\u003e\n    My Secret Message\n  \u003cbr /\u003e\n\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/EricNeves/mySecretMessage?style=flat-square\u0026logo=github\u0026logoColor=white\u0026color=blue\u0026labelColor=%23102C57\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/top/ericneves/mySecretMessage?style=flat-square\u0026logo=php\u0026logoColor=%23f3f3f3\u0026label=%20PHP\u0026color=%23379777\u0026labelColor=%23333\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/ericneves/mySecretMessage?style=flat-square\u0026logo=git\u0026labelColor=405D72\u0026color=667BC6\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Projeto web desenvolvido com \u003cstrong\u003ePHP\u003c/strong\u003e e \u003cstrong\u003eAngular\u003c/strong\u003e, implementando melhorias na estrutura da aplicação em \u003cstrong\u003ePHP\u003c/strong\u003e através do uso de um dos modelos da \u003cstrong\u003eArquitetura Limpa\u003c/strong\u003e, conhecido como \u003cstrong\u003ePorts and Adapters\u003c/strong\u003e ou \u003cstrong\u003eArquitetura Hexagonal\u003c/strong\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eData de criação: Aug 4, 2024\u003c/p\u003e\n\nhttps://github.com/user-attachments/assets/7884329d-ccad-4ae3-b954-28686556a9ba\n\n#### Intro 📃\n\n**My Secret Message** é um projeto web desenvolvido com **PHP** e **Angular**, projetado para o compartilhamento seguro de mensagens secretas. Para acessar a mensagem, o destinatário precisa de uma chave secreta (**secret key**), garantindo que apenas pessoas autorizadas possam visualizá-la. Além disso, o criador da mensagem pode definir um tempo de expiração, após o qual a mensagem se torna inacessível, proporcionando uma camada adicional de segurança e controle.\n\n\nEsse projeto traz como principal **feature** a implementação de um dos modelos de **Arquitetura Limpa** conhecido porpulamente como **Hexagonal** ou **Ports** and **Adapters**.\n\nEsse modelo arquitetônico tem como principal recurso a utilização de **Portas** e **Adaptadores**, mas afinal, o que isso significa ?\n\n\u003e [!NOTE] \n\u003e \n\u003e **Exemplo** - Maria comprou um cartão microSD para usar em sua câmera fotográfica, mas ao tentar inseri-lo, percebeu que sua câmera suporta apenas cartões SD de tamanho padrão. Para resolver o problema, Maria foi até uma loja de informática e adquiriu um adaptador de microSD para SD, permitindo que o cartão funcionasse perfeitamente em sua câmera.\n\u003e\n\u003e \n\nEsse exemplo ilustra perfeitamente o conceito de **Ports** and **Adapters** na arquitetura de software. No contexto do sistema, as **portas** representam interfaces ou pontos de entrada e saída definidos, enquanto os **adaptadores** são responsáveis por conectar diferentes componentes do sistema, permitindo que trabalhem juntos, mesmo que usem formatos ou tecnologias diferentes. \n\nNa estrutura da aplicação, as regras de negócio podem incluir um sistema de cadastro de usuários que utiliza a interface **UserRepositoryPort** (**ports/out**). Como adaptador, posso implementar o repositório **UserPostgresRepository** (**adapters/out**), o que me dá a flexibilidade de integrar diferentes tipos de bancos de dados, como em **memória**, **SQL**, **NoSQL**, entre outros. Isso torna a aplicação altamente flexível e preparada para mudanças futuras, permitindo a substituição ou adição de novas tecnologias sem impactar a lógica central do sistema.\n\n\u003e [!NOTE]\n\u003e **Citações Relacionadas**\n\u003e  \n\u003e - **Livro Arquitetura Limpa**: \"Portanto, as arquiteturas devem ser tão agnósticas em sua forma quanto práticas.\"\n\u003e - **Livro Arquitetura Limpa**: \"A dificuldade em realizar uma mudança deve ser proporcional apenas ao escopo da mudança e não à forma da mudança.\"\n\u003e - **Livro Arquitetura Limpa**: \"A arquitetura representa decisões significativas de design que moldam um sistema, onde a significância é medida pelo custo de mudança.\"\n\u003e\n\n#### Features 🔭\n\nAbaixo está a lista de **tecnologias** e **recursos** utilizados neste projeto, juntamente com a implementação da **infraestrutura** da API. Importante destacar que a API foi desenvolvida sem o uso de **frameworks**, utilizando exclusivamente **PHP**.\n\n- API\n  - PHP:8.2\n    - ports and adapters architecture\n    - routes\n    - request/response\n    - controllers\n    - middlewares\n    - jwt\n    - libraries\n        - phpunit/phpunit:10.5\n        - vlucas/phpdotenv:5.6\n        - predis/predis:2.2\n        - ramsey/uuid:4.7\n  - postgreSQL:15.4\n  - redis:latest\n- Web\n  - angular:17\n    - routes\n    - guards\n    - interceptors\n    - services\n    - events\n  - libraries\n    - typescript:5.4\n    - primeflex:3.3\n    - primeicons:7\n    - primeng:17.8\n- devOps\n  - docker\n  - docker Compose\n\n#### How to use ? 💡\n\n\u003e [!NOTE]\n\u003e\n\u003e Para garantir a execução bem-sucedida da aplicação, é essencial seguir os passos abaixo.\n\u003e\n\n```sh\n\n# project dir\n$ cd mySecretMessage\n\n# install web dependencies\n$ cd web \u0026\u0026 pnpm install\n\n# install www dependencies\n$ cd www \u0026\u0026 composer install \u0026\u0026 cp .env.example .env\n\n# run docker\n$ cd ./mySecretMessage \u0026\u0026 docker compose -f \"docker-compose.yml\" up -d --build\n\n```\n\n#### Tests 🔋\n\n```sh\n\n# unit tests\n$ cd www \u0026\u0026 composer test:unit\n\n# integration tests\n$ cd www \u0026\u0026 composer test:integration\n\n```\n\n#### Author 🦆\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.instagram.com/ericneves_dev/\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/32256029\" width=\"100px;\" alt=\"\"/\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eEric Neves\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://www.instagram.com/ericneves_dev/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge\u0026logo=instagram\u0026logoColor=white\" width=\"100%\"\u003e\n      \u003c/a\u003e \n      \u003cbr /\u003e\n      \u003ca href=\"https://linkedin.com/in/ericnevesrr\"\u003e \n        \u003cimg src=\"https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\" width=\"100%\"\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n#### License 📋\n\n\u003cimg src=\"https://img.shields.io/github/license/ericneves/mySecretMessage?style=flat-square\u0026logo=git\u0026labelColor=405D72\u0026color=667BC6\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericneves%2Fmysecretmessage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericneves%2Fmysecretmessage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericneves%2Fmysecretmessage/lists"}