diff --git a/core/server/src/data-access/controllers/admin/admin/get-admins.spec.ts b/core/server/src/data-access/controllers/admin/admin/get-admins.spec.ts index d48c4347..8b1272dd 100644 --- a/core/server/src/data-access/controllers/admin/admin/get-admins.spec.ts +++ b/core/server/src/data-access/controllers/admin/admin/get-admins.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakeAdmin } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IAdmin from "../../../../database/interfaces/admin"; import makeCreateAdmin from "../../../../use-cases/admin/create-admin"; @@ -34,6 +36,9 @@ describe("getAdmins", () => { const createAdmin = makeCreateAdmin({ adminDb }); const getAdmins = makeGetAdmins({ adminDb, + randomCacheTime, + redis, + logger, }); const mock_admin_data = fakeAdmin(); diff --git a/core/server/src/data-access/controllers/admin/category/get-categories.spec.ts b/core/server/src/data-access/controllers/admin/category/get-categories.spec.ts index efbd0ef5..3310ac7e 100644 --- a/core/server/src/data-access/controllers/admin/category/get-categories.spec.ts +++ b/core/server/src/data-access/controllers/admin/category/get-categories.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakeCategory } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import ICategory from "../../../../database/interfaces/category"; import makeCreateCategory from "../../../../use-cases/category/create-category"; @@ -32,7 +34,12 @@ describe("getCategories", () => { }); const createCategory = makeCreateCategory({ categoryDb }); - const getCategories = makeGetCategories({ categoryDb }); + const getCategories = makeGetCategories({ + categoryDb, + randomCacheTime, + redis, + logger, + }); const mock_category_data = fakeCategory(); diff --git a/core/server/src/data-access/controllers/admin/category/get-category-analystics.spec.ts b/core/server/src/data-access/controllers/admin/category/get-category-analystics.spec.ts index 62169bc9..5533a087 100644 --- a/core/server/src/data-access/controllers/admin/category/get-category-analystics.spec.ts +++ b/core/server/src/data-access/controllers/admin/category/get-category-analystics.spec.ts @@ -7,6 +7,7 @@ import { connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCreateCategory from "../../../../use-cases/category/create-category"; import makeGetCategoryAnalystics from "../../../../use-cases/category/get-category-analystics"; @@ -35,6 +36,7 @@ describe("getCategoryAnalystics", () => { const createCategory = makeCreateCategory({ categoryDb }); const getCategoryAnalystics = makeGetCategoryAnalystics({ categoryDb, + randomCacheTime, logger, redis, }); diff --git a/core/server/src/data-access/controllers/admin/comment/get-comments.spec.ts b/core/server/src/data-access/controllers/admin/comment/get-comments.spec.ts index c20a804d..7614180f 100644 --- a/core/server/src/data-access/controllers/admin/comment/get-comments.spec.ts +++ b/core/server/src/data-access/controllers/admin/comment/get-comments.spec.ts @@ -1,10 +1,12 @@ import { fakeComment } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IComment from "../../../../database/interfaces/comment"; import makeCreateComment from "../../../../use-cases/comment/create-comment"; @@ -30,7 +32,12 @@ describe("getComments", () => { }); const createComment = makeCreateComment({ commentDb }); - const getComments = makeGetComments({ commentDb }); + const getComments = makeGetComments({ + commentDb, + randomCacheTime, + redis, + logger, + }); const mock_comment_data = fakeComment(); diff --git a/core/server/src/data-access/controllers/admin/gallery/get-galleries-by-parent.spec.ts b/core/server/src/data-access/controllers/admin/gallery/get-galleries-by-parent.spec.ts index d23af72c..beeda749 100644 --- a/core/server/src/data-access/controllers/admin/gallery/get-galleries-by-parent.spec.ts +++ b/core/server/src/data-access/controllers/admin/gallery/get-galleries-by-parent.spec.ts @@ -1,10 +1,12 @@ import { fakeGallery } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IGallery from "../../../../database/interfaces/gallery"; import makeCreateGallery from "../../../../use-cases/gallery/create-gallery"; @@ -34,6 +36,9 @@ describe("getGalleriesByParent", () => { const getGallery = makeGetGallery({ galleryDb }); const getGalleriesByParent = makeGetGalleriesByParent({ galleryDb, + randomCacheTime, + redis, + logger, }); const mock_gallery_data = fakeGallery(); diff --git a/core/server/src/data-access/controllers/admin/gallery/get-galleries-paginated.spec.ts b/core/server/src/data-access/controllers/admin/gallery/get-galleries-paginated.spec.ts index fd1e2a9a..fc22027a 100644 --- a/core/server/src/data-access/controllers/admin/gallery/get-galleries-paginated.spec.ts +++ b/core/server/src/data-access/controllers/admin/gallery/get-galleries-paginated.spec.ts @@ -3,11 +3,13 @@ import { fakeQueryParams, } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IGallery from "../../../../database/interfaces/gallery"; import makeCreateGallery from "../../../../use-cases/gallery/create-gallery"; @@ -35,6 +37,9 @@ describe("getGalleriesPaginated", () => { const createGallery = makeCreateGallery({ galleryDb }); const getGalleriesPaginated = makeGetGalleriesPaginated({ galleryDb, + randomCacheTime, + redis, + logger, }); const mock_gallery_data = fakeGallery(); diff --git a/core/server/src/data-access/controllers/admin/post/create-post.spec.ts b/core/server/src/data-access/controllers/admin/post/create-post.spec.ts index cd756bde..a7f98a15 100644 --- a/core/server/src/data-access/controllers/admin/post/create-post.spec.ts +++ b/core/server/src/data-access/controllers/admin/post/create-post.spec.ts @@ -12,6 +12,7 @@ import { renderEmailContent, sendEmail, } from "../../../../config/emailManager"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPost from "../../../../database/interfaces/post"; import makeCreateAdmin from "../../../../use-cases/admin/create-admin"; @@ -56,6 +57,9 @@ describe("createPost", () => { const getPost = makeGetPost({ postDb }); const getActivatingSubscriptions = makeGetActivatingSubscriptions({ subscriptionDb, + randomCacheTime, + redis, + logger, }); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/admin/post/get-most-popular-posts-analystics.spec.ts b/core/server/src/data-access/controllers/admin/post/get-most-popular-posts-analystics.spec.ts index 45212029..9422fdb6 100644 --- a/core/server/src/data-access/controllers/admin/post/get-most-popular-posts-analystics.spec.ts +++ b/core/server/src/data-access/controllers/admin/post/get-most-popular-posts-analystics.spec.ts @@ -7,6 +7,7 @@ import { connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import { IMostPopularPostsAnalytics } from "../../../../data-access/interfaces/post-db"; import makeCreatePost from "../../../../use-cases/post/create-post"; @@ -35,6 +36,7 @@ describe("getMostPopularPostsAnalystics", () => { const createPost = makeCreatePost({ postDb }); const getMostPopularPostsAnalystics = makeGetMostPopularPostsAnalystics({ postDb, + randomCacheTime, logger, redis, }); diff --git a/core/server/src/data-access/controllers/admin/post/get-post-analystics.spec.ts b/core/server/src/data-access/controllers/admin/post/get-post-analystics.spec.ts index c0da224f..f1fd1464 100644 --- a/core/server/src/data-access/controllers/admin/post/get-post-analystics.spec.ts +++ b/core/server/src/data-access/controllers/admin/post/get-post-analystics.spec.ts @@ -7,6 +7,7 @@ import { connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import { IPostAnalytics } from "../../../../data-access/interfaces/post-db"; import makeCreatePost from "../../../../use-cases/post/create-post"; @@ -33,7 +34,12 @@ describe("getPostAnalystics", () => { }); const createPost = makeCreatePost({ postDb }); - const getPostAnalystics = makeGetPostAnalystics({ postDb, logger, redis }); + const getPostAnalystics = makeGetPostAnalystics({ + postDb, + randomCacheTime, + logger, + redis, + }); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/admin/post/get-posts.spec.ts b/core/server/src/data-access/controllers/admin/post/get-posts.spec.ts index 2a484aad..fd8ab289 100644 --- a/core/server/src/data-access/controllers/admin/post/get-posts.spec.ts +++ b/core/server/src/data-access/controllers/admin/post/get-posts.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakePost } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPost from "../../../../database/interfaces/post"; import makeCreatePost from "../../../../use-cases/post/create-post"; @@ -32,7 +34,7 @@ describe("getPosts", () => { }); const createPost = makeCreatePost({ postDb }); - const getPosts = makeGetPosts({ postDb }); + const getPosts = makeGetPosts({ postDb, randomCacheTime, redis, logger }); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/admin/subscription/get-subscription-analystics.spec.ts b/core/server/src/data-access/controllers/admin/subscription/get-subscription-analystics.spec.ts index f96078e0..fd828eb2 100644 --- a/core/server/src/data-access/controllers/admin/subscription/get-subscription-analystics.spec.ts +++ b/core/server/src/data-access/controllers/admin/subscription/get-subscription-analystics.spec.ts @@ -7,6 +7,7 @@ import { connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCreateSubscription from "../../../../use-cases/subscription/create-subscription"; import makeGetSubscriptionAnalystics from "../../../../use-cases/subscription/get-subscription-analystics"; @@ -37,8 +38,9 @@ describe("getSubscriptionAnalystics", () => { }); const getSubscriptionAnalystics = makeGetSubscriptionAnalystics({ subscriptionDb, - logger, + randomCacheTime, redis, + logger, }); const mock_subscription_data = fakeSubscription(); diff --git a/core/server/src/data-access/controllers/admin/subscription/get-subscriptions.spec.ts b/core/server/src/data-access/controllers/admin/subscription/get-subscriptions.spec.ts index 68ab9193..a18df42c 100644 --- a/core/server/src/data-access/controllers/admin/subscription/get-subscriptions.spec.ts +++ b/core/server/src/data-access/controllers/admin/subscription/get-subscriptions.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakeSubscription } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import ISubscription from "../../../../database/interfaces/subscription"; import makeCreateSubscription from "../../../../use-cases/subscription/create-subscription"; @@ -34,7 +36,12 @@ describe("getSubscriptions", () => { const createSubscription = makeCreateSubscription({ subscriptionDb, }); - const getSubscriptions = makeGetSubscriptions({ subscriptionDb }); + const getSubscriptions = makeGetSubscriptions({ + subscriptionDb, + randomCacheTime, + redis, + logger, + }); const mock_subscription_data = fakeSubscription(); diff --git a/core/server/src/data-access/controllers/admin/user/get-user-analystics.spec.ts b/core/server/src/data-access/controllers/admin/user/get-user-analystics.spec.ts index 7e5ba52b..b763178d 100644 --- a/core/server/src/data-access/controllers/admin/user/get-user-analystics.spec.ts +++ b/core/server/src/data-access/controllers/admin/user/get-user-analystics.spec.ts @@ -7,6 +7,7 @@ import { connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCreateUser from "../../../../use-cases/user/create-user"; import makeGetUserAnalystics from "../../../../use-cases/user/get-user-analystics"; @@ -33,7 +34,12 @@ describe("getUserAnalystics", () => { }); const createUser = makeCreateUser({ userDb }); - const getUserAnalystics = makeGetUserAnalystics({ userDb, logger, redis }); + const getUserAnalystics = makeGetUserAnalystics({ + userDb, + randomCacheTime, + logger, + redis, + }); const mock_user_data = fakeUser(); await createUser(mock_user_data); diff --git a/core/server/src/data-access/controllers/admin/user/get-users.spec.ts b/core/server/src/data-access/controllers/admin/user/get-users.spec.ts index a9969336..a4e60fb7 100644 --- a/core/server/src/data-access/controllers/admin/user/get-users.spec.ts +++ b/core/server/src/data-access/controllers/admin/user/get-users.spec.ts @@ -1,10 +1,12 @@ import moment from "moment"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IUser from "../../../../database/interfaces/user"; import makeGetUsers from "../../../../use-cases/user/get-users"; @@ -29,7 +31,7 @@ describe("getUsers", () => { moment, }); - const getUsers = makeGetUsers({ userDb }); + const getUsers = makeGetUsers({ userDb, randomCacheTime, redis, logger }); const getUsersController = makeGetUsersController({ getUsers, diff --git a/core/server/src/data-access/controllers/user/category/get-category-titles.spec.ts b/core/server/src/data-access/controllers/user/category/get-category-titles.spec.ts index 91eebcaa..58c9b21b 100644 --- a/core/server/src/data-access/controllers/user/category/get-category-titles.spec.ts +++ b/core/server/src/data-access/controllers/user/category/get-category-titles.spec.ts @@ -1,10 +1,12 @@ import moment from "moment"; import { fakeCategory } from "../../../../../__tests__/__mock__"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCreateCategory from "../../../../use-cases/category/create-category"; import makeGetCategoryTitles from "../../../../use-cases/category/get-category-titles"; @@ -29,7 +31,13 @@ describe("getCategoryTitles", () => { moment, }); - const getCategoryTitles = makeGetCategoryTitles({ categoryDb }); + const getCategoryTitles = makeGetCategoryTitles({ + categoryDb, + randomCacheTime, + redis, + logger, + }); + const createCategory = makeCreateCategory({ categoryDb }); const mock_category_data = fakeCategory(); diff --git a/core/server/src/data-access/controllers/user/category/get-outstanding-categories-paginated.spec.ts b/core/server/src/data-access/controllers/user/category/get-outstanding-categories-paginated.spec.ts index 6910e019..2343e3c2 100644 --- a/core/server/src/data-access/controllers/user/category/get-outstanding-categories-paginated.spec.ts +++ b/core/server/src/data-access/controllers/user/category/get-outstanding-categories-paginated.spec.ts @@ -4,11 +4,13 @@ import { fakePost, fakeQueryParams, } from "../../../../../__tests__/__mock__"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCreateCategory from "../../../../use-cases/category/create-category"; import makeGetCategoriesPaginated from "../../../../use-cases/category/get-categories-paginated"; @@ -42,8 +44,18 @@ describe("getOutstandingCategoriesPaginated", () => { const createCategory = makeCreateCategory({ categoryDb }); const createPost = makeCreatePost({ postDb }); - const countPostByCategory = makeCountPostByCategory({ postDb }); - const getCategoriesPaginated = makeGetCategoriesPaginated({ categoryDb }); + const countPostByCategory = makeCountPostByCategory({ + postDb, + randomCacheTime, + redis, + logger, + }); + const getCategoriesPaginated = makeGetCategoriesPaginated({ + categoryDb, + randomCacheTime, + redis, + logger, + }); const mock_category_data = fakeCategory(); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/user/comment/count-comments-by-post.spec.ts b/core/server/src/data-access/controllers/user/comment/count-comments-by-post.spec.ts index 40d0c1e6..d4ca9a63 100644 --- a/core/server/src/data-access/controllers/user/comment/count-comments-by-post.spec.ts +++ b/core/server/src/data-access/controllers/user/comment/count-comments-by-post.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakePost } from "../../../../../__tests__/__mock__"; import { ExpectSingleResult } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import makeCountCommentsByPost from "../../../../use-cases/comment/count-comments-by-post"; import makeCreatePost from "../../../../use-cases/post/create-post"; @@ -37,7 +39,12 @@ describe("countCommentsByPost", () => { const getPost = makeGetPost({ postDb }); const createPost = makeCreatePost({ postDb }); - const countCommentsByPost = makeCountCommentsByPost({ commentDb }); + const countCommentsByPost = makeCountCommentsByPost({ + commentDb, + randomCacheTime, + redis, + logger, + }); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/user/comment/get-comments-by-parent.spec.ts b/core/server/src/data-access/controllers/user/comment/get-comments-by-parent.spec.ts index 5bf51eb8..5775714f 100644 --- a/core/server/src/data-access/controllers/user/comment/get-comments-by-parent.spec.ts +++ b/core/server/src/data-access/controllers/user/comment/get-comments-by-parent.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakeComment, fakeUser } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IComment from "../../../../database/interfaces/comment"; import makeCountCommentLikeByCommentAndType from "../../../../use-cases/comment-like/count-comment-like-by-comment-and-type"; @@ -48,6 +50,9 @@ describe("getCommentsByParent", () => { const getComment = makeGetComment({ commentDb }); const getCommentsByParent = makeGetCommentsByParent({ commentDb, + randomCacheTime, + redis, + logger, }); const countCommentLikeByCommentAndType = makeCountCommentLikeByCommentAndType({ commentLikeDb }); diff --git a/core/server/src/data-access/controllers/user/comment/get-comments-by-post-paginated.spec.ts b/core/server/src/data-access/controllers/user/comment/get-comments-by-post-paginated.spec.ts index 3440a818..30883a3d 100644 --- a/core/server/src/data-access/controllers/user/comment/get-comments-by-post-paginated.spec.ts +++ b/core/server/src/data-access/controllers/user/comment/get-comments-by-post-paginated.spec.ts @@ -6,11 +6,13 @@ import { fakeUser, } from "../../../../../__tests__/__mock__"; import { ExpectPaginatedResult } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IComment from "../../../../database/interfaces/comment"; import makeCountCommentLikeByCommentAndType from "../../../../use-cases/comment-like/count-comment-like-by-comment-and-type"; @@ -70,6 +72,9 @@ describe("getCommentsByPostPaginated", () => { const createComment = makeCreateComment({ commentDb }); const getCommentsByPostPaginated = makeGetCommentsByPostPaginated({ commentDb, + randomCacheTime, + redis, + logger, }); const mock_comment_data = fakeComment(); diff --git a/core/server/src/data-access/controllers/user/post-bookmark/get-post-bookmarks-paginated.spec.ts b/core/server/src/data-access/controllers/user/post-bookmark/get-post-bookmarks-paginated.spec.ts index b7f94e22..55c04266 100644 --- a/core/server/src/data-access/controllers/user/post-bookmark/get-post-bookmarks-paginated.spec.ts +++ b/core/server/src/data-access/controllers/user/post-bookmark/get-post-bookmarks-paginated.spec.ts @@ -5,12 +5,14 @@ import { fakeUser, } from "../../../../../__tests__/__mock__"; import { ExpectPaginatedResult } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; import { readingTimeAnalyzer } from "../../../../../__tests__/reading-time"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPostBookmark from "../../../../database/interfaces/post-bookmark"; import makeCountCommentsByPost from "../../../../use-cases/comment/count-comments-by-post"; @@ -51,9 +53,15 @@ describe("getPostBookmarksPaginated", () => { }); const getPostBookmarksPaginated = makeGetPostBookmarksPaginated({ postBookmarkDb, + randomCacheTime, + redis, + logger, }); const countCommentsByPost = makeCountCommentsByPost({ commentDb, + randomCacheTime, + redis, + logger, }); const createUser = makeCreateUser({ userDb, diff --git a/core/server/src/data-access/controllers/user/post/get-posts-paginated.spec.ts b/core/server/src/data-access/controllers/user/post/get-posts-paginated.spec.ts index 1feef1c5..a92b3d55 100644 --- a/core/server/src/data-access/controllers/user/post/get-posts-paginated.spec.ts +++ b/core/server/src/data-access/controllers/user/post/get-posts-paginated.spec.ts @@ -5,12 +5,14 @@ import { fakeUser, } from "../../../../../__tests__/__mock__"; import { ExpectPaginatedPartialResult } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; import { readingTimeAnalyzer } from "../../../../../__tests__/reading-time"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPost from "../../../../database/interfaces/post"; import makeCountCommentsByPost from "../../../../use-cases/comment/count-comments-by-post"; @@ -58,8 +60,18 @@ describe("getPostsPaginated", () => { }); const createPost = makeCreatePost({ postDb }); - const getPostsPaginated = makeGetPostsPaginated({ postDb }); - const countCommentsByPost = makeCountCommentsByPost({ commentDb }); + const getPostsPaginated = makeGetPostsPaginated({ + postDb, + randomCacheTime, + redis, + logger, + }); + const countCommentsByPost = makeCountCommentsByPost({ + commentDb, + randomCacheTime, + redis, + logger, + }); const createUser = makeCreateUser({ userDb }); const getPostBookmarkByUserAndPost = makeGetPostBookmarkByUserAndPost({ postBookmarkDb, diff --git a/core/server/src/data-access/controllers/user/post/get-posts.spec.ts b/core/server/src/data-access/controllers/user/post/get-posts.spec.ts index 1d814e24..f01c6ebe 100644 --- a/core/server/src/data-access/controllers/user/post/get-posts.spec.ts +++ b/core/server/src/data-access/controllers/user/post/get-posts.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakePost } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPost from "../../../../database/interfaces/post"; import makeCountCommentsByPost from "../../../../use-cases/comment/count-comments-by-post"; @@ -37,8 +39,13 @@ describe("getPosts", () => { }); const createPost = makeCreatePost({ postDb }); - const getPosts = makeGetPosts({ postDb }); - const countCommentsByPost = makeCountCommentsByPost({ commentDb }); + const getPosts = makeGetPosts({ postDb, randomCacheTime, redis, logger }); + const countCommentsByPost = makeCountCommentsByPost({ + commentDb, + randomCacheTime, + redis, + logger, + }); const mock_post_data = fakePost(); diff --git a/core/server/src/data-access/controllers/user/post/get-suggestion-posts.spec.ts b/core/server/src/data-access/controllers/user/post/get-suggestion-posts.spec.ts index 0c1f42c8..dd1eaeab 100644 --- a/core/server/src/data-access/controllers/user/post/get-suggestion-posts.spec.ts +++ b/core/server/src/data-access/controllers/user/post/get-suggestion-posts.spec.ts @@ -1,11 +1,13 @@ import moment from "moment"; import { fakeCategory, fakePost } from "../../../../../__tests__/__mock__"; import { ExpectMultipleResults } from "../../../../../__tests__/__types__/expect-types"; +import { logger } from "../../../../../__tests__/jest-logger"; import { clearDatabase, connectDatabase, } from "../../../../../__tests__/jest-mongo"; import { redis } from "../../../../../__tests__/jest-redis"; +import { randomCacheTime } from "../../../../config/random-cache-time"; import { HttpStatusCode } from "../../../../constants/http-status-code"; import IPost from "../../../../database/interfaces/post"; import makeCreateCategory from "../../../../use-cases/category/create-category"; @@ -39,7 +41,12 @@ describe("getSuggestionPosts", () => { const createPost = makeCreatePost({ postDb }); const createCategory = makeCreateCategory({ categoryDb }); - const getSuggestionPosts = makeGetSuggestionPosts({ postDb }); + const getSuggestionPosts = makeGetSuggestionPosts({ + postDb, + randomCacheTime, + redis, + logger, + }); const mock_post_data = fakePost(); const mock_category_data = fakeCategory(); diff --git a/core/server/src/use-cases/admin/get-admin-analystics.ts b/core/server/src/use-cases/admin/get-admin-analystics.ts index dff1c665..5695e343 100644 --- a/core/server/src/use-cases/admin/get-admin-analystics.ts +++ b/core/server/src/use-cases/admin/get-admin-analystics.ts @@ -37,9 +37,9 @@ export default function makeGetAdminAnalystics({ range, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -48,17 +48,12 @@ export default function makeGetAdminAnalystics({ const data = await adminDb.getAdminAnalystics({ range, unit, author_type }); - const one_day_in_seconds = 24 * 60 * 60; const duration_in_seconds = randomCacheTime({ - seconds: one_day_in_seconds, + seconds: 24 * 60 * 60, extra_minutes: 12, }); - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds, - }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); return data; }; diff --git a/core/server/src/use-cases/admin/get-admins-paginated.ts b/core/server/src/use-cases/admin/get-admins-paginated.ts index 00871c1a..e2c3b5f2 100644 --- a/core/server/src/use-cases/admin/get-admins-paginated.ts +++ b/core/server/src/use-cases/admin/get-admins-paginated.ts @@ -36,9 +36,9 @@ export default function makeGetAdminsPaginated({ entries_per_page, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -51,17 +51,12 @@ export default function makeGetAdminsPaginated({ entries_per_page, }); - const one_hour_in_seconds = 60 * 60; const duration_in_seconds = randomCacheTime({ - seconds: one_hour_in_seconds, + seconds: 60 * 60, extra_minutes: 10, }); - redis.setData({ - key: cache_key, - value: admins, - duration_in_seconds, - }); + redis.setData({ key: cache_key, value: admins, duration_in_seconds }); return admins; }; diff --git a/core/server/src/use-cases/admin/get-admins.ts b/core/server/src/use-cases/admin/get-admins.ts index fa9dc794..cd98cf48 100644 --- a/core/server/src/use-cases/admin/get-admins.ts +++ b/core/server/src/use-cases/admin/get-admins.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IAdminDb from "../../data-access/interfaces/admin-db"; import IAdmin from "../../database/interfaces/admin"; @@ -5,10 +8,34 @@ export type GetAdmins = () => Promise; export default function makeGetAdmins({ adminDb, + randomCacheTime, + redis, + logger, }: { adminDb: IAdminDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetAdmins { return async function getAdmins() { - return await adminDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getAdmins" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const admins = await adminDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 12, + }); + + redis.setData({ key: cache_key, value: admins, duration_in_seconds }); + + return admins; }; } diff --git a/core/server/src/use-cases/admin/index.ts b/core/server/src/use-cases/admin/index.ts index 7326cb9e..1d1b693b 100644 --- a/core/server/src/use-cases/admin/index.ts +++ b/core/server/src/use-cases/admin/index.ts @@ -61,6 +61,9 @@ const createAdmin = makeCreateAdmin({ const getAdmins = makeGetAdmins({ adminDb: AdminDb, + randomCacheTime, + redis, + logger, }); const getAdmin = makeGetAdmin({ diff --git a/core/server/src/use-cases/category/get-categories-for-seo.ts b/core/server/src/use-cases/category/get-categories-for-seo.ts index 5e15376c..eaa6e5af 100644 --- a/core/server/src/use-cases/category/get-categories-for-seo.ts +++ b/core/server/src/use-cases/category/get-categories-for-seo.ts @@ -1,14 +1,41 @@ -import ICategory from "../../database/interfaces/category"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICategoryDb from "../../data-access/interfaces/category-db"; +import ICategory from "../../database/interfaces/category"; export type GetCategoriesForSEO = () => Promise; export default function makeGetCategoriesForSEO({ categoryDb, + randomCacheTime, + redis, + logger, }: { categoryDb: ICategoryDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCategoriesForSEO { return async function getCategoriesForSEO() { - return await categoryDb.findAllForSEO(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getCategoriesForSEO" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const categories = await categoryDb.findAllForSEO(); + + const duration_in_seconds = randomCacheTime({ + seconds: 15 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: categories, duration_in_seconds }); + + return categories; }; } diff --git a/core/server/src/use-cases/category/get-categories-paginated.ts b/core/server/src/use-cases/category/get-categories-paginated.ts index 53906a1c..5d217d42 100644 --- a/core/server/src/use-cases/category/get-categories-paginated.ts +++ b/core/server/src/use-cases/category/get-categories-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICategoryDb, { IPaginatedCategoriesResult, } from "../../data-access/interfaces/category-db"; @@ -16,18 +19,49 @@ export type GetCategoriesPaginated = ({ export default function makeGetCategoriesPaginated({ categoryDb, + randomCacheTime, + redis, + logger, }: { categoryDb: ICategoryDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCategoriesPaginated { return async function getCategoriesPaginated({ query, page, entries_per_page, }) { - return await categoryDb.findAllPaginated({ + const cache_key = redis.cacheKeyBuilder({ + prefix: "getCategoriesPaginated", query, page, entries_per_page, }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await categoryDb.findAllPaginated({ + query, + page, + entries_per_page, + }); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/category/get-categories.ts b/core/server/src/use-cases/category/get-categories.ts index af30d658..44b745ff 100644 --- a/core/server/src/use-cases/category/get-categories.ts +++ b/core/server/src/use-cases/category/get-categories.ts @@ -1,14 +1,41 @@ -import ICategory from "../../database/interfaces/category"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICategoryDb from "../../data-access/interfaces/category-db"; +import ICategory from "../../database/interfaces/category"; export type GetCategories = () => Promise; export default function makeGetCategories({ categoryDb, + randomCacheTime, + redis, + logger, }: { categoryDb: ICategoryDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCategories { return async function getCategories() { - return await categoryDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getCategories" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const categories = await categoryDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: categories, duration_in_seconds }); + + return categories; }; } diff --git a/core/server/src/use-cases/category/get-category-analystics.ts b/core/server/src/use-cases/category/get-category-analystics.ts index c3e0fc08..aac70d2f 100644 --- a/core/server/src/use-cases/category/get-category-analystics.ts +++ b/core/server/src/use-cases/category/get-category-analystics.ts @@ -1,8 +1,9 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICategoryDb, { ICategoryAnalyticsData, } from "../../data-access/interfaces/category-db"; -import Redis from "../../config/redis"; -import { Logger } from "winston"; export interface IGetCategoryAnalysticsPayload { range?: string[]; @@ -18,10 +19,12 @@ export type GetCategoryAnalystics = ({ export default function makeGetCategoryAnalystics({ categoryDb, + randomCacheTime, redis, logger, }: { categoryDb: ICategoryDb; + randomCacheTime: RandomCacheTime; redis: Redis; logger: Logger; }): GetCategoryAnalystics { @@ -32,9 +35,9 @@ export default function makeGetCategoryAnalystics({ range, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -43,13 +46,13 @@ export default function makeGetCategoryAnalystics({ const data = await categoryDb.getCategoryAnalystics({ range, unit, limit }); - const one_day_in_seconds = 24 * 60 * 60; - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds: one_day_in_seconds, + const duration_in_seconds = randomCacheTime({ + seconds: 24 * 60 * 60, + extra_minutes: 10, }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + return data; }; } diff --git a/core/server/src/use-cases/category/get-category-titles.ts b/core/server/src/use-cases/category/get-category-titles.ts index ba9faf34..edf7995d 100644 --- a/core/server/src/use-cases/category/get-category-titles.ts +++ b/core/server/src/use-cases/category/get-category-titles.ts @@ -1,15 +1,48 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICategoryDb from "../../data-access/interfaces/category-db"; -export type GetCategoryTitles = () => Promise< - { _id: string; title: string; slug: string }[] ->; +export interface ICategoryTitles { + _id: string; + title: string; + slug: string; +} + +export type GetCategoryTitles = () => Promise; export default function makeGetCategoryTitles({ categoryDb, + randomCacheTime, + redis, + logger, }: { categoryDb: ICategoryDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCategoryTitles { return async function getCategoryTitles() { - return await categoryDb.findAllCategoryTitles(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getCategoryTitles" }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await categoryDb.findAllCategoryTitles(); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/category/index.ts b/core/server/src/use-cases/category/index.ts index ba783f42..76293f75 100644 --- a/core/server/src/use-cases/category/index.ts +++ b/core/server/src/use-cases/category/index.ts @@ -1,4 +1,5 @@ import { logger } from "../../config/logs/logger"; +import { randomCacheTime } from "../../config/random-cache-time"; import { redis } from "../../config/redis"; import { CategoryDb } from "../../data-access"; import makeCreateCategory from "./create-category"; @@ -25,14 +26,21 @@ const getCategoryBySlug = makeGetCategoryBySlug({ const getCategoriesPaginated = makeGetCategoriesPaginated({ categoryDb: CategoryDb, + randomCacheTime, + redis, + logger, }); const getCategoriesForSEO = makeGetCategoriesForSEO({ categoryDb: CategoryDb, + randomCacheTime, + redis, + logger, }); const getCategoryAnalystics = makeGetCategoryAnalystics({ categoryDb: CategoryDb, + randomCacheTime, logger, redis, }); @@ -43,6 +51,9 @@ const getCategoryByTitle = makeGetCategoryByTitle({ const getCategoryTitles = makeGetCategoryTitles({ categoryDb: CategoryDb, + randomCacheTime, + redis, + logger, }); const hardDeleteCategory = makeHardDeleteCategory({ @@ -67,6 +78,9 @@ const updateCategory = makeUpdateCategory({ const getCategories = makeGetCategories({ categoryDb: CategoryDb, + randomCacheTime, + redis, + logger, }); const categoryServices = Object.freeze({ diff --git a/core/server/src/use-cases/comment/count-comments-by-post.ts b/core/server/src/use-cases/comment/count-comments-by-post.ts index af70a997..3a921f4d 100644 --- a/core/server/src/use-cases/comment/count-comments-by-post.ts +++ b/core/server/src/use-cases/comment/count-comments-by-post.ts @@ -1,3 +1,7 @@ +import { isNumber } from "lodash"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICommentDb from "../../data-access/interfaces/comment-db"; export interface ICountCommentsByPostPayload { @@ -10,10 +14,37 @@ export type CountCommentsByPost = ({ export default function makeCountCommentsByPost({ commentDb, + randomCacheTime, + redis, + logger, }: { commentDb: ICommentDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): CountCommentsByPost { return async function countCommentsByPost({ post_id }) { - return await commentDb.countByPost({ post_id }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "countCommentsByPost", + post_id, + }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (isNumber(cached_data)) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await commentDb.countByPost({ post_id }); + + const duration_in_seconds = randomCacheTime({ + seconds: 5 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/comment/get-comments-by-parent.ts b/core/server/src/use-cases/comment/get-comments-by-parent.ts index 80f45f8e..859a4ab9 100644 --- a/core/server/src/use-cases/comment/get-comments-by-parent.ts +++ b/core/server/src/use-cases/comment/get-comments-by-parent.ts @@ -1,5 +1,8 @@ -import IComment from "../../database/interfaces/comment"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICommentDb from "../../data-access/interfaces/comment-db"; +import IComment from "../../database/interfaces/comment"; export interface IGetCommentsByParentPayload { _id: string; @@ -11,10 +14,37 @@ export type GetCommentsByParent = ({ export default function makeGetCommentsByParent({ commentDb, + randomCacheTime, + redis, + logger, }: { commentDb: ICommentDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCommentsByParent { return async function getCommentsByParent({ _id }) { - return await commentDb.findAllByParent({ _id }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "getCommentsByParent", + _id, + }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const comments = await commentDb.findAllByParent({ _id }); + + const duration_in_seconds = randomCacheTime({ + seconds: 5 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: comments, duration_in_seconds }); + + return comments; }; } diff --git a/core/server/src/use-cases/comment/get-comments-by-post-paginated.ts b/core/server/src/use-cases/comment/get-comments-by-post-paginated.ts index 88f1a314..f5bcbc21 100644 --- a/core/server/src/use-cases/comment/get-comments-by-post-paginated.ts +++ b/core/server/src/use-cases/comment/get-comments-by-post-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICommentDb, { IPaginatedCommentsResult, } from "../../data-access/interfaces/comment-db"; @@ -18,8 +21,14 @@ export type GetCommentsByPostPaginated = ({ export default function makeGetCommentsByPostPaginated({ commentDb, + randomCacheTime, + redis, + logger, }: { commentDb: ICommentDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCommentsByPostPaginated { return async function getCommentsByPostPaginated({ query, @@ -27,13 +36,35 @@ export default function makeGetCommentsByPostPaginated({ entries_per_page, post_id, }) { - return await commentDb.findAllByPostPaginated( + const cache_key = redis.cacheKeyBuilder({ + prefix: "getCommentsByPostPaginated", + query, + page, + entries_per_page, + post_id, + }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await commentDb.findAllByPostPaginated( { post_id }, - { - query, - page, - entries_per_page, - } + { query, page, entries_per_page } ); + + const duration_in_seconds = randomCacheTime({ + seconds: 5 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/comment/get-comments-paginated.ts b/core/server/src/use-cases/comment/get-comments-paginated.ts index 46962ed5..a05b85a0 100644 --- a/core/server/src/use-cases/comment/get-comments-paginated.ts +++ b/core/server/src/use-cases/comment/get-comments-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ICommentDb, { IPaginatedCommentsResult, } from "../../data-access/interfaces/comment-db"; @@ -16,14 +19,49 @@ export type GetCommentsPaginated = ({ export default function makeGetCommentsPaginated({ commentDb, + randomCacheTime, + redis, + logger, }: { commentDb: ICommentDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetCommentsPaginated { return async function getCommentsPaginated({ query, page, entries_per_page, }) { - return await commentDb.findAllPaginated({ query, page, entries_per_page }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "getCommentsPaginated", + query, + page, + entries_per_page, + }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await commentDb.findAllPaginated({ + query, + page, + entries_per_page, + }); + + const duration_in_seconds = randomCacheTime({ + seconds: 5 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/comment/get-comments.ts b/core/server/src/use-cases/comment/get-comments.ts index 30d624f7..e25b4d47 100644 --- a/core/server/src/use-cases/comment/get-comments.ts +++ b/core/server/src/use-cases/comment/get-comments.ts @@ -1,14 +1,41 @@ import IComment from "../../database/interfaces/comment"; import ICommentDb from "../../data-access/interfaces/comment-db"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; +import { Logger } from "winston"; export type GetComments = () => Promise; export default function makeGetComments({ commentDb, + randomCacheTime, + redis, + logger, }: { commentDb: ICommentDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetComments { return async function getComments() { - return await commentDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getComments" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const comments = await commentDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: comments, duration_in_seconds }); + + return comments; }; } diff --git a/core/server/src/use-cases/comment/index.ts b/core/server/src/use-cases/comment/index.ts index 5215832f..762a15d6 100644 --- a/core/server/src/use-cases/comment/index.ts +++ b/core/server/src/use-cases/comment/index.ts @@ -1,3 +1,6 @@ +import { logger } from "../../config/logs/logger"; +import { randomCacheTime } from "../../config/random-cache-time"; +import { redis } from "../../config/redis"; import { CommentDb } from "../../data-access"; import makeCountCommentsByPost from "./count-comments-by-post"; import makeCreateComment from "./create-comment"; @@ -12,6 +15,9 @@ import makeUpdateComment from "./update-comment"; const getCommentsPaginated = makeGetCommentsPaginated({ commentDb: CommentDb, + randomCacheTime, + redis, + logger, }); const replyComment = makeReplyComment({ @@ -20,14 +26,23 @@ const replyComment = makeReplyComment({ const getCommentsByPostPaginated = makeGetCommentsByPostPaginated({ commentDb: CommentDb, + randomCacheTime, + redis, + logger, }); const countCommentsByPost = makeCountCommentsByPost({ commentDb: CommentDb, + randomCacheTime, + redis, + logger, }); const getCommentsByParent = makeGetCommentsByParent({ commentDb: CommentDb, + randomCacheTime, + redis, + logger, }); const createComment = makeCreateComment({ @@ -48,6 +63,9 @@ const updateComment = makeUpdateComment({ const getComments = makeGetComments({ commentDb: CommentDb, + randomCacheTime, + redis, + logger, }); const commentServices = Object.freeze({ diff --git a/core/server/src/use-cases/gallery/get-galleries-by-parent.ts b/core/server/src/use-cases/gallery/get-galleries-by-parent.ts index f11d0ec0..0e7fd32a 100644 --- a/core/server/src/use-cases/gallery/get-galleries-by-parent.ts +++ b/core/server/src/use-cases/gallery/get-galleries-by-parent.ts @@ -1,5 +1,8 @@ -import IGallery from "../../database/interfaces/gallery"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IGalleryDb from "../../data-access/interfaces/gallery-db"; +import IGallery from "../../database/interfaces/gallery"; export interface IGetGalleriesByParentPayload { parent_id: string; @@ -11,10 +14,37 @@ export type GetGalleriesByParent = ({ export default function makeGetGalleriesByParent({ galleryDb, + randomCacheTime, + logger, + redis, }: { galleryDb: IGalleryDb; + randomCacheTime: RandomCacheTime; + logger: Logger; + redis: Redis; }): GetGalleriesByParent { return async function getGalleriesByParent({ parent_id }) { - return await galleryDb.findAllByParent({ parent_id }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "getGalleriesByParent", + parent_id, + }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const galleries = await galleryDb.findAllByParent({ parent_id }); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: galleries, duration_in_seconds }); + + return galleries; }; } diff --git a/core/server/src/use-cases/gallery/get-galleries-paginated.ts b/core/server/src/use-cases/gallery/get-galleries-paginated.ts index f7bd5202..1fb6a4e0 100644 --- a/core/server/src/use-cases/gallery/get-galleries-paginated.ts +++ b/core/server/src/use-cases/gallery/get-galleries-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IGalleryDb, { IPaginatedGalleriesResult, } from "../../data-access/interfaces/gallery-db"; @@ -18,8 +21,14 @@ export type GetGalleriesPaginated = ({ export default function makeGetGalleriesPaginated({ galleryDb, + randomCacheTime, + logger, + redis, }: { galleryDb: IGalleryDb; + randomCacheTime: RandomCacheTime; + logger: Logger; + redis: Redis; }): GetGalleriesPaginated { return async function getGalleriesPaginated({ query, @@ -27,17 +36,35 @@ export default function makeGetGalleriesPaginated({ entries_per_page, is_parent, }) { - const posts = await galleryDb.findAllPaginated( - { - query, - page, - entries_per_page, - }, - { - is_parent, - } + const cache_key = redis.cacheKeyBuilder({ + prefix: "getGalleriesPaginated", + query, + page, + entries_per_page, + is_parent, + }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await galleryDb.findAllPaginated( + { query, page, entries_per_page }, + { is_parent } ); - return posts; + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/gallery/index.ts b/core/server/src/use-cases/gallery/index.ts index 61a9313c..484b8788 100644 --- a/core/server/src/use-cases/gallery/index.ts +++ b/core/server/src/use-cases/gallery/index.ts @@ -1,17 +1,26 @@ +import { logger } from "../../config/logs/logger"; +import { randomCacheTime } from "../../config/random-cache-time"; +import { redis } from "../../config/redis"; import { GalleryDb } from "../../data-access"; -import makeGetGallery from "./get-gallery"; -import makeUpdateGallery from "./update-gallery"; import makeCreateGallery from "./create-gallery"; -import makeHardDeleteGallery from "./hard-delete-gallery"; -import makeGetGalleriesPaginated from "./get-galleries-paginated"; import makeGetGalleriesByParent from "./get-galleries-by-parent"; +import makeGetGalleriesPaginated from "./get-galleries-paginated"; +import makeGetGallery from "./get-gallery"; +import makeHardDeleteGallery from "./hard-delete-gallery"; +import makeUpdateGallery from "./update-gallery"; const getGalleriesByParent = makeGetGalleriesByParent({ galleryDb: GalleryDb, + randomCacheTime, + logger, + redis, }); const getGalleriesPaginated = makeGetGalleriesPaginated({ galleryDb: GalleryDb, + randomCacheTime, + logger, + redis, }); const hardDeleteGallery = makeHardDeleteGallery({ @@ -42,10 +51,10 @@ const galleryServices = Object.freeze({ export default galleryServices; export { - getGallery, - updateGallery, createGallery, - hardDeleteGallery, - getGalleriesPaginated, getGalleriesByParent, + getGalleriesPaginated, + getGallery, + hardDeleteGallery, + updateGallery, }; diff --git a/core/server/src/use-cases/post-bookmark/get-post-bookmarks-paginated.ts b/core/server/src/use-cases/post-bookmark/get-post-bookmarks-paginated.ts index 6f66dbd3..16c9231e 100644 --- a/core/server/src/use-cases/post-bookmark/get-post-bookmarks-paginated.ts +++ b/core/server/src/use-cases/post-bookmark/get-post-bookmarks-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostBookmarkDb, { IPaginatedPostBookmarksResult, } from "../../data-access/interfaces/post-bookmark-db"; @@ -18,8 +21,14 @@ export type GetPostBookmarksPaginated = ({ export default function makeGetPostBookmarksPaginated({ postBookmarkDb, + randomCacheTime, + redis, + logger, }: { postBookmarkDb: IPostBookmarkDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetPostBookmarksPaginated { return async function getPostBookmarksPaginated({ query, @@ -27,11 +36,37 @@ export default function makeGetPostBookmarksPaginated({ entries_per_page, user_id, }) { - return await postBookmarkDb.findAllPaginated({ + const cache_key = redis.cacheKeyBuilder({ + prefix: "getPostBookmarksPaginated", query, page, entries_per_page, user_id, }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await postBookmarkDb.findAllPaginated({ + query, + page, + entries_per_page, + user_id, + }); + + const duration_in_seconds = randomCacheTime({ + seconds: 5 * 60, + extra_minutes: 10, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/post-bookmark/index.ts b/core/server/src/use-cases/post-bookmark/index.ts index 5be1468f..497c9c43 100644 --- a/core/server/src/use-cases/post-bookmark/index.ts +++ b/core/server/src/use-cases/post-bookmark/index.ts @@ -1,11 +1,13 @@ import { logger } from "../../config/logs/logger"; +import { randomCacheTime } from "../../config/random-cache-time"; +import { redis } from "../../config/redis"; import { PostBookmarkDb } from "../../data-access"; +import makeCountPostBookmarks from "./count-post-bookmarks"; import makeCreatePostBookmark from "./create-post-bookmark"; -import makeGetPostBookmarksPaginated from "./get-post-bookmarks-paginated"; -import makeGetPostBookmarkAnalystics from "./hard-delete-post-bookmark"; import makeGetPostBookmark from "./get-post-bookmark"; import makeGetPostBookmarkByUserAndPost from "./get-post-bookmark-by-user-and-post"; -import makeCountPostBookmarks from "./count-post-bookmarks"; +import makeGetPostBookmarksPaginated from "./get-post-bookmarks-paginated"; +import makeGetPostBookmarkAnalystics from "./hard-delete-post-bookmark"; const countPostBookmarks = makeCountPostBookmarks({ postBookmarkDb: PostBookmarkDb, @@ -25,6 +27,9 @@ const getPostBookmark = makeGetPostBookmark({ const getPostBookmarksPaginated = makeGetPostBookmarksPaginated({ postBookmarkDb: PostBookmarkDb, + randomCacheTime, + redis, + logger, }); const hardDeletePostBookmark = makeGetPostBookmarkAnalystics({ @@ -43,10 +48,10 @@ const subscriptionServices = Object.freeze({ export default subscriptionServices; export { + countPostBookmarks, createPostBookmark, - getPostBookmarksPaginated, - hardDeletePostBookmark, getPostBookmark, getPostBookmarkByUserAndPost, - countPostBookmarks, + getPostBookmarksPaginated, + hardDeletePostBookmark, }; diff --git a/core/server/src/use-cases/post/count-post-by-category.ts b/core/server/src/use-cases/post/count-post-by-category.ts index 99c6c6ae..a4eb704f 100644 --- a/core/server/src/use-cases/post/count-post-by-category.ts +++ b/core/server/src/use-cases/post/count-post-by-category.ts @@ -1,3 +1,7 @@ +import { isNumber } from "lodash"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb from "../../data-access/interfaces/post-db"; export interface ICountPostByCategoryPayload { @@ -10,10 +14,37 @@ export type CountPostByCategory = ({ export default function makeCountPostByCategory({ postDb, + randomCacheTime, + logger, + redis, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; + logger: Logger; + redis: Redis; }): CountPostByCategory { return async function countPostByCategory({ category_id }) { - return await postDb.countByCategory({ category_id }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "countPostByCategory", + category_id, + }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (isNumber(cached_data)) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await postDb.countByCategory({ category_id }); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/post/get-most-popular-posts-analystics.ts b/core/server/src/use-cases/post/get-most-popular-posts-analystics.ts index df905053..b2477ce5 100644 --- a/core/server/src/use-cases/post/get-most-popular-posts-analystics.ts +++ b/core/server/src/use-cases/post/get-most-popular-posts-analystics.ts @@ -1,8 +1,9 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb, { IMostPopularPostsAnalytics, } from "../../data-access/interfaces/post-db"; -import { Logger } from "winston"; -import Redis from "../../config/redis"; export interface IGetMostPopularPostsAnalysticsPayload { range?: string[]; @@ -18,10 +19,12 @@ export type GetMostPopularPostsAnalystics = ({ export default function makeGetMostPopularPostsAnalystics({ postDb, + randomCacheTime, logger, redis, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; logger: Logger; redis: Redis; }): GetMostPopularPostsAnalystics { @@ -33,9 +36,9 @@ export default function makeGetMostPopularPostsAnalystics({ limit, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -48,13 +51,13 @@ export default function makeGetMostPopularPostsAnalystics({ limit, }); - const one_day_in_seconds = 24 * 60 * 60; - redis.setData({ - key: cache_key, - value: posts, - duration_in_seconds: one_day_in_seconds, + const duration_in_seconds = randomCacheTime({ + seconds: 30 * 60, + extra_minutes: 10, }); + redis.setData({ key: cache_key, value: posts, duration_in_seconds }); + return posts; }; } diff --git a/core/server/src/use-cases/post/get-post-analystics.ts b/core/server/src/use-cases/post/get-post-analystics.ts index 0d18be60..f79cef45 100644 --- a/core/server/src/use-cases/post/get-post-analystics.ts +++ b/core/server/src/use-cases/post/get-post-analystics.ts @@ -1,6 +1,7 @@ -import IPostDb, { IPostAnalytics } from "../../data-access/interfaces/post-db"; -import Redis from "../../config/redis"; import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; +import IPostDb, { IPostAnalytics } from "../../data-access/interfaces/post-db"; export interface IGetPostAnalysticsPayload { range?: string[]; @@ -15,10 +16,12 @@ export type GetPostAnalystics = ({ export default function makeGetPostAnalystics({ postDb, + randomCacheTime, redis, logger, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; redis: Redis; logger: Logger; }): GetPostAnalystics { @@ -29,7 +32,7 @@ export default function makeGetPostAnalystics({ range, }); - const cached_data = await redis.getData({ key: cache_key }); + const cached_data = await redis.getData({ key: cache_key }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -38,13 +41,13 @@ export default function makeGetPostAnalystics({ const data = await postDb.getPostAnalystics({ range, unit }); - const one_day_in_seconds = 24 * 60 * 60; - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds: one_day_in_seconds, + const duration_in_seconds = randomCacheTime({ + seconds: 24 * 60 * 60, + extra_minutes: 10, }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + return data; }; } diff --git a/core/server/src/use-cases/post/get-posts-for-seo.ts b/core/server/src/use-cases/post/get-posts-for-seo.ts index 3b7434d8..e3661318 100644 --- a/core/server/src/use-cases/post/get-posts-for-seo.ts +++ b/core/server/src/use-cases/post/get-posts-for-seo.ts @@ -1,14 +1,41 @@ -import IPost from "../../database/interfaces/post"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb from "../../data-access/interfaces/post-db"; +import IPost from "../../database/interfaces/post"; export type GetPostsForSEO = () => Promise; export default function makeGetPostsForSEO({ postDb, + randomCacheTime, + redis, + logger, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetPostsForSEO { return async function getPostsForSEO() { - return await postDb.findAllForSEO(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getPostsForSEO" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const posts = await postDb.findAllForSEO(); + + const duration_in_seconds = randomCacheTime({ + seconds: 15 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: posts, duration_in_seconds }); + + return posts; }; } diff --git a/core/server/src/use-cases/post/get-posts-paginated.ts b/core/server/src/use-cases/post/get-posts-paginated.ts index 3b99a030..64db5129 100644 --- a/core/server/src/use-cases/post/get-posts-paginated.ts +++ b/core/server/src/use-cases/post/get-posts-paginated.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb, { IPaginatedPostsResult, } from "../../data-access/interfaces/post-db"; @@ -22,8 +25,14 @@ export type GetPostsPaginated = ({ export default function makeGetPostsPaginated({ postDb, + randomCacheTime, + redis, + logger, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetPostsPaginated { return async function getPostsPaginated({ query, @@ -33,13 +42,37 @@ export default function makeGetPostsPaginated({ tags, sorts, }) { - return await postDb.findAllPaginated( + const cache_key = redis.cacheKeyBuilder({ + prefix: "getPostsPaginated", + categories, + tags, + sorts, + query, + page, + entries_per_page, + }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await postDb.findAllPaginated( { categories, tags, sorts }, - { - query, - page, - entries_per_page, - } + { query, page, entries_per_page } ); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/post/get-posts.ts b/core/server/src/use-cases/post/get-posts.ts index 4df0370d..0753e2c3 100644 --- a/core/server/src/use-cases/post/get-posts.ts +++ b/core/server/src/use-cases/post/get-posts.ts @@ -1,14 +1,41 @@ -import IPost from "../../database/interfaces/post"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb from "../../data-access/interfaces/post-db"; +import IPost from "../../database/interfaces/post"; export type GetPosts = () => Promise; export default function makeGetPosts({ postDb, + randomCacheTime, + redis, + logger, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetPosts { return async function getPosts() { - return await postDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getPosts" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const posts = await postDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 30 * 60, + extra_minutes: 10, + }); + + redis.setData({ key: cache_key, value: posts, duration_in_seconds }); + + return posts; }; } diff --git a/core/server/src/use-cases/post/get-suggestion-posts.ts b/core/server/src/use-cases/post/get-suggestion-posts.ts index 2ae88dce..706cbfd5 100644 --- a/core/server/src/use-cases/post/get-suggestion-posts.ts +++ b/core/server/src/use-cases/post/get-suggestion-posts.ts @@ -1,5 +1,8 @@ -import IPost from "../../database/interfaces/post"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IPostDb from "../../data-access/interfaces/post-db"; +import IPost from "../../database/interfaces/post"; export interface IGetSuggestionPostsPayload { amount: number; @@ -15,18 +18,47 @@ export type GetSuggestionPosts = ({ export default function makeGetSuggestionPosts({ postDb, + randomCacheTime, + redis, + logger, }: { postDb: IPostDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetSuggestionPosts { return async function getSuggestionPosts({ amount, categories, exclude_ids, }) { - return await postDb.findSuggestionPosts({ + const cache_key = redis.cacheKeyBuilder({ + prefix: "getSuggestionPosts", amount, categories, exclude_ids, }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await postDb.findSuggestionPosts({ + amount, + categories, + exclude_ids, + }); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/post/index.ts b/core/server/src/use-cases/post/index.ts index 477aa380..30a51aa5 100644 --- a/core/server/src/use-cases/post/index.ts +++ b/core/server/src/use-cases/post/index.ts @@ -1,4 +1,5 @@ import { logger } from "../../config/logs/logger"; +import { randomCacheTime } from "../../config/random-cache-time"; import { redis } from "../../config/redis"; import { PostDb } from "../../data-access"; import makeCountPostByCategory from "./count-post-by-category"; @@ -31,28 +32,42 @@ const getPostBySlug = makeGetPostBySlug({ const countPostByCategory = makeCountPostByCategory({ postDb: PostDb, + randomCacheTime, + logger, + redis, }); const getPostsForSEO = makeGetPostsForSEO({ postDb: PostDb, + randomCacheTime, + redis, + logger, }); const getMostPopularPostsAnalystics = makeGetMostPopularPostsAnalystics({ postDb: PostDb, + randomCacheTime, logger, redis, }); const getPostsPaginated = makeGetPostsPaginated({ postDb: PostDb, + randomCacheTime, + redis, + logger, }); const getSuggestionPosts = makeGetSuggestionPosts({ postDb: PostDb, + randomCacheTime, + redis, + logger, }); const getPostAnalystics = makeGetPostAnalystics({ postDb: PostDb, + randomCacheTime, redis, logger, }); @@ -79,6 +94,9 @@ const createPost = makeCreatePost({ const getPosts = makeGetPosts({ postDb: PostDb, + randomCacheTime, + redis, + logger, }); const postServices = Object.freeze({ diff --git a/core/server/src/use-cases/subscription/get-activating-subscriptions.ts b/core/server/src/use-cases/subscription/get-activating-subscriptions.ts index ef73571e..e75846ff 100644 --- a/core/server/src/use-cases/subscription/get-activating-subscriptions.ts +++ b/core/server/src/use-cases/subscription/get-activating-subscriptions.ts @@ -1,3 +1,6 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ISubscriptionDb from "../../data-access/interfaces/subscription-db"; import ISubscription from "../../database/interfaces/subscription"; @@ -5,10 +8,38 @@ export type GetActivatingSubscriptions = () => Promise; export default function makeGetActivatingSubscriptions({ subscriptionDb, + randomCacheTime, + redis, + logger, }: { subscriptionDb: ISubscriptionDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetActivatingSubscriptions { return async function getActivatingSubscriptions() { - return await subscriptionDb.findAllActivating(); + const cache_key = redis.cacheKeyBuilder({ + prefix: "getActivatingSubscriptions", + }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await subscriptionDb.findAllActivating(); + + const duration_in_seconds = randomCacheTime({ + seconds: 10 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/subscription/get-subscription-analystics.ts b/core/server/src/use-cases/subscription/get-subscription-analystics.ts index 8a1ac320..6be36a08 100644 --- a/core/server/src/use-cases/subscription/get-subscription-analystics.ts +++ b/core/server/src/use-cases/subscription/get-subscription-analystics.ts @@ -1,8 +1,9 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ISubscriptionDb, { ISubscriptionAnalyticsData, } from "../../data-access/interfaces/subscription-db"; -import Redis from "../../config/redis"; -import { Logger } from "winston"; export interface IGetSubscriptionAnalysticsPayload { range?: string[]; @@ -16,10 +17,12 @@ export type GetSubscriptionAnalystics = ({ export default function makeGetSubscriptionAnalystics({ subscriptionDb, + randomCacheTime, redis, logger, }: { subscriptionDb: ISubscriptionDb; + randomCacheTime: RandomCacheTime; redis: Redis; logger: Logger; }): GetSubscriptionAnalystics { @@ -30,9 +33,9 @@ export default function makeGetSubscriptionAnalystics({ range, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -44,13 +47,13 @@ export default function makeGetSubscriptionAnalystics({ unit, }); - const one_day_in_seconds = 24 * 60 * 60; - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds: one_day_in_seconds, + const duration_in_seconds = randomCacheTime({ + seconds: 24 * 60 * 60, + extra_minutes: 10, }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + return data; }; } diff --git a/core/server/src/use-cases/subscription/get-subscriptions-paginated.ts b/core/server/src/use-cases/subscription/get-subscriptions-paginated.ts index c8fef799..48f7c1b2 100644 --- a/core/server/src/use-cases/subscription/get-subscriptions-paginated.ts +++ b/core/server/src/use-cases/subscription/get-subscriptions-paginated.ts @@ -40,7 +40,9 @@ export default function makeGetSubscriptionsPaginated({ entries_per_page, }); - const cached_data = await redis.getData({ key: cache_key }); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -58,11 +60,7 @@ export default function makeGetSubscriptionsPaginated({ extra_minutes: 5, }); - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds, - }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); return data; }; diff --git a/core/server/src/use-cases/subscription/get-subscriptions.ts b/core/server/src/use-cases/subscription/get-subscriptions.ts index e031b3df..211ad946 100644 --- a/core/server/src/use-cases/subscription/get-subscriptions.ts +++ b/core/server/src/use-cases/subscription/get-subscriptions.ts @@ -1,14 +1,43 @@ -import ISubscription from "../../database/interfaces/subscription"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import ISubscriptionDb from "../../data-access/interfaces/subscription-db"; +import ISubscription from "../../database/interfaces/subscription"; export type GetSubscriptions = () => Promise; export default function makeGetSubscriptions({ subscriptionDb, + randomCacheTime, + redis, + logger, }: { subscriptionDb: ISubscriptionDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetSubscriptions { return async function getSubscriptions() { - return await subscriptionDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getSubscriptions" }); + + const cached_data = await redis.getData({ + key: cache_key, + }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const data = await subscriptionDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 15 * 60, + extra_minutes: 5, + }); + + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + + return data; }; } diff --git a/core/server/src/use-cases/subscription/index.ts b/core/server/src/use-cases/subscription/index.ts index 6bc04e4e..46940ffc 100644 --- a/core/server/src/use-cases/subscription/index.ts +++ b/core/server/src/use-cases/subscription/index.ts @@ -20,12 +20,16 @@ const getSubscriptionsPaginated = makeGetSubscriptionsPaginated({ const getSubscriptionAnalystics = makeGetSubscriptionAnalystics({ subscriptionDb: SubscriptionDb, + randomCacheTime, redis, logger, }); const getActivatingSubscriptions = makeGetActivatingSubscriptions({ subscriptionDb: SubscriptionDb, + randomCacheTime, + redis, + logger, }); const getSubscription = makeGetSubscription({ @@ -46,6 +50,9 @@ const createSubscription = makeCreateSubscription({ const getSubscriptions = makeGetSubscriptions({ subscriptionDb: SubscriptionDb, + randomCacheTime, + redis, + logger, }); const subscriptionServices = Object.freeze({ diff --git a/core/server/src/use-cases/user/get-user-analystics.ts b/core/server/src/use-cases/user/get-user-analystics.ts index a7eb951f..c06e837e 100644 --- a/core/server/src/use-cases/user/get-user-analystics.ts +++ b/core/server/src/use-cases/user/get-user-analystics.ts @@ -1,8 +1,9 @@ +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IUserDb, { IUserAnalyticsData, } from "../../data-access/interfaces/user-db"; -import Redis from "../../config/redis"; -import { Logger } from "winston"; export interface IGetUserAnalysticsPayload { range?: string[]; @@ -16,10 +17,12 @@ export type GetUserAnalystics = ({ export default function makeGetUserAnalystics({ userDb, + randomCacheTime, redis, logger, }: { userDb: IUserDb; + randomCacheTime: RandomCacheTime; redis: Redis; logger: Logger; }): GetUserAnalystics { @@ -30,9 +33,9 @@ export default function makeGetUserAnalystics({ range, }); - const cached_data = ( - await redis.getData({ key: cache_key }) - ); + const cached_data = await redis.getData({ + key: cache_key, + }); if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); @@ -44,13 +47,13 @@ export default function makeGetUserAnalystics({ unit, }); - const one_day_in_seconds = 24 * 60 * 60; - redis.setData({ - key: cache_key, - value: data, - duration_in_seconds: one_day_in_seconds, + const duration_in_seconds = randomCacheTime({ + seconds: 24 * 60 * 60, + extra_minutes: 10, }); + redis.setData({ key: cache_key, value: data, duration_in_seconds }); + return data; }; } diff --git a/core/server/src/use-cases/user/get-users-paginated.ts b/core/server/src/use-cases/user/get-users-paginated.ts index 7c9bc10d..9ef6a35b 100644 --- a/core/server/src/use-cases/user/get-users-paginated.ts +++ b/core/server/src/use-cases/user/get-users-paginated.ts @@ -36,7 +36,10 @@ export default function makeGetUsersPaginated({ entries_per_page, }); - const cached_data = await redis.getData({ key: cache_key }); + const cached_data = await redis.getData({ + key: cache_key, + }); + if (cached_data) { logger.verbose("Redis: Data found in cache", { cache_key }); return cached_data; @@ -48,9 +51,8 @@ export default function makeGetUsersPaginated({ entries_per_page, }); - const one_hour_in_seconds = 60 * 60; const duration_in_seconds = randomCacheTime({ - seconds: one_hour_in_seconds, + seconds: 60 * 60, extra_minutes: 10, }); diff --git a/core/server/src/use-cases/user/get-users.ts b/core/server/src/use-cases/user/get-users.ts index b8be2299..931e7c97 100644 --- a/core/server/src/use-cases/user/get-users.ts +++ b/core/server/src/use-cases/user/get-users.ts @@ -1,14 +1,41 @@ -import IUser from "../../database/interfaces/user"; +import { Logger } from "winston"; +import { RandomCacheTime } from "../../config/random-cache-time/make-random-cache-time"; +import Redis from "../../config/redis"; import IUserDb from "../../data-access/interfaces/user-db"; +import IUser from "../../database/interfaces/user"; export type GetUsers = () => Promise; export default function makeGetUsers({ userDb, + randomCacheTime, + redis, + logger, }: { userDb: IUserDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetUsers { return async function getUsers() { - return await userDb.findAll(); + const cache_key = redis.cacheKeyBuilder({ prefix: "getUsers" }); + + const cached_data = await redis.getData({ key: cache_key }); + + if (cached_data) { + logger.verbose("Redis: Data found in cache", { cache_key }); + return cached_data; + } + + const users = await userDb.findAll(); + + const duration_in_seconds = randomCacheTime({ + seconds: 30 * 60, + extra_minutes: 10, + }); + + redis.setData({ key: cache_key, value: users, duration_in_seconds }); + + return users; }; } diff --git a/core/server/src/use-cases/user/index.ts b/core/server/src/use-cases/user/index.ts index 7b7e15fb..63b8403e 100644 --- a/core/server/src/use-cases/user/index.ts +++ b/core/server/src/use-cases/user/index.ts @@ -60,6 +60,7 @@ const createUser = makeCreateUser({ const getUserAnalystics = makeGetUserAnalystics({ userDb: UserDb, + randomCacheTime, redis, logger, });