Skip to content

Commit 59183e4

Browse files
committed
Latest posts list
1 parent 8eb544b commit 59183e4

10 files changed

Lines changed: 79 additions & 6 deletions

File tree

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@
213213
<version>1.2.1</version>
214214
<scope>test</scope>
215215
</dependency>
216+
217+
<dependency>
218+
<groupId>com.jayway.jsonpath</groupId>
219+
<artifactId>json-path</artifactId>
220+
<version>2.0.0</version>
221+
</dependency>
216222
</dependencies>
217223

218224
<build>

src/main/java/alexp/blog/controller/PostsController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ public String showPostsList(@RequestParam(value = "page", defaultValue = "0") In
3737
return "posts";
3838
}
3939

40+
@RequestMapping(value = {"/posts"}, method = RequestMethod.GET, headers="Accept=application/json")
41+
public @ResponseBody String getPostsList(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber) {
42+
List<Post> posts = postService.getPostsList(pageNumber, 10);
43+
44+
return "[" + posts.stream().map(this::toJsonLink).collect(Collectors.joining(", \n")) + "]";
45+
}
46+
4047
@RequestMapping(value = "/posts", method = RequestMethod.GET, params = {"tagged"})
4148
public String searchByTag(@RequestParam("tagged") String tagsStr, @RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
4249
ModelMap model, HttpServletRequest request) {
@@ -156,4 +163,12 @@ public String updatePost(ModelMap model, @Valid @ModelAttribute("post") PostEdit
156163

157164
return "ok";
158165
}
166+
167+
private String toJsonLink(Post post) {
168+
return "{" + toJsonField("id", post.getId().toString()) + ", " + toJsonField("title", post.getTitle()) + "}";
169+
}
170+
171+
private String toJsonField(String name, String value) {
172+
return "\"" + name + "\":\"" + value + "\"";
173+
}
159174
}

src/main/java/alexp/blog/model/Post.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
import alexp.blog.service.MarkdownConverter;
44
import alexp.blog.utils.LocalDateTimePersistenceConverter;
5-
import org.hibernate.validator.constraints.NotBlank;
6-
import org.hibernate.validator.constraints.NotEmpty;
75
import org.springframework.util.StringUtils;
86

97
import javax.persistence.*;
10-
import javax.validation.constraints.Size;
118
import java.time.LocalDateTime;
129
import java.util.ArrayList;
1310
import java.util.Collection;
14-
import java.util.Date;
1511
import java.util.List;
1612

1713
@Entity
@@ -39,7 +35,7 @@ public class Post {
3935
@Column(nullable = false)
4036
private boolean hidden = false;
4137

42-
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE})
38+
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE})
4339
@JoinTable(name = "posts_tags",
4440
joinColumns = @JoinColumn(name = "post_id", referencedColumnName = "id"),
4541
inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id"))

src/main/java/alexp/blog/repository/PostRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
import org.springframework.data.jpa.repository.Query;
88
import org.springframework.data.repository.query.Param;
99
import java.util.Collection;
10+
import java.util.List;
1011

1112
public interface PostRepository extends JpaRepository<Post, Long> {
1213

1314
Page<Post> findByHiddenFalse(Pageable pageable);
1415

16+
// without count
17+
List<Post> findByHiddenIs(boolean hidden, Pageable pageable);
18+
1519
@Query("SELECT p FROM Post p WHERE :tagCount = (SELECT COUNT(DISTINCT t.id) FROM Post p2 JOIN p2.tags t WHERE LOWER(t.name) in (:tags) and p = p2)")
1620
Page<Post> findByTags(@Param("tags") Collection<String> tags, @Param("tagCount") Long tagCount, Pageable pageable);
1721

src/main/java/alexp/blog/service/PostService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public interface PostService {
1010

1111
Page<Post> getPostsPage(int pageNumber, int pageSize);
1212

13+
List<Post> getPostsList(int pageNumber, int pageSize);
14+
1315
Post getPost(Long id);
1416

1517
PostEditDto getEditablePost(Long id);

src/main/java/alexp/blog/service/PostServiceImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import java.time.LocalDateTime;
1515
import java.util.Arrays;
16-
import java.util.Date;
1716
import java.util.List;
1817
import java.util.stream.Collectors;
1918

@@ -39,6 +38,13 @@ public Page<Post> getPostsPage(int pageNumber, int pageSize) {
3938
return postRepository.findByHiddenFalse(pageRequest);
4039
}
4140

41+
@Override
42+
public List<Post> getPostsList(int pageNumber, int pageSize) {
43+
PageRequest pageRequest = new PageRequest(pageNumber, pageSize, Sort.Direction.DESC, "dateTime");
44+
45+
return postRepository.findByHiddenIs(false, pageRequest);
46+
}
47+
4248
@Override
4349
public Post getPost(Long id) {
4450
return postRepository.findOne(id);

src/main/webapp/WEB-INF/templates/layouts/blog.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141

4242
<body>
4343

44+
<script th:inline="javascript">
45+
window.postsUrl = /*[[@{/posts}]]*/ '';
46+
</script>
47+
4448
<div class="container-fluid">
4549

4650
<div class="row">
@@ -114,6 +118,14 @@ <h1>Blog</h1>
114118

115119
<button type="submit" class="btn btn-default">Search</button>
116120
</form>
121+
122+
<div id="latestPosts" class="panel panel-default">
123+
<div class="panel-body">
124+
<h4>Latest posts</h4>
125+
126+
127+
</div>
128+
</div>
117129
</div>
118130
</section>
119131
</div>

src/main/webapp/css/blog.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,8 @@ label.error {
223223

224224
.search-result {
225225
margin-top: 10px;
226+
}
227+
228+
#latestPosts {
229+
margin-top: 30px;
226230
}

src/main/webapp/js/common.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,20 @@ $(document).ready(function() {
2323
$(document).ajaxSend(function(e, xhr, options) {
2424
xhr.setRequestHeader(header, token);
2525
});
26+
27+
28+
$.ajax({
29+
dataType: "json",
30+
url: window.postsUrl,
31+
success: function (data) {
32+
var items = [];
33+
$.each(data, function(key, val) {
34+
items.push('<li><a href="' + window.postsUrl + '/' + val.id + '">' + val.title + '</a></li>');
35+
});
36+
$("<ul/>", {
37+
class: 'list-no-indent',
38+
html: items.join('')
39+
}).appendTo('#latestPosts div');
40+
}
41+
});
2642
});

src/test/java/alexp/blog/controller/PostsControllerIT.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ public void shouldShowPostsPage() throws Exception {
3535
.andExpect(model().attribute("postsPage", hasProperty("totalElements", equalTo(2L))));
3636
}
3737

38+
@Test
39+
@ExpectedDatabase("data.xml")
40+
public void shouldGetPostsList() throws Exception {
41+
mockMvc.perform(get("/posts").accept(MediaType.APPLICATION_JSON))
42+
.andExpect(status().isOk())
43+
.andExpect(jsonPath("$", hasSize(2)))
44+
.andExpect(jsonPath("$[0].id", is("2")))
45+
.andExpect(jsonPath("$[0].title", is("meow title")))
46+
.andExpect(jsonPath("$[1].id", is("1")))
47+
.andExpect(jsonPath("$[1].title", is("hello title")));
48+
}
49+
3850
@Test
3951
@ExpectedDatabase("data.xml")
4052
public void shouldShowPostPage() throws Exception {

0 commit comments

Comments
 (0)