// Path: spring-jdbc/src/main/java/io/crate/spring/jdbc/samples/dao/BlogPostDao.java
// public interface BlogPostDao {
// 
//     List<BlogPost> getPosts();
// 
//     Optional<BlogPost> getPost(String id);
// 
//     Optional<BlogPost> insertPost(BlogPost newPost);
// 
//     Optional<BlogPost> updatePostText(String id, String newText);
// 
//     Optional<BlogPost> incrementLikeCount(String id);
// 
//     boolean deletePost(String id);
// 
//     List<BlogPost> searchPostsWithQuery(String query);
// }
// 
// Path: spring-jdbc/src/main/java/io/crate/spring/jdbc/samples/model/BlogPost.java
// public class BlogPost {
// 
//     private String id;
// 
//     private User user;
// 
//     private String text;
// 
//     private Date created;
// 
//     @JsonProperty("image_ref")
//     private String imageRef;
// 
//     @JsonProperty("like_count")
//     private long likeCount;
// 
//     private String country;
// 
//     private Area area;
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
//     public void setText(String text) {
//         this.text = text;
//     }
// 
//     public Date getCreated() {
//         return created;
//     }
// 
//     public void setCreated(Date created) {
//         this.created = created;
//     }
// 
//     public String getImageRef() {
//         return imageRef;
//     }
// 
//     public void setImageRef(String imageRef) {
//         this.imageRef = imageRef;
//     }
// 
//     public long getLikeCount() {
//         return likeCount;
//     }
// 
//     public void setLikeCount(long likeCount) {
//         this.likeCount = likeCount;
//     }
// 
//     public String getCountry() {
//         return country;
//     }
// 
//     public void setCountry(String country) {
//         this.country = country;
//     }
// 
//     public Area getArea() {
//         return area;
//     }
// 
//     public void setArea(Area area) {
//         this.area = area;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         BlogPost blogPost = (BlogPost) o;
//         return likeCount == blogPost.likeCount &&
//                 Objects.equals(id, blogPost.id) &&
//                 Objects.equals(user, blogPost.user) &&
//                 Objects.equals(text, blogPost.text) &&
//                 Objects.equals(created, blogPost.created) &&
//                 Objects.equals(imageRef, blogPost.imageRef) &&
//                 Objects.equals(country, blogPost.country) &&
//                 Objects.equals(area, blogPost.area);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(id, user, text, created, imageRef, likeCount, country, area);
//     }
// 
//     @Override
//     public String toString() {
//         return "BlogPost{" +
//                 "id='" + id + '\'' +
//                 ", user=" + user +
//                 ", text='" + text + '\'' +
//                 ", created=" + created +
//                 ", imageRef='" + imageRef + '\'' +
//                 ", likeCount=" + likeCount +
//                 ", country='" + country + '\'' +
//                 ", area=" + area +
//                 '}';
//     }
// }


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import io.crate.spring.jdbc.samples.dao.BlogPostDao;
import io.crate.spring.jdbc.samples.model.BlogPost;
        }

        var newPost = dao.insertPost(postsDeserializer.fromMap(postProps)).orElseThrow(() -> new PostNotFoundException("new from insert"));

        return List.of(postsSerializer.serialize(newPost));
    }

    @GetMapping("/post/{id}")
    public Map<String, Object> getPost(@PathVariable String id) {
        logger.debug("Searching for post with id '" + id + "' in database");
        return postsSerializer.serialize(dao.getPost(id).orElseThrow(() -> new PostNotFoundException(id)));
    }

    @PutMapping("/post/{id}")
    public Map<String, Object> updatePost(@PathVariable String id, @RequestBody Map<String, Object> postProps) {
        logger.debug("Updating post with id '" + id + "' in database");

        if (postProps == null) {
            throw new ArgumentRequiredException("Request body is required");
        } else if (!postProps.containsKey("text")) {
            throw new ArgumentRequiredException("Argument \"text\" is required");
        }

        String text = postProps != null ? postProps.get("text").toString() : null;
        return postsSerializer.serialize(dao.updatePostText(id, text).orElseThrow(() -> new PostNotFoundException(id)));
    }

    @PutMapping("/post/{id}/like")
    public Map<String, Object> incrementLikeCount(@PathVariable String id) {
        logger.debug("Incrementing like count of post with id " + id);
// Path: spring-jdbc/src/main/java/io/crate/spring/jdbc/samples/dao/BlogPostDao.java
// public interface BlogPostDao {
// 
//     List<BlogPost> getPosts();
// 
//     Optional<BlogPost> getPost(String id);
// 
//     Optional<BlogPost> insertPost(BlogPost newPost);
// 
//     Optional<BlogPost> updatePostText(String id, String newText);
// 
//     Optional<BlogPost> incrementLikeCount(String id);
// 
//     boolean deletePost(String id);
// 
//     List<BlogPost> searchPostsWithQuery(String query);
// }
// 
// Path: spring-jdbc/src/main/java/io/crate/spring/jdbc/samples/model/BlogPost.java
// public class BlogPost {
// 
//     private String id;
// 
//     private User user;
// 
//     private String text;
// 
//     private Date created;
// 
//     @JsonProperty("image_ref")
//     private String imageRef;
// 
//     @JsonProperty("like_count")
//     private long likeCount;
// 
//     private String country;
// 
//     private Area area;
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
//     public void setText(String text) {
//         this.text = text;
//     }
// 
//     public Date getCreated() {
//         return created;
//     }
// 
//     public void setCreated(Date created) {
//         this.created = created;
//     }
// 
//     public String getImageRef() {
//         return imageRef;
//     }
// 
//     public void setImageRef(String imageRef) {
//         this.imageRef = imageRef;
//     }
// 
//     public long getLikeCount() {
//         return likeCount;
//     }
// 
//     public void setLikeCount(long likeCount) {
//         this.likeCount = likeCount;
//     }
// 
//     public String getCountry() {
//         return country;
//     }
// 
//     public void setCountry(String country) {
//         this.country = country;
//     }
// 
//     public Area getArea() {
//         return area;
//     }
// 
//     public void setArea(Area area) {
//         this.area = area;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         BlogPost blogPost = (BlogPost) o;
//         return likeCount == blogPost.likeCount &&
//                 Objects.equals(id, blogPost.id) &&
//                 Objects.equals(user, blogPost.user) &&
//                 Objects.equals(text, blogPost.text) &&
//                 Objects.equals(created, blogPost.created) &&
//                 Objects.equals(imageRef, blogPost.imageRef) &&
//                 Objects.equals(country, blogPost.country) &&
//                 Objects.equals(area, blogPost.area);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(id, user, text, created, imageRef, likeCount, country, area);
//     }
// 
//     @Override
//     public String toString() {
//         return "BlogPost{" +
//                 "id='" + id + '\'' +
//                 ", user=" + user +
//                 ", text='" + text + '\'' +
//                 ", created=" + created +
//                 ", imageRef='" + imageRef + '\'' +
//                 ", likeCount=" + likeCount +
//                 ", country='" + country + '\'' +
//                 ", area=" + area +
//                 '}';
//     }
// }


// Path: spring-jdbc/src/main/java/io/crate/spring/jdbc/samples/PostsController.java
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import io.crate.spring.jdbc.samples.dao.BlogPostDao;
import io.crate.spring.jdbc.samples.model.BlogPost;

        }

        var newPost = dao.insertPost(postsDeserializer.fromMap(postProps)).orElseThrow(() -> new PostNotFoundException("new from insert"));

        return List.of(postsSerializer.serialize(newPost));
    }

    @GetMapping("/post/{id}")
    public Map<String, Object> getPost(@PathVariable String id) {
        logger.debug("Searching for post with id '" + id + "' in database");
        return postsSerializer.serialize(dao.getPost(id).orElseThrow(() -> new PostNotFoundException(id)));
    }

    @PutMapping("/post/{id}")
    public Map<String, Object> updatePost(@PathVariable String id, @RequestBody Map<String, Object> postProps) {
        logger.debug("Updating post with id '" + id + "' in database");

        if (postProps == null) {
            throw new ArgumentRequiredException("Request body is required");
        } else if (!postProps.containsKey("text")) {
            throw new ArgumentRequiredException("Argument \"text\" is required");
        }

        String text = postProps != null ? postProps.get("text").toString() : null;
        return postsSerializer.serialize(dao.updatePostText(id, text).orElseThrow(() -> new PostNotFoundException(id)));
    }

    @PutMapping("/post/{id}/like")
    public Map<String, Object> incrementLikeCount(@PathVariable String id) {
        logger.debug("Incrementing like count of post with id " + id);
        BlogPost post = dao.incrementLikeCount(id).orElseThrow(() -> new PostNotFoundException(id));