Add timestamp suffix to all image urls (#1200)

This commit is contained in:
InfiniteTF
2021-03-13 01:49:20 +01:00
committed by GitHub
parent a619b9dd48
commit ecac7a8013
14 changed files with 63 additions and 50 deletions

View File

@@ -34,7 +34,7 @@ func (r *imageResolver) File(ctx context.Context, obj *models.Image) (*models.Im
func (r *imageResolver) Paths(ctx context.Context, obj *models.Image) (*models.ImagePathsType, error) { func (r *imageResolver) Paths(ctx context.Context, obj *models.Image) (*models.ImagePathsType, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
builder := urlbuilders.NewImageURLBuilder(baseURL, obj.ID) builder := urlbuilders.NewImageURLBuilder(baseURL, obj)
thumbnailPath := builder.GetThumbnailURL() thumbnailPath := builder.GetThumbnailURL()
imagePath := builder.GetImageURL() imagePath := builder.GetImageURL()
return &models.ImagePathsType{ return &models.ImagePathsType{

View File

@@ -84,13 +84,13 @@ func (r *movieResolver) Synopsis(ctx context.Context, obj *models.Movie) (*strin
func (r *movieResolver) FrontImagePath(ctx context.Context, obj *models.Movie) (*string, error) { func (r *movieResolver) FrontImagePath(ctx context.Context, obj *models.Movie) (*string, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
frontimagePath := urlbuilders.NewMovieURLBuilder(baseURL, obj.ID).GetMovieFrontImageURL() frontimagePath := urlbuilders.NewMovieURLBuilder(baseURL, obj).GetMovieFrontImageURL()
return &frontimagePath, nil return &frontimagePath, nil
} }
func (r *movieResolver) BackImagePath(ctx context.Context, obj *models.Movie) (*string, error) { func (r *movieResolver) BackImagePath(ctx context.Context, obj *models.Movie) (*string, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
backimagePath := urlbuilders.NewMovieURLBuilder(baseURL, obj.ID).GetMovieBackImageURL() backimagePath := urlbuilders.NewMovieURLBuilder(baseURL, obj).GetMovieBackImageURL()
return &backimagePath, nil return &backimagePath, nil
} }

View File

@@ -134,7 +134,7 @@ func (r *performerResolver) Favorite(ctx context.Context, obj *models.Performer)
func (r *performerResolver) ImagePath(ctx context.Context, obj *models.Performer) (*string, error) { func (r *performerResolver) ImagePath(ctx context.Context, obj *models.Performer) (*string, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
imagePath := urlbuilders.NewPerformerURLBuilder(baseURL, obj.ID).GetPerformerImageURL() imagePath := urlbuilders.NewPerformerURLBuilder(baseURL, obj).GetPerformerImageURL()
return &imagePath, nil return &imagePath, nil
} }

View File

@@ -23,7 +23,7 @@ func (r *studioResolver) URL(ctx context.Context, obj *models.Studio) (*string,
func (r *studioResolver) ImagePath(ctx context.Context, obj *models.Studio) (*string, error) { func (r *studioResolver) ImagePath(ctx context.Context, obj *models.Studio) (*string, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
imagePath := urlbuilders.NewStudioURLBuilder(baseURL, obj.ID).GetStudioImageURL() imagePath := urlbuilders.NewStudioURLBuilder(baseURL, obj).GetStudioImageURL()
var hasImage bool var hasImage bool
if err := r.withReadTxn(ctx, func(repo models.ReaderRepository) error { if err := r.withReadTxn(ctx, func(repo models.ReaderRepository) error {

View File

@@ -45,6 +45,6 @@ func (r *tagResolver) PerformerCount(ctx context.Context, obj *models.Tag) (ret
func (r *tagResolver) ImagePath(ctx context.Context, obj *models.Tag) (*string, error) { func (r *tagResolver) ImagePath(ctx context.Context, obj *models.Tag) (*string, error) {
baseURL, _ := ctx.Value(BaseURLCtxKey).(string) baseURL, _ := ctx.Value(BaseURLCtxKey).(string)
imagePath := urlbuilders.NewTagURLBuilder(baseURL, obj.ID).GetTagImageURL() imagePath := urlbuilders.NewTagURLBuilder(baseURL, obj).GetTagImageURL()
return &imagePath, nil return &imagePath, nil
} }

View File

@@ -1,25 +1,28 @@
package urlbuilders package urlbuilders
import ( import (
"github.com/stashapp/stash/pkg/models"
"strconv" "strconv"
) )
type ImageURLBuilder struct { type ImageURLBuilder struct {
BaseURL string BaseURL string
ImageID string ImageID string
UpdatedAt string
} }
func NewImageURLBuilder(baseURL string, imageID int) ImageURLBuilder { func NewImageURLBuilder(baseURL string, image *models.Image) ImageURLBuilder {
return ImageURLBuilder{ return ImageURLBuilder{
BaseURL: baseURL, BaseURL: baseURL,
ImageID: strconv.Itoa(imageID), ImageID: strconv.Itoa(image.ID),
UpdatedAt: strconv.FormatInt(image.UpdatedAt.Timestamp.Unix(), 10),
} }
} }
func (b ImageURLBuilder) GetImageURL() string { func (b ImageURLBuilder) GetImageURL() string {
return b.BaseURL + "/image/" + b.ImageID + "/image" return b.BaseURL + "/image/" + b.ImageID + "/image?" + b.UpdatedAt
} }
func (b ImageURLBuilder) GetThumbnailURL() string { func (b ImageURLBuilder) GetThumbnailURL() string {
return b.BaseURL + "/image/" + b.ImageID + "/thumbnail" return b.BaseURL + "/image/" + b.ImageID + "/thumbnail?" + b.UpdatedAt
} }

View File

@@ -1,23 +1,28 @@
package urlbuilders package urlbuilders
import "strconv" import (
"github.com/stashapp/stash/pkg/models"
"strconv"
)
type MovieURLBuilder struct { type MovieURLBuilder struct {
BaseURL string BaseURL string
MovieID string MovieID string
UpdatedAt string
} }
func NewMovieURLBuilder(baseURL string, movieID int) MovieURLBuilder { func NewMovieURLBuilder(baseURL string, movie *models.Movie) MovieURLBuilder {
return MovieURLBuilder{ return MovieURLBuilder{
BaseURL: baseURL, BaseURL: baseURL,
MovieID: strconv.Itoa(movieID), MovieID: strconv.Itoa(movie.ID),
UpdatedAt: strconv.FormatInt(movie.UpdatedAt.Timestamp.Unix(), 10),
} }
} }
func (b MovieURLBuilder) GetMovieFrontImageURL() string { func (b MovieURLBuilder) GetMovieFrontImageURL() string {
return b.BaseURL + "/movie/" + b.MovieID + "/frontimage" return b.BaseURL + "/movie/" + b.MovieID + "/frontimage?" + b.UpdatedAt
} }
func (b MovieURLBuilder) GetMovieBackImageURL() string { func (b MovieURLBuilder) GetMovieBackImageURL() string {
return b.BaseURL + "/movie/" + b.MovieID + "/backimage" return b.BaseURL + "/movie/" + b.MovieID + "/backimage?" + b.UpdatedAt
} }

View File

@@ -1,19 +1,24 @@
package urlbuilders package urlbuilders
import "strconv" import (
"github.com/stashapp/stash/pkg/models"
"strconv"
)
type PerformerURLBuilder struct { type PerformerURLBuilder struct {
BaseURL string BaseURL string
PerformerID string PerformerID string
UpdatedAt string
} }
func NewPerformerURLBuilder(baseURL string, performerID int) PerformerURLBuilder { func NewPerformerURLBuilder(baseURL string, performer *models.Performer) PerformerURLBuilder {
return PerformerURLBuilder{ return PerformerURLBuilder{
BaseURL: baseURL, BaseURL: baseURL,
PerformerID: strconv.Itoa(performerID), PerformerID: strconv.Itoa(performer.ID),
UpdatedAt: strconv.FormatInt(performer.UpdatedAt.Timestamp.Unix(), 10),
} }
} }
func (b PerformerURLBuilder) GetPerformerImageURL() string { func (b PerformerURLBuilder) GetPerformerImageURL() string {
return b.BaseURL + "/performer/" + b.PerformerID + "/image" return b.BaseURL + "/performer/" + b.PerformerID + "/image?" + b.UpdatedAt
} }

View File

@@ -1,19 +1,24 @@
package urlbuilders package urlbuilders
import "strconv" import (
"github.com/stashapp/stash/pkg/models"
"strconv"
)
type StudioURLBuilder struct { type StudioURLBuilder struct {
BaseURL string BaseURL string
StudioID string StudioID string
UpdatedAt string
} }
func NewStudioURLBuilder(baseURL string, studioID int) StudioURLBuilder { func NewStudioURLBuilder(baseURL string, studio *models.Studio) StudioURLBuilder {
return StudioURLBuilder{ return StudioURLBuilder{
BaseURL: baseURL, BaseURL: baseURL,
StudioID: strconv.Itoa(studioID), StudioID: strconv.Itoa(studio.ID),
UpdatedAt: strconv.FormatInt(studio.UpdatedAt.Timestamp.Unix(), 10),
} }
} }
func (b StudioURLBuilder) GetStudioImageURL() string { func (b StudioURLBuilder) GetStudioImageURL() string {
return b.BaseURL + "/studio/" + b.StudioID + "/image" return b.BaseURL + "/studio/" + b.StudioID + "/image?" + b.UpdatedAt
} }

View File

@@ -1,19 +1,24 @@
package urlbuilders package urlbuilders
import "strconv" import (
"github.com/stashapp/stash/pkg/models"
"strconv"
)
type TagURLBuilder struct { type TagURLBuilder struct {
BaseURL string BaseURL string
TagID string TagID string
UpdatedAt string
} }
func NewTagURLBuilder(baseURL string, tagID int) TagURLBuilder { func NewTagURLBuilder(baseURL string, tag *models.Tag) TagURLBuilder {
return TagURLBuilder{ return TagURLBuilder{
BaseURL: baseURL, BaseURL: baseURL,
TagID: strconv.Itoa(tagID), TagID: strconv.Itoa(tag.ID),
UpdatedAt: strconv.FormatInt(tag.UpdatedAt.Timestamp.Unix(), 10),
} }
} }
func (b TagURLBuilder) GetTagImageURL() string { func (b TagURLBuilder) GetTagImageURL() string {
return b.BaseURL + "/tag/" + b.TagID + "/image" return b.BaseURL + "/tag/" + b.TagID + "/image?" + b.UpdatedAt
} }

View File

@@ -121,6 +121,7 @@ func ServeImage(image []byte, w http.ResponseWriter, r *http.Request) error {
w.Header().Set("Content-Type", contentType) w.Header().Set("Content-Type", contentType)
w.Header().Add("Etag", etag) w.Header().Add("Etag", etag)
w.Header().Set("Cache-Control", "public, max-age=604800, immutable")
_, err := w.Write(image) _, err := w.Write(image)
return err return err
} }

View File

@@ -326,11 +326,6 @@ export const PerformerEditPanel: React.FC<IPerformerDetails> = ({
} as GQL.PerformerUpdateInput, } as GQL.PerformerUpdateInput,
}, },
}); });
if (performerInput.image) {
// Refetch image to bust browser cache
await fetch(`/performer/${performer.id}/image`, { cache: "reload" });
}
history.push(`/performers/${performer.id}`); history.push(`/performers/${performer.id}`);
} else { } else {
const result = await createPerformer({ const result = await createPerformer({

View File

@@ -134,10 +134,6 @@ export const Studio: React.FC = () => {
input: getStudioInput() as GQL.StudioUpdateInput, input: getStudioInput() as GQL.StudioUpdateInput,
}, },
}); });
if (result.data?.studioUpdate?.image_path)
await fetch(result.data?.studioUpdate?.image_path, {
cache: "reload",
});
if (result.data?.studioUpdate) { if (result.data?.studioUpdate) {
updateStudioData(result.data.studioUpdate); updateStudioData(result.data.studioUpdate);
setIsEditing(false); setIsEditing(false);

View File

@@ -141,8 +141,6 @@ export const Tag: React.FC = () => {
}, },
}); });
if (result.data?.tagUpdate) { if (result.data?.tagUpdate) {
if (result.data.tagUpdate.image_path)
await fetch(result.data.tagUpdate.image_path, { cache: "reload" });
updateTagData(result.data.tagUpdate); updateTagData(result.data.tagUpdate);
setIsEditing(false); setIsEditing(false);
} }