Git Product home page Git Product logo

fri-prpo-projektms's Introduction

MikroStoritev - Priporočilnica Filmov

Zasnovana na vajah predmeta PRPO - Postopki razvoja programske opreme.

Rest API

Primeri klicev:

  1. GET http://localhost:8080/v1/uporabniki?limit=10&order=ime%20DESC
    • sortira uporabnike po imenu padajoče (Ž-A) in izpiše prvih 10.
  2. GET http://localhost:8080/v1/filmi?order=datumIzida DESC
    • izpiše filme, od najnovejšega do najstarejšega
  3. GET http://localhost:8080/v1/filmi?filter=rating:GTE:5
    • izpiše filme, ki imajo rating večji ali enak 5
  4. GET http://localhost:8080/v1/filmi?order=ime
    • izpiše filme, urejene po imenu (naslovu)
  5. GET localhost:8080/v1/uporabniki?filter=email:LIKE:'%yahoo.com'&order=priimek ASC
    • izpiše vse uporabnike, ki uporabljajo yahoo mail in jih uredi po priimku naraščajoče (A-Ž)
  6. GET localhost:8080/v1/kinoteke?fields=spletnaStran&offset=2
    • izpiše vse kinoteke, ki imajo spletno stran in preskoči prvi dve
  7. GET localhost:8080/v1/kinoteke?filter=ime:LIKEIC:%cinema%
    • izpiše vse kinoteke, ki imajo v nazivu podniz "cinema", ne glede na velikost črk
  8. GET localhost:8080/v1/zanri?order=ime ASC&offset=2
    • izpiše žanre, urejene po abecedi naraščajoče in preskiči prva dva
  9. GET localhost:8080/v1/uporabniki?order=priimek ASC&limit=5
    • uredi uporabnike po priimku naraščajoče in izpiše prvih 5
  10. GET localhost:8080/v1/filmi?filter=opis:LIKEIC:%classic%
    • izpiše vse filme, ki imajo besedo "classic" v svojem opisu, ne glede na velikost črk
  11. GET localhost:8080/v1/filmi?filter=datumIzida:GT:'2023-10-13T22:00:00Z[UTC]'&limit=5
    • izpiše prvih pet filmov, izdanih po 13.10.2023
  12. GET localhost:8080/v1/filmi?filter=rating:EQ:5
    • izpiše vse filme, ocenjene z oceno 5

Baza

Filmi

  • film_id (primarni ključ)
  • film_ime
  • rating
  • datum_izida
  • opis
  • informacija o žanru (tuji ključ)
  • kinoteke, kjer je film dostopen
  • uporabniki, ki so gledali film
  • uporabniki, katerim je film bil všeč

Žanr

  • zanr_id (primarni ključ)
  • ime žanra
  • filmi tega žanra

Kinoteka

  • kinoteka_id (primarni ključ)
  • kinoteka_ime
  • spletna_stran
  • dostopni filmi

Uporabnik

  • uporabnik_id (primarni ključ)
  • ime
  • priimek
  • uporabnisko_ime
  • email
  • pogledani filmi
  • filmi, ki so uporabniku bili všeč

Konceptualni model: model.jpg

fri-prpo-projektms's People

Contributors

samolego avatar mirkovicmilica avatar dependabot[bot] avatar

Watchers

 avatar  avatar

fri-prpo-projektms's Issues

Dopolnitev storitev REST za spletnega odjemalca [1 točka]

Da bomo lahko storitve REST klicali iz spletnega odjemalca, je potrebno poskrbeti za implementacijo CORS filtrov. CORS je kratica za Cross-Origin Resource Sharing (W3C dokumentacija: http://www.w3.org/TR/cors/ ). CORS je bil uveden za določanje pravil o uporabi virov na internetu. Po pravilih in priporočilih spletna aplikacija ne sme uporabljati vira, ki se ne nahaja na istem izvoru (same origin policy). Za spoštovanje teh pravil skrbijo brskalniki. Isti izvor se šteje v kolikor sta aplikacija in resurs dostopna na istem naslovu, istih vratih in preko istega protokola. V kolikor uporabljate priporočeno strukturo projekta na vajah, so vaše storitve REST dosegljive na vratih 8080, spletna aplikacija pa bo dosegljiva na vratih 4200. Z deklaracijo v glavi odgovora sporočimo brskalniku, katere aplikacije lahko uporabljajo ta vir ("Access-Control-Allow-Origin").

V KumuluzEE lahko za implementacijo CORS filtrov uporabimo KumuluzEE CORS:

  • V projekt dodajte odvisnost:
<dependency>
    <groupId>com.kumuluz.ee.cors</groupId>
    <artifactId>kumuluzee-cors</artifactId>
    <version>${kumuluzee-cors.version}</version>
</dependency>
  • Virom REST, ki jih boste boste klicali iz spletne aplikacije, z uprorabo anotacije @crossorigin določite ustrezne filtre CORS.

Implementacija zrn za dostop do podatkovne baze [2 točki]

  • Vsak član skupine naj za izbrano entiteto implementira CDI zrno (npr. FilmiZrno), ki vsebuje vse CRUD operacije. Za ostale entitete implementirajte CRUD operacije za CDI zrna po potrebi glede na poslovno logiko vaše aplikacije, ki jo boste razvili v naslednjem koraku.
  • Vsa zrna naj v log zapisujejo sporočila o inicializaciji in uničenju zrna.
  • Za metode, ki spreminjajo zapise v bazi, določite ustrezne transakcije z uporabo JTA.
@ApplicationScoped
public class FilmiZrno {

    public List<Film> pridobiFilme() {

        // implementacija

    }

    public Film pridobiFilm(int filmId) {

        // implementacija

    }

    ...
}

Različni dosegi CDI zrn [2 točki]

  • Demonstrirajte razliko v obnašanju zrn z dosegi @RequestScoped in @ApplicationScoped. Ob kreiranju zrna lahko na primer kreirate identifikator zrna z uporabo razreda java.util.UUID in ga ob klicu metod zrna zapisujete v log.

Implementacija zrn s poslovno logiko [6 točk]

  • Ustvarite novo zrno (npr. UpravljanjeFilmovZrno), v katerem boste implementirali poslovne metode (npr. dodajFilm).
  • Implementirate vsaj tri vsebinsko smiselne poslovne metode na člana skupine, ki predstavljajo poslovno logiko aplikacije.
    • Med drugim lahko metoda preveri, ali so vsa polja ustrezno izpolnjena, preveri ali so izpolnjene vse zahteve ipd.
    • Poslovne metode naj kličejo tista zrna, ki implementirajo CRUD operacije, dodane v prejšnji točki.
  • Za argumente poslovnih metod definirajte nove objekte DTO, ki naj vsebujejo polja za vse podatke, ki jih metoda potrebuje. Objekt DTO lahko na primer vsebuje agregirane podatke več JPA entitet s podatkovnega nivoja (npr. podatke o filmu in o kategoriji). Objekte DTO bo aplikacija prejela kot vhodne podatke storitev REST.

Testiranje storitev REST [4 točke]

  • Testirajte delovanje ostranjevanja, sortiranja in filtriranja. Vsak član skupine naj pripravi 6 primerov klicev, ki jih boste demonstrirali na zagovoru. Od teh operacij naj bodo 3 kompleksnejše (v primere vključite več parametrov ali operacij). Pomagajte si s primeri.
  • Testirajte tudi, da vam ustrezno delujejo vse druge metode, ki se jih izpostavili v virih REST v okviru prejšnje naloge.

Testiranje [2 točki]

  • V modula api in storitve dodajte datoteko beans.xml, ki je priložena nalogi. Datoteko dodajte v direktorij resources/META-INF.
  • V modulu storitve vsak član skupine za izbrano entiteto kreira novo CDI zrno (npr. FilmZrno, več o CDI zrnih bomo še povedali v nadaljevanju). V zrnu implementirajte metodo, ki iz baze vrne vse entitete z uporabo poizvedb NamedQuery.
@ApplicationScoped
public class FilmiZrno {

    @PersistenceContext(unitName = "priporocila-jpa")
    private EntityManager em;

    public List<Film> getFilmi() {

        // implementacija

    }
}
  • V modulu api ustvarite nov servlet in v njem izpišite vse tiste entitete, za katere ste v prejšnji točki implementirali zrno.
@WebServlet("/servlet")
public class JPAServlet extends HttpServlet {

    @Inject
    private FilmiZrno filmiZrno;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        List<Film> filmi = filmiZrno.getFilmi());

        // izpis filmov na spletno stran
        
    }
}
```

Implementacija anotacije in prestreznika [4 točke]

Cilj te naloge je implementirati anotacijo, s katero bomo omogočili beleženje klicev anotiranih metod. V modulu storitve:

  • dodajte anotacijo BeleziKlice
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BeleziKlice {
}
  • implementirajte prestreznik za definirano anotacijo
@Interceptor
@BeleziKlice
public class BelezenjeKlicevInterceptor {

        // implementacija

}
  • prestreznik naj kliče CDI zrno BelezenjeKlicevZrno, ki naj hrani število vseh klicev metod,
  • za preprosto rešitev lahko implementirate en števec za vse metode, za vse točke pa je potrebno implementirati ločene števce za vsako klicano metodo,
  • zrno BelezenjeKlicevZrno naj ob vsakem povečanju števca v konzolo izpiše njegovo novo vrednost,
  • prestreznik ustrezno registrirajte v datoteki beans.xml modula storitve, npr.:

Priprava JPA entitet [2 točki]

  • Za entitete vašega podatkovnega modela kreirajte JPA entitete. Zgledujete se lahko po entiteti Film:
@Entity(name = "film")
@NamedQueries(value =
        {
                @NamedQuery(name = "Film.getAll", query = "SELECT f FROM film f")
        })
public class Film {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String ime;

    private String opis; 

    private Integer rating;

    @ManyToOne
    @JoinColumn(name = "zanr_id")
    private Zanr zanr;

    // getter in setter metode

}
  • Zahteva je, da vsak član skupine na eni entiteti doda poleg poizvedbe getAll vsaj še tri smiselne @NamedQuery poizvedbe z in brez uporabe parametrov.

Implementacija anotacije in prestreznika [4 točke]

Cilj te naloge je implementirati anotacijo, s katero bomo omogočili beleženje klicev anotiranih metod. V modulu storitve:

  • dodajte anotacijo BeleziKlice
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BeleziKlice {
}
  • implementirajte prestreznik za definirano anotacijo
@Interceptor
@BeleziKlice
public class BelezenjeKlicevInterceptor {

        // implementacija

}
  • prestreznik naj kliče CDI zrno BelezenjeKlicevZrno, ki naj hrani število vseh klicev metod,
  • za preprosto rešitev lahko implementirate en števec za vse metode, za vse točke pa je potrebno implementirati ločene števce za vsako klicano metodo,
  • zrno BelezenjeKlicevZrno naj ob vsakem povečanju števca v konzolo izpiše njegovo novo vrednost,
  • prestreznik ustrezno registrirajte v datoteki beans.xml modula storitve, npr.:
<interceptors>
    <class>si.fri.prpo.skupina7.interceptorji.BelezenjeKlicevInterceptor</class>
</interceptors>
  • delovanje anotacije preizkusite na metodah v vaših zrnih

Uporaba DataSource in priprava PU [1 točka]

  • V datoteki config.yaml modula api definirajte DataSource.
kumuluzee:
  ...
  datasources:
    - jndi-name: jdbc/PriporocilaDS
      connection-url: jdbc:postgresql://localhost:5432/priporocila
      username: postgres
      password: postgres
  • V modulu entitete dodajte datoteko resources/META-INF/persistence.xml v kateri definirajte persistence-unit. Uporabite DataSource iz config.yaml ter določite ime in tip transakcije JTA.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="priporocila-jpa" transaction-type="JTA">
        <jta-data-source>jdbc/PriporocilaDS</jta-data-source>

        <class><!-- vaše entitete --></class>
        <class><!-- vaše entitete --></class>

        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
            <property name="javax.persistence.sql-load-script-source" value="sql-scripts/init-db.sql"/>
            <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
        </properties>
    </persistence-unit>
</persistence>
  • Nalogi je priložen preprost primer skripte SQL za inicializacijo baze, ki jo predelajte, da bo ustrezala vašemu podatkovnemu modelu.

Preslikovalci napak [2 točki]

  • Dodajte poslovno izjemo (exception), ki jo prožite v primeru neveljavnih zahtevkov v vaših poslovnih metodah.
  • Dodajte preslikovalca napak za vašo izjemo.
  • Preslikovalec naj vrne ustrezno HTTP response kodo in sporočilo o napaki v formatu JSON.

Kubernetes [7 točk]

  • Cilj naloge je na Kubernetes namestiti mikrostoritev, ki ste jo razvijali tekom semestra.
  • S svojim @student.uni-lj.si študentskim računom si ustvarite račun na platformi Azure.
  • Ustvarite Kubernetes service.
  • Poskrbite za povezavo na podatkovno bazo.
  • Pripravite namestitveno datoteko za namestitev (deployment) in storitev (service), ki bo namestila vašo mikrostoritev in jo izpostavila kot storitev. Pomagajte si s priloženim primerom. Storitev naj bo dostopna na javnem naslovu IP.
  • Ustvarite novo namestitev in storitev.
  • Pazite, da ne porabite vseh Azure Education kreditov pred končnimi zagovori.

Priprava slike Docker in zagon na lokalnem računalniku [3 točke]

  • Ustvarite sliko Docker, ki vsebuje vašo mikrostoritev.
  • Priporočamo, da v Dockerfile-u izhajate iz slike eclipse-temurin. Izberite optimalno verzijo slike.
  • Pri pisanju datoteke Dockerfile si lahko pomagate z ukazi FROM, RUN, WORKDIR, ADD, EXPOSE, CMD.
  • Pred ustvarjanjem slike Docker z orodjem Maven ustvarite fat JAR.
  • Sliko ustvarite z ukazom
docker build -t <ime slike> .
  • Označi sliko s tagom
docker tag ...
  • Vašo sliko naložite na portal DockerHub z ukazom
docker push <ime slike>

Implementacija ostranjevanja, sortiranja in filtriranja [4 točke]

  • Implementirajte ostranjevanje, sortiranje in filtriranje na vseh končnih točkah REST, ki vračajo sezname.
  • Uporabite KumuluzEE REST.
  • Razširitev v projekt vključite tako, da dodate spodnjo odvisnost.
<dependency>
    <groupId>com.kumuluz.ee.[rest](https://ucilnica.fri.uni-lj.si/mod/resource/view.php?id=9093)</groupId>
    <artifactId>kumuluzee-[rest](https://ucilnica.fri.uni-lj.si/mod/resource/view.php?id=9093)-core</artifactId>
    <version>${kumuluzee-[rest](https://ucilnica.fri.uni-lj.si/mod/resource/view.php?id=9093).version}</version>
</dependency>
  • V REST vir, ki mu želite dodati zahtevane funkcionalnosti, dodajte sklic na objekt UriInfo, ki hrani podrobnosti o zahtevku:
@Context
protected UriInfo uriInfo;
  • V metodi, ki vrača seznam entitet, iz objekta UriInfo pridobite podatke o zahtevku in jih posredujte metodi, ki entitete pridobiva iz baze. Kot osnovo lahko uporabite naslednji primer:
QueryParameters query = QueryParameters.query(uriInfo.getRequestUri().getQuery()).build();
List<Uporabnik> uporabniki = uporabnikiZrno.pridobiUporabnike(query);
  • Dopolnite metodo, ki pridobiva entitete iz baze, na primer:
List<Uporabnik> uporabniki = JPAUtils.queryEntities(em, Uporabnik.class, query);
  • Končnim točkam REST, ki vračajo sezname, dodajte HTTP glavo (header) X-Total-Count, v katero zapišite število vrnjenih entitet. Uporabite metodo JPAUtils.queryEntitiesCount.

Implementacija storitev REST [6 točk]

  • V projekt dodajte odvisnosti na komponente kumuluzee-jax-rs-jersey, kumuluzee-json-p-jsonp in kumuluzee-json-b-yasson.
  • V modul api dodajte razred, ki razširja razred javax.ws.rs.core.Application in ga anotirajte z @ApplicationPath("v1"). Dobra praksa je, da ima paket, v katerem se nahaja ta razred, strukturo **.v1 – torej, da vsebuje verzijo.
  • Za CDI zrna s CRUD operacijami, ki ste jih implementirali v prejšnji nalogi, dodajte vire REST (npr. UporabnikiVir, FilmiVir...), v katerih njihove metode izpostavite kot storitve REST. Storitve naj sprejemajo in vračajo JPA entitete.
    • Če ne želite, da se nek atribut generira v izhodnem JSON objektu, uporabite anotacijo javax.json.bind.annotation.JsonbTransient.
  • V ustreznih virih REST izpostavite implementirane poslovne metode. Storitve naj sprejemajo in vračajo poslovne entitete (objekte DTO).
  • Vsi viri REST naj se nahajajo v paketu, ki ustreza poimenovanju xyz.v1.viri.
  • Pri implementaciji virov REST si lahko pomagate s spodnjim izsekom kode:
@Path("filmi")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class FilmiVir {

    @GET
    public Response vrniFilme(){

        ArrayList<Film> filmi = // pridobi filme

        return Response.status(Response.Status.OK).entity(filmi).build();
    }

    ...
}
  • Pri implementaciji upoštevajte dobre prakse razvoja storitev REST.

Priprava spletnega odjemalca [9 točk]

Organizacija projekta in HTTP strežnik

  • Ustvarite nov repozitorij za spletno aplikacijo
  • Za izhodišče lahko uporabite ogrodje spletne aplikacije, ki je objavljeno na učilnici.
  • Namestite node.js in npm.
  • Ogrodje lahko poženete z uporabo npm:
    • Najprej z ukazom npm install namestite potrebne odvisnosti.
    • Spletni strežnik poženete z ukazom npm start.
    • Spletni strežnik se privzeto nahaja na vratih 4200.

Delo z ogrodjem

  • Preučite ogrodje, ki ste ga prenesli iz spletne učilnice.
  • Vaša spletna aplikacija mora za eno izmed vaših entitet (npr. film...) omogočati prikaz seznama entitet, prikaz podrobnosti entitete, pri čemer je potrebno prikazati vsaj eno gnezdeno entiteto (npr. uporabnikove najljubše filme), in brisanje entitet.
  • Glede na vaš projekt ustrezno spremenite implementacijo klicev storitev REST, definiranih v storitvi seznami.service.ts.
  • Ustrezno spremenite predloge in komponente, da bodo ustrezale vaši aplikaciji.
  • Uredite usmerjanje (router) v datoteki app-routing.module.ts.
  • Vaša aplikacija mora, podobno kot primer v ogrodju, vsaj enkrat uporabiti vsako izmed CRUD operacij POST, GET, in DELETE.
  • Nasvet: Pri razhroščevanju si pomagajte z razvijalsko konzolo brskalnika (F12 v Chrome, IE, …)

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.