Skip to content

Commit

Permalink
Added lastModified to entities with images, for better http caching
Browse files Browse the repository at this point in the history
  • Loading branch information
FroMage committed Jun 12, 2024
1 parent 8728f13 commit aced825
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 20 deletions.
14 changes: 13 additions & 1 deletion src/main/java/model/Organiser.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.sql.Blob;
import java.sql.Types;
import java.time.Instant;
import java.util.Date;
import java.util.List;

import org.hibernate.annotations.JdbcTypeCode;
Expand All @@ -10,6 +12,8 @@

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;

Expand All @@ -34,7 +38,15 @@ public class Organiser extends PanacheEntity {

public boolean orga;
public boolean cfp;


public Date lastUpdated;

@PreUpdate
@PrePersist
public void prePersist() {
lastUpdated = Date.from(Instant.now());
}

@Override
public String toString() {
return firstName+" "+lastName;
Expand Down
13 changes: 12 additions & 1 deletion src/main/java/model/PreviousSpeaker.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package model;

import java.sql.Blob;
import java.time.Instant;
import java.util.Date;

import jakarta.persistence.Entity;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
Expand All @@ -20,11 +24,18 @@ public class PreviousSpeaker extends PanacheEntity implements Comparable<Previou
public String company;

public Blob photo;

public Date lastUpdated;

/* La dernière année à laquelle l'orateur a participé au RivieraDEV */
@NotNull
public Integer year;

@PreUpdate
@PrePersist
public void prePersist() {
lastUpdated = Date.from(Instant.now());
}

@Override
public String toString() {
return firstName+" "+lastName;
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/model/Speaker.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import java.sql.Blob;
import java.sql.Types;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.annotations.JdbcTypeCode;
Expand All @@ -12,6 +14,8 @@
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.validation.constraints.NotBlank;

@Entity
Expand Down Expand Up @@ -45,7 +49,15 @@ public class Speaker extends PanacheEntity implements Comparable<Speaker> {
public List<Talk> talks = new ArrayList<Talk>();

public String phone;


public Date lastUpdated;

@PreUpdate
@PrePersist
public void prePersist() {
lastUpdated = Date.from(Instant.now());
}

@Override
public String toString() {
return firstName+" "+lastName;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/model/Sponsor.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
import java.sql.Blob;
import java.sql.SQLException;
import java.sql.Types;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
Expand Down Expand Up @@ -52,11 +55,13 @@ public class Sponsor extends PanacheEntity implements Comparable<Sponsor> {

// set on save/create
public Integer width, height;
public Date lastUpdated;

@PreUpdate
@PrePersist
public void prePersist() {
updateImageSizes();
lastUpdated = Date.from(Instant.now());
}

private void updateImageSizes() {
Expand Down
41 changes: 24 additions & 17 deletions src/main/java/rest/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,21 @@

import org.jboss.resteasy.reactive.RestPath;
import org.jboss.resteasy.reactive.RestQuery;
import org.jboss.resteasy.reactive.server.SimpleResourceInfo;
import org.jboss.resteasy.reactive.server.core.CurrentRequestManager;
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
import org.jboss.resteasy.reactive.common.jaxrs.AbstractResponseBuilder;

import io.quarkiverse.renarde.security.ControllerWithUser;
import io.quarkiverse.renarde.util.FileUtils;
import io.quarkus.arc.Arc;
import io.quarkus.qute.CheckedTemplate;
import io.quarkus.qute.TemplateGlobal;
import io.quarkus.qute.TemplateInstance;
import io.smallrye.common.annotation.Blocking;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.container.ResourceInfo;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Request;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriBuilder;
import jakarta.ws.rs.core.UriInfo;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import model.Configuration;
import model.Language;
import model.Level;
Expand Down Expand Up @@ -377,47 +373,58 @@ public void becomeSponsor() {
}

@Transactional
public Response previousSpeakerPhoto(@RestPath Long id) {
public Response previousSpeakerPhoto(@RestPath Long id, Request request) {
PreviousSpeaker speaker = PreviousSpeaker.findById(id);
notFoundIfNull(speaker);
if (speaker.photo == null)
seeOther("/static/images/mascotte/Ray_Cool.jpg");
return binary(speaker.photo);
return binary(speaker.photo, speaker.lastUpdated, request);
}

private Response binary(Blob photo) {
private Response binary(Blob photo, Date lastUpdated, Request request) {
if(lastUpdated != null) {
// Workaround for https://github.com/quarkusio/quarkus/issues/41110
// truncate milliseconds for comparison
Date forComparison = new Date((lastUpdated.getTime() / 1000) * 1000);
ResponseBuilder cacheResponse = request.evaluatePreconditions(forComparison);
if(cacheResponse != null) {
return cacheResponse.build();
}
}
byte[] bytes;
try {
bytes = photo.getBytes(1, (int) photo.length());
} catch (SQLException e) {
throw new RuntimeException(e);
}
return Response.ok(bytes, FileUtils.getMimeType(null, bytes)).build();
return Response.ok(bytes, FileUtils.getMimeType(null, bytes))
// Workaround for https://github.com/quarkusio/quarkus/issues/41110
.header(HttpHeaders.LAST_MODIFIED, AbstractResponseBuilder.getDateFormatRFC822().format(lastUpdated)).build();
}

@Transactional
public Response speakerPhoto(@RestPath Long id) {
public Response speakerPhoto(@RestPath Long id, Request request) {
Speaker speaker = Speaker.findById(id);
notFoundIfNull(speaker);
if (speaker.photo == null)
seeOther("/static/images/mascotte/Ray_Cool.jpg");
return binary(speaker.photo);
return binary(speaker.photo, speaker.lastUpdated, request);
}

@Transactional
public Response sponsorLogo(@RestPath Long id) {
public Response sponsorLogo(@RestPath Long id, Request request) {
Sponsor sponsor = Sponsor.findById(id);
notFoundIfNull(sponsor);
return binary(sponsor.logo);
return binary(sponsor.logo, sponsor.lastUpdated, request);
}

@Transactional
public Response orgaPhoto(@RestPath Long id) {
public Response orgaPhoto(@RestPath Long id, Request request) {
Organiser organiser = Organiser.findById(id);
notFoundIfNull(organiser);
if (organiser.photo == null)
seeOther("/static/images/mascotte/Ray_Badass.jpg");
return binary(organiser.photo);
return binary(organiser.photo, organiser.lastUpdated, request);
}

@Path("/team")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
alter table Organiser add column lastUpdated timestamp(6);
alter table PreviousSpeaker add column lastUpdated timestamp(6);
alter table Speaker add column lastUpdated timestamp(6);
alter table Sponsor add column lastUpdated timestamp(6);

update Organiser set lastUpdated = current_timestamp;
update PreviousSpeaker set lastUpdated = current_timestamp;
update Speaker set lastUpdated = current_timestamp;
update Sponsor set lastUpdated = current_timestamp;

0 comments on commit aced825

Please sign in to comment.