Skip to content

Instantly share code, notes, and snippets.

@Kamilnaja
Created February 22, 2025 20:04
Show Gist options
  • Save Kamilnaja/bf83436f6bb887a53c573ddfd85d59f0 to your computer and use it in GitHub Desktop.
Save Kamilnaja/bf83436f6bb887a53c573ddfd85d59f0 to your computer and use it in GitHub Desktop.
// 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