new entrie sortings, link titles
This commit is contained in:
parent
d07805cd54
commit
4b6d9233ac
@ -76,6 +76,19 @@ public class EntryManager {
|
|||||||
return entryRepository.findAllByComments(date, gravity, PageRequest.of(page, size));
|
return entryRepository.findAllByComments(date, gravity, PageRequest.of(page, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch by comments.
|
||||||
|
*
|
||||||
|
* @param date the date
|
||||||
|
* @param gravity the gravity
|
||||||
|
* @param page the page
|
||||||
|
* @param size the size
|
||||||
|
* @return the page
|
||||||
|
*/
|
||||||
|
public Page<Entry> fetchByLastComment(Instant date, int page, int size) {
|
||||||
|
return entryRepository.findAllByLastComment(date, PageRequest.of(page, size));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch by date.
|
* Fetch by date.
|
||||||
*
|
*
|
||||||
|
@ -57,30 +57,10 @@ public class UserManager implements UserDetailsService, SmartInitializingSinglet
|
|||||||
@Value("${bstly.board.ranking.gravity:1.2}")
|
@Value("${bstly.board.ranking.gravity:1.2}")
|
||||||
private double GRAVITY;
|
private double GRAVITY;
|
||||||
|
|
||||||
/*
|
|
||||||
* @see org.springframework.security.core.userdetails.UserDetailsService#
|
|
||||||
* loadUserByUsername(java.lang.String)
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.security.core.userdetails.UserDetailsService#
|
|
||||||
* loadUserByUsername(java.lang.String)
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.security.core.userdetails.UserDetailsService#
|
|
||||||
* loadUserByUsername(java.lang.String)
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.security.core.userdetails.UserDetailsService#
|
|
||||||
* loadUserByUsername(java.lang.String)
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
|
* @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* @see
|
|
||||||
* de.bstly.board.businesslogic.LocalUserManager#loadUserByUsername(java.lang.
|
|
||||||
* String)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||||
LocalUser localUser = getByUsername(username);
|
LocalUser localUser = getByUsername(username);
|
||||||
@ -118,30 +98,10 @@ public class UserManager implements UserDetailsService, SmartInitializingSinglet
|
|||||||
return userDetails;
|
return userDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#afterSingletonsInstantiated()
|
* @see org.springframework.beans.factory.SmartInitializingSingleton#afterSingletonsInstantiated()
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void afterSingletonsInstantiated() {
|
public void afterSingletonsInstantiated() {
|
||||||
if (!localUserRepository.exists(qLocalUser.roles.contains("ROLE_ADMIN"))) {
|
if (!localUserRepository.exists(qLocalUser.roles.contains("ROLE_ADMIN"))) {
|
||||||
|
@ -3,9 +3,14 @@
|
|||||||
*/
|
*/
|
||||||
package de.bstly.board.controller;
|
package de.bstly.board.controller;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Scanner;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -96,7 +101,35 @@ public class EntryController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch by ranking.
|
* Fetch by date.
|
||||||
|
*
|
||||||
|
* @param pageParameter the page parameter
|
||||||
|
* @param sizeParameter the size parameter
|
||||||
|
* @param dateParameter the date parameter
|
||||||
|
* @param ignoreParameter the ignore parameter
|
||||||
|
* @return the page
|
||||||
|
*/
|
||||||
|
@PreAuthorize("isAuthenticated()")
|
||||||
|
@GetMapping("/new")
|
||||||
|
public Page<Entry> fetchByDate(@RequestParam("page") Optional<Integer> pageParameter,
|
||||||
|
@RequestParam("size") Optional<Integer> sizeParameter,
|
||||||
|
@RequestParam("date") Optional<Instant> dateParameter,
|
||||||
|
@RequestParam("ignore") Optional<List<String>> ignoreParameter) {
|
||||||
|
|
||||||
|
if (sizeParameter.isPresent() && sizeParameter.get() > 100) {
|
||||||
|
sizeParameter = Optional.of(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
Page<Entry> entries = entryManager.fetchByDate(dateParameter.orElse(Instant.now()),
|
||||||
|
pageParameter.orElse(0), sizeParameter.orElse(SIZE));
|
||||||
|
List<String> ignore = ignoreParameter.orElse(Lists.newArrayList());
|
||||||
|
entryManager.applyMetadata(getCurrentUsername(), userManager.getKarma(getCurrentUsername()),
|
||||||
|
entries.getContent(), ignore);
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch by comments.
|
||||||
*
|
*
|
||||||
* @param pageParameter the page parameter
|
* @param pageParameter the page parameter
|
||||||
* @param sizeParameter the size parameter
|
* @param sizeParameter the size parameter
|
||||||
@ -134,17 +167,18 @@ public class EntryController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch by date.
|
* Fetch by comments.
|
||||||
*
|
*
|
||||||
* @param pageParameter the page parameter
|
* @param pageParameter the page parameter
|
||||||
* @param sizeParameter the size parameter
|
* @param sizeParameter the size parameter
|
||||||
* @param dateParameter the date parameter
|
* @param dateParameter the date parameter
|
||||||
|
* @param gravityParameter the gravity parameter
|
||||||
* @param ignoreParameter the ignore parameter
|
* @param ignoreParameter the ignore parameter
|
||||||
* @return the page
|
* @return the page
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("isAuthenticated()")
|
@PreAuthorize("isAuthenticated()")
|
||||||
@GetMapping("/new")
|
@GetMapping("/last")
|
||||||
public Page<Entry> fetchByDate(@RequestParam("page") Optional<Integer> pageParameter,
|
public Page<Entry> fetchByLast(@RequestParam("page") Optional<Integer> pageParameter,
|
||||||
@RequestParam("size") Optional<Integer> sizeParameter,
|
@RequestParam("size") Optional<Integer> sizeParameter,
|
||||||
@RequestParam("date") Optional<Instant> dateParameter,
|
@RequestParam("date") Optional<Instant> dateParameter,
|
||||||
@RequestParam("ignore") Optional<List<String>> ignoreParameter) {
|
@RequestParam("ignore") Optional<List<String>> ignoreParameter) {
|
||||||
@ -153,8 +187,9 @@ public class EntryController extends BaseController {
|
|||||||
sizeParameter = Optional.of(100);
|
sizeParameter = Optional.of(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
Page<Entry> entries = entryManager.fetchByDate(dateParameter.orElse(Instant.now()),
|
Page<Entry> entries = entryManager.fetchByLastComment(dateParameter.orElse(Instant.now()),
|
||||||
pageParameter.orElse(0), sizeParameter.orElse(SIZE));
|
pageParameter.orElse(0), sizeParameter.orElse(SIZE));
|
||||||
|
|
||||||
List<String> ignore = ignoreParameter.orElse(Lists.newArrayList());
|
List<String> ignore = ignoreParameter.orElse(Lists.newArrayList());
|
||||||
entryManager.applyMetadata(getCurrentUsername(), userManager.getKarma(getCurrentUsername()),
|
entryManager.applyMetadata(getCurrentUsername(), userManager.getKarma(getCurrentUsername()),
|
||||||
entries.getContent(), ignore);
|
entries.getContent(), ignore);
|
||||||
@ -256,4 +291,36 @@ public class EntryController extends BaseController {
|
|||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the title.
|
||||||
|
*
|
||||||
|
* @param url the url
|
||||||
|
* @return the title
|
||||||
|
*/
|
||||||
|
@PreAuthorize("isAuthenticated()")
|
||||||
|
@GetMapping("/helper/title")
|
||||||
|
public String getTitle(@RequestParam("url") String url) {
|
||||||
|
InputStream response = null;
|
||||||
|
Scanner scanner = null;
|
||||||
|
try {
|
||||||
|
response = new URL(URLDecoder.decode(url, "utf-8")).openStream();
|
||||||
|
scanner = new Scanner(response);
|
||||||
|
String responseBody = scanner.useDelimiter("\\A").next();
|
||||||
|
return responseBody.substring(responseBody.indexOf("<title>") + 7,
|
||||||
|
responseBody.indexOf("</title>"));
|
||||||
|
} catch (IOException ex) {
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (response != null) {
|
||||||
|
response.close();
|
||||||
|
}
|
||||||
|
if (scanner != null) {
|
||||||
|
scanner.close();
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
package de.bstly.board.controller;
|
package de.bstly.board.controller;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
@ -15,13 +16,13 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import de.bstly.board.businesslogic.CommentManager;
|
import de.bstly.board.businesslogic.CommentManager;
|
||||||
import de.bstly.board.businesslogic.EntryManager;
|
import de.bstly.board.businesslogic.EntryManager;
|
||||||
|
import de.bstly.board.businesslogic.UserManager;
|
||||||
import de.bstly.board.businesslogic.VoteManager;
|
import de.bstly.board.businesslogic.VoteManager;
|
||||||
import de.bstly.board.controller.support.EntityResponseStatusException;
|
import de.bstly.board.controller.support.EntityResponseStatusException;
|
||||||
import de.bstly.board.model.Types;
|
import de.bstly.board.model.Types;
|
||||||
import de.bstly.board.model.Vote;
|
import de.bstly.board.model.Vote;
|
||||||
import de.bstly.board.model.VoteType;
|
import de.bstly.board.model.VoteType;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class VoteController.
|
* The Class VoteController.
|
||||||
*/
|
*/
|
||||||
@ -29,17 +30,17 @@ import de.bstly.board.model.VoteType;
|
|||||||
@RequestMapping("/votes")
|
@RequestMapping("/votes")
|
||||||
public class VoteController extends BaseController {
|
public class VoteController extends BaseController {
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private VoteManager voteManager;
|
private VoteManager voteManager;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EntryManager entryManager;
|
private EntryManager entryManager;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CommentManager commentManager;
|
private CommentManager commentManager;
|
||||||
|
@Autowired
|
||||||
|
private UserManager userManager;
|
||||||
|
|
||||||
|
@Value("${bstly.board.unvoteThresh:10}")
|
||||||
|
private long UNVOTE_THRESH;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the entry points.
|
* Gets the entry points.
|
||||||
@ -95,6 +96,10 @@ public class VoteController extends BaseController {
|
|||||||
throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY);
|
throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (userManager.getKarma(getCurrentUsername()) < UNVOTE_THRESH) {
|
||||||
|
throw new EntityResponseStatusException(HttpStatus.FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
Vote vote = voteManager.get(getCurrentUsername(), Types.entry, id);
|
Vote vote = voteManager.get(getCurrentUsername(), Types.entry, id);
|
||||||
if (vote == null) {
|
if (vote == null) {
|
||||||
vote = new Vote();
|
vote = new Vote();
|
||||||
|
@ -78,6 +78,7 @@ public class EntityResponseStatusException extends NestedRuntimeException {
|
|||||||
return this.body;
|
return this.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.core.NestedRuntimeException#getMessage()
|
* @see org.springframework.core.NestedRuntimeException#getMessage()
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,94 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package de.bstly.board.controller.support;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
|
import org.springframework.core.MethodParameter;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpInputMessage;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
|
import org.springframework.http.converter.StringHttpMessageConverter;
|
||||||
|
import org.springframework.http.server.ServerHttpRequest;
|
||||||
|
import org.springframework.http.server.ServerHttpResponse;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
|
||||||
|
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonPrimitive;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class JsonStringBodyControllerAdvice.
|
||||||
|
*/
|
||||||
|
@ControllerAdvice
|
||||||
|
public class JsonStringBodyControllerAdvice implements RequestBodyAdvice, ResponseBodyAdvice<String> {
|
||||||
|
|
||||||
|
private Gson gson = new Gson();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice#supports(org.springframework.core.MethodParameter, java.lang.reflect.Type, java.lang.Class)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean supports(MethodParameter methodParameter, Type targetType,
|
||||||
|
Class<? extends HttpMessageConverter<?>> converterType) {
|
||||||
|
return targetType instanceof Class && String.class.equals((Class<?>) targetType);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice#beforeBodyRead(org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type, java.lang.Class)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
|
||||||
|
Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
|
||||||
|
return inputMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice#afterBodyRead(java.lang.Object, org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type, java.lang.Class)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
|
||||||
|
Class<? extends HttpMessageConverter<?>> converterType) {
|
||||||
|
body = ((String) body).replaceAll("^\"|\"$", "");
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice#handleEmptyBody(java.lang.Object, org.springframework.http.HttpInputMessage, org.springframework.core.MethodParameter, java.lang.reflect.Type, java.lang.Class)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
|
||||||
|
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice#supports(org.springframework.core.MethodParameter, java.lang.Class)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
|
||||||
|
return converterType == StringHttpMessageConverter.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice#beforeBodyWrite(java.lang.Object, org.springframework.core.MethodParameter, org.springframework.http.MediaType, java.lang.Class, org.springframework.http.server.ServerHttpRequest, org.springframework.http.server.ServerHttpResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String beforeBodyWrite(String body, MethodParameter returnType, MediaType selectedContentType,
|
||||||
|
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
|
||||||
|
ServerHttpResponse response) {
|
||||||
|
response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
|
||||||
|
return gson.toJson(new JsonPrimitive(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,14 +35,10 @@ public class RequestBodyErrors extends AbstractBindingResult {
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.validation.AbstractBindingResult#getActualFieldValue(java.lang.String)
|
* @see org.springframework.validation.AbstractBindingResult#getActualFieldValue(java.lang.String)
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* @see
|
|
||||||
* org.springframework.validation.AbstractBindingResult#getActualFieldValue(java
|
|
||||||
* .lang.String)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
protected Object getActualFieldValue(String field) {
|
protected Object getActualFieldValue(String field) {
|
||||||
// Not necessary
|
// Not necessary
|
||||||
|
@ -20,14 +20,12 @@ import de.bstly.board.model.Comment;
|
|||||||
@Component
|
@Component
|
||||||
public class CommentValidator implements Validator {
|
public class CommentValidator implements Validator {
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CommentManager commentManager;
|
private CommentManager commentManager;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EntryManager entryManager;
|
private EntryManager entryManager;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.validation.Validator#supports(java.lang.Class)
|
* @see org.springframework.validation.Validator#supports(java.lang.Class)
|
||||||
*/
|
*/
|
||||||
@ -36,9 +34,9 @@ public class CommentValidator implements Validator {
|
|||||||
return clazz.isAssignableFrom(Comment.class);
|
return clazz.isAssignableFrom(Comment.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.validation.Validator#validate(java.lang.Object,
|
* @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors)
|
||||||
* org.springframework.validation.Errors)
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void validate(Object target, Errors errors) {
|
public void validate(Object target, Errors errors) {
|
||||||
|
@ -20,6 +20,7 @@ public class EntryValidator implements Validator {
|
|||||||
|
|
||||||
private UrlValidator urlValidator = new UrlValidator();
|
private UrlValidator urlValidator = new UrlValidator();
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.validation.Validator#supports(java.lang.Class)
|
* @see org.springframework.validation.Validator#supports(java.lang.Class)
|
||||||
*/
|
*/
|
||||||
@ -28,9 +29,9 @@ public class EntryValidator implements Validator {
|
|||||||
return clazz.isAssignableFrom(Entry.class);
|
return clazz.isAssignableFrom(Entry.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.validation.Validator#validate(java.lang.Object,
|
* @see org.springframework.validation.Validator#validate(java.lang.Object, org.springframework.validation.Errors)
|
||||||
* org.springframework.validation.Errors)
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void validate(Object target, Errors errors) {
|
public void validate(Object target, Errors errors) {
|
||||||
|
@ -158,13 +158,10 @@ public class I18nManager implements SmartInitializingSingleton {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#afterSingletonsInstantiated()
|
* @see org.springframework.beans.factory.SmartInitializingSingleton#afterSingletonsInstantiated()
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* @see org.springframework.beans.factory.SmartInitializingSingleton#
|
|
||||||
* afterSingletonsInstantiated()
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void afterSingletonsInstantiated() {
|
public void afterSingletonsInstantiated() {
|
||||||
try {
|
try {
|
||||||
|
@ -27,7 +27,7 @@ public interface EntryRepository
|
|||||||
|
|
||||||
static final String DOWNVOTES_QUERY = "SELECT downvote.target,COUNT(downvote.id) AS count FROM votes as downvote WHERE downvote.type = 1 AND downvote.target_type = 1 GROUP BY downvote.target";
|
static final String DOWNVOTES_QUERY = "SELECT downvote.target,COUNT(downvote.id) AS count FROM votes as downvote WHERE downvote.type = 1 AND downvote.target_type = 1 GROUP BY downvote.target";
|
||||||
|
|
||||||
static final String COMMENTS_QUERY = "SELECT comment.target,COUNT(comment.id) AS count FROM comments as comment GROUP BY comment.target";
|
static final String COMMENTS_QUERY = "SELECT comment.target,MAX(comment.created) as last,COUNT(comment.id) AS count FROM comments as comment GROUP BY comment.target";
|
||||||
|
|
||||||
static final String RANK_CALCULATION_QUERY = "SELECT entry.*, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) as points, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) / POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
static final String RANK_CALCULATION_QUERY = "SELECT entry.*, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) as points, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) / POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
||||||
+ UPVOTES_QUERY
|
+ UPVOTES_QUERY
|
||||||
@ -35,10 +35,14 @@ public interface EntryRepository
|
|||||||
+ DOWNVOTES_QUERY
|
+ DOWNVOTES_QUERY
|
||||||
+ ") AS downvote ON downvote.target = entry.id WHERE entry.created < :before AND entry.entry_status = 'NORMAL' ORDER BY ranking DESC, entry.created DESC";
|
+ ") AS downvote ON downvote.target = entry.id WHERE entry.created < :before AND entry.entry_status = 'NORMAL' ORDER BY ranking DESC, entry.created DESC";
|
||||||
|
|
||||||
static final String COMMENT_CALCULATION_QUERY = "SELECT entry.*, IFNULL(comment.count,0) as comments, IFNULL(comment.count,0) / POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
static final String COMMENT_CALCULATION_QUERY = "SELECT entry.*, IFNULL(comment.count,0) as comments, IFNULL(comment.count,0) / POW(TIMESTAMPDIFF(HOUR, comment.last, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
||||||
+ COMMENTS_QUERY
|
+ COMMENTS_QUERY
|
||||||
+ ") AS comment ON comment.target = entry.id WHERE entry.created < :before AND entry.entry_status = 'NORMAL' ORDER BY ranking DESC, entry.created DESC";
|
+ ") AS comment ON comment.target = entry.id WHERE entry.created < :before AND entry.entry_status = 'NORMAL' ORDER BY ranking DESC, entry.created DESC";
|
||||||
|
|
||||||
|
static final String LAST_COMMENT_QUERY = "SELECT entry.* FROM entries AS entry LEFT JOIN ("
|
||||||
|
+ COMMENTS_QUERY
|
||||||
|
+ ") AS comment ON comment.target = entry.id WHERE entry.created < :before AND entry.entry_status = 'NORMAL' ORDER BY comment.last DESC, entry.created DESC";
|
||||||
|
|
||||||
static final String ARCHIVE_CALCULATION_QUERY = "SELECT entry.*, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) as points, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) / POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
static final String ARCHIVE_CALCULATION_QUERY = "SELECT entry.*, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) as points, (IFNULL(upvote.count,0) - IFNULL(downvote.count,0)) / POW(TIMESTAMPDIFF(HOUR, entry.created, :before)+2,:gravity) AS ranking FROM entries AS entry LEFT JOIN ("
|
||||||
+ UPVOTES_QUERY
|
+ UPVOTES_QUERY
|
||||||
+ ") AS upvote ON upvote.target = entry.id LEFT JOIN ("
|
+ ") AS upvote ON upvote.target = entry.id LEFT JOIN ("
|
||||||
@ -75,6 +79,17 @@ public interface EntryRepository
|
|||||||
Page<RankedEntry> findAllByComments(@Param("before") Instant before,
|
Page<RankedEntry> findAllByComments(@Param("before") Instant before,
|
||||||
@Param("gravity") double gravity, Pageable pageable);
|
@Param("gravity") double gravity, Pageable pageable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find all by comments.
|
||||||
|
*
|
||||||
|
* @param before the before
|
||||||
|
* @param gravity the gravity
|
||||||
|
* @param pageable the pageable
|
||||||
|
* @return the page
|
||||||
|
*/
|
||||||
|
@Query(value = LAST_COMMENT_QUERY, countQuery = COUNT_QUERY, nativeQuery = true)
|
||||||
|
Page<Entry> findAllByLastComment(@Param("before") Instant before, Pageable pageable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find all by ranking archive.
|
* Find all by ranking archive.
|
||||||
*
|
*
|
||||||
|
@ -27,15 +27,10 @@ public class LocalRememberMeServices extends PersistentTokenBasedRememberMeServi
|
|||||||
super(key, userDetailsService, tokenRepository);
|
super(key, userDetailsService, tokenRepository);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices#rememberMeRequested(javax.servlet.http.HttpServletRequest, java.lang.String)
|
* @see org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices#rememberMeRequested(javax.servlet.http.HttpServletRequest, java.lang.String)
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
*
|
|
||||||
* @see org.springframework.security.web.authentication.rememberme.
|
|
||||||
* AbstractRememberMeServices#rememberMeRequested(javax.servlet.http.
|
|
||||||
* HttpServletRequest, java.lang.String)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
|
protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
|
||||||
Object value = request.getAttribute(parameter);
|
Object value = request.getAttribute(parameter);
|
||||||
|
@ -37,15 +37,10 @@ public class OAuth2AuthenticationSuccessHandler
|
|||||||
|
|
||||||
private RememberMeServices rememberMeServices;
|
private RememberMeServices rememberMeServices;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.security.core.Authentication)
|
* @see org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.security.core.Authentication)
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* @see org.springframework.security.web.authentication.
|
|
||||||
* SavedRequestAwareAuthenticationSuccessHandler#onAuthenticationSuccess(javax.
|
|
||||||
* servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse,
|
|
||||||
* org.springframework.security.core.Authentication)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
|
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
|
||||||
Authentication authentication) throws IOException, ServletException {
|
Authentication authentication) throws IOException, ServletException {
|
||||||
|
@ -53,15 +53,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|||||||
@Value("${loginTargetUrl:/}")
|
@Value("${loginTargetUrl:/}")
|
||||||
private String loginTargetUrl;
|
private String loginTargetUrl;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
|
* @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
*
|
|
||||||
* @see org.springframework.security.config.annotation.web.configuration.
|
|
||||||
* WebSecurityConfigurerAdapter#configure(org.springframework.security.config.
|
|
||||||
* annotation.web.builders.HttpSecurity)
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(HttpSecurity http) throws Exception {
|
protected void configure(HttpSecurity http) throws Exception {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user