import { dateAdd } from "./tsHelpers"; import { appDependencies } from "../domain/AppDependencies"; export interface ICachedSection<T> { key: string; minutes: number; forceGenerate?: boolean; fetch: () => PromiseLike<T>; generate: () => PromiseLike<T>; } async function storeGenerate<T>(key: string, fn: () => PromiseLike<T>) { const data = await fn(); appDependencies.ILocalRepository.store(key, new Date().getTime()); return data; } export class CacheHelper { static async section<T>(cs: ICachedSection<T>) { const now = new Date(); if (cs.forceGenerate) { return await storeGenerate(cs.key, cs.generate); } const data = await cs.fetch(); if (Array.isArray(data) && data["length"] === 0) { return await storeGenerate(cs.key, cs.generate); } const lastGenerated = new Date(Number(appDependencies.ILocalRepository.getSync(cs.key)) || 0); if (lastGenerated < dateAdd(now, -(cs.minutes * 1000))) { storeGenerate(cs.key, cs.generate); // return old data, do not await } return data; } }
import Dexie from "dexie"; import { IDebtorOrder } from "src/app/domain/models/DebtorOrder"; import { IInventoryItem } from "src/app/domain/models/IInventoryItem"; import { ICulture } from "../../domain/models/ICulture"; import { ICountry } from "src/app/domain/models/ICountry"; class DexiePlug extends Dexie { // Declare implicit table properties. // (just to inform Typescript. Instanciated by Dexie in stores() method) inventoryItems: Dexie.Table<IInventoryItem, string>; // number = type of the primkey debtorOrderHistory: Dexie.Table<IDebtorOrder, number>; languages: Dexie.Table<ICulture, string>; countries: Dexie.Table<ICountry, string>; // ...other tables goes here... constructor () { super("AppDatabase"); this.version(1).stores({ inventoryItems: "id, brand", debtorOrderHistory: "orderNumber, deliveryDate", languages: "cultureCode", countries: "name" }); this.version(2).stores({ debtorOrderHistory: "orderNumber, deliveryDate, createdAt" }); // The following line is needed if your typescript // is compiled using babel instead of tsc: this.inventoryItems = this.table("inventoryItems"); this.debtorOrderHistory = this.table("debtorOrderHistory"); this.languages = this.table("languages"); this.countries = this.table("countries"); } } // tslint:disable-next-line: naming-convention export const dexiePlug = new DexiePlug();
import { CacheHelper } from "src/app/helpers/CacheHelper"; import { appDomain } from "../../domain/AppDomain"; import { IInventoryItem } from "../../domain/models/IInventoryItem"; import { IInventoryRepository } from "../../domain/ports/secondary/IInventoryRepository"; import { dexiePlug } from "../DexieAdapter/DexiePlug"; import { restApiHelper } from "../helpers/RestApiHelper"; const getDefaultCurrency = (itemCurrencyCode) => itemCurrencyCode === "-" ? appDomain.IGetCurrentSession.getSession().getCompanyCurrencyCode() : itemCurrencyCode; const webApiUrl = (window as any).config.WebApiUrl.replace(/\/$/g, ""); const getImages = (companyId: string, tableRowId: string, imageCount: number) => { return Array(imageCount).fill(null) .map((_, i) => webApiUrl + `/api/InventoryItem/image/${companyId}/${tableRowId}/${i}`); }; const inventoryItemMap = (x: any): IInventoryItem => ({ id: x.id, name: x.name, salesPrice: x.salesPrice, brand: x.brandName, cartons: x.cartons, available: x.available || 0, salesUnit: x.salesUnit, nlRegistrationNumber: x.nlRegistrationNumber, isAvailable: x.available > 0, currencyCode: getDefaultCurrency(x.currencyCode), tableRowId: x.tableRowId, imageCount: x.imageCount }); export class InventoryRepository implements IInventoryRepository { async getById(id: string): Task<IInventoryItem> { return await dexiePlug.inventoryItems.get(id); } async getAllInventoryItems(reload = false): Task<IInventoryItem[]> { return CacheHelper.section<IInventoryItem[]>({ key: "InventoryItems-LastUpdate", minutes: 60, forceGenerate: reload, fetch: async () => await dexiePlug.inventoryItems.toArray(), generate: async () => { const data = await restApiHelper.getData("api/inventoryitem/AllWithNlRegistration"); const companyId = appDomain.IGetCurrentSession.getSession().getCompanyId(); const invItems = data.map(inventoryItemMap); invItems.forEach(inv => inv.images = getImages(companyId, inv.tableRowId, inv.imageCount)); await dexiePlug.inventoryItems.bulkPut(invItems); return data; } }); } }
230600cookie-checkTypescript Cache Helper