add read one article
This commit is contained in:
44
src/main/java/io/spring/JacksonCustomizations.java
Normal file
44
src/main/java/io/spring/JacksonCustomizations.java
Normal file
@@ -0,0 +1,44 @@
|
||||
package io.spring;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.Module;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
|
||||
import org.joda.time.DateTime;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Configuration
|
||||
public class JacksonCustomizations {
|
||||
|
||||
@Bean
|
||||
public Module realWorldModules() {
|
||||
return new RealWorldModules();
|
||||
}
|
||||
|
||||
public static class RealWorldModules extends SimpleModule {
|
||||
public RealWorldModules() {
|
||||
addSerializer(DateTime.class, new DateTimeSerializer());
|
||||
}
|
||||
}
|
||||
|
||||
public static class DateTimeSerializer extends StdSerializer<DateTime> {
|
||||
|
||||
protected DateTimeSerializer() {
|
||||
super(DateTime.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
|
||||
if (value == null) {
|
||||
gen.writeNull();
|
||||
} else {
|
||||
gen.writeString(value.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
30
src/main/java/io/spring/api/ArticleApi.java
Normal file
30
src/main/java/io/spring/api/ArticleApi.java
Normal file
@@ -0,0 +1,30 @@
|
||||
package io.spring.api;
|
||||
|
||||
import io.spring.api.exception.ResourceNotFoundException;
|
||||
import io.spring.application.article.ArticleData;
|
||||
import io.spring.application.article.ArticleQueryService;
|
||||
import io.spring.core.user.User;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(path = "/articles/{slug}")
|
||||
public class ArticleApi {
|
||||
private ArticleQueryService articleQueryService;
|
||||
|
||||
@Autowired
|
||||
public ArticleApi(ArticleQueryService articleQueryService) {
|
||||
this.articleQueryService = articleQueryService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ResponseEntity<ArticleData> article(@PathVariable("slug") String slug,
|
||||
@AuthenticationPrincipal User user) {
|
||||
return articleQueryService.findBySlug(slug, user).map(ResponseEntity::ok).orElseThrow(ResourceNotFoundException::new);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package io.spring.api.exception;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
|
||||
@ResponseStatus(value = HttpStatus.NOT_FOUND)
|
||||
public class ResourceNotFoundException extends RuntimeException {
|
||||
}
|
||||
@@ -26,6 +26,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
|
||||
.authorizeRequests()
|
||||
.antMatchers(HttpMethod.POST, "/users", "/users/login").permitAll()
|
||||
.antMatchers(HttpMethod.GET, "/articles/**").permitAll()
|
||||
.anyRequest().authenticated();
|
||||
|
||||
http.addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
|
||||
|
||||
@@ -23,17 +23,35 @@ public class ArticleQueryService {
|
||||
}
|
||||
|
||||
public Optional<ArticleData> findById(String id, User user) {
|
||||
ArticleData articleData = articleReadService.ofId(id);
|
||||
ArticleData articleData = articleReadService.findById(id);
|
||||
if (articleData == null) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
articleData.setFavorited(articleFavoritesQueryService.isUserFavorite(user.getId(), id));
|
||||
articleData.setFavoritesCount(articleFavoritesQueryService.articleFavoriteCount(id));
|
||||
articleData.getProfileData().setFollowing(
|
||||
userRelationshipQueryService.isUserFollowing(
|
||||
user.getId(),
|
||||
articleData.getProfileData().getId()));
|
||||
if (user != null) {
|
||||
fillExtraInfo(id, user, articleData);
|
||||
}
|
||||
return Optional.of(articleData);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<ArticleData> findBySlug(String slug, User user) {
|
||||
ArticleData articleData = articleReadService.findBySlug(slug);
|
||||
if (articleData == null) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
if (user != null) {
|
||||
fillExtraInfo(articleData.getId(), user, articleData);
|
||||
}
|
||||
return Optional.of(articleData);
|
||||
}
|
||||
}
|
||||
|
||||
private void fillExtraInfo(String id, User user, ArticleData articleData) {
|
||||
articleData.setFavorited(articleFavoritesQueryService.isUserFavorite(user.getId(), id));
|
||||
articleData.setFavoritesCount(articleFavoritesQueryService.articleFavoriteCount(id));
|
||||
articleData.getProfileData().setFollowing(
|
||||
userRelationshipQueryService.isUserFollowing(
|
||||
user.getId(),
|
||||
articleData.getProfileData().getId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,5 +7,7 @@ import org.springframework.stereotype.Component;
|
||||
@Component
|
||||
@Mapper
|
||||
public interface ArticleReadService {
|
||||
ArticleData ofId(@Param("id") String id);
|
||||
ArticleData findById(@Param("id") String id);
|
||||
|
||||
ArticleData findBySlug(@Param("slug") String slug);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user