diff --git a/pom.xml b/pom.xml
index 7b353f3..f38313e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,13 +21,26 @@
org.springframework.boot
spring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
org.springframework.boot
spring-boot-starter-test
test
3.1.2
+
+ org.springframework.boot
+ spring-boot-starter-security
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/BasicController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/BasicController.java
new file mode 100644
index 0000000..fbb3f0c
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/controller/BasicController.java
@@ -0,0 +1,26 @@
+package com.faf223.expensetrackerfaf.controller;
+
+import com.faf223.expensetrackerfaf.model.BasicEntity;
+import com.faf223.expensetrackerfaf.repository.BasicRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/getData")
+public class BasicController {
+ private final BasicRepository basicRepository;
+
+ @Autowired
+ public BasicController(BasicRepository basicRepository) {
+ this.basicRepository = basicRepository;
+ }
+
+ @GetMapping()
+ public List listDepartments() {
+ return basicRepository.findAll();
+ }
+}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/MainController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/MainController.java
new file mode 100644
index 0000000..6e8d9bf
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/controller/MainController.java
@@ -0,0 +1,66 @@
+package com.faf223.expensetrackerfaf.controller;
+
+import com.faf223.expensetrackerfaf.model.Expense;
+import com.faf223.expensetrackerfaf.model.Income;
+import com.faf223.expensetrackerfaf.model.Role;
+import com.faf223.expensetrackerfaf.model.User;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+public class MainController {
+
+ @GetMapping("/")
+ public String helloWorld() {
+ return "Hello, World!";
+ }
+
+ @GetMapping("/users/get/{id}")
+ public User getUser(@PathVariable int id) {
+ return new User(id, "Test", null, null, null, null, null, null);
+ }
+
+ @PostMapping("/users/set/{id}/name")
+ public String setName(@PathVariable int id,
+ @RequestParam("name") String name) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/email")
+ public String setEmail(@PathVariable int id,
+ @RequestParam("email") String email) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/login")
+ public String setLogin(@PathVariable int id,
+ @RequestParam("login") String login) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/password")
+ public String setPassword(@PathVariable int id,
+ @RequestParam("password") String password) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/role")
+ public String setRole(@PathVariable int id,
+ @RequestParam("role") Role role) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/expenses")
+ public String setExpenses(@PathVariable int id,
+ @RequestParam("expenses") List expenses) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+ @PostMapping("/users/set/{id}/incomes")
+ public String setIncomes(@PathVariable int id,
+ @RequestParam("incomes")List incomes) {
+ throw new UnsupportedOperationException("Waiting for the DB.");
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/faf223/expensetrackerfaf/controllers/MainController.java b/src/main/java/com/faf223/expensetrackerfaf/controllers/MainController.java
deleted file mode 100644
index fe74c84..0000000
--- a/src/main/java/com/faf223/expensetrackerfaf/controllers/MainController.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.faf223.expensetrackerfaf.controllers;
-
-import entities.User;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class MainController {
-
- @GetMapping("/")
- public String helloWorld() {
- return "Hello, World!";
- }
-
- @GetMapping("/users/get/{id}")
- public User getUser(@PathVariable int id) {
- return new User(id, "Test", null, null, null, null, null, null);
- }
-
-}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/custom/UppercaseStrategy.java b/src/main/java/com/faf223/expensetrackerfaf/custom/UppercaseStrategy.java
new file mode 100644
index 0000000..9c3cc83
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/custom/UppercaseStrategy.java
@@ -0,0 +1,39 @@
+package com.faf223.expensetrackerfaf.custom;
+
+import org.hibernate.boot.model.naming.Identifier;
+import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
+import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
+
+public class UppercaseStrategy implements PhysicalNamingStrategy {
+
+ @Override
+ public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
+ return identifier; // No modification for catalog name
+ }
+
+ @Override
+ public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
+ return identifier; // No modification for schema name
+ }
+
+ @Override
+ public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
+ String tableName = name.getText();
+ return new Identifier(tableName, name.isQuoted());
+ }
+
+ @Override
+ public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
+ return identifier; // No modification for sequence name
+ }
+
+ @Override
+ public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnvironment) {
+ return identifier; // No modification for column name
+ }
+
+ @Override
+ public Identifier toPhysicalTypeName(Identifier logicalName, JdbcEnvironment jdbcEnvironment) {
+ return PhysicalNamingStrategy.super.toPhysicalTypeName(logicalName, jdbcEnvironment);
+ }
+}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/BasicEntity.java b/src/main/java/com/faf223/expensetrackerfaf/model/BasicEntity.java
new file mode 100644
index 0000000..06f0644
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/BasicEntity.java
@@ -0,0 +1,37 @@
+package com.faf223.expensetrackerfaf.model;
+
+import jakarta.persistence.*;
+import java.util.Date;
+
+@Entity
+@Table(name = "Department", schema = "HumanResources")
+public class BasicEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "DepartmentID")
+ private Short departmentId;
+
+ @Column(name = "GroupName", nullable = false, length = 50)
+ private String groupName;
+
+ @Column(name = "ModifiedDate", nullable = false)
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date modifiedDate;
+
+ @Column(name = "Name", nullable = false, length = 50)
+ private String name;
+
+ public Short getDepartmentId() {
+ return departmentId;
+ }
+ public String getGroupName() {
+ return groupName;
+ }
+ public Date getModifiedDate() {
+ return modifiedDate;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/main/java/entities/Categories.java b/src/main/java/com/faf223/expensetrackerfaf/model/Categories.java
similarity index 95%
rename from src/main/java/entities/Categories.java
rename to src/main/java/com/faf223/expensetrackerfaf/model/Categories.java
index 43bda11..a309f85 100644
--- a/src/main/java/entities/Categories.java
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/Categories.java
@@ -1,4 +1,5 @@
-package entities;
+
+package com.faf223.expensetrackerfaf.model;
public class Categories {
diff --git a/src/main/java/entities/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java
similarity index 51%
rename from src/main/java/entities/Expense.java
rename to src/main/java/com/faf223/expensetrackerfaf/model/Expense.java
index c6b2c3b..48f80c4 100644
--- a/src/main/java/entities/Expense.java
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java
@@ -1,24 +1,43 @@
-package entities;
+package com.faf223.expensetrackerfaf.model;
+import com.faf223.expensetrackerfaf.util.IMoneyTransaction;
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "expense")
public class Expense implements IMoneyTransaction {
- private int userId;
+ @Id
+ @Column(name = "id")
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @ManyToOne
+ @JoinColumn(name = "user_id", referencedColumnName = "id")
+ private User user;
private int amount;
private Categories.ExpenseCategory category;
- public Expense(int userId, int amount, Categories.ExpenseCategory category) {
- this.userId = userId;
+ public Expense(User user, int amount, Categories.ExpenseCategory category) {
+ this.user = user;
this.amount = amount;
this.category = category;
}
+ public Expense() {}
+
@Override
- public long getUserId() {
- return userId;
+ public User getUser() {
+ return user;
}
public void setUserId(int userId) {
- this.userId = userId;
+ this.user = user;
+ }
+
+ @Override
+ public long getUserId() {
+ return 0;
}
@Override
diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java
new file mode 100644
index 0000000..098c4de
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java
@@ -0,0 +1,60 @@
+package com.faf223.expensetrackerfaf.model;
+
+import com.faf223.expensetrackerfaf.util.IMoneyTransaction;
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "income")
+public class Income implements IMoneyTransaction {
+
+ @Id
+ @Column(name = "id")
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ @ManyToOne
+ @JoinColumn(name = "user_id", referencedColumnName = "id")
+ private User user;
+ private int amount;
+ private Categories.IncomeCategory category;
+
+ public Income(User user, int amount, Categories.IncomeCategory category) {
+ this.user = user;
+ this.amount = amount;
+ this.category = category;
+ }
+
+ public Income() {}
+
+ @Override
+ public User getUser() {
+ return user;
+ }
+
+ @Override
+ public long getUserId() {
+ return 0;
+ }
+
+ @Override
+ public int getAmount() {
+ return amount;
+ }
+
+ @Override
+ public String getCategory() {
+ return category.getEffectiveName();
+ }
+
+ public void setUserId(User user) {
+ this.user = user;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+
+ public void setCategory(Categories.IncomeCategory category) {
+ this.category = category;
+ }
+}
diff --git a/src/main/java/entities/Role.java b/src/main/java/com/faf223/expensetrackerfaf/model/Role.java
similarity index 57%
rename from src/main/java/entities/Role.java
rename to src/main/java/com/faf223/expensetrackerfaf/model/Role.java
index 258e49e..d9393e8 100644
--- a/src/main/java/entities/Role.java
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/Role.java
@@ -1,7 +1,6 @@
-package entities;
+
+package com.faf223.expensetrackerfaf.model;
public enum Role {
-
UNREGISTERED, REGISTERED, ADMIN;
-
}
diff --git a/src/main/java/entities/User.java b/src/main/java/com/faf223/expensetrackerfaf/model/User.java
similarity index 83%
rename from src/main/java/entities/User.java
rename to src/main/java/com/faf223/expensetrackerfaf/model/User.java
index 37f571a..65ed712 100644
--- a/src/main/java/entities/User.java
+++ b/src/main/java/com/faf223/expensetrackerfaf/model/User.java
@@ -1,12 +1,25 @@
-package entities;
+
+package com.faf223.expensetrackerfaf.model;
+import jakarta.persistence.*;
import java.util.List;
+@Entity
+@Table(name = "User")
public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
- private String name, email, login, password;
+ private String name;
+ private String email;
+ private String login;
+ private String password;
private Role role;
+
+ @OneToMany(mappedBy = "user")
private List expenses;
+
+ @OneToMany(mappedBy = "user")
private List incomes;
public User(long id, String name, String email, String login, String password, Role role, List expenses, List incomes) {
diff --git a/src/main/java/com/faf223/expensetrackerfaf/repository/BasicRepository.java b/src/main/java/com/faf223/expensetrackerfaf/repository/BasicRepository.java
new file mode 100644
index 0000000..94f10e3
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/repository/BasicRepository.java
@@ -0,0 +1,12 @@
+package com.faf223.expensetrackerfaf.repository;
+
+import com.faf223.expensetrackerfaf.model.BasicEntity;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface BasicRepository extends JpaRepository {
+ // You can define custom query methods here if needed
+}
+
diff --git a/src/main/java/com/faf223/expensetrackerfaf/security/PersonDetails.java b/src/main/java/com/faf223/expensetrackerfaf/security/PersonDetails.java
new file mode 100644
index 0000000..cb18bc5
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/security/PersonDetails.java
@@ -0,0 +1,59 @@
+package com.faf223.expensetrackerfaf.security;
+
+import com.faf223.expensetrackerfaf.model.Role;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.List;
+
+public class PersonDetails implements UserDetails {
+
+ private final User user;
+
+ @Enumerated(EnumType.STRING)
+ private Role role;
+
+ public PersonDetails(User user) {
+ this.user = user;
+ }
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return List.of(new SimpleGrantedAuthority(role.name()));
+ }
+
+ @Override
+ public String getPassword() {
+ return user.getPassword();
+ }
+
+ @Override
+ public String getUsername() {
+ return user.getUsername();
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/BasicService.java b/src/main/java/com/faf223/expensetrackerfaf/service/BasicService.java
new file mode 100644
index 0000000..a424dce
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/service/BasicService.java
@@ -0,0 +1,9 @@
+package com.faf223.expensetrackerfaf.service;
+
+import com.faf223.expensetrackerfaf.model.BasicEntity;
+
+import java.util.List;
+
+public interface BasicService {
+ List getAllData();
+}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/BasicServiceImpl.java b/src/main/java/com/faf223/expensetrackerfaf/service/BasicServiceImpl.java
new file mode 100644
index 0000000..8a83825
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/service/BasicServiceImpl.java
@@ -0,0 +1,23 @@
+package com.faf223.expensetrackerfaf.service;
+
+import com.faf223.expensetrackerfaf.model.BasicEntity;
+import com.faf223.expensetrackerfaf.repository.BasicRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BasicServiceImpl implements BasicService {
+ private final BasicRepository basicRepository;
+
+ @Autowired
+ public BasicServiceImpl(BasicRepository basicRepository) {
+ this.basicRepository = basicRepository;
+ }
+
+ @Override
+ public List getAllData() {
+ return basicRepository.findAll();
+ }
+}
diff --git a/src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java b/src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java
new file mode 100644
index 0000000..7dfe2fd
--- /dev/null
+++ b/src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java
@@ -0,0 +1,13 @@
+package com.faf223.expensetrackerfaf.util;
+
+import com.faf223.expensetrackerfaf.model.User;
+
+public interface IMoneyTransaction {
+
+ User getUser();
+
+ long getUserId();
+ int getAmount();
+ String getCategory();
+
+}
diff --git a/src/main/java/entities/IMoneyTransaction.java b/src/main/java/entities/IMoneyTransaction.java
deleted file mode 100644
index 70b92d5..0000000
--- a/src/main/java/entities/IMoneyTransaction.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package entities;
-
-public interface IMoneyTransaction {
-
- long getUserId();
- int getAmount();
- String getCategory();
-
-}
diff --git a/src/main/java/entities/Income.java b/src/main/java/entities/Income.java
deleted file mode 100644
index 31b5d67..0000000
--- a/src/main/java/entities/Income.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package entities;
-
-public class Income implements IMoneyTransaction {
-
- private long userId;
- private int amount;
- private Categories.IncomeCategory category;
-
- public Income(long userId, int amount, Categories.IncomeCategory category) {
- this.userId = userId;
- this.amount = amount;
- this.category = category;
- }
-
- @Override
- public long getUserId() {
- return userId;
- }
-
- @Override
- public int getAmount() {
- return amount;
- }
-
- @Override
- public String getCategory() {
- return category.getEffectiveName();
- }
-
- public void setUserId(long userId) {
- this.userId = userId;
- }
-
- public void setAmount(int amount) {
- this.amount = amount;
- }
-
- public void setCategory(Categories.IncomeCategory category) {
- this.category = category;
- }
-}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 637a0d4..4d2c5a7 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,3 +1,5 @@
-spring.datasource.url=jdbc:sqlserver://DESKTOP-53DT8GT\\SQLEXPRESS:1433;databaseName=ExpensesApp;integratedSecurity=true
+spring.datasource.url=jdbc:sqlserver://DANIEL-LAPTOP\\SQLEXPRESS01:1433;databaseName=AdventureWorks2022;user=Daniel1;password=daniel;encrypt=true;trustServerCertificate=true;
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect
\ No newline at end of file
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect
+spring.jpa.hibernate.naming.physical-strategy=com.faf223.expensetrackerfaf.custom.UppercaseStrategy
+
diff --git a/src/main/resources/templates/basic-template.jsp b/src/main/resources/templates/basic-template.jsp
new file mode 100644
index 0000000..de83d98
--- /dev/null
+++ b/src/main/resources/templates/basic-template.jsp
@@ -0,0 +1,25 @@
+
+
+
+
+ Department List
+
+
+ Department List
+
+
+
+ | Department ID |
+ Name |
+ Group Name |
+ Modified Date |
+
+
+
+
+ |
+
+
+
+
+