Skip to content

Commit

Permalink
Added caching
Browse files Browse the repository at this point in the history
  • Loading branch information
cjmalloy committed Aug 9, 2022
1 parent 0ac10f3 commit ac8e0d2
Show file tree
Hide file tree
Showing 10 changed files with 115 additions and 25 deletions.
56 changes: 56 additions & 0 deletions src/main/java/jasper/util/RestUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package jasper.util;

import jasper.domain.proj.HasModified;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.context.request.WebRequest;

import java.time.Instant;
import java.util.Comparator;
import java.util.List;

public class RestUtil {

public static CacheControl ifNotModifiedCacheControl = CacheControl
.noCache()
.mustRevalidate()
.cachePrivate();

public static <T extends HasModified> ResponseEntity<T> ifModifiedSince(WebRequest request, T result) {
return ifModifiedSince(request, result, result.getModified());
}

public static <T extends HasModified> ResponseEntity<List<T>> ifModifiedSinceList(WebRequest request, List<T> result) {
return ifModifiedSince(request, result, getMaxModified(result));
}

public static <T> ResponseEntity<T> ifModifiedSince(WebRequest request, T result, GetModified<T> m) {
return ifModifiedSince(request, result, m.getModified(result));
}

public static <T> ResponseEntity<T> ifModifiedSince(WebRequest request, T result, Instant lastModified) {
if (lastModified == null) return ResponseEntity.ok(result);
var ms = lastModified.toEpochMilli();
if (request.checkNotModified(ms)) {
return ResponseEntity.status(HttpStatus.NOT_MODIFIED)
.cacheControl(ifNotModifiedCacheControl)
.build();
}
return ResponseEntity.ok()
.cacheControl(ifNotModifiedCacheControl)
.lastModified(ms)
.body(result);
}

public static <T extends HasModified> Instant getMaxModified(List<T> list) {
return list.stream()
.max(Comparator.comparing(HasModified::getModified))
.map(HasModified::getModified)
.orElse(null);
}

public interface GetModified<T> {
Instant getModified(T entity);
}
}
8 changes: 6 additions & 2 deletions src/main/java/jasper/web/rest/ExtController.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -22,12 +23,14 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;

import static jasper.domain.TagId.QTAG_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;

@RestController
@RequestMapping("api/v1/ext")
Expand All @@ -46,10 +49,11 @@ void createExt(
}

@GetMapping
Ext getExt(
HttpEntity<Ext> getExt(
WebRequest request,
@RequestParam @Length(max = QTAG_LEN) @Pattern(regexp = TagId.REGEX) String tag
) {
return extService.get(tag);
return ifModifiedSince(request, extService.get(tag));
}

@GetMapping("page")
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/jasper/web/rest/FeedController.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -26,6 +27,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
Expand All @@ -35,6 +37,7 @@
import static jasper.domain.Origin.ORIGIN_LEN;
import static jasper.domain.Ref.URL_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;

@RestController
@RequestMapping("api/v1/feed")
Expand All @@ -53,11 +56,12 @@ void createFeed(
}

@GetMapping
FeedDto getFeed(
HttpEntity<FeedDto> getFeed(
WebRequest request,
@RequestParam @Length(max = URL_LEN) @URL String url,
@RequestParam(defaultValue = "") @Length(max = ORIGIN_LEN) @Pattern(regexp = Origin.REGEX) String origin
) {
return feedService.get(url, origin);
return ifModifiedSince(request, feedService.get(url, origin));
}

@GetMapping("exists")
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/jasper/web/rest/OriginController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -20,13 +21,15 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
import java.time.Instant;

import static jasper.domain.Origin.ORIGIN_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;

@RestController
@RequestMapping("api/v1/origin")
Expand All @@ -45,10 +48,11 @@ void createOrigin(
}

@GetMapping
Origin getOrigin(
HttpEntity<Origin> getOrigin(
WebRequest request,
@RequestParam @Length(max = ORIGIN_LEN) @Pattern(regexp = Origin.REGEX) String origin
) {
return originService.get(origin);
return ifModifiedSince(request, originService.get(origin));
}

@GetMapping("page")
Expand Down
16 changes: 11 additions & 5 deletions src/main/java/jasper/web/rest/PluginController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.annotation.Validated;
Expand All @@ -21,6 +22,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
Expand All @@ -30,6 +32,8 @@

import static jasper.domain.TagId.QTAG_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;
import static jasper.util.RestUtil.ifModifiedSinceList;

@RestController
@RequestMapping("api/v1/plugin")
Expand All @@ -48,10 +52,11 @@ void createPlugin(
}

@GetMapping
Plugin getPlugin(
HttpEntity<Plugin> getPlugin(
WebRequest request,
@RequestParam @Length(max = QTAG_LEN) @Pattern(regexp = Plugin.REGEX) String tag
) {
return pluginService.get(tag);
return ifModifiedSince(request, pluginService.get(tag));
}

@GetMapping("exists")
Expand All @@ -62,16 +67,17 @@ boolean pluginExists(
}

@GetMapping("list")
List<Plugin> getList(
HttpEntity<List<Plugin>> getList(
WebRequest request,
@RequestParam @Size(max = 100) List<@Length(max = QTAG_LEN) @Pattern(regexp = Plugin.REGEX) String> tags
) {
return tags.stream().map(tag -> {
return ifModifiedSinceList(request, tags.stream().map(tag -> {
try {
return pluginService.get(tag);
} catch (NotFoundException | AccessDeniedException e) {
return null;
}
}).toList();
}).toList());
}

@GetMapping("page")
Expand Down
16 changes: 11 additions & 5 deletions src/main/java/jasper/web/rest/RefController.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.annotation.Validated;
Expand All @@ -28,6 +29,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
Expand All @@ -40,6 +42,8 @@
import static jasper.domain.Ref.URL_LEN;
import static jasper.domain.TagId.TAG_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;
import static jasper.util.RestUtil.ifModifiedSinceList;

@RestController
@RequestMapping("api/v1/ref")
Expand All @@ -58,11 +62,12 @@ void createRef(
}

@GetMapping
RefDto getRef(
HttpEntity<RefDto> getRef(
WebRequest request,
@RequestParam @Length(max = URL_LEN) @Pattern(regexp = Ref.REGEX) String url,
@RequestParam(defaultValue = "") @Length(max = ORIGIN_LEN) @Pattern(regexp = Origin.REGEX) String origin
) {
return refService.get(url, origin);
return ifModifiedSince(request, refService.get(url, origin));
}

@GetMapping("exists")
Expand All @@ -74,17 +79,18 @@ boolean refExists(
}

@GetMapping("list")
List<RefDto> getList(
HttpEntity<List<RefDto>> getList(
WebRequest request,
@RequestParam @Size(max = 100) List<@Length(max = URL_LEN) @Pattern(regexp = Ref.REGEX) String> urls,
@RequestParam(defaultValue = "") @Length(max = ORIGIN_LEN) @Pattern(regexp = Origin.REGEX) String origin
) {
return urls.stream().map(url -> {
return ifModifiedSinceList(request, urls.stream().map(url -> {
try {
return refService.get(url, origin);
} catch (NotFoundException | AccessDeniedException e) {
return null;
}
}).toList();
}).toList());
}

@GetMapping("page")
Expand Down
1 change: 0 additions & 1 deletion src/main/java/jasper/web/rest/TaggingController.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Pattern;

import java.util.List;

import static jasper.domain.Origin.ORIGIN_LEN;
Expand Down
16 changes: 11 additions & 5 deletions src/main/java/jasper/web/rest/TemplateController.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.annotation.Validated;
Expand All @@ -22,6 +23,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
Expand All @@ -31,6 +33,8 @@

import static jasper.domain.TagId.QTAG_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;
import static jasper.util.RestUtil.ifModifiedSinceList;

@RestController
@RequestMapping("api/v1/template")
Expand All @@ -49,10 +53,11 @@ void createTemplate(
}

@GetMapping
Template getTemplate(
HttpEntity<Template> getTemplate(
WebRequest request,
@RequestParam(defaultValue = "") @Length(max = QTAG_LEN) @Pattern(regexp = Template.REGEX) String tag
) {
return templateService.get(tag);
return ifModifiedSince(request, templateService.get(tag));
}

@GetMapping("exists")
Expand All @@ -63,16 +68,17 @@ boolean templateExists(
}

@GetMapping("list")
List<Template> getList(
HttpEntity<List<Template>> getList(
WebRequest request,
@RequestParam @Size(max = 100) List<@Length(max = QTAG_LEN) @Pattern(regexp = Template.REGEX) String> tags
) {
return tags.stream().map(tag -> {
return ifModifiedSinceList(request, tags.stream().map(tag -> {
try {
return templateService.get(tag);
} catch (NotFoundException | AccessDeniedException e) {
return null;
}
}).toList();
}).toList());
}

@GetMapping("page")
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/jasper/web/rest/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -22,13 +23,15 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;
import java.time.Instant;

import static jasper.domain.TagId.QTAG_LEN;
import static jasper.repository.filter.Query.QUERY_LEN;
import static jasper.util.RestUtil.ifModifiedSince;

@RestController
@RequestMapping("api/v1/user")
Expand All @@ -50,10 +53,11 @@ void createUser(
}

@GetMapping
UserDto getUser(
HttpEntity<UserDto> getUser(
WebRequest request,
@RequestParam @Length(max = QTAG_LEN) @Pattern(regexp = User.REGEX) String tag
) {
return userService.get(tag);
return ifModifiedSince(request, userService.get(tag));
}

@GetMapping("page")
Expand Down
Loading

0 comments on commit ac8e0d2

Please sign in to comment.