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;