Giter Club home page Giter Club logo

pricerunner's Introduction

GitHub Streak

pricerunner's People

Contributors

bl4ko avatar nyanspruk avatar

Watchers

 avatar  avatar

pricerunner's Issues

Kubernetes [5 točk]

  • Ustvarite Kubernetes service.
  • Na Kubernetes namestite mikrostoritev in 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. pomagate si lahko s priloženim primerom. Storitev naj bo dostopna na javnem naslovu IP.
  • Ustvarite novo namestitev in storitev.

Kreiranje Maven projekta [3 točke]

  • Ustvarite novo storitev v obliki projekta Maven, ki naj bo sestavljen iz treh modulov:
<groupId>si.fri.prpo.skupina7</groupId>
<artifactId>primerjalnik-cen</artifactId>
<version>1.0.0-SNAPSHOT</version>

<packaging>pom</packaging>

<modules>
    <module>api</module>
    <module>storitve</module>
    <module>entitete</module>
</modules>
  • Modul api naj ima odvisnosti na KumuluzEE modula core in servlet, ter na modul storitve.
  • Modul storitve naj ima odvisnosti na KumuluzEE modula CDI in JTA, ter na modul entitete.
  • Modul entitete naj ima odvisnosti na KumuluzEE modul JPA in na gonilnik postgres.

Izdelava preprostih testov

Aplikacija bo cez cas postala vse vecja, zato je dobro ze na zacetku dodati teste.
Za vsak izmed novih featurjev dodaj simple test.

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 ostranjevanje, sortiranja in filtriranja

  • Implementriarjte ostranjevanje, sortiranje in filtriranje na vseh koncnih tockah REST, ki vracajo sezname
  • Uporabite KumuluzEE REST
  • Razsiritev v projekt vkljucite tako, da dodate spodnjo odvisnost
<dependency>
    <groupId>com.kumuluz.ee.rest</groupId>
    <artifactId>kumuluzee-rest-core</artifactId>
    <version>${kumuluzee.rest.version}</version>
</dependency>
  • V REST vir, ki mu zelite dodati zahtevane funkcionalnosti, dodajke 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:
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.
  • Testirajte delovanje ostranjevanja, sortiranja in filtriranja. Pripravite si primere klicev, ki jih boste demonstrirali na zagovoru. Pomagajte si s primeri.

Dokumentrianje storitev REST z uporabo OpenAPI

Dokumentiranje storitev REST z uporabo OpenAPI [4 točke]

  • Vašim storitvam REST dodajte dokumentacijo. - Uporabite KumuluzEE OpenAPI MP.
    Razširitev v projekt vključite tako, da dodate spodnjo odvisnost.
<dependency>
    <groupId>com.kumuluz.ee.openapi</groupId>
    <artifactId>kumuluzee-openapi-mp</artifactId>
    <version>${kumuluzee-openapi.version}</version>
</dependency>
  • Dokumentirajte vaš API in vse njegove vire. Uporabite vsaj pet različnih OpenAPI anotacij.
  • Generirana dokumentacija bo dosegljiva na naslovu localhost:8080/openapi
  • Omogočite še grafični vmesnik. Podrobnejša navodila poiščite na GitHub strani projekta.

Preiskovalci napak

Preslikovalci napak

  • 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.

Preimenovaje Verzije

Trenutno je ime verzije "1.0.0-SNAPSHOT"

  • Preimenujte verzijo, tako da odstranite "SNAPSHOT" in pustite samo verzijo

Oddaja

  • Ko končate z nalogo, kreirajte ustrezen Tag v repozitoriju Git za razvito verzijo ter ga ustrezno poimenujte (npr. RELEASE-0.5).

Priprava spletnega odjemalca [9 točke]:

  • Organizacija projekta in HTTP strežnik:

    • Ustvarite nov repozitorij za spletno aplikacijo
    • 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

    • Vaša spletna aplikacija mora za eno izmed vaših entitet (npr. izdelek...) omogočati prikaz seznama entitet, prikaz podrobnosti entitete, pri čemer je potrebno prikazati vsaj eno gnezdeno entiteto (npr. uporabnikove izdelke v košarici), 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 operaciji POST, GET, in DELETE.
    • Nasvet: Pri razhroščevanju si pomagajte z razvijalsko konzolo brskalnika (F12 v Chrome, IE, …)

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.

Izdelava testov - baza

Issue se povezuje na #10
Ustvarite nekaj preprostih unit testov za podatkovno bazo.
Primeri:

  • Da povezava v DB deluje
  • Dodajane podatkov
  • Brisanje podatkov
  • Pridobivanje podatkov
  • ...

Logging

Add logging feature for easier debugging. Possible libraries we could use:

Testiranje [2 točki]

  • V modula api in storitve dodajte datoteko (beans.xml) [beans.xml], ki je priložena nalogi. Datoteko dodajte v direktorij resources/META-INF.
  • V modulu storitve za eno izmed vaših entitet kreiranje novo CDI zrno (npr. IzdelekZrno, več o CDI zrnih naslednji teden), v katerem implementirajte metodo, ki iz baze vrne vse entitete z uporabo poizvedb NamedQuery.
@ApplicationScoped
public class IzdelkiZrno {

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

    public List<Izdelek> getIzdelki() {

        // implementacija

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

    @Inject
    private IzdelkiZrno izdelkiZrno;

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

        List<Izdelek> izdelki = izdelkiZrno.getIzdelki());

        // izpis izdelkov na spletno stran
        
    }
}

Oddaja projekta

  • Ko končate z nalogo (ko zaprete vse odprte zahtevke za to verzijo) v GIT repozitoriju kreirajte ustrezen posnetek oz. tag za razvito verzijo ter ga ustrezno poimenujte (npr. RELEASE-0.3).
  • Z ukazom mvn clean počistite projekt, ga zapakirajte v arhiv tipa zip, in oddajte na učilnico.

Priprava JPA entitet [3 točke]

Za entitete vašega podatkovnega modela kreirajte JPA entitete. Zgledujete se lahko po entiteti Izdelek.

@Entity(name = "izdelek")
@NamedQueries(value =
        {
                @NamedQuery(name = "Izdelek.getAll", query = "SELECT o FROM izdelek o")
        })
public class Izdelek {

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

    private String ime;

    private String opis;

    private Integer cena;

    @ManyToOne
    @JoinColumn(name = "kategorija_id")
    private Kategorija kategorija;

    // getter in setter metode

}
  • Poizvedbam getAll dodajte vsaj še tri smiselne @NamedQuery poizvedbe z in brez uporabe parametrov.

Create RELEASE-0.6

Ko končate z nalogo, kreirajte ustrezen Tag v repozitoriju Git za razvito verzijo ter ga ustrezno poimenujte (npr. RELEASE-0.6).

Kreiranje baze na zunanjem strezniku

  • V datoteki config.yaml modula api posodobite DataSource.
    kumuluzee:
    ...
    datasources:
    • jndi-name: jdbc/PrimerjalnikCenDS
      connection-url: jdbc:postgresql://{DB_ADDRESS}:{DB_PORT}/primerjalnikcen
      username: {DB_USERNAME}
      password: {DB_PASSWORD}

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, IzdelkiVir...), 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 **.v1.viri.
  • Pri implementaciji virov REST si lahko pomagate s spodnjim izsekom kode:
@Path("izdelki")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class IzdelkiVir {

    @GET
    public Response vrniIzdelke(){

        ArrayList<Izdelek> izdelki = // pridobi izdelke

        return Response.status(Response.Status.OK).entity(izdelki).build();
    }
    ...
}
  • Pri implementaciji upoštevajte dobre prakse razvoja storitev REST.

Implementacija poslovne logike z uporabo tehnologij CDI in JPA

Implementacija zrn za dostop do podatkovne baze [4 točke]:

  • Za vaše entitete implementirajte CDI zrna (npr. IzdelkiZrno), ki naj vsebujejo vse CRUD operacije nad posamezno entiteto.
  • 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 IzdelkiZrno {

    public List<Izdelek> pridobiIzdelke() {

        // implementacija

    }

    public Izdelek pridobiIzdelek(int izdelekId) {

        // implementacija

    }

    ...

}

Implementacija zrn s poslovno logiko [4 točke]:

  • Ustvarite novo zrno (npr. UpravljanjeIzdelkovZrno), v katerem boste implementirali poslovne metode (npr. dodajIzdelek).
  • 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 poslovne zahteve, naredi izračun ipd.
    • Poslovne metode naj kličejo vsa zrna, ki implementirajo CRUD operacije, dodana 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 izdelku in o kategoriji). Objekte DTO bo aplikacija prejela kot vhodne podatke storitev REST.

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.

Ko končate z nalogo, kreirajte ustrezen Tag v repozitoriju Git za razvito verzijo ter ga ustrezno poimenujte (npr. RELEASE-0.4).

Uporaba DataSource in priprave PU [1 točka]

  • V datoteki config.yaml modula api definirajte DataSource.
kumuluzee:
  ...
  datasources:
    - jndi-name: jdbc/PrimerjalnikCenDS
      connection-url: jdbc:postgresql://localhost:5432/primerjalnikcen
      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="primerjalnik-cen-jpa" transaction-type="JTA">
        <jta-data-source>jdbc/PrimerjalnikCenDS</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.
Link to SQL file - init-db.sql

Priprava slike Docker in zagon na lokalnem računalniku [2 točki]:

  • Ustvarite sliko Docker, ki vsebujejo vaše mikrostoritve.
  • 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 imeslike .
  • Sliko poženete z ukazom docker run -p 8080:8080 imeslike
  • Aplikacija je privzeto dostopna na naslovu [docker-host-ip]:8080
  • Vašo sliko naložite na portal DockerHub z ukazom docker push imeslike.

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.