Readme.md + UML + db/all (reset+recreate)

This commit is contained in:
Georg Reisinger 2021-01-07 20:44:36 +01:00
parent 514ac3553f
commit e590ccd3e0
8 changed files with 3492 additions and 70 deletions

View File

@ -1,8 +1,5 @@
# Monster Trading Card Game
Created by *Georg Reisinger*
## Protocol
* RestServer von https://github.com/DerGeorg/RESTServer
* MTCG Git Repo https://github.com/DerGeorg/SWE1-MTCG
* JavaDoc online auf: http://mtcg.dergeorg.at
@ -24,9 +21,24 @@ Created by *Georg Reisinger*
* *Typ der Card wird automatisch in Card und Element Typ getrennt*
* Trading Table
* *Alle aktiven Trading deals*
## Protokoll
#### Cards
* Card Type (z.B. FireSpell) wird zu ElementTyp(Fire) und CardType(Spell) aufgespalten
* Alle Cards sind in der Cards Tabelle gespeichert
* Wenn ein User Cards acquired, dann wird das passende package gelöscht und die Cards in seine user_card Table geschrieben
#### Deck
* Die Deckkarten werden in der Tabelle User_deck gespeichert
* Wird eine Card getradet, die im Deck ist, so wird das Deck des Users zurückgesetzt
* Wird ein Battle begonnen, dann muss der user 4 cards im deck haben.
#### Battle
* Beginnt ein User ein Battle und ist der erste, so wird in der Battle tabelle eine "Einladung" erstellt.
Die Einladung besteht aus: **Username, Userdeck, Battleid**
* Beginnt ein 2. User ein Battle, so sieht er das in der Battle Tabelle ein Spiel ohne 2. spieler ist, und kann beitreten.
#### Score & Stats
* Score zeigt das Ergebnis des letzten spieles an
* Stats zeigt die Ergebnisse aller vergangen Spiele
## API Beschreibung
### GET
#### GET
| ROUTE | BESCHREIBUNG | ATTRIBUTE | RETURN | HEADER |
|--------------------|------------------------------------|-----------|-------------------------|------------------------------------------------------|
| /cards | show all acquired cards | / | Cards Object | --header "Authorization: Basic kienboec-mtcgToken" |
@ -36,7 +48,7 @@ Created by *Georg Reisinger*
| /stats | get stats about all battles | / | All battle Logs | --header "Authorization: Basic kienboec-mtcgToken" |
| /score | get score, about last battle | / | Last Battle Log | --header "Authorization: Basic kienboec-mtcgToken" |
| /tradings | get trading deals | / | List TradingDeal Object | --header "Authorization: Basic kienboec-mtcgToken" |
### POST
#### POST
| ROUTE | BESCHREIBUNG | ATTRIBUTE | RETURN | HEADER |
|------------------------|---------------------------|--------------------------------------|---------------------|------------------------------------------------------|
| /users | create user | Username, Password | User Object | / |
@ -46,20 +58,19 @@ Created by *Georg Reisinger*
| /battles | Battle | / | Anweisungen String | --header "Authorization: Basic kienboec-mtcgToken" |
| /tradings | create tradingdeal | Id, CardToTrade, Type, MinimumDamage | TradingDeal Object | --header "Authorization: Basic kienboec-mtcgToken" |
| /tradings/{TradeID} | Do Trade | CardID | New Card Object | --header "Authorization: Basic kienboec-mtcgToken" |
### PUT
#### PUT
| ROUTE | BESCHREIBUNG | ATTRIBUTE | RETURN | HEADER |
|-------------------|----------------|------------------|--------------|------------------------------------------------------|
| /deck | configure deck | [ID, ID, ID, ID] | Cards Object | --header "Authorization: Basic kienboec-mtcgToken" |
| /users/{username} | / | Name, Bio, Image | User Object | --header "Authorization: Basic kienboec-mtcgToken" |
### DELETE
#### DELETE
| ROUTE | BESCHREIBUNG | ATTRIBUTE | RETURN | HEADER |
|---------------------|---------------------|-----------|--------|------------------------------------------------------|
| /tradings/{TradeID} | delete trading deal | / | / | --header "Authorization: Basic kienboec-mtcgToken" |
## Zeit
5 Tage x 6 Stunden = 30 Stunden
## Insomnia Requests
Basierend auf dem [Curl Script]((https://github.com/DerGeorg/SWE1-MTCG/blob/master/curl.bat)) habe ich die Requests in Insomnia erstellt.
[Öffne insomnia.json](https://github.com/DerGeorg/SWE1-MTCG/blob/master/insomnia.json)
## UML
*UML2021.png*
http://dergeorg.at/mtcg/UML2021.png
![UML2021.png](UML2021.png)
* [UML.png](https://github.com/DerGeorg/SWE1-MTCG/blob/master/UML2021.png)
* [UML.svg](https://github.com/DerGeorg/SWE1-MTCG/blob/master/UML2021.svg)
![UML2021.svg](UML2021.svg)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 MiB

After

Width:  |  Height:  |  Size: 16 MiB

3405
UML2021.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 251 KiB

1
insomnia.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -67,11 +67,9 @@ public class Battle {
System.out.println("Card 1: " + c1.getElementTyp() + c1.getCardType() + "\nCard 2: " + c2.getElementTyp() + c2.getCardType());
//GLEICHER TYP Monster
if (!c1.getCardType().name().equalsIgnoreCase("SPELL") && !c2.getCardType().name().equalsIgnoreCase("SPELL")) {
System.out.println("Same Monster");
//Check ob eine der beiden Carten ein Dragon ist
if ((c1.getCardType().name().equalsIgnoreCase("DRAGON") && !c2.getCardType().name().equalsIgnoreCase("DRAGON") || (!c1.getCardType().name().equalsIgnoreCase("DRAGON") && c2.getCardType().name().equalsIgnoreCase("DRAGON")))) {
//Eine der Karten is Dragon
System.out.println("Eine ist ein dragon");
Card dragon;
int dragonOwner;
if (c1.getCardType().name().equalsIgnoreCase("DRAGON")) {
@ -81,19 +79,16 @@ public class Battle {
dragon = c2;
dragonOwner = 2;
} else {
System.out.println("KEIN DRAGON GEFUNDEN");
return false;
}
if ((c1.getCardType().name().equalsIgnoreCase("GOBLIN") && !c2.getCardType().name().equalsIgnoreCase("GOBLIN") || (!c1.getCardType().name().equalsIgnoreCase("GOBLIN") && c2.getCardType().name().equalsIgnoreCase("GOBLIN")))) {
//Eine der Karten ist Goblin
System.out.println("Andere ist ein goblin");
Card goblin;
if (c1.getCardType().name().equalsIgnoreCase("GOBLIN")) {
goblin = c1;
} else if (c2.getCardType().name().equalsIgnoreCase("GOBLIN")) {
goblin = c2;
} else {
System.out.println("KEIN GOBLIN GEFUNDEN");
return false;
}
if (dragon.getDamage() > goblin.getDamage()) {
@ -110,12 +105,9 @@ public class Battle {
this.scorePlayer2 += 3;
}
this.log.add("Player " + dragonOwner + " gewinnt!\nDrache ist stärker! Drache: " + dragon.getDamage() + " vs Goblin: " + goblin.getDamage() + "\nPlayer 1 score: " + scorePlayer1 + "\nPlayer 2 score: " + scorePlayer2);
} else {
System.out.println("DRAW: Drache zu schwach um anzugreifen und GOBLIN zu feige.");
}
} else if ((c1.getCardType().name().equalsIgnoreCase("ELF") && c1.getElementTyp().name().equalsIgnoreCase("FIRE") && !c2.getCardType().name().equalsIgnoreCase("ELF") || (!c1.getCardType().name().equalsIgnoreCase("ELF") && c2.getElementTyp().name().equalsIgnoreCase("FIRE") && c2.getCardType().name().equalsIgnoreCase("ELF")))) {
//Eine der Karten ist der Fire Elf die andere Karte ist der drache
System.out.println("Andere ist ein elf");
Card fireelf;
if (dragonOwner == 1) {
fireelf = c2;
@ -145,7 +137,6 @@ public class Battle {
//Checkt ob eine der beiden karten ein wizzard ist und der andere ein ork
} else if ((c1.getCardType().name().equalsIgnoreCase("WIZZARD") && c2.getCardType().name().equalsIgnoreCase("ORK") || (c2.getCardType().name().equalsIgnoreCase("WIZZARD") && c1.getCardType().name().equalsIgnoreCase("ORK")))) {
System.out.println("Eine wizzard Andere ist ein ork");
Card wizzard = null;
Card ork = null;
int wizzardOwner = 0;
@ -184,7 +175,6 @@ public class Battle {
if (c1.getCardType().name().equalsIgnoreCase("KNIGHT") || c2.getCardType().name().equalsIgnoreCase("KNIGHT")) {
//Mixed mit "Spezialeffekt" KNIGHT
System.out.println("Spell und knight");
Card knight = null, other = null;
int knightOwner = 0;
if (c1.getCardType().name().equalsIgnoreCase("KNIGHT")) {
@ -254,7 +244,6 @@ public class Battle {
}
} else {
////PURE SPELL & mixed mit elementen
System.out.println("Spell und mixed mit elementen");
//Player 1 Damage berechnen
damagePlayer1 = calculateEffectiveness(c1, c2);
//P2 damage
@ -267,7 +256,6 @@ public class Battle {
p2win(c1, c2);
}
} else {
System.out.println("Damage konnte nicht berechnet werden");
return false;
}
}
@ -279,7 +267,7 @@ public class Battle {
this.deckPlayer1 = new Cards(this.d1);
this.deckPlayer2 = new Cards(this.d2);
}else{
System.out.println("Einer der Spieler hat zu wenige Karten im Deck");
System.err.println("Einer der Spieler hat zu wenige Karten im Deck");
return false;
}
return true;

View File

@ -30,19 +30,22 @@ public class DBConnection {
/**
* Erstellt alle Tabellen die für den Betrieb der Software bennötigt werden
* @return True bei erfolg, sonst error
*/
public void init() {
PostgresHelper.executeUpdateMessage("CREATE TABLE IF NOT EXISTS USERS (username TEXT PRIMARY KEY NOT NULL, nachname TEXT NOT NULL, email TEXT NOT NULL, password TEXT NOT NULL, bio TEXT, image TEXT, coins integer default 20 not null)", "User Table created");
PostgresHelper.executeUpdate("CREATE TABLE IF NOT EXISTS CARD(NAME TEXT not null,DAMAGE FLOAT not null,ELEMENTTYP TEXT not null,CARDTYPE TEXT not null, PRIMARY KEY (\"name\"));");
PostgresHelper.executeUpdateMessage("create unique index IF NOT EXISTS card_name_uindex on CARD (NAME);", "Card Table created");
PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS package(\"ID\" varchar(255) not null,name varchar(255) not null constraint name references card, i serial not null constraint package_i primary key );", "Package Table created");
PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS user_cards(username TEXT not null constraint user_cards_users_username_fk references users,name text not null, gesperrt boolean not null);", "UserCards Table created");
PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS user_deck(username text not null constraint user_deck_users_username_fk references users,cardname text not null);", "UserDeck Table created");
PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS trading(username text not null constraint trading_users_username_fk references users,id text not null constraint trading_pk primary key, cardtotrade text not null constraint trading_card_name_fk references card, mindamage float not null,reqcardtype text not null,reqelement text not null);", "Trading Table created");
PostgresHelper.executeUpdate("create table if not exists battle(usernamecreator text not null constraint battle_users_username_fk references users,usernameplayer text constraint battle_users_username_fk_2 references users, battleid serial, deckcreator text not null);");
PostgresHelper.executeUpdateMessage("create unique index if not exists battle_battleid_uindex on battle (battleid);", "Battle Table created");
PostgresHelper.executeUpdate("create table IF NOT EXISTS battle_log(id int not null constraint battle_log_pk primary key, playerone text not null,playertwo text not null,playeronescore text not null,playertwoscore text not null,log varchar(10485760));");
PostgresHelper.executeUpdateMessage("create unique index IF NOT EXISTS battle_log_id_uindex on battle_log (id);", "Battle_lgo Table created");
public boolean init() {
ArrayList<Boolean> errors = new ArrayList<>();
errors.add(PostgresHelper.executeUpdateMessage("CREATE TABLE IF NOT EXISTS USERS (username TEXT PRIMARY KEY NOT NULL, nachname TEXT NOT NULL, email TEXT NOT NULL, password TEXT NOT NULL, bio TEXT, image TEXT, coins integer default 20 not null)", "User Table created"));
errors.add(PostgresHelper.executeUpdate("CREATE TABLE IF NOT EXISTS CARD(NAME TEXT not null,DAMAGE FLOAT not null,ELEMENTTYP TEXT not null,CARDTYPE TEXT not null, PRIMARY KEY (\"name\"));"));
errors.add(PostgresHelper.executeUpdateMessage("create unique index IF NOT EXISTS card_name_uindex on CARD (NAME);", "Card Table created"));
errors.add(PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS package(\"ID\" varchar(255) not null,name varchar(255) not null constraint name references card, i serial not null constraint package_i primary key );", "Package Table created"));
errors.add(PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS user_cards(username TEXT not null constraint user_cards_users_username_fk references users,name text not null, gesperrt boolean not null);", "UserCards Table created"));
errors.add(PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS user_deck(username text not null constraint user_deck_users_username_fk references users,cardname text not null);", "UserDeck Table created"));
errors.add(PostgresHelper.executeUpdateMessage("create table IF NOT EXISTS trading(username text not null constraint trading_users_username_fk references users,id text not null constraint trading_pk primary key, cardtotrade text not null constraint trading_card_name_fk references card, mindamage float not null,reqcardtype text not null,reqelement text not null);", "Trading Table created"));
errors.add(PostgresHelper.executeUpdate("create table if not exists battle(usernamecreator text not null constraint battle_users_username_fk references users,usernameplayer text constraint battle_users_username_fk_2 references users, battleid serial, deckcreator text not null);"));
errors.add(PostgresHelper.executeUpdateMessage("create unique index if not exists battle_battleid_uindex on battle (battleid);", "Battle Table created"));
errors.add(PostgresHelper.executeUpdate("create table IF NOT EXISTS battle_log(id int not null constraint battle_log_pk primary key, playerone text not null,playertwo text not null,playeronescore text not null,playertwoscore text not null,log varchar(10485760));"));
errors.add(PostgresHelper.executeUpdateMessage("create unique index IF NOT EXISTS battle_log_id_uindex on battle_log (id);", "Battle_lgo Table created"));
return !errors.contains(false);
}
/**
@ -60,7 +63,6 @@ public class DBConnection {
while (rs.next()) {
id = rs.getInt("id");
if (id > 0) {
System.out.println("BATTLE ID: " + id);
battleIds.add(id + "");
}else {
return null;
@ -90,10 +92,7 @@ public class DBConnection {
//noinspection LoopStatementThatDoesntLoop
while (rs.next()) {
id = rs.getInt("max");
System.out.println("select max(id) from battle_log where playerone = '" + username + "' or playerone = '" + username + "';");
System.out.println("PREEEE IF ID: " + id);
if (id > 0) {
System.out.println("LAST BATTLE ID: " + id);
return id;
}else {
return -1;
@ -139,7 +138,6 @@ public class DBConnection {
map.put("id", id+"");
return map;
}else{
System.out.println("GET BATTLE LOG WAS EMPTY");
return null;
}

View File

@ -20,7 +20,10 @@ public class Main {
* @param args Nicht Verwendet
*/
public static void main(String[] args) {
new DBConnection().init();
if (!new DBConnection().init()) {
System.err.println("DB init failed");
System.exit(0);
}
System.out.println("\n\nStarte Server auf Port " + port + "\n\n");
new Main(port);
}

View File

@ -4,6 +4,7 @@ import at.reisinger.obj.*;
import at.reisinger.obj.Package;
import at.reisinger.server.DBConnection;
import at.reisinger.server.helper.JsonHelper;
import at.reisinger.server.helper.PostgresHelper;
import at.reisinger.server.helper.ResponseHelper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@ -59,14 +60,10 @@ public class Response {
}
break;
case "DELETE":
if (login()) {
deleteMethodes();
} else {
sendResponse("Login Error", "401");
}
break;
default:
sendResponse("", "405");
sendResponse(cmd + " not found!", "405");
break;
}
}
@ -169,7 +166,7 @@ public class Response {
sendResponse("Login Error", "401");
}
}else{
sendResponse("", "204");
sendResponse(this.url + " not found!", "404");
}
}
@ -425,7 +422,6 @@ public class Response {
openBattle.setDeckPlayer2(deck);
if(new DBConnection().delBattleEinladung(openBattle.getId() + "")) {
if (openBattle.doFight()){
System.out.println(JsonHelper.objToJson(openBattle.getLog().size()));
if (new DBConnection().addBattleLog(openBattle.getId() + "", openBattle.getPlayer1().getName(), openBattle.getPlayer2().getName(), openBattle.getScorePlayer1() + "", openBattle.getScorePlayer2() + "", openBattle.getLog().toString())) {
if (new DBConnection().delDeck(openBattle.getPlayer1().getCredentials().getUsername()) && new DBConnection().delDeck(openBattle.getPlayer2().getCredentials().getUsername())) {
//DEL OLD DECK CARDS
@ -500,7 +496,7 @@ public class Response {
sendResponse("Login Error", "401");
}
} else{
sendResponse("", "405");
sendResponse(this.url + " not found!", "404");
}
}
@ -563,6 +559,8 @@ public class Response {
}else{
sendResponse(Objects.requireNonNull(deckIds).size() + " von 4 Karten sind im Deck.","500");
}
}else{
sendResponse(this.url + " not found!", "404");
}
}
@ -570,10 +568,10 @@ public class Response {
/**
* Alle Delete Methoden, siehe API beschreibung für genauere details
* Nur für angemeldete user erreichbar
*/
private void deleteMethodes(){
if (this.url.startsWith("/tradings")) {
if(login()) {
String tradeid = this.url.substring(this.url.lastIndexOf('/') + 1);
ArrayList<TradingDeal> allTradingDeals = new DBConnection().getAllTradingDeals();
TradingDeal tr = null;
@ -590,11 +588,29 @@ public class Response {
} else {
sendResponse("", "500");
}
}else{
} else {
sendResponse("", "500");
}
}
}else{
sendResponse("Login Error", "401");
}
}else if (this.url.startsWith("/db/all")) {
if(basicAuth("admin", "istrator", this.authString)) {
if (!PostgresHelper.executeUpdate("drop table user_deck;drop table trading;drop table battle;drop table battle_log;drop table user_cards;drop table package;drop table card;drop table users;")) {
if (!new DBConnection().init()) {
sendResponse("DB init failed", "500");
} else {
sendResponse("DB deleted & recreated", "205");
}
}else {
sendResponse("DB drop error", "500");
}
}else {
sendResponse("Login Error", "401");
}
}else{
sendResponse(this.url + " not found!", "404");
}
}