Code Monkey home page Code Monkey logo

scala-project's Introduction

Scala Rest APIs with Akka framework

An example of a box office tickets service

University of Catania - DIEEI

Advanced Programming Languages

Silvia Sottile - Alessandro Di Stefano

L'applicazione gestisce la prenotazione e l’acquisto online di biglietti per qualsiasi tipo di evento: concerti, spettacoli teatrali ecc. E' implementata su architettura RESTful utilizzando JSON come formato standard dei messaggi per la comunicazione client-server.

Il backend è realizzato in linguaggio Scala, in particolare utilizzando il framework Akka per implementare il modello ad attori e la libreria Akka-HTTP per implementare le chiamare REST.

La persistenza è implementata con database noSql MongoDB, l'interfaccia grafica in AngularJS/Material: quest'ultima scelta permette di aver un client portabile dell'applicazione, come web app o, integrato con framework come Ionic, come mobile app.

L'applicazione, infine, si comporta da Broker di eventi verso i client connessi attraverso una webSocket: ogni evento pubblicato da un admin (Publisher) viene notificato ai client (Subscribers).

Deployment e Docker

Il deploy puo' essere effettuato, out-of-the-box, con Docker e Docker Compose:

$ cd docker/
$ docker-compose up

Il deploy con Docker espone i seguenti servizi/porte attraverso port forwarding su localhost:

Su sistemi *nix fare attenzione alle configurazioni dei permessi (SELinux e group membership dell'utente).

Il backend dipende da un host che ospita MongoDB per poter gestire la persistenza; il binding dell'host e' attualmente hard-coded a mongodb://mongo. Pertanto e' necessario che il nodo che esegue il backend possa raggiungere un database mongoDB all'indirizzo mongo. Se si vuole eseguire localmente MongoDB e' possibile modificare il codice dell'oggetto BoxOffice o aggiungere su /etc/hosts la riga

127.0.0.1 mongo

Infine, per il frontend, e' necessario avere a disposizione un web server capace di fornire le pagine html su public_html/.

In particolare, per l'esecuzione locale, e' possibile importare il progetto .iml su IntelliJ IDEA o usare sbt (Scala version: 2.11.6)

Seeds per Demo

Per popolare il database con dati mock, è possibile avviare lo script src/devTests/MongoSeeds.scala.

Dopo aver eseguito il deploy con Docker eseguire:

 $ cd docker/
 $ docker exec -it $(docker-compose ps -q advproject_scala) sbt "runMain devTests.MongoSeed"

Come sopra, fare attenzione ai permessi e a SELinux.

Interfaccia alle API Rest

Qualunque client http puo' essere utilizzato per interfacciarsi con il servizio. (Postman, curl, browsers...).

Documentazione e demo

La documentazione del codice e' disponibile qui.

La documentazione dettagliata delle API rest su /apidocs.

Una versione demo dell'applicazione e' disponibile qui: espone, come descritto sopra i due servizi backend (:8080) e web frontend (:80).

NOTA: Il database viene ripristinato allo stato iniziale e ripopolato con i dati Mock ogni ora.

Demo admins:

  • aleskandro@scala
  • silvia@scala

Demo users:

  • pippo@scala
  • pluto@scala

Usare una password a caso

Di seguito si riporta una sintesi delle API Rest disponibili.

URL GET POST PUT DELETE
/events Restituisce l'elenco di tutti gli eventi disponibili Creazione di un nuovo evento (*)
/events/(:id) Restituisce l’evento (:id) / Modifica l'evento (:id) (*) Elimina l'evento (:id) (*)
/events/search/(:query) Ricerca degli eventi con pattern matching su (:query) / / /
/events/categories Lista delle categorie di eventi disponibili / / /
/users Restituisce l'elenco di tutti gli utenti (*) Creazione di un nuovo utente / /
/users/(:id) Restituisce l’utente (:id) (*) / Modifica l'utente (*) Elimina l'utente (:id)
/tickets Restituisce l'elenco dei biglietti acquistati (*) Creazione di un nuovo biglietto (*) / /
/tickets/(:id) Restituisce il biglietto (:id) (*) / / Eliminazione del biglietto (:id) (*)

Su ws://backend:8080/ws e' infine disponibile la WebSocket per la notifica degli eventi (Pubblish-Subscribe <=> Admin-Users)

I metodi marcati con (*) richiedono autenticazione; alcuni di questi si comportano diversamente in funzione dei diritti dell'utente autenticato (admin/user). Fare riferimento alle API su /apidocs

In particolare l'autenticazione e' stata implementata per semplicita' attraverso HTTP Basic Authentication: pertanto l'applicazione non ha assolutamente alcun meccanismo "vero" di hardening.

scala-project's People

Contributors

silviabooks avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

Forkers

aleskandro

scala-project's Issues

Ridondanza nel codice delle routes

Sistemando il controller per gli eventi in maniera omogenea rispetto alle risposte da fornire, viene fuori che la definizione delle route (vedi router.EventsRouter) continue MOLTO codice ridondante.

  } ~ path("categories") {
        get {
          onSuccess(eventHandler ? GetCategories) {
            case r: Array[String] =>
              complete(r)
            case r: StatusCode =>
              complete(r)
            case _ =>
              complete(StatusCodes.InternalServerError)
          }
        }
      } ~ path(Segment) { eventId =>
        get {
          onSuccess(eventHandler ? GetEvent(eventId)) {
            case r: Array[Event] =>
              complete(r)
            case r: StatusCode =>
              complete(r)
            case _ =>
              complete(StatusCodes.InternalServerError)
          }
        } ~ put {
          entity(as[Event]) { event =>
            onSuccess(eventHandler ? PutEvent(eventId, event)) {
              case r: StatusCode =>
                complete(r)
              case _ =>
                complete(StatusCodes.InternalServerError)
            }
          }
        } ~ delete {
          onSuccess(eventHandler ? DeleteEvent(eventId)) {
            case r: StatusCode =>
              complete(r)
            case _ =>
              complete(StatusCodes.InternalServerError)
          }

@silviabooks non sto riescendo per il momento a trovare un modo per rendere una 'variabile' il blocco { .(case .)* }

Provi anche tu a dare un'occhiata in giro?

Events Resources

  • /events
  1. Get (List all events)
  2. Post (Create a new event)
  • /events/(:id)
  1. Get (the event)
  2. Put (edit the event)
  3. Delete (delete the event)
  • /events/search/(:somestring)

Only get, a list of events that matches with :somestring

  • /events/categories

Get all the categories (needed for publish-subscribe, see #3 )

Tickets resources

  • /tickets
  1. Get (the list)
  2. Post (create a new ticket for a given user,event)
  • /tickets/(:id)
  1. Get (the ticket)
  2. Put (edit the ticket, actually needed?)
  3. Delete the ticket

WebSocket nella UI

Fare un blocco nella ui per fornire l'esempio del client web socket (gia' implementato in js puro su src/devTests/)

User authentication (base)

Rileggendo le specifiche, abbiamo la necessita' di fornire un minimo di meccanismo di autenticazione.

Dobbiamo fare qualche prova su una delle risorse gia' definite affinche' in funzione del tipo di utente (un flag admin : bool) si proceda o si risponda con un 401.

In sostanza penso serva definire una route come /login che crei qualcosa utilizzabile a mo' di autenticazione negli header http successivi (la piu' semplice direi tra auth basic, digest, session, qualunque cosa di indolore).

Dopo di questo abbiamo praticamente finito la parte server-side lato funzionale.

Users resources

  • Users (mettere la -s nell'endpoint)

  • /users

Get (the list)
Post (create a user)

  • /users/:id

Get (a user)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.