Göm menyn

Projekt - SOA Tjänst

Alla laborationer och projekt görs i par, och alla studenter måste registrera sig i Webreg
Läs alla instruktioner för att lättast komma igång

Syfte

Projektet ämnar hjälpa studenten att uppfylla följande mål.

Lärandemål - Gäller TDP024

  • utveckla egna program baserade på SOA
  • konstruera programsystem med lager, klient-server, webbserver/middle ware och persistent lagring
  • arbeta på relevanta utvecklingsplattformar
  • reflektera över egen programutveckling inom området och diskutera alternativa lösningar

Introduktion

Företaget du jobbar på har köpt upp ett misslyckat start-up bolags kodbas för ett mindre banksystem. Den kodbasen är designad med ett SOA perpektiv i åtanke, och det är din uppgift att slutföra det. Tidiagre fanns det två tjänster för att lagra och hämta personer samt banker (se specifikation 1 och 2), ni behöver nu implementera dessa själva (enligt specification 1 och 2) Det som saknas utöver detta är en tjänst som tillåter skapandet av konton för individer hos en viss bank, t ex för Anders Fröberg hos Swedbank.

Vi önskar att du utvecklar en SOA tjänst som tillåter skapandet av konton. Du ska även utveckla tjänster för personer och banker (se specifikation 1 och 2), så varje konto måste ha information om vilken person och vilken bank det tillhör. Vi kommer behöva sparkonton och lönekonton. Vi måste också kunna hitta alla konton för en viss person och/eller bank. Förutom att skapa och hitta konton behöver vi möjlighet att debitera och kreditera konton. Varje gång en debitering eller kreditering sker måste det sparas transaktionsinformation, även om de misslyckas. Utöver detta vill företaget att alla förfrågningar till varje tjänst ska lagras och sparas på minst en centralt server.

Vi kan inte skapa konton för personer som vi inte redan har i vår användardatabas, och inte heller skapa konton för banker som vi inte har som kunder.

För en fullständig specifikation för vilka funktioner som skall finnas, hur de ska anropas och vad de skall returnera, se specifikation 3.

Krav på lösning

  • Persons-Tjänsten är utvecklad enligt REST-principen och enbart tillgänlig via HTTP
  • Banks-Tjänsten är utvecklad enligt REST-principen och enbart tillgänlig via HTTP
  • Java-Tjänsten är utvecklad enligt multi-tier konceptet och namngivning av klasser och metoder är väl valda.
  • Java-Tjänsten är utvecklad på ett sådan sätt att program to an interface principen uppfylls.
  • Java-Tjänsten använder JAX-RS eller liknande (så som Spring) och JPA.
  • Java-Tjänsten består av minst två entities, med var sin facade i datalagret och var sin facade i logiklagret.
  • Java-Tjänsten får aldrig spara namnet på en person eller en bank, utan skall alltid använda den nyckel som fås från externa tjänster.
  • Java-Tjänsten använder transactions och hanterar concurrency på ett bra sätt.
  • Java-Tjänsten är väl testad med code coverage på 60% eller över, om detta inte uppnås måste det motiveras.
  • Java-Tjänsten uppfyller specifikationen.
  • Java-Tjänsten följer de SOA principer som diskuterats i kursen (se slides).
  • Lagring/loggning av transaktioner och REST-förfrågningar ska ske med hjälp av Kafka. Använd dig av minst två olika topics en för transaktioner och en för REST-förfrågningar

Övergripande arkitektur av systemet

För att få godkänt

  • Kraven skall vara uppfyllda.
  • Code coverage skall vara 60% eller över (eller motivera varför det inte är det).
  • Testen i projektet account-xfinal-test skall alla lyckas.
  • Projektet och koden skall bli godkänd genom en manuell genomgång av kursledningen.

Hjälp att komma igång

  • Ladda ner kodskelettet nedan och spara på lämplig plats
  • Titta i Source Packages och Test Packages för tips på hur koden skall byggas upp
  • Filen HTTPHelperImpl.java är användbar i logiklagret när ni behöver göra requests till andra SOA tjänster

Kodskelett (via gitlab): git@gitlab.liu.se:tdp024-course/account-project.git

Specifikation 1

Tjänsten som innehåller alla person ska nås genom följande tjänst. Ni använder de språk som ni valt, eller blivit tilldelade.

Endpoint: http://localhost:8060/person

Function Path Method Input parameters Output
List all persons /list GET List of Persons in JSON format
Find person by name /find.name GET name List of Persons in JSON format
Find person by key /find.key GET key Person found or 'null'

Tjänsten ska åtminstone returnera följande personer:
Key(Unique) Name Andra attribut kan också finnas
ahRtu7874Gdgd345Tlgd39TyurrG7 Jakob Pogulis
2657TyuhR57575GGhu7 Xena
3Wytrt5638HUTyPWert Marcus Bendtsen
4786NmbVyt67d232hj Zorro
5OOpluoRt5612Nhu Q

Specifikation 2

Tjänsten som innehåller alla banker ska nås genom följande tjänst. Ni använder de språk som ni valt, eller blivit tilldelade.

Endpoint: http://localhost:8070/bank

Function Path Method Input parameters Output
List all banks /list GET List of Banks in JSON format
Find bank by name /find.name GET name Bank found or 'null'
Find bank by key /find.key GET key Bank found or 'null'

Tjänsten ska åtminstone returnera följande banker:
Key(Unique) Name(Unique) Andra attribut kan också finnas
1 SWEDBANK
2 IKANOBANKEN
3 JPMORGAN
4 NORDEA
5 CITIBANK
6 HANDELSBANKEN
7 SBAB
8 HSBC
9 NORDNET

Specifikation 3

Endpoint: http://localhost:8080/account-rest
Description Path Method Input parameters Output
Skapa ett visst typ av konto, för en person, på en viss bank. /account/create GET accounttype (kan vara "CHECK" eller "SAVINGS")
person (key på personen)
bank (name på banken)
"OK" eller "FAILED"
Hitta alla konton för en viss person. /account/find/person GET person (key på personen) Lista på konton i JSON (se specifikation 4.1). Om inga konton hittades skall en tom JSON array returneras (dvs []).
Debitera konto. /account/debit GET id (ett heltal som representerar kontot)
amount (ett heltal som skall debiteras från konton)
"OK" eller "FAILED"
Kreditera konto. /account/credit GET id (ett heltal som representerar kontot)
amount (ett heltal som skall krediteras till kontot)
"OK" eller "FAILED"
Hämta alla transaktioner för ett konto. /account/transactions GET id (ett heltal som representerar kontot) Lista på transaktioner i JSON (se specifikation 4.2). Om inga transaktioner hittades skall en tom JSON array returneras (dvs []).
Specifikation 4.1 - JSON format för konto

I exemplena nedan så innehåller personKey och bankKey den nyckel man får när man anropar de andra externa tjänsterna (specifikation 1 och 2).

Exempel på ett konto i JSON
   {
    "id": 5,
    "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
    "accountType": "CHECK",
    "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
    "holdings": 42
   }
Exempel på en lista med konton i JSON
   [
    {
     "id": 5,
     "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
     "accountType": "CHECK",
     "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
     "holdings": 42
    },
    {
     "id": 3,
     "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
     "accountType": "SAVINGS",
     "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxjxLgw",
     "holdings": 21
    }
   ]
Specifikation 4.2 - JSON format för transaktion
Exempel på en transaktion i JSON
   {
    "id": 144,
    "type": "DEBIT",
    "amount": 8,
    "created": "2013-06-30 14:49:32",
    "status": "OK",
    "account" : {
      "id": 5,
      "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
      "accountType": "CHECK",
      "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
      "holdings": 42
    }
   }
Exempel på en lista med transaktioner i JSON
   [
    {
     "id": 144,
     "type": "DEBIT",
     "amount": 8,
     "created": "2013-06-30 14:49:32",
     "status": "OK",
     "account" : {
       "id": 5,
       "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
       "accountType": "CHECK",
       "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
       "holdings": 42
     }
    },
    {
     "id": 55,
     "type": "CREDIT",
     "amount": 13,
     "created": "2013-06-28 12:01:54",
     "status": "FAILED",
     "account" : {
       "id": 5,
       "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
       "accountType": "CHECK",
       "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
       "holdings": 42
     }
    }
   ]

Sidansvarig: Anders Fröberg
Senast uppdaterad: 2023-09-08