Skip to content

Commit

Permalink
(cached-local-api): cache HIT / skip logs, properly handle findOne an…
Browse files Browse the repository at this point in the history
…d execute revalidation many operation once.
  • Loading branch information
r1tsuu committed May 21, 2024
1 parent 48c6173 commit ad06ad6
Show file tree
Hide file tree
Showing 18 changed files with 407 additions and 300 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "payload-enchants",
"version": "1.1.20",
"version": "1.1.21",
"private": true,
"description": "",
"keywords": [],
Expand Down
18 changes: 9 additions & 9 deletions packages/better-localized-fields/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@payload-enchants/better-localized-fields",
"version": "1.1.20",
"version": "1.1.21",
"private": false,
"bugs": "https://github.com/r1tsuu/payload-enchants/issues",
"repository": "https://github.com/r1tsuu/payload-enchants",
Expand Down Expand Up @@ -43,21 +43,21 @@
"prepublishOnly": "pnpm clean && pnpm build"
},
"devDependencies": {
"@payloadcms/next": "3.0.0-beta.34",
"@payloadcms/translations": "3.0.0-beta.34",
"@payloadcms/ui": "3.0.0-beta.34",
"@payloadcms/next": "3.0.0-beta.35",
"@payloadcms/translations": "3.0.0-beta.35",
"@payloadcms/ui": "3.0.0-beta.35",
"@types/react": "18.3.2",
"@types/react-dom": "18.3.0",
"payload": "3.0.0-beta.34",
"payload": "3.0.0-beta.35",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"peerDependencies": {
"@payloadcms/next": "^3.0.0-beta.34",
"@payloadcms/translations": "^3.0.0-beta.34",
"@payloadcms/ui": "^3.0.0-beta.34",
"@payloadcms/next": "^3.0.0-beta.35",
"@payloadcms/translations": "^3.0.0-beta.35",
"@payloadcms/ui": "^3.0.0-beta.35",
"flatley": "^5.2.0",
"payload": "^3.0.0-beta.34"
"payload": "^3.0.0-beta.35"
},
"publishConfig": {
"exports": {
Expand Down
10 changes: 5 additions & 5 deletions packages/better-use-as-title/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@payload-enchants/better-use-as-title",
"version": "1.1.20",
"version": "1.1.21",
"private": false,
"bugs": "https://github.com/r1tsuu/payload-enchants/issues",
"repository": "https://github.com/r1tsuu/payload-enchants",
Expand Down Expand Up @@ -28,16 +28,16 @@
"prepublishOnly": "pnpm clean && pnpm build"
},
"devDependencies": {
"@payloadcms/ui": "3.0.0-beta.34",
"@payloadcms/ui": "3.0.0-beta.35",
"@types/react": "18.2.64",
"payload": "3.0.0-beta.34",
"payload": "3.0.0-beta.35",
"typescript": "^5.4.5",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"peerDependencies": {
"@payloadcms/ui": "^3.0.0-beta.34",
"payload": "^3.0.0-beta.34"
"@payloadcms/ui": "^3.0.0-beta.35",
"payload": "^3.0.0-beta.35"
},
"publishConfig": {
"exports": {
Expand Down
2 changes: 1 addition & 1 deletion packages/bump-payload/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bump-payload",
"version": "1.1.20",
"version": "1.1.21",
"private": false,
"bugs": "https://github.com/r1tsuu/payload-enchants/issues",
"repository": "https://github.com/r1tsuu/payload-enchants",
Expand Down
6 changes: 3 additions & 3 deletions packages/cached-local-api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@payload-enchants/cached-local-api",
"version": "1.1.20",
"version": "1.1.21",
"private": false,
"bugs": "https://github.com/r1tsuu/payload-enchants/issues",
"repository": "https://github.com/r1tsuu/payload-enchants",
Expand Down Expand Up @@ -28,11 +28,11 @@
"prepublishOnly": "pnpm clean && pnpm build"
},
"devDependencies": {
"payload": "3.0.0-beta.34",
"payload": "3.0.0-beta.35",
"typescript": "^5.4.5"
},
"peerDependencies": {
"payload": "^3.0.0-beta.34"
"payload": "^3.0.0-beta.35"
},
"publishConfig": {
"exports": {
Expand Down
18 changes: 18 additions & 0 deletions packages/cached-local-api/src/operations/count.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,14 @@ export const buildCount = ({
args.req?.transactionID,
];

let cacheHit = true;

const start = Date.now();

const result = await ctx.unstable_cache(
() => {
cacheHit = false;

return payload.count({ ...args, depth: 0 });
},
[JSON.stringify(keys)],
Expand All @@ -45,6 +51,18 @@ export const buildCount = ({
},
)();

if (cacheHit) {
ctx.debugLog({
message: `Cache HIT, operation: count, collection: ${args.collection.toString()}`,
payload,
});
} else {
ctx.debugLog({
message: `Cache skipped, operation: cound, collection: ${args.collection.toString()}, execution time - ${Date.now() - start} MS`,
payload,
});
}

return result;
};
};
18 changes: 18 additions & 0 deletions packages/cached-local-api/src/operations/find.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,14 @@ export const buildFind = ({
args.req?.transactionID,
];

let cacheHit = true;

const start = Date.now();

const result = await ctx.unstable_cache(
() => {
cacheHit = false;

return payload.find({ ...args, depth: 0 });
},
[JSON.stringify(keys)],
Expand All @@ -56,6 +62,18 @@ export const buildFind = ({
},
)();

if (cacheHit) {
ctx.debugLog({
message: `Cache HIT, operation: find, collection: ${args.collection.toString()}`,
payload,
});
} else {
ctx.debugLog({
message: `Cache skipped, operation: find, collection: ${args.collection.toString()}, execution time - ${Date.now() - start} MS`,
payload,
});
}

const depth = args.depth ?? payload.config.defaultDepth;

if (depth > 0)
Expand Down
18 changes: 18 additions & 0 deletions packages/cached-local-api/src/operations/findByID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,14 @@ export const buildFindByID = ({
args.req?.transactionID,
];

let cacheHit = true;

const start = Date.now();

const doc = await ctx.unstable_cache(
() => {
cacheHit = false;

return payload.findByID({ ...args, depth: 0 });
},
[JSON.stringify(keys)],
Expand All @@ -47,6 +53,18 @@ export const buildFindByID = ({
},
)();

if (cacheHit) {
ctx.debugLog({
message: `Cache HIT, operation: findByID, collection: ${args.collection.toString()}, id: ${args.id}`,
payload,
});
} else {
ctx.debugLog({
message: `Cache skipped, operation: findByID, collection: ${args.collection.toString()}, id: ${args.id}, execution time - ${Date.now() - start} MS`,
payload,
});
}

const depth = args.depth ?? payload.config.defaultDepth;

if (depth > payload.config.maxDepth)
Expand Down
18 changes: 18 additions & 0 deletions packages/cached-local-api/src/operations/findGlobal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,14 @@ export const buildFindGlobal = ({
args.req?.transactionID,
];

let cacheHit = true;

const start = Date.now();

const doc = await ctx.unstable_cache(
() => {
cacheHit = false;

return payload.findGlobal({ ...args, depth: 0 });
},
[JSON.stringify(keys)],
Expand All @@ -45,6 +51,18 @@ export const buildFindGlobal = ({
},
)();

if (cacheHit) {
ctx.debugLog({
message: `Cache HIT, operation: findGlobal, global: ${args.slug.toString()}`,
payload,
});
} else {
ctx.debugLog({
message: `Cache skipped, operation: findGlobal, global: ${args.slug.toString()},execution time - ${Date.now() - start} MS`,
payload,
});
}

const depth = args.depth ?? payload.config.defaultDepth;

const global = payload.config.globals.find((each) => each.slug === args.slug)!;
Expand Down
19 changes: 18 additions & 1 deletion packages/cached-local-api/src/operations/findOne.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export const buildFindOne = ({
{ field: 'args.field', message: 'Invalid findOne field' + args.field },
]);

const shouldCache = await ctx.shouldCacheFindOperation(args);
const shouldCache = await ctx.shouldCacheFindOneOperation(args);

const where = field.buildWhere({ args, fieldName: field.name, shouldCache, value: args.value });

Expand Down Expand Up @@ -86,8 +86,13 @@ export const buildFindOne = ({
tag,
];

let cacheHit = true;

const start = Date.now();

const doc = await ctx.unstable_cache(
async () => {
cacheHit = false;
const {
docs: [doc],
} = await payload.find({ ...fullArgs, depth: 0 });
Expand All @@ -102,6 +107,18 @@ export const buildFindOne = ({
},
)();

if (cacheHit) {
ctx.debugLog({
message: `Cache HIT, operation: findOne, collection: ${args.collection.toString()}, field: ${field.name}, field-value: ${args.value}`,
payload,
});
} else {
ctx.debugLog({
message: `Cache skipped, operation: findOne, collection: ${args.collection.toString()}, field: ${field.name}, field-value: ${args.value}, execution time - ${Date.now() - start} MS`,
payload,
});
}

const depth = args.depth ?? payload.config.defaultDepth;

if (depth > 0 && doc)
Expand Down
44 changes: 33 additions & 11 deletions packages/cached-local-api/src/plugin/extendCollectionConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const buildFindOneTags = ({
.flat();
};

const executeHook = async ({
const executeSingleDocHook = async ({
cachedCollectionConfig,
collection,
ctx,
Expand All @@ -62,25 +62,29 @@ const executeHook = async ({
const shouldFunction =
type === 'afterDelete' ? ctx.shouldRevalidateOnDelete : ctx.shouldRevalidateOnChange;

const shouldValidate = await shouldFunction(hookArgs as any);
const shouldRevalidate = await shouldFunction(hookArgs as any);

if (!shouldValidate) return;
if (!shouldRevalidate) return;

const { slug } = collection;

const tags = [
ctx.buildTagFindByID({ id: hookArgs.doc.id, slug: slug as string }),
ctx.buildTagFind({ slug }),
...buildFindOneTags({ cachedCollectionConfig, collection, ctx, hookArgs }),
];

let operation: 'CREATE' | 'DELETE' | 'UPDATE';

if (type === 'afterDelete') operation = 'DELETE';
else if ((hookArgs as Parameters<CollectionAfterChangeHook>[0]).operation === 'create')
operation = 'CREATE';
else operation = 'UPDATE';

if (hookArgs.context.shouldRevalidate && (operation === 'UPDATE' || operation === 'DELETE')) {
hookArgs.context.shouldRevalidate = true;
hookArgs.context.tagFind = ctx.buildTagFind({ slug });
}

const tags = [
ctx.buildTagFindByID({ id: hookArgs.doc.id, slug: slug as string }),
...buildFindOneTags({ cachedCollectionConfig, collection, ctx, hookArgs }),
];

ctx.revalidateTags({
operation,
payload: hookArgs.req.payload,
Expand All @@ -104,7 +108,7 @@ export const extendCollectionConfig = ({
afterChange: [
...(collection.hooks?.afterChange ?? []),
async (hookArgs) => {
await executeHook({
await executeSingleDocHook({
cachedCollectionConfig,
collection,
ctx,
Expand All @@ -116,7 +120,7 @@ export const extendCollectionConfig = ({
afterDelete: [
...(collection.hooks?.afterDelete ?? []),
async (hookArgs) => {
await executeHook({
await executeSingleDocHook({
cachedCollectionConfig,
collection,
ctx,
Expand All @@ -125,6 +129,24 @@ export const extendCollectionConfig = ({
});
},
],
afterOperation: [
(args) => {
if (args.operation !== 'update' && args.operation !== 'delete') return args.result;
const {
req: { context, payload },
} = args;

if (context.shouldRevalidate && typeof context.tagFind === 'string') {
ctx.revalidateTags({
operation: args.operation === 'update' ? 'UPDATE-BULK' : 'DELETE-BULK',
payload,
tags: [context.tagFind],
});
}

return args.result;
},
],
},
};
};
Loading

0 comments on commit ad06ad6

Please sign in to comment.