The document summarizes a backend project created by a team of 4 members over 7 weeks. It outlines the technologies used, including Spring Boot, Hibernate, MySQL, JWT authentication, and deployment to Heroku. It provides details on the project structure, including 54 classes in 5 packages, 19 test classes, 7 controllers, and 19 entity models mapped to the MySQL database. It also describes some methods and endpoints, and where to find the GitHub repository and running application. Security is handled through JWT authentication and authorization filters. Database migrations are managed through Flyway to support database versioning.
2. OUR TEAM HAS FOUR MEMBERS
JIŘINA KOPSOVÁ
• https://github.com/Kopsova/
• www.linkedin.com/in/jirinakopsova
PETER KOŽUCH
• https://github.com/PeterXMR
• www.linkedin.com/in/PeterKozuch
VOJTĚCH BLUDSKÝ
• https://github.com/Organt
• www.linkedin.com/in/vojtech-
bludsky
JIŘÍ SOUŠEK
• https://github.com/jsousek
• https://www.linkedin.com/in/jirisous
ek/
3. WE ALREADY SPEND 7 WEEKS WORKING ON
OUR APP
WHICH IS BEAUTIFUL :
SINCE IT IS A RESTFUL APPLICATION
4. LIST OF TECHNOLOGIES USED IN THE
PROJECT
• SPRING BOOT
• HIBERNATE
• ORACLE MYSQL
• FLYWAY DB MIGRATION
• JWT TOKEN AUTHENTICATION
• BCRYPT PW ENCRYPTION
• JUNIT
• MOCKITO TEST FRAMEWORK
• MOCK MVC
• JENKINS CI
• HEROKU DEPLOYMENT
• POSTMAN
5. WE ALREADY HAVE
• 54 CLASSES IN 5 PACKAGES
• 19 TESTS CLASSES WITH 53 TESTS
11. SOME METHODS IN OUR PROJECT ARE
ELEGANT AND SIMPLE
public int getSumOfBuildingLevels(Kingdom kingdom, String buildingType) {
return kingdom.getBuildings().stream()
.filter(b -> b.getType().equals(buildingType))
.mapToInt(Building::getLevel)
.sum();
}
12. SOME COULD USE SOME REFACTORING OR
SIMPLIFICATION
public List<ResourcesModel> resourceDisplayandUpdate(String username) {
Kingdom kingdomFromDB = kingdomService.verifyKingdom(username);
List<ResourcesModel> rmListFromDB = kingdomFromDB.getResourcesModel();
List<String>buildingTypes = Arrays.asList("mine","farm");
for (int i = 0; i < 2; i++) {
long OriginalUpdatedAt = rmListFromDB.get(i).getUpdatedAt();
String buildingType = buildingTypes.get(i);
long timeDiff = timeDifferenceInMinIn(OriginalUpdatedAt, System.currentTimeMillis());
long sumRes = getSumOfBuildingLevels(kingdomFromDB, buildingType);
rmListFromDB.get(i).setAmount(rmListFromDB.get(i).getAmount() + (timeDiff * sumRes));
rmListFromDB.get(i).setUpdatedAt(getCurrentTimestamp().getTime());
rmListFromDB.get(i).setGenerated(timeDiff * sumRes);
resourceRepository.save(rmListFromDB.get(i));
}
return rmListFromDB;
}
13. WHERE TO FIND OUR APP
URL:
https://vulpes-tribes-backend.herokuapp.com
GitHub Repository:
https://github.com/green-fox-academy/vulpes-
tribes-backend
14. BUT MOST OF ALL, IT
WORKS
👍
AS VOJTA WILL DEMONSTRATE IN POSTMAN
19. public class JWTService {
public static String createToken (String username){
String jwtToken = JWT.create()
.withSubject(username)
.withExpiresAt(new
Date(System.currentTimeMillis() + EXPIRATION_TIME))
.sign(HMAC512(SecurityConstants.SECRET.getBytes()))
;
return jwtToken;
}
Method createToken
20. USER IS LOGGED IN SUCCESSFULLY.
JWT TOKEN IS CREATED.
{ "status": "ok",
"tribes_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZGFtZ3l1bGF2YXJpIiwiZX
hwIjoxNTQ5Mjc2NzQ1fQ.xYiud2OUo8TycTUt3nueW-
ULDEDA_sAc_fyi0joMUjb2uUF_1SfvhoC7zbU9uWNWHHuPO-zbxXiY1BkWJQ-
fmg "
}
To access secured endpoint, JWT token must be present in the header of each
HTTP request.
21. SECURITY IS HANDLED BY
JWTAUTHORISATIONFILTER
IT IS NOT NECESSARY TO SECURE EVERY
SINGLE ENDPOINT SEPARATELY.
25. WHY WE HAVE DATABASE MIGRATIONS IN
OUR APP
• WE CAN HAVE SEVERAL VERSIONS OF OUR DATABASE
• WE CAN FILL DATABASE WITH DATA IN A CONTROLLED MANNER
• WE DO NOT NEED DROP DATABASE AT HEROKU IF DATABASE
STRUCTURE HAS BEEN CHANGED