Created
February 22, 2025 20:04
-
-
Save Kamilnaja/bf83436f6bb887a53c573ddfd85d59f0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// AddDiaryFoodRequest.java | |
package com.diettracker.backend.requests; | |
public class AddDiaryFoodRequest { | |
private Long diaryId; | |
private Long foodId; | |
private double weight; | |
// Getters and setters | |
public Long getDiaryId() { return diaryId; } | |
public void setDiaryId(Long diaryId) { this.diaryId = diaryId; } | |
public Long getFoodId() { return foodId; } | |
public void setFoodId(Long foodId) { this.foodId = foodId; } | |
public double getWeight() { return weight; } | |
public void setWeight(double weight) { this.weight = weight; } | |
} | |
// diary | |
package com.diettracker.backend.models; | |
import jakarta.persistence.*; | |
import java.util.Set; | |
@Entity | |
@Table(name = "diary") | |
public class Diary { | |
@Id | |
@GeneratedValue(strategy = GenerationType.IDENTITY) | |
private Long id; | |
@Enumerated(EnumType.STRING) | |
private DiaryType name; | |
// @OneToMany(mappedBy = "diary", cascade = CascadeType.ALL, orphanRemoval = true) | |
// private Set<DiaryFood> diaryFoods; | |
public Diary() { | |
} | |
public Diary(DiaryType name) { | |
this.name = name; | |
} | |
public Long getId() { | |
return id; | |
} | |
public void setId(Long id) { | |
this.id = id; | |
} | |
public DiaryType getName() { | |
return name; | |
} | |
public void setName(DiaryType name) { | |
this.name = name; | |
} | |
} | |
// DiaryController.java | |
package com.diettracker.backend.controllers; | |
import com.diettracker.backend.dto.DiaryFoodDTO; | |
import com.diettracker.backend.models.Diary; | |
import com.diettracker.backend.models.DiaryFood; | |
import com.diettracker.backend.models.DiaryType; | |
import com.diettracker.backend.models.Food; | |
import com.diettracker.backend.repositories.DiaryFoodRepository; | |
import com.diettracker.backend.repositories.DiaryRepository; | |
import com.diettracker.backend.requests.AddDiaryFoodRequest; | |
import com.diettracker.backend.services.DiaryService; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.http.ResponseEntity; | |
import org.springframework.web.bind.annotation.*; | |
import java.util.List; | |
import java.util.Optional; | |
@RestController | |
@RequestMapping("/api/diary") | |
public class DiaryController { | |
private final DiaryRepository diaryRepository; | |
private final DiaryFoodRepository diaryFoodRepository; | |
private final DiaryService diaryService; | |
public DiaryController(DiaryRepository diaryRepository, DiaryFoodRepository diaryFoodRepository, DiaryService diaryService) { | |
this.diaryRepository = diaryRepository; | |
this.diaryFoodRepository = diaryFoodRepository; | |
this.diaryService = diaryService; | |
} | |
@GetMapping | |
public List<DiaryFood> getAllDiaries() { | |
return diaryFoodRepository.findAll(); | |
} | |
@GetMapping("/{id}") | |
public ResponseEntity<Diary> getDiaryById(@PathVariable Long id) { | |
Optional<Diary> diary = diaryRepository.findById(id); | |
return diary.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); | |
} | |
@PostMapping | |
public ResponseEntity<DiaryFoodDTO> addFoodToDiary(@RequestBody AddDiaryFoodRequest request) { | |
DiaryFood diaryFood = diaryService.addFoodToDiary( | |
request.getDiaryId(), | |
request.getFoodId(), | |
request.getWeight() | |
); | |
return ResponseEntity.ok(convertToDTO(diaryFood)); | |
} | |
private DiaryFoodDTO convertToDTO(DiaryFood diaryFood) { | |
Food food = diaryFood.getFood(); | |
double weightRatio = diaryFood.getWeight() / food.getWeight(); | |
return new DiaryFoodDTO( | |
diaryFood.getId(), | |
diaryFood.getDiary().getId(), | |
food.getId(), | |
food.getName(), | |
diaryFood.getWeight(), | |
Math.round(food.getCalories() * weightRatio * 10.0) / 10.0, | |
Math.round(food.getProteins() * weightRatio * 10.0) / 10.0, | |
Math.round(food.getFats() * weightRatio * 10.0) / 10.0, | |
Math.round(food.getCarbs() * weightRatio * 10.0) / 10.0, | |
diaryFood.getCreatedAt(), | |
diaryFood.getUpdatedAt() | |
); | |
} | |
} | |
// DiaryFoodDTO | |
package com.diettracker.backend.dto; | |
import java.time.LocalDateTime; | |
public class DiaryFoodDTO { | |
private final Long id; | |
private final Long diaryId; | |
private final Long foodId; | |
private final String foodName; | |
private final double weight; | |
private final double calories; | |
private final double proteins; | |
private final double fats; | |
private final double carbs; | |
private final LocalDateTime createdAt; | |
private final LocalDateTime updatedAt; | |
public DiaryFoodDTO( | |
Long id, Long diaryId, Long foodId, String foodName, | |
double weight, double calories, double proteins, | |
double fats, double carbs, LocalDateTime createdAt, | |
LocalDateTime updatedAt) { | |
this.id = id; | |
this.diaryId = diaryId; | |
this.foodId = foodId; | |
this.foodName = foodName; | |
this.weight = weight; | |
this.calories = calories; | |
this.proteins = proteins; | |
this.fats = fats; | |
this.carbs = carbs; | |
this.createdAt = createdAt; | |
this.updatedAt = updatedAt; | |
} | |
// Getters | |
public Long getId() { return id; } | |
public Long getDiaryId() { return diaryId; } | |
public Long getFoodId() { return foodId; } | |
public String getFoodName() { return foodName; } | |
public double getWeight() { return weight; } | |
public double getCalories() { return calories; } | |
public double getProteins() { return proteins; } | |
public double getFats() { return fats; } | |
public double getCarbs() { return carbs; } | |
public LocalDateTime getCreatedAt() { return createdAt; } | |
public LocalDateTime getUpdatedAt() { return updatedAt; } | |
} | |
// Diary Food Repository | |
package com.diettracker.backend.repositories; | |
import com.diettracker.backend.models.DiaryFood; | |
import org.springframework.data.jpa.repository.JpaRepository; | |
public interface DiaryFoodRepository extends JpaRepository<DiaryFood, Long> { | |
} | |
// Diary Service | |
package com.diettracker.backend.services; | |
import com.diettracker.backend.models.Diary; | |
import com.diettracker.backend.models.DiaryFood; | |
import com.diettracker.backend.models.DiaryType; | |
import com.diettracker.backend.models.Food; | |
import com.diettracker.backend.repositories.DiaryFoodRepository; | |
import com.diettracker.backend.repositories.DiaryRepository; | |
import com.diettracker.backend.repositories.FoodRepository; | |
import jakarta.persistence.EntityNotFoundException; | |
import jakarta.transaction.Transactional; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.stereotype.Service; | |
@Service | |
@Transactional | |
public class DiaryService { | |
@Autowired | |
private DiaryRepository diaryRepository; | |
@Autowired | |
private FoodRepository foodRepository; | |
@Autowired | |
private DiaryFoodRepository diaryFoodRepository; | |
public DiaryFood addFoodToDiary(Long diaryId, Long foodId, double weight) { | |
// First, get the persistent entities from the database | |
Diary diary; | |
if (diaryId == null) { | |
diary = new Diary(DiaryType.BREAKFAST); // Default type, you might want to make this configurable | |
diary = diaryRepository.save(diary); | |
} else { | |
diary = diaryRepository.findById(diaryId).orElseThrow(() -> new EntityNotFoundException("Diary not found")); | |
} | |
Food food = foodRepository.findById(foodId).orElseThrow(() -> new EntityNotFoundException("Food not found")); | |
// Create new DiaryFood with the persistent entities | |
DiaryFood diaryFood = new DiaryFood(); | |
diaryFood.setDiary(diary); | |
diaryFood.setFood(food); | |
diaryFood.setWeight(weight); | |
// Add to diary's collection | |
// diary.addDiaryFood(diaryFood); | |
// Save and return | |
return diaryFoodRepository.save(diaryFood); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment