Compare commits

..

2 Commits

Author SHA1 Message Date
PaulK
32dc4d2e9b start 2025-01-28 14:55:01 +01:00
PaulK
99aaa482cd start 2025-01-28 13:24:57 +01:00
8 changed files with 333 additions and 5 deletions

View File

@ -1,9 +1,6 @@
package com.example.hangry;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.*;
@Entity
public class Ingredient {
@ -14,11 +11,18 @@ public class Ingredient {
private String name; // Name der Zutat
private boolean isGlobal; // Flag, ob die Zutat global ist (true) oder benutzerspezifisch (false)
@ManyToOne
@JoinColumn(name = "user_id") // Verknüpft mit der 'User'-Tabelle
private User user; // Hinzufügen einer 'user'-Beziehung
public Ingredient() {
}
public Ingredient(String name) {
public Ingredient(String name, boolean isGlobal) {
this.name = name;
this.isGlobal = isGlobal;
}
// Getter und Setter
@ -37,4 +41,20 @@ public class Ingredient {
public void setName(String name) {
this.name = name;
}
public boolean isGlobal() {
return isGlobal;
}
public void setGlobal(boolean global) {
isGlobal = global;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}

View File

@ -0,0 +1,45 @@
package com.example.hangry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/api/ingredients")
public class IngredientController {
@Autowired
private IngredientService ingredientService;
// Globale Zutaten abrufen
@GetMapping("/global")
public List<Ingredient> getGlobalIngredients() {
return ingredientService.getGlobalIngredients();
}
// Benutzerspezifische Zutaten abrufen
@GetMapping("/user/{userId}")
public List<Ingredient> getUserIngredients(@PathVariable Long userId) {
return ingredientService.getUserIngredients(userId);
}
// Neue globale Zutat hinzufügen
@PostMapping("/global")
public Ingredient addGlobalIngredient(@RequestBody Ingredient ingredient) {
return ingredientService.addGlobalIngredient(ingredient);
}
// Neue benutzerspezifische Zutat hinzufügen
@PostMapping("/user/{userId}")
public ResponseEntity<Ingredient> addUserIngredient(@PathVariable Long userId, @RequestBody Ingredient ingredient) {
try {
Ingredient newIngredient = ingredientService.addUserIngredient(userId, ingredient);
return ResponseEntity.status(HttpStatus.CREATED).body(newIngredient);
} catch (IllegalArgumentException e) {
// Falls die Zutat bereits global existiert
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
}
}

View File

@ -0,0 +1,26 @@
package com.example.hangry;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface IngredientRepository extends JpaRepository<Ingredient, Long> {
// 1. Alle globalen Zutaten abrufen
List<Ingredient> findByIsGlobal(boolean isGlobal);
// 2. Zutaten, die einem bestimmten Benutzer gehören, abrufen
List<Ingredient> findByUserId(Long userId);
// 3. Zutaten suchen, die global und/oder benutzerdefiniert nach Name passen
List<Ingredient> findByNameContainingIgnoreCase(String name);
// 4. Benutzerdefinierte Zutat für einen bestimmten Benutzer nach Namen abrufen
List<Ingredient> findByNameAndUserId(String name, Long userId);
// 5. Überprüfen, ob eine Zutat global existiert
boolean existsByNameAndIsGlobal(String name, boolean isGlobal);
}

View File

@ -0,0 +1,55 @@
package com.example.hangry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class IngredientService {
@Autowired
private IngredientRepository ingredientRepository;
@Autowired
private UserRepository userRepository;
// Globale Zutaten abrufen
public List<Ingredient> getGlobalIngredients() {
return ingredientRepository.findByIsGlobal(true);
}
// Benutzerspezifische Zutaten abrufen
public List<Ingredient> getUserIngredients(Long userId) {
Optional<User> user = userRepository.findById(userId);
if (user.isPresent()) {
return ingredientRepository.findByUserId(userId);
} else {
throw new IllegalArgumentException("User not found with ID: " + userId);
}
}
// Globale Zutat hinzufügen
public Ingredient addGlobalIngredient(Ingredient ingredient) {
ingredient.setGlobal(true); // Zutat als global markieren
return ingredientRepository.save(ingredient);
}
// Benutzerdefinierte Zutat hinzufügen, nur wenn sie nicht global existiert
public Ingredient addUserIngredient(Long userId, Ingredient ingredient) {
// Zuerst prüfen, ob diese Zutat bereits global existiert
boolean isGlobalIngredientExists = ingredientRepository.existsByNameAndIsGlobal(ingredient.getName(), true);
if (isGlobalIngredientExists) {
throw new IllegalArgumentException("Zutat existiert bereits als globale Zutat.");
}
Optional<User> user = userRepository.findById(userId);
if (user.isPresent()) {
ingredient.setGlobal(false); // Zutat als benutzerspezifisch markieren
ingredient.setUser(user.get()); // Zutat dem Benutzer zuweisen
return ingredientRepository.save(ingredient);
} else {
throw new IllegalArgumentException("User not found with ID: " + userId);
}
}
}

View File

@ -0,0 +1,105 @@
package com.example.hangry;
import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password; // Hier solltest du sicherstellen, dass das Passwort verschlüsselt wird
@Column(unique = true, nullable = false)
private String email;
private String role; // Für Rollen wie "ADMIN", "USER", etc.
// Many-to-Many Beziehung zu Ingredients
@ManyToMany
@JoinTable(
name = "user_ingredients",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "ingredient_id")
)
private List<Ingredient> ingredients = new ArrayList<>();
// No-Args-Konstruktor (wichtig für JPA)
public User() {
}
// All-Args-Konstruktor
public User(Long id, String username, String password, String email, String role) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.role = role;
}
// Getter und Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public List<Ingredient> getIngredients() {
return ingredients;
}
public void setIngredients(List<Ingredient> ingredients) {
this.ingredients = ingredients;
}
// Methode, um eine Zutat zu einem User hinzuzufügen
public void addIngredient(Ingredient ingredient) {
this.ingredients.add(ingredient);
}
// Methode, um eine Zutat aus der Liste zu entfernen
public void removeIngredient(Ingredient ingredient) {
this.ingredients.remove(ingredient);
}
}

View File

@ -0,0 +1,33 @@
package com.example.hangry;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
// Endpunkt: Benutzer erstellen
@PostMapping
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
// Endpunkt: Benutzer nach Benutzername abrufen
@GetMapping("/username/{username}")
public User getUserByUsername(@PathVariable String username) {
return userService.getUserByUsername(username);
}
// Endpunkt: Benutzer nach E-Mail abrufen
@GetMapping("/email/{email}")
public User getUserByEmail(@PathVariable String email) {
return userService.getUserByEmail(email);
}
}

View File

@ -0,0 +1,15 @@
package com.example.hangry;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Benutzerdefinierte Abfrage: Benutzer nach Benutzernamen finden
User findByUsername(String username);
// Benutzerdefinierte Abfrage: Benutzer nach E-Mail finden
User findByEmail(String email);
}

View File

@ -0,0 +1,29 @@
package com.example.hangry;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
// Dependency Injection (Spring kümmert sich darum)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// Einen neuen Benutzer erstellen
public User createUser(User user) {
return userRepository.save(user);
}
// Benutzer anhand des Benutzernamens suchen
public User getUserByUsername(String username) {
return userRepository.findByUsername(username);
}
// Benutzer anhand der E-Mail suchen
public User getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
}