diff --git a/apiDesign.drawio b/apiDesign.drawio
new file mode 100644
index 0000000..e276b67
--- /dev/null
+++ b/apiDesign.drawio
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/de/zendric/app/XpenselyServer/controller/ExpenseListController.java b/src/main/java/de/zendric/app/XpenselyServer/controller/ExpenseListController.java
deleted file mode 100644
index a41b469..0000000
--- a/src/main/java/de/zendric/app/XpenselyServer/controller/ExpenseListController.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.zendric.app.XpenselyServer.controller;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import de.zendric.app.XpenselyServer.model.ExpenseList;
-import de.zendric.app.XpenselyServer.services.ExpenseListService;
-
-@RestController
-@RequestMapping("/api/lists")
-public class ExpenseListController {
-
- @Autowired
- private ExpenseListService service;
-
- @GetMapping
- public List getAllLists() {
- return service.getAllLists();
- }
-
- @PostMapping
- public ExpenseList createList(@RequestBody ExpenseList list) {
- return service.createList(list);
- }
-
- @DeleteMapping("/{id}")
- public void deleteList(@PathVariable Long id) {
- service.deleteList(id);
- }
-}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/model/Expense.java b/src/main/java/de/zendric/app/XpenselyServer/model/Expense.java
deleted file mode 100644
index b3618a6..0000000
--- a/src/main/java/de/zendric/app/XpenselyServer/model/Expense.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.zendric.app.XpenselyServer.model;
-
-import jakarta.persistence.Entity;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-import jakarta.persistence.ManyToOne;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@Entity
-public class Expense {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
-
- private String description;
- private Double amount;
-
-
- @ManyToOne
- private ExpenseList expenseList;
-}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/security/SecurityConfig.java b/src/main/java/de/zendric/app/XpenselyServer/security/SecurityConfig.java
deleted file mode 100644
index fa24b6b..0000000
--- a/src/main/java/de/zendric/app/XpenselyServer/security/SecurityConfig.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.zendric.app.XpenselyServer.security;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.web.SecurityFilterChain;
-
-@Configuration
-public class SecurityConfig {
-
- @Bean
- public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
- http
- .csrf().disable() // Disable CSRF for testing
- .authorizeHttpRequests()
- .anyRequest().permitAll(); // Allow all requests
- return http.build();
- }
-}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/services/ExpenseListService.java b/src/main/java/de/zendric/app/XpenselyServer/services/ExpenseListService.java
deleted file mode 100644
index d08c3a1..0000000
--- a/src/main/java/de/zendric/app/XpenselyServer/services/ExpenseListService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.zendric.app.XpenselyServer.services;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import de.zendric.app.XpenselyServer.model.ExpenseList;
-import de.zendric.app.XpenselyServer.repo.ExpenseListRepository;
-
-@Service
-public class ExpenseListService {
- @Autowired
- private ExpenseListRepository repository;
-
- public List getAllLists() {
- return repository.findAll();
- }
-
- public ExpenseList createList(ExpenseList list) {
- return repository.save(list);
- }
-
- public void deleteList(Long id) {
- repository.deleteById(id);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/de/zendric/app/XpenselyServer/XpenselyServerApplication.java b/src/main/java/de/zendric/app/xpensely_server/XpenselyServerApplication.java
similarity index 88%
rename from src/main/java/de/zendric/app/XpenselyServer/XpenselyServerApplication.java
rename to src/main/java/de/zendric/app/xpensely_server/XpenselyServerApplication.java
index 0fe260e..420f3e5 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/XpenselyServerApplication.java
+++ b/src/main/java/de/zendric/app/xpensely_server/XpenselyServerApplication.java
@@ -1,4 +1,4 @@
-package de.zendric.app.XpenselyServer;
+package de.zendric.app.xpensely_server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/src/main/java/de/zendric/app/XpenselyServer/controller/AppUserController.java b/src/main/java/de/zendric/app/xpensely_server/controller/AppUserController.java
similarity index 57%
rename from src/main/java/de/zendric/app/XpenselyServer/controller/AppUserController.java
rename to src/main/java/de/zendric/app/xpensely_server/controller/AppUserController.java
index 5d03e05..4714ecc 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/controller/AppUserController.java
+++ b/src/main/java/de/zendric/app/xpensely_server/controller/AppUserController.java
@@ -1,4 +1,4 @@
-package de.zendric.app.XpenselyServer.controller;
+package de.zendric.app.xpensely_server.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -11,35 +11,39 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import de.zendric.app.XpenselyServer.model.AppUser;
-import de.zendric.app.XpenselyServer.services.UserService;
+import de.zendric.app.xpensely_server.model.AppUser;
+import de.zendric.app.xpensely_server.services.UserService;
@RestController
@RequestMapping("/api/users")
public class AppUserController {
-
+
private UserService userService;
-
+
@Autowired
- public AppUserController(UserService userService){
- this.userService= userService;
+ public AppUserController(UserService userService) {
+ this.userService = userService;
}
-
+
@GetMapping
- public AppUser getUser(@RequestParam Long id){
+ public AppUser getUser(@RequestParam Long id) {
return userService.getUser(id);
}
- @PostMapping
- public ResponseEntity createUser(@RequestBody AppUser user){
- AppUser appUser = userService.createUser(user);
- return ResponseEntity.status(HttpStatus.CREATED).body(appUser);
+ @GetMapping("/byName")
+ public AppUser getUserByName(@RequestParam String username) {
+ return userService.getUserByName(username);
}
+ @PostMapping
+ public ResponseEntity createUser(@RequestBody AppUser user) {
+ AppUser appUser = userService.createUser(user);
+ return ResponseEntity.status(HttpStatus.CREATED).body(appUser);
+ }
@DeleteMapping
- public String deleteUser(@RequestParam Long id){
- AppUser user = userService.deleteUserById(id);
- return "User deleted : "+ user.getUsername();
+ public String deleteUser(@RequestParam Long id) {
+ AppUser user = userService.deleteUserById(id);
+ return "User deleted : " + user.getUsername();
}
}
diff --git a/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java b/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java
new file mode 100644
index 0000000..b39ccc1
--- /dev/null
+++ b/src/main/java/de/zendric/app/xpensely_server/controller/ExpenseListController.java
@@ -0,0 +1,132 @@
+package de.zendric.app.xpensely_server.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import de.zendric.app.xpensely_server.model.Expense;
+import de.zendric.app.xpensely_server.model.ExpenseList;
+import de.zendric.app.xpensely_server.services.ExpenseListService;
+
+@RestController
+@RequestMapping("/api/expenselist")
+class ExpenseListController {
+
+ private ExpenseListService expenseListService;
+
+ @Autowired
+ public ExpenseListController(ExpenseListService expenseListService) {
+ this.expenseListService = expenseListService;
+ }
+
+ @GetMapping("/all")
+ public ResponseEntity> getAll() {
+ try {
+ List items = new ArrayList<>();
+
+ expenseListService.findAll().forEach(items::add);
+
+ if (items.isEmpty())
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+
+ return new ResponseEntity<>(items, HttpStatus.OK);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @GetMapping("/byUser")
+ public ResponseEntity> getByUser(@RequestParam Long userId) {
+ try {
+ List items = expenseListService.findByUserId(userId);
+
+ if (items.isEmpty())
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+
+ return new ResponseEntity<>(items, HttpStatus.OK);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @GetMapping("/byUsername")
+ public ResponseEntity> getByUser(@RequestParam String username) {
+ try {
+ List items = expenseListService.findByUsername(username);
+
+ if (items.isEmpty())
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+
+ return new ResponseEntity<>(items, HttpStatus.OK);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @GetMapping("/byId")
+ public ResponseEntity getById(@RequestParam Long id) {
+ Optional existingItemOptional = expenseListService.findById(id);
+
+ if (existingItemOptional.isPresent()) {
+ return new ResponseEntity<>(existingItemOptional.get(), HttpStatus.OK);
+ } else {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+ }
+
+ @PostMapping
+ public ResponseEntity create(@RequestBody ExpenseList expenseList) {
+ try {
+ ExpenseList savedItem = (ExpenseList) expenseListService.save(expenseList);
+ return new ResponseEntity<>(savedItem, HttpStatus.CREATED);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.EXPECTATION_FAILED);
+ }
+ }
+
+ @DeleteMapping("{id}")
+ public ResponseEntity delete(@PathVariable("id") Long id) {
+ try {
+ expenseListService.deleteById(id);
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+ } catch (Exception e) {
+ return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+ }
+ }
+
+ @PostMapping("/{id}/add")
+ public ResponseEntity addExpenseToList(
+ @PathVariable("id") Long expenseListId,
+ @RequestBody Expense expense) {
+ try {
+ Expense addedExpense = expenseListService.addExpenseToList(expenseListId, expense);
+ return new ResponseEntity<>(addedExpense, HttpStatus.CREATED);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @DeleteMapping("/{id}/delete")
+ public ResponseEntity deleteExpenseFromList(
+ @PathVariable("id") Long expenseListId,
+ @RequestParam("expenseId") Long expenseId) {
+ try {
+ expenseListService.deleteExpenseFromList(expenseListId, expenseId);
+ return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+ } catch (Exception e) {
+ return new ResponseEntity<>(null, HttpStatus.EXPECTATION_FAILED);
+ }
+ }
+}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/model/AppUser.java b/src/main/java/de/zendric/app/xpensely_server/model/AppUser.java
similarity index 72%
rename from src/main/java/de/zendric/app/XpenselyServer/model/AppUser.java
rename to src/main/java/de/zendric/app/xpensely_server/model/AppUser.java
index ff060d9..2b495e2 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/model/AppUser.java
+++ b/src/main/java/de/zendric/app/xpensely_server/model/AppUser.java
@@ -1,26 +1,24 @@
-package de.zendric.app.XpenselyServer.model;
+package de.zendric.app.xpensely_server.model;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
-import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
-@Entity
@Getter
@Setter
-@AllArgsConstructor
@NoArgsConstructor
+@Entity
public class AppUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
+ @Column(name = "username", nullable = false, unique = true)
private String username;
- private String password;
- private String email;
}
diff --git a/src/main/java/de/zendric/app/xpensely_server/model/Expense.java b/src/main/java/de/zendric/app/xpensely_server/model/Expense.java
new file mode 100644
index 0000000..828eaae
--- /dev/null
+++ b/src/main/java/de/zendric/app/xpensely_server/model/Expense.java
@@ -0,0 +1,43 @@
+package de.zendric.app.xpensely_server.model;
+
+import java.time.LocalDate;
+
+import com.fasterxml.jackson.annotation.JsonBackReference;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class Expense {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String title;
+
+ @ManyToOne
+ private AppUser owner;
+
+ private Double amount;
+ private Double deviation;
+
+ private LocalDate date;
+
+ @ManyToOne
+ @JoinColumn(name = "expense_list_id", nullable = false)
+ @JsonBackReference
+ private ExpenseList expenseList;
+}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/model/ExpenseList.java b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseList.java
similarity index 58%
rename from src/main/java/de/zendric/app/XpenselyServer/model/ExpenseList.java
rename to src/main/java/de/zendric/app/xpensely_server/model/ExpenseList.java
index c7a2a5a..49a742d 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/model/ExpenseList.java
+++ b/src/main/java/de/zendric/app/xpensely_server/model/ExpenseList.java
@@ -1,7 +1,9 @@
-package de.zendric.app.XpenselyServer.model;
+package de.zendric.app.xpensely_server.model;
import java.util.List;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
+
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
@@ -10,17 +12,21 @@ import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
+@AllArgsConstructor
+@NoArgsConstructor
public class ExpenseList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
-
+
private String name;
@ManyToOne
@@ -29,6 +35,18 @@ public class ExpenseList {
@ManyToMany
private List sharedWith;
- @OneToMany(mappedBy = "expenseList", cascade = CascadeType.ALL)
+ @OneToMany(mappedBy = "expenseList", cascade = CascadeType.ALL, orphanRemoval = true)
+ @JsonManagedReference
private List expenses;
+
+ public void addExpense(Expense expense) {
+ expense.setExpenseList(this);
+ expenses.add(expense);
+
+ }
+
+ public void removeExpense(Expense expense) {
+ expenses.remove(expense);
+ expense.setExpenseList(null);
+ }
}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseListRepository.java b/src/main/java/de/zendric/app/xpensely_server/repo/ExpenseListRepository.java
similarity index 57%
rename from src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseListRepository.java
rename to src/main/java/de/zendric/app/xpensely_server/repo/ExpenseListRepository.java
index ad2301b..613e091 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseListRepository.java
+++ b/src/main/java/de/zendric/app/xpensely_server/repo/ExpenseListRepository.java
@@ -1,11 +1,13 @@
-package de.zendric.app.XpenselyServer.repo;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import de.zendric.app.XpenselyServer.model.ExpenseList;
+package de.zendric.app.xpensely_server.repo;
import java.util.List;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import de.zendric.app.xpensely_server.model.ExpenseList;
+
+@Repository
public interface ExpenseListRepository extends JpaRepository {
List findByOwnerId(Long ownerId);
}
\ No newline at end of file
diff --git a/src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseRepository.java b/src/main/java/de/zendric/app/xpensely_server/repo/ExpenseRepository.java
similarity index 63%
rename from src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseRepository.java
rename to src/main/java/de/zendric/app/xpensely_server/repo/ExpenseRepository.java
index 3590d36..c79b08b 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/repo/ExpenseRepository.java
+++ b/src/main/java/de/zendric/app/xpensely_server/repo/ExpenseRepository.java
@@ -1,9 +1,10 @@
-package de.zendric.app.XpenselyServer.repo;
+package de.zendric.app.xpensely_server.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
-import de.zendric.app.XpenselyServer.model.Expense;
+import de.zendric.app.xpensely_server.model.Expense;
@Repository
-public interface ExpenseRepository extends JpaRepository {}
+public interface ExpenseRepository extends JpaRepository {
+}
diff --git a/src/main/java/de/zendric/app/XpenselyServer/repo/UserRepository.java b/src/main/java/de/zendric/app/xpensely_server/repo/UserRepository.java
similarity index 50%
rename from src/main/java/de/zendric/app/XpenselyServer/repo/UserRepository.java
rename to src/main/java/de/zendric/app/xpensely_server/repo/UserRepository.java
index 926b70a..23bb4ee 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/repo/UserRepository.java
+++ b/src/main/java/de/zendric/app/xpensely_server/repo/UserRepository.java
@@ -1,9 +1,13 @@
-package de.zendric.app.XpenselyServer.repo;
+package de.zendric.app.xpensely_server.repo;
+
+import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
-import de.zendric.app.XpenselyServer.model.AppUser;
+import de.zendric.app.xpensely_server.model.AppUser;
@Repository
-public interface UserRepository extends JpaRepository {}
+public interface UserRepository extends JpaRepository {
+ Optional findByUsername(String username);
+}
diff --git a/src/main/java/de/zendric/app/xpensely_server/security/SecurityConfig.java b/src/main/java/de/zendric/app/xpensely_server/security/SecurityConfig.java
new file mode 100644
index 0000000..8843cb7
--- /dev/null
+++ b/src/main/java/de/zendric/app/xpensely_server/security/SecurityConfig.java
@@ -0,0 +1,32 @@
+package de.zendric.app.xpensely_server.security;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+public class SecurityConfig {
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ http
+ .authorizeHttpRequests(authorize -> authorize
+ .anyRequest().permitAll() // Allow all requests without authentication
+ )
+ .csrf().disable(); // Disable CSRF for development purposes
+
+ return http.build();
+ }
+
+ // @Bean
+ // public SecurityFilterChain securityFilterChain(HttpSecurity http) throws
+ // Exception {
+ // return http.authorizeHttpRequests(auth -> {
+ // auth.requestMatchers("/").permitAll();
+ // auth.anyRequest().permitAll();
+ // // auth.anyRequest().authenticated();
+ // }).oauth2Login(Customizer.withDefaults())
+ // .build();
+ // }
+}
diff --git a/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java
new file mode 100644
index 0000000..055d496
--- /dev/null
+++ b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseListService.java
@@ -0,0 +1,137 @@
+package de.zendric.app.xpensely_server.services;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import de.zendric.app.xpensely_server.model.AppUser;
+import de.zendric.app.xpensely_server.model.Expense;
+import de.zendric.app.xpensely_server.model.ExpenseList;
+import de.zendric.app.xpensely_server.repo.ExpenseListRepository;
+import de.zendric.app.xpensely_server.repo.ExpenseRepository;
+import jakarta.persistence.EntityManager;
+
+@Service
+@Transactional
+public class ExpenseListService {
+
+ private ExpenseListRepository repository;
+ private final ExpenseRepository expenseRepository;
+
+ @Autowired
+ private EntityManager entityManager;
+
+ @Autowired
+ public ExpenseListService(ExpenseListRepository repository, ExpenseRepository expenseRepository) {
+ this.repository = repository;
+ this.expenseRepository = expenseRepository;
+ }
+
+ public List getAllLists() {
+ return repository.findAll();
+ }
+
+ public ExpenseList createList(ExpenseList list) {
+ return repository.save(list);
+ }
+
+ public void deleteList(Long id) {
+ repository.deleteById(id);
+ }
+
+ public void deleteById(Long id) {
+ repository.deleteById(id);
+ }
+
+ public Optional findById(Long id) {
+ return repository.findById(id);
+ }
+
+ public Iterable findAll() {
+ return repository.findAll();
+ }
+
+ public ExpenseList save(ExpenseList expenseList) {
+ return repository.save(expenseList);
+ }
+
+ public List findByUserId(Long id) {
+ List allLists = repository.findAll();
+ List userSpecificList = new ArrayList<>();
+ for (ExpenseList expenseList : allLists) {
+ List sharedWith = expenseList.getSharedWith();
+
+ if (expenseList.getOwner().getId().equals(id)) {
+ userSpecificList.add(expenseList);
+ } else {
+ for (AppUser user : sharedWith) {
+ if (user.getId().equals(id)) {
+ userSpecificList.add(expenseList);
+ }
+ }
+ }
+ }
+ return userSpecificList;
+ }
+
+ public List findByUsername(String username) {
+ List allLists = repository.findAll();
+ List userSpecificList = new ArrayList<>();
+ for (ExpenseList expenseList : allLists) {
+ List sharedWith = expenseList.getSharedWith();
+
+ if (expenseList.getOwner().getUsername().equals(username)) {
+ userSpecificList.add(expenseList);
+ } else {
+ for (AppUser user : sharedWith) {
+ if (user.getUsername().equals(username)) {
+ userSpecificList.add(expenseList);
+ }
+ }
+ }
+ }
+ return userSpecificList;
+ }
+
+ public Expense addExpenseToList(Long expenseListId, Expense expense) {
+ ExpenseList expenseList = repository.findById(expenseListId)
+ .orElseThrow(() -> new RuntimeException("ExpenseList not found with id: " + expenseListId));
+ HashSet existingId = new HashSet<>();
+ for (Expense e : expenseList.getExpenses()) {
+ existingId.add(e.getId());
+ }
+ expenseList.addExpense(expense);
+ repository.save(expenseList);
+ Expense newExpense = expense;
+ for (Expense e : expenseList.getExpenses()) {
+ if (!existingId.contains(e.getId())) {
+ newExpense = e;
+ break;
+ }
+ }
+ return newExpense;
+ }
+
+ public void deleteExpenseFromList(Long expenseListId, Long expenseId) {
+ ExpenseList expenseList = repository.findById(expenseListId)
+ .orElseThrow(() -> new RuntimeException("ExpenseList not found with id: " + expenseListId));
+ Expense expenseToRemove = null;
+ for (Expense expense : expenseList.getExpenses()) {
+ if (expense.getId().equals(expenseId)) {
+ expenseToRemove = expense;
+ break;
+ }
+ }
+ if (expenseToRemove != null) {
+ expenseList.removeExpense(expenseToRemove);
+ } else {
+ throw new RuntimeException("Expense not found with id: " + expenseId);
+ }
+ repository.save(expenseList);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/zendric/app/xpensely_server/services/ExpenseService.java b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseService.java
new file mode 100644
index 0000000..3d45353
--- /dev/null
+++ b/src/main/java/de/zendric/app/xpensely_server/services/ExpenseService.java
@@ -0,0 +1,19 @@
+package de.zendric.app.xpensely_server.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import de.zendric.app.xpensely_server.repo.ExpenseRepository;
+
+@Service
+@Transactional
+public class ExpenseService {
+
+ @Autowired
+ private ExpenseRepository repository;
+
+ public ExpenseService(ExpenseRepository repository) {
+ this.repository = repository;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/zendric/app/XpenselyServer/services/UserService.java b/src/main/java/de/zendric/app/xpensely_server/services/UserService.java
similarity index 55%
rename from src/main/java/de/zendric/app/XpenselyServer/services/UserService.java
rename to src/main/java/de/zendric/app/xpensely_server/services/UserService.java
index 68a3cec..66371ae 100644
--- a/src/main/java/de/zendric/app/XpenselyServer/services/UserService.java
+++ b/src/main/java/de/zendric/app/xpensely_server/services/UserService.java
@@ -1,12 +1,12 @@
-package de.zendric.app.XpenselyServer.services;
+package de.zendric.app.xpensely_server.services;
import java.util.List;
import java.util.Optional;
import org.springframework.stereotype.Service;
-import de.zendric.app.XpenselyServer.model.AppUser;
-import de.zendric.app.XpenselyServer.repo.UserRepository;
+import de.zendric.app.xpensely_server.model.AppUser;
+import de.zendric.app.xpensely_server.repo.UserRepository;
@Service
public class UserService {
@@ -25,19 +25,27 @@ public class UserService {
}
public AppUser getUser(Long id) {
- Optional user= userRepository.findById(id);
+ Optional user = userRepository.findById(id);
if (user.isPresent()) {
return user.get();
- }
- else return null;
+ } else
+ return null;
}
public AppUser deleteUserById(Long id) {
- Optional user= userRepository.findById(id);
+ Optional user = userRepository.findById(id);
if (user.isPresent()) {
userRepository.deleteById(id);
return user.get();
- }
- else return null;
+ } else
+ return null;
+ }
+
+ public AppUser getUserByName(String username) {
+ Optional optUser = userRepository.findByUsername(username);
+ if (optUser.isPresent()) {
+ return optUser.get();
+ } else
+ return null;
}
}
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index bc19518..5591bdb 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,16 @@
+#Server
spring.application.name=XpenselyServer
+
+#Security
+spring.security.enabled=false
+#logging.level.org.springframework.security=TRACE
+
+# PostgreSQL Configuration
+spring.datasource.url=jdbc:postgresql://localhost:5432/Xpensely
+spring.datasource.username=${XpenselyDBUser}
+spring.datasource.password=${XpenselyDBPW}
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+# Hibernate configuration
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
diff --git a/src/test/java/de/zendric/app/XpenselyServer/XpenselyServerApplicationTests.java b/src/test/java/de/zendric/app/xpensely_Server/XpenselyServerApplicationTests.java
similarity index 82%
rename from src/test/java/de/zendric/app/XpenselyServer/XpenselyServerApplicationTests.java
rename to src/test/java/de/zendric/app/xpensely_Server/XpenselyServerApplicationTests.java
index 5f228b2..3c78751 100644
--- a/src/test/java/de/zendric/app/XpenselyServer/XpenselyServerApplicationTests.java
+++ b/src/test/java/de/zendric/app/xpensely_Server/XpenselyServerApplicationTests.java
@@ -1,4 +1,4 @@
-package de.zendric.app.XpenselyServer;
+package de.zendric.app.xpensely_Server;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;