fabianoroberto / news-aggregator

News Aggregator

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Benvenuto su News Aggregator 👋

Version Twitter: dr_thief

News aggregator è una web application creata con Symfony 5.2 e permette di raccogliere un'insieme di articoli, scriverne a tua volta altri e commentare.

Il progetto contiene un'insieme di componenti che andrò ad elencare in dettaglio

Docker

Per rendere il progetto facilmente fruibile a terzi è stato predisposto un container docker con al suo interno:

  • Nginx (web server)
  • MariaDB (database relazionale)
  • PHP 8.0.3
  • MailHog (testing email)

Tale docker espone i servizi di default sulle porte indicate su docker-compose.override.yml.dist ma possono essere sovrascritte su docker-compose.override.yml.

Gli endpoint esposti sono:

Comandi utili

docker-composer up -d

Entity

La struttura relazionale del progetto prevede l'uso di tre entity:

  • User (contenente gli utenti registrati in piattaforma con ruoli diversi: ROLE_ADMIN o ROLE_USER)
  • Article (contenente tutti gli articoli scritti da utenti registrati in piattaforma)
  • Comment (contenente tutti i commenti associati agli articoli che possono essere aggiunti anche da utenti non loggati in piattaforma)

Migration

I cambiamenti alla struttura del db sono stati gestiti attraverso le migration in modo da avere lo schema sempre consistente ad ogni release del codice

Comandi utili

Create DB

symfony console doctrine:database:create

Update DB Schema

symfony console doctrine:migrations:migrate --no-interaction

Fixtures

Per avere una base di dati di partenza sulla quale fare i test sono state caricate delle fixtures:

  • 10 users (alcuni in soft-delete)
  • 1 admin
  • 10 articles
  • 50 comments

Comandi utili

Reset DB: (drop db, create db, update schema and load fixtures)

symfony console doctrine:database:drop --force
symfony console doctrine:database:create
symfony console doctrine:migrations:migrate --no-interaction
symfony console doctrine:fixtures:load --no-interaction

Importazione

E' stato creato anche un metodo per riempire il database degli articoli partendo da Feed RSS. Passando quindi un qualsiasi url standard RSS 2.0 verranno creati gli articoli in piattaforma Un esempio di importazione è:

symfony console app:import-rss-news "https://news.google.com/rss?hl=it&gl=IT&ceid=IT:it"

Autenticazione

L'autenticazione è stata gestita attraverso JWT. Interrogando l'endpoint POST /v1/auth/login passando:

{
    "username": "admin@newsaggregator.local",
    "password": "admin"
}

ottengo un token JWT fruibile attraverso Authorization: Bearer nelle chiamate che richiedono l'autenticazione.

API

Le API sono state costruite attraverso FOSRestBundle e la loro documentazione attraverso NelmioApiDocBundle. Quest'ultima libreria esporrà sia la documentazione in OpenApi (/doc.json) sia un tool visuale (raggiungibile sotto /doc) dove provare ciascun endpoint.

Tool

Formato

Le risposte alle interrogazioni delle API sono compliant al formato HATEOAS REST. Nel caso di una collezione di elementi HATEOAS gestirà anche la parte di paginazione degli elementi.

DTO

Per interagire con le API di creazione/modifica di ciascuna entità ci si è avvalsi dei Data Transfer Object. In questo modo i dati passati dall'utente sono prima validati

Best-practice

#SPA

Per la parte Frontend di visualizzazione dei contenuti si è scelto di costruire una Single Page Application. Tale SPA è stata costruita basandosi su Preact e Symfony Encore esponendo due pagine pubbliche:

  • Home con la lista di tutti gli articoli presenti in piattaforma (basata sull'api GET /v1/public/articles)
  • Article con il dettaglio di un singolo articolo e tutti i commenti su di esso applicati (basata sull'api GET /v1/public/articles/{parentId}/comments)

Home Article1 Article2

CORS

Per permettere che la SPA possa accedere alle API è stato necessario configurare CORS e mettere tra i domini "allowed" news-aggregator.local. La gestione è demandata a NelmioCorsBundle

Comandi utili

Build Frontend

cd spa && API_ENDPOINT=http://api.news-aggregator.local:8082/ yarn encore dev

Requirements

#Altri comandi utili

Create JWT private and public keys

mkdir -p config/jwt
openssl genpkey -out config/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -pass pass:${JWT_PASSPHRASE}
openssl pkey -in config/jwt/private.pem -out config/jwt/public.pem -pubout -passin pass:${JWT_PASSPHRASE}

Dump ENV

symfony composer dump-env ${APP_ENV}

Refresh cache

symfony console cache:clear

Author

👤 Fabiano Roberto


This README was generated with ❤️ by readme-md-generator

About

News Aggregator


Languages

Language:JavaScript 70.0%Language:CSS 24.8%Language:PHP 4.5%Language:Shell 0.3%Language:Twig 0.1%Language:SCSS 0.1%Language:Dockerfile 0.0%Language:Makefile 0.0%Language:EJS 0.0%