Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ nb-configuration.xml
# Local environment
.env

# Database
.local-db

# Plugin directory
/.quarkus/cli/plugins/
# TLS Certificates
Expand Down
9 changes: 9 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,15 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit-mockito</artifactId>
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/de/schulung/quarkus/recipes/Ingredient.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
package de.schulung.quarkus.recipes;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.Size;

import lombok.Getter;
import lombok.Setter;

@Entity(name = "Ingredient")
@Table(name = "ingredients")
@Getter
@Setter
public class Ingredient {

/**
* The ingredient ID (internal, not exposed via JSON).
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private Long id;
/**
* The ingredient name.
*/
Expand All @@ -26,6 +36,7 @@ public class Ingredient {
* The unit of the ingredient.
*/
@NotNull
@Enumerated(EnumType.STRING)
private IngredientUnit unit;

}
9 changes: 9 additions & 0 deletions src/main/java/de/schulung/quarkus/recipes/Recipe.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.schulung.quarkus.recipes;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
Expand All @@ -11,13 +12,17 @@
import java.time.OffsetDateTime;
import java.util.List;

@Entity(name = "Recipe")
@Table(name = "recipes")
@Getter
@Setter
public class Recipe {

/**
* The recipe ID (read-only, assigned by the server).
*/
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private String id;
/**
Expand Down Expand Up @@ -49,18 +54,22 @@ public class Recipe {
/**
* Difficulty level of the recipe.
*/
@Enumerated(EnumType.STRING)
private Difficulty difficulty;
/**
* List of ingredients.
*/
@NotNull
@Size(max = 100)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "recipe_id")
private List<@Valid @NotNull Ingredient> ingredients;
/**
* Preparation instructions.
*/
@NotNull
@Size(max = 2000)
@Column(length = 2000)
private String preparation;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.schulung.quarkus.recipes;

import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class RecipesRepository
implements PanacheRepositoryBase<Recipe, String> {
}
22 changes: 10 additions & 12 deletions src/main/java/de/schulung/quarkus/recipes/RecipesService.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,36 @@
package de.schulung.quarkus.recipes;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

import java.time.OffsetDateTime;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;

@ApplicationScoped
@RequiredArgsConstructor
public class RecipesService {

private final Map<String, Recipe> recipes = new ConcurrentHashMap<>();
private final RecipesRepository repository;

public Stream<Recipe> findAll() {
return recipes
.values()
return repository
.listAll()
.stream();
}

public Optional<Recipe> findById(String id) {
return Optional
.ofNullable(recipes.get(id));
return repository
.findByIdOptional(id);
}

@Transactional
public void create(
@Valid
Recipe recipe
) {

final var id = UUID.randomUUID().toString();
recipe.setId(id);
recipe.setLastEdited(OffsetDateTime.now());

if (null == recipe.getImg()) {
Expand All @@ -43,6 +41,6 @@ public void create(
recipe.setDifficulty(Difficulty.medium);
}

recipes.put(id, recipe);
repository.persist(recipe);
}
}
3 changes: 3 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
quarkus.jackson.fail-on-unknown-properties=true
quarkus.datasource.jdbc.url=jdbc:h2:./.local-db/customers
quarkus.hibernate-orm.schema-management.strategy=update
quarkus.hibernate-orm.log.sql=true
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.schulung.quarkus.recipes;

import io.quarkus.test.TestTransaction;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
Expand All @@ -15,6 +16,7 @@
import static org.hamcrest.Matchers.*;

@QuarkusTest
@TestTransaction
class RecipesResourceTests {

// --- Content Negotiation ---
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package de.schulung.quarkus.recipes;

import io.quarkus.test.TestTransaction;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertThrows;

@QuarkusTest
@TestTransaction
public class RecipesServiceTests {

@Inject
Expand Down