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 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 IDNameGroup NameModified Date
+ +