Readme.md + UML + db/all (reset+recreate)
This commit is contained in:
parent
514ac3553f
commit
e590ccd3e0
41
README.md
41
README.md
@ -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
|
||||

|
||||
* [UML.png](https://github.com/DerGeorg/SWE1-MTCG/blob/master/UML2021.png)
|
||||
* [UML.svg](https://github.com/DerGeorg/SWE1-MTCG/blob/master/UML2021.svg)
|
||||

|
BIN
UML2021.png
BIN
UML2021.png
Binary file not shown.
Before Width: | Height: | Size: 16 MiB After Width: | Height: | Size: 16 MiB |
3405
UML2021.svg
Normal file
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
1
insomnia.json
Normal file
File diff suppressed because one or more lines are too long
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user