diff --git a/core/admin-dashboard/components/admin/widget/BaseAdminTable.vue b/core/admin-dashboard/components/admin/widget/BaseAdminTable.vue index 012aabcf..29fbd697 100644 --- a/core/admin-dashboard/components/admin/widget/BaseAdminTable.vue +++ b/core/admin-dashboard/components/admin/widget/BaseAdminTable.vue @@ -8,7 +8,7 @@ :page="admin_pagination.current_page" :items-per-page="admin_pagination.per_page" :multi-sort="true" - :server-items-length="admin_pagination.total" + :server-items-length="admin_pagination.total - 1" @update:items-per-page="tableUpdateItemsPerPage" @update:page="tableUpdatePage" > @@ -186,6 +186,7 @@ export default { return { ADMIN_TYPES, LOGIN_FAILED, + is_items_per_page_changed: false, }; }, @@ -261,16 +262,29 @@ export default { }, async tableUpdatePage(data) { - this.UPDATE_ADMIN_PAGINATION({ path: "current_page", data }); - - await this.GET_ADMINS_PAGINATED({ - page: this.admin_pagination.current_page, + const admins = await this.GET_ADMINS_PAGINATED({ + page: data, entries_per_page: this.admin_pagination.per_page, }); + + this.filterAdmins(admins); }, - tableUpdateItemsPerPage(data) { - this.UPDATE_ADMIN_PAGINATION({ path: "per_page", data }); + async tableUpdateItemsPerPage(data) { + const admins = await this.GET_ADMINS_PAGINATED({ + page: 1, + entries_per_page: data, + }); + + this.filterAdmins(admins); + }, + + filterAdmins(admins) { + const filtered_admins = admins.filter( + (admin) => admin._id !== this.me._id + ); + + this.SET_ADMINS({ data: filtered_admins }); }, }, @@ -281,11 +295,7 @@ export default { entries_per_page: this.admin_pagination.per_page, }); - const filtered_admins = admins.filter( - (admin) => admin._id !== this.me._id - ); - - this.SET_ADMINS({ data: filtered_admins }); + this.filterAdmins(admins); } catch (error) { console.error(error); } diff --git a/core/admin-dashboard/store/admin/actions.ts b/core/admin-dashboard/store/admin/actions.ts index 96f2c68b..73e7bc59 100644 --- a/core/admin-dashboard/store/admin/actions.ts +++ b/core/admin-dashboard/store/admin/actions.ts @@ -29,7 +29,6 @@ const actions: ActionTree = { async [ActionTypes.GET_ADMINS]({ commit }, params = {}) { const keep_in_store = get(params, "keep_in_store", true); - const new_state = get(params, "new_state", true); const { data: admins } = await this.$axios.$get("/admin"); @@ -37,7 +36,7 @@ const actions: ActionTree = { return admins; } - commit(MutationTypes.SET_ADMINS, { data: admins, new_state }); + commit(MutationTypes.SET_ADMINS, { data: admins }); return admins; }, @@ -143,7 +142,6 @@ const actions: ActionTree = { const query = get(params, "query"); const page = get(params, "page", 1); const entries_per_page = get(params, "entries_per_page", 15); - const new_state = get(params, "new_state", true); const query_url = new URLSearchParams(); @@ -155,7 +153,7 @@ const actions: ActionTree = { `/admin/all-paginated?${query_url}` ); - commit(MutationTypes.SET_ADMINS, { data: admins, new_state }); + commit(MutationTypes.SET_ADMINS, { data: admins }); commit(MutationTypes.SET_ADMIN_PAGINATION, { data: pagination }); return admins; diff --git a/core/admin-dashboard/store/admin/index.ts b/core/admin-dashboard/store/admin/index.ts index a32ce8d3..d21136cc 100644 --- a/core/admin-dashboard/store/admin/index.ts +++ b/core/admin-dashboard/store/admin/index.ts @@ -9,6 +9,7 @@ export const state = () => ({ per_page: 15, total: 0, total_pages: 0, + has_more: true, }, }); diff --git a/core/admin-dashboard/store/admin/mutations.ts b/core/admin-dashboard/store/admin/mutations.ts index 0721a95a..e2aa5fea 100644 --- a/core/admin-dashboard/store/admin/mutations.ts +++ b/core/admin-dashboard/store/admin/mutations.ts @@ -14,7 +14,7 @@ const mutations: MutationTree = { [MutationTypes.SET_ADMINS]( state, - { data, new_state }: { data: any[]; new_state: boolean } + { data, new_state = true }: { data: any[]; new_state?: boolean } ) { if (new_state) { return (state.admins = data); @@ -42,6 +42,7 @@ const mutations: MutationTree = { total_pages: number; from: number; to: number; + has_more: boolean; }; } ) { 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 f7f88ec3..dff1c665 100644 --- a/core/server/src/use-cases/admin/get-admin-analystics.ts +++ b/core/server/src/use-cases/admin/get-admin-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 IAdminDb, { IAdminAnalyticsData, } from "../../data-access/interfaces/admin-db"; -import Redis from "../../config/redis"; -import { Logger } from "winston"; import { AdminType } from "../../database/interfaces/admin"; export interface IGetAdminAnalysticsPayload { @@ -19,10 +20,12 @@ export type GetAdminAnalystics = ({ export default function makeGetAdminAnalystics({ adminDb, + randomCacheTime, redis, logger, }: { adminDb: IAdminDb; + randomCacheTime: RandomCacheTime; redis: Redis; logger: Logger; }): GetAdminAnalystics { @@ -46,10 +49,15 @@ 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, + extra_minutes: 12, + }); + redis.setData({ key: cache_key, value: data, - duration_in_seconds: one_day_in_seconds, + 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 384c2a8b..00871c1a 100644 --- a/core/server/src/use-cases/admin/get-admins-paginated.ts +++ b/core/server/src/use-cases/admin/get-admins-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 IAdminDb, { IPaginatedAdminsResult, } from "../../data-access/interfaces/admin-db"; @@ -16,10 +19,50 @@ export type GetAdminsPaginated = ({ export default function makeGetAdminsPaginated({ adminDb, + randomCacheTime, + redis, + logger, }: { adminDb: IAdminDb; + randomCacheTime: RandomCacheTime; + redis: Redis; + logger: Logger; }): GetAdminsPaginated { return async function getAdminsPaginated({ query, page, entries_per_page }) { - return await adminDb.findAllPaginated({ query, page, entries_per_page }); + const cache_key = redis.cacheKeyBuilder({ + prefix: "getAdminsPaginated", + 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 admins = await adminDb.findAllPaginated({ + query, + page, + entries_per_page, + }); + + const one_hour_in_seconds = 60 * 60; + const duration_in_seconds = randomCacheTime({ + seconds: one_hour_in_seconds, + extra_minutes: 10, + }); + + 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 b1b70fa4..7326cb9e 100644 --- a/core/server/src/use-cases/admin/index.ts +++ b/core/server/src/use-cases/admin/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 { AdminDb } from "../../data-access"; import makeBatchUploadAdmins from "./batch-upload-admins"; @@ -18,6 +19,9 @@ import makeUpdateAdmin from "./update-admin"; const getAdminsPaginated = makeGetAdminsPaginated({ adminDb: AdminDb, + randomCacheTime, + redis, + logger, }); const batchUploadAdmins = makeBatchUploadAdmins({ @@ -42,6 +46,7 @@ const getOneAdmin = makeGetOneAdmin({ const getAdminAnalystics = makeGetAdminAnalystics({ adminDb: AdminDb, + randomCacheTime, redis, logger, });