diff --git a/api/openapi.yaml b/api/openapi.yaml index 941f8842..eeae5df9 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1150,11 +1150,14 @@ paths: parameters: - $ref: "#/components/parameters/ThreadMarkParam" - $ref: "#/components/parameters/PaginationQuery" + - $ref: "#/components/parameters/If-None-Match" + - $ref: "#/components/parameters/If-Modified-Since" responses: default: { $ref: "#/components/responses/InternalServerError" } "404": { $ref: "#/components/responses/NotFound" } "401": { $ref: "#/components/responses/Unauthorised" } "200": { $ref: "#/components/responses/ThreadGet" } + "304": { description: cached } patch: operationId: ThreadUpdate description: Publish changes to a thread. @@ -1910,6 +1913,21 @@ components: # parameters: + "If-None-Match": + description: If-None-Match cache control header. + name: If-None-Match + in: header + required: false + schema: + type: string + "If-Modified-Since": + description: If-Modified-Since cache control header. + name: If-Modified-Since + in: header + required: false + schema: + type: string + IconSize: description: Icon sizes. example: "512x512" @@ -2789,6 +2807,10 @@ components: ThreadGet: description: The information about a thread and its posts. + headers: + Cache-Control: { $ref: "#/components/headers/Cache-Control" } + Last-Modified: { $ref: "#/components/headers/Last-Modified" } + ETag: { $ref: "#/components/headers/ETag" } content: application/json: schema: { $ref: "#/components/schemas/Thread" } @@ -3024,6 +3046,18 @@ components: # "Y8888P" "Y8888P" 888 888 8888888888 888 888 d88P 888 "Y8888P" # + headers: + Cache-Control: + schema: + type: string + Last-Modified: + schema: + type: string + format: RFC1123 + ETag: + schema: + type: string + schemas: # # .d8888b. diff --git a/app/resources/cachecontrol/query.go b/app/resources/cachecontrol/query.go new file mode 100644 index 00000000..750a9c97 --- /dev/null +++ b/app/resources/cachecontrol/query.go @@ -0,0 +1,61 @@ +package cachecontrol + +import ( + "time" + + "github.com/Southclaws/opt" + + "github.com/Southclaws/storyden/app/transports/http/openapi" +) + +// Query represents a HTTP conditional request query. +type Query struct { + ETag opt.Optional[string] + ModifiedSince opt.Optional[time.Time] +} + +// NewQuery must be constructed from a HTTP request's conditional headers. +func NewQuery( + IfNoneMatch *string, + IfModifiedSince *string, +) opt.Optional[Query] { + if IfNoneMatch == nil && IfModifiedSince == nil { + return opt.NewEmpty[Query]() + } + + modifiedSince, err := opt.MapErr(opt.NewPtr(IfModifiedSince), parseConditionalRequestTime) + if err != nil { + return opt.NewEmpty[Query]() + } + + return opt.New(Query{ + ETag: opt.NewPtr((*string)(IfNoneMatch)), + ModifiedSince: modifiedSince, + }) +} + +// NotModified takes the current updated date of a resource and returns true if +// the cache control query includes a Is-Modified-Since header and the resource +// updated date is not after the header value. True means a 304 response header. +func (q Query) NotModified(resourceUpdated time.Time) bool { + // truncate the resourceUpdated to the nearest second because the actual + // HTTP header is already truncated but the database time is in nanoseconds. + // If we didn't do this, the resource updated will always be slightly ahead. + truncated := resourceUpdated.Truncate(time.Second) + + if ms, ok := q.ModifiedSince.Get(); ok { + + // If the resource update time is ahead of the HTTP Last-Modified check, + // modified = 1, meaning the resource has been modified since the last + // request and should be returned from the DB, instead of a 304 status. + modified := truncated.Compare(ms) + + return modified <= 0 + } + + return false +} + +func parseConditionalRequestTime(in openapi.IfModifiedSince) (time.Time, error) { + return time.Parse(time.RFC1123, in) +} diff --git a/app/resources/post/thread_cache/cache.go b/app/resources/post/thread_cache/cache.go new file mode 100644 index 00000000..1174d5a6 --- /dev/null +++ b/app/resources/post/thread_cache/cache.go @@ -0,0 +1,40 @@ +package thread_cache + +import ( + "context" + + "github.com/Southclaws/fault" + "github.com/Southclaws/fault/fctx" + "github.com/Southclaws/opt" + "github.com/rs/xid" + + "github.com/Southclaws/storyden/app/resources/cachecontrol" + "github.com/Southclaws/storyden/internal/ent" + "github.com/Southclaws/storyden/internal/ent/post" +) + +type Cache struct { + db *ent.Client +} + +func New(db *ent.Client) *Cache { + return &Cache{ + db: db, + } +} + +func (c *Cache) IsNotModified(ctx context.Context, cq opt.Optional[cachecontrol.Query], id xid.ID) (bool, error) { + query, ok := cq.Get() + if !ok { + return false, nil + } + + r, err := c.db.Post.Query().Select(post.FieldUpdatedAt).Where(post.ID(id)).Only(ctx) + if err != nil { + return false, fault.Wrap(err, fctx.With(ctx)) + } + + notModified := query.NotModified(r.UpdatedAt) + + return notModified, nil +} diff --git a/app/resources/resources.go b/app/resources/resources.go index 6022177f..a903efd1 100644 --- a/app/resources/resources.go +++ b/app/resources/resources.go @@ -40,6 +40,7 @@ import ( "github.com/Southclaws/storyden/app/resources/post/reaction" "github.com/Southclaws/storyden/app/resources/post/reply" "github.com/Southclaws/storyden/app/resources/post/thread" + "github.com/Southclaws/storyden/app/resources/post/thread_cache" "github.com/Southclaws/storyden/app/resources/profile/follow_querier" "github.com/Southclaws/storyden/app/resources/profile/follow_writer" "github.com/Southclaws/storyden/app/resources/profile/profile_search" @@ -72,6 +73,7 @@ func Build() fx.Option { tag_querier.New, tag_writer.New, thread.New, + thread_cache.New, reaction.New, like_querier.New, like_writer.New, diff --git a/app/transports/http/bindings/threads.go b/app/transports/http/bindings/threads.go index 0b44209a..c88c4837 100644 --- a/app/transports/http/bindings/threads.go +++ b/app/transports/http/bindings/threads.go @@ -4,6 +4,7 @@ import ( "context" "net/url" "strconv" + "time" "github.com/Southclaws/dt" "github.com/Southclaws/fault" @@ -13,10 +14,12 @@ import ( "github.com/rs/xid" "github.com/Southclaws/storyden/app/resources/account/account_querier" + "github.com/Southclaws/storyden/app/resources/cachecontrol" "github.com/Southclaws/storyden/app/resources/datagraph" "github.com/Southclaws/storyden/app/resources/tag/tag_ref" "github.com/Southclaws/storyden/app/resources/post/category" + "github.com/Southclaws/storyden/app/resources/post/thread_cache" "github.com/Southclaws/storyden/app/resources/visibility" "github.com/Southclaws/storyden/app/services/authentication/session" thread_service "github.com/Southclaws/storyden/app/services/thread" @@ -25,17 +28,19 @@ import ( ) type Threads struct { + thread_cache *thread_cache.Cache thread_svc thread_service.Service thread_mark_svc thread_mark.Service accountQuery *account_querier.Querier } func NewThreads( + thread_cache *thread_cache.Cache, thread_svc thread_service.Service, thread_mark_svc thread_mark.Service, accountQuery *account_querier.Querier, ) Threads { - return Threads{thread_svc, thread_mark_svc, accountQuery} + return Threads{thread_cache, thread_svc, thread_mark_svc, accountQuery} } func (i *Threads) ThreadCreate(ctx context.Context, request openapi.ThreadCreateRequestObject) (openapi.ThreadCreateResponseObject, error) { @@ -211,6 +216,15 @@ func (i *Threads) ThreadGet(ctx context.Context, request openapi.ThreadGetReques return nil, fault.Wrap(err, fctx.With(ctx)) } + notModified, err := i.thread_cache.IsNotModified(ctx, cachecontrol.NewQuery(request.Params.IfNoneMatch, request.Params.IfModifiedSince), xid.ID(postID)) + if err != nil { + return nil, fault.Wrap(err, fctx.With(ctx)) + } + + if notModified { + return openapi.ThreadGet304Response{}, nil + } + pp := deserialisePageParams(request.Params.Page, 50) thread, err := i.thread_svc.Get(ctx, postID, pp) @@ -219,7 +233,13 @@ func (i *Threads) ThreadGet(ctx context.Context, request openapi.ThreadGetReques } return openapi.ThreadGet200JSONResponse{ - ThreadGetJSONResponse: openapi.ThreadGetJSONResponse(serialiseThread(thread)), + ThreadGetJSONResponse: openapi.ThreadGetJSONResponse{ + Body: serialiseThread(thread), + Headers: openapi.ThreadGetResponseHeaders{ + CacheControl: "max-age=1", + LastModified: thread.UpdatedAt.Format(time.RFC1123), + }, + }, }, nil } diff --git a/app/transports/http/openapi/server_gen.go b/app/transports/http/openapi/server_gen.go index 4cb8bb33..88e0fd4e 100644 --- a/app/transports/http/openapi/server_gen.go +++ b/app/transports/http/openapi/server_gen.go @@ -3073,6 +3073,12 @@ type FillSourceQuery = FillSource // IconSize defines model for IconSize. type IconSize string +// IfModifiedSince defines model for If-Modified-Since. +type IfModifiedSince = string + +// IfNoneMatch defines model for If-None-Match. +type IfNoneMatch = string + // InvitationIDParam A unique identifier for this resource. type InvitationIDParam = Identifier @@ -3799,6 +3805,12 @@ type ThreadListParams struct { type ThreadGetParams struct { // Page Pagination query parameters. Page *PaginationQuery `form:"page,omitempty" json:"page,omitempty"` + + // IfNoneMatch If-None-Match cache control header. + IfNoneMatch *IfNoneMatch `json:"If-None-Match,omitempty"` + + // IfModifiedSince If-Modified-Since cache control header. + IfModifiedSince *IfModifiedSince `json:"If-Modified-Since,omitempty"` } // AccountUpdateJSONRequestBody defines body for AccountUpdate for application/json ContentType. @@ -11447,6 +11459,32 @@ func NewThreadGetRequest(server string, threadMark ThreadMarkParam, params *Thre return nil, err } + if params != nil { + + if params.IfNoneMatch != nil { + var headerParam0 string + + headerParam0, err = runtime.StyleParamWithLocation("simple", false, "If-None-Match", runtime.ParamLocationHeader, *params.IfNoneMatch) + if err != nil { + return nil, err + } + + req.Header.Set("If-None-Match", headerParam0) + } + + if params.IfModifiedSince != nil { + var headerParam1 string + + headerParam1, err = runtime.StyleParamWithLocation("simple", false, "If-Modified-Since", runtime.ParamLocationHeader, *params.IfModifiedSince) + if err != nil { + return nil, err + } + + req.Header.Set("If-Modified-Since", headerParam1) + } + + } + return req, nil } @@ -21865,6 +21903,38 @@ func (w *ServerInterfaceWrapper) ThreadGet(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter page: %s", err)) } + headers := ctx.Request().Header + // ------------- Optional header parameter "If-None-Match" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("If-None-Match")]; found { + var IfNoneMatch IfNoneMatch + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for If-None-Match, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "If-None-Match", valueList[0], &IfNoneMatch, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter If-None-Match: %s", err)) + } + + params.IfNoneMatch = &IfNoneMatch + } + // ------------- Optional header parameter "If-Modified-Since" ------------- + if valueList, found := headers[http.CanonicalHeaderKey("If-Modified-Since")]; found { + var IfModifiedSince IfModifiedSince + n := len(valueList) + if n != 1 { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Expected one value for If-Modified-Since, got %d", n)) + } + + err = runtime.BindStyledParameterWithOptions("simple", "If-Modified-Since", valueList[0], &IfModifiedSince, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationHeader, Explode: false, Required: false}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter If-Modified-Since: %s", err)) + } + + params.IfModifiedSince = &IfModifiedSince + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.ThreadGet(ctx, threadMark, params) return err @@ -22211,7 +22281,16 @@ type TagListOKJSONResponse TagListResult type ThreadCreateOKJSONResponse Thread -type ThreadGetJSONResponse Thread +type ThreadGetResponseHeaders struct { + CacheControl string + ETag string + LastModified string +} +type ThreadGetJSONResponse struct { + Body Thread + + Headers ThreadGetResponseHeaders +} type ThreadListOKJSONResponse ThreadListResult @@ -26717,9 +26796,20 @@ type ThreadGet200JSONResponse struct{ ThreadGetJSONResponse } func (response ThreadGet200JSONResponse) VisitThreadGetResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") + w.Header().Set("Cache-Control", fmt.Sprint(response.Headers.CacheControl)) + w.Header().Set("ETag", fmt.Sprint(response.Headers.ETag)) + w.Header().Set("Last-Modified", fmt.Sprint(response.Headers.LastModified)) w.WriteHeader(200) - return json.NewEncoder(w).Encode(response) + return json.NewEncoder(w).Encode(response.Body) +} + +type ThreadGet304Response struct { +} + +func (response ThreadGet304Response) VisitThreadGetResponse(w http.ResponseWriter) error { + w.WriteHeader(304) + return nil } type ThreadGet401Response = UnauthorisedResponse @@ -30226,383 +30316,385 @@ func (sh *strictHandler) GetVersion(ctx echo.Context) error { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "OY00AgA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/web/src/api/client.ts b/web/src/api/client.ts index ad9810e4..cc0d6fd5 100644 --- a/web/src/api/client.ts +++ b/web/src/api/client.ts @@ -5,7 +5,18 @@ import { deriveError } from "@/utils/error"; import { Options, buildRequest, buildResult } from "./common"; export const fetcher = async (opts: Options): Promise => { - const response = await fetch(buildRequest(opts)); + const request = buildRequest({ + ...opts, + // We use the browser default cache behaviour for the client side requests. + // There's no revalidation set on the client as we're already using SWR for + // that. The default cache behaviour will however make use of browser HTTP + // Conditional Requests and ETag headers which some endpoints in Storyden + // provide. This results in a mostly fast experience but it's slowed down a + // bit by the server side behaviour (see server.ts comment for more info.) + cache: "default", + }); + + const response = await fetch(request); return buildResult(response); }; diff --git a/web/src/api/common.ts b/web/src/api/common.ts index 49604679..7c873225 100644 --- a/web/src/api/common.ts +++ b/web/src/api/common.ts @@ -11,6 +11,7 @@ export type Options = { responseType?: string; cookie?: string; revalidate?: number; + cache?: RequestCache; }; export class RequestError extends Error { @@ -29,6 +30,7 @@ export function buildRequest({ params, data, revalidate, + cache, }: Options): Request { const apiAddress = getAPIAddress(); const address = `${apiAddress}/api${url}${cleanQuery(params)}`; @@ -42,7 +44,7 @@ export function buildRequest({ credentials: "include", headers, body: buildPayload(data), - cache: "default", + cache, next: { tags, revalidate, diff --git a/web/src/api/openapi-client/threads.ts b/web/src/api/openapi-client/threads.ts index d9fcfb53..0a765307 100644 --- a/web/src/api/openapi-client/threads.ts +++ b/web/src/api/openapi-client/threads.ts @@ -158,6 +158,7 @@ export type ThreadGetQueryResult = NonNullable< Awaited> >; export type ThreadGetQueryError = + | void | UnauthorisedResponse | NotFoundResponse | InternalServerErrorResponse; @@ -167,6 +168,7 @@ export type ThreadGetQueryError = */ export const useThreadGet = < TError = + | void | UnauthorisedResponse | NotFoundResponse | InternalServerErrorResponse, diff --git a/web/src/api/server.ts b/web/src/api/server.ts index d70fdef6..ab1a5c42 100644 --- a/web/src/api/server.ts +++ b/web/src/api/server.ts @@ -22,7 +22,22 @@ export const fetcher = async (url: string, opts: Options): Promise => { headers, method: opts.method as any, data: opts.body, - revalidate: 5, + // Server side requests are cached a little more aggressively than client + // side hydration requests. The downside of this is a user may see a flash + // of stale data as the server render loads which will be replaced by the + // client side hydration by SWR. However, the second call will most likely + // be a 304 if it has been loaded before by the same user already. So, in a + // best case, we get a single database read, worst case we get two. The + // revalidation period is set to one minute in order to cut down on the + // flashes of stale data. However, in reality this doesn't really gain much + // as a user landing for the first time will still trigger two DB reads, + // and a user returning is quite likely someone who has interacted with a + // piece of content and thus will result in a new read at least once. So, + // it's not the most efficient approach (ignoring server-side data cache) + // but it's the best of a not-so-great situation. This should improve a lot + // if Next.js adds support for HTTP Conditional Requests and ETag headers. + revalidate: 60, + cache: "force-cache", }); req.headers.set("Cookie", await getCookieHeader());