From f17f265ccb515f2fe23959038eb833fc090068ab Mon Sep 17 00:00:00 2001 From: Dragan Andonovski Date: Fri, 15 Jul 2016 14:35:01 +0200 Subject: [PATCH 1/2] [#7] Usage of @Cacheable and @CacheEvict decorators - added CacheService which uses the decorators @Cacheable and @CacheEvict - added the @CacheEnable decorator to the AppConfig class - added CacheService in the GreetingsController for demonstration purposes - created two methods (get and delete) in the Greetings controller for testing the caching decorators - added dependency to redis and object-hash in package.json [review by saskodh] --- package.json | 4 +- src/app/AppConfig.ts | 11 +++ src/app/controllers/ControllersConfig.ts | 5 ++ src/app/controllers/GreetingsController.ts | 20 +++--- .../CacheProviders/RedisCacheProvider.ts | 71 +++++++++++++++++++ src/app/repositories/ITodoRepository.ts | 41 +++++++++++ src/app/repositories/RepositoriesConfig.ts | 5 ++ .../repositories/TodoRepositoryMongoImpl.ts | 63 ++++++++++++++++ src/app/repositories/TodoRepositoryPgImpl.ts | 56 +++++++++++++++ .../repositories/dataSources/DataSource.ts | 50 +++++++++++++ .../dataSources/DataSourceService.ts | 24 +++++++ .../dataSources/MongoDataSource.ts | 29 ++++++++ src/app/services/CacheableService.ts | 19 +++++ src/app/services/ServicesConfig.ts | 5 ++ src/app/services/TodoService.ts | 2 +- src/main.ts | 11 +-- test/TodoController.spec.ts | 4 +- 17 files changed, 400 insertions(+), 20 deletions(-) create mode 100644 src/app/AppConfig.ts create mode 100644 src/app/controllers/ControllersConfig.ts create mode 100644 src/app/repositories/CacheProviders/RedisCacheProvider.ts create mode 100644 src/app/repositories/ITodoRepository.ts create mode 100644 src/app/repositories/RepositoriesConfig.ts create mode 100644 src/app/repositories/TodoRepositoryMongoImpl.ts create mode 100644 src/app/repositories/TodoRepositoryPgImpl.ts create mode 100644 src/app/repositories/dataSources/DataSource.ts create mode 100644 src/app/repositories/dataSources/DataSourceService.ts create mode 100644 src/app/repositories/dataSources/MongoDataSource.ts create mode 100644 src/app/services/CacheableService.ts create mode 100644 src/app/services/ServicesConfig.ts diff --git a/package.json b/package.json index b091da2..6987656 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "express": "4.13.4", "lodash": "4.13.1", "mongodb": "2.1.18", - "pg": "6.0.1" + "object-hash": "^1.1.3", + "pg": "6.0.1", + "redis": "^2.6.2" }, "devDependencies": { "chai": "3.5.0", diff --git a/src/app/AppConfig.ts b/src/app/AppConfig.ts new file mode 100644 index 0000000..aca3915 --- /dev/null +++ b/src/app/AppConfig.ts @@ -0,0 +1,11 @@ +import {Configuration, PropertySource, Import, EnableCaching} from "@sklechko/framework"; +import {ControllersConfig} from "./controllers/ControllersConfig"; +import {RepositoriesConfig} from "./repositories/RepositoriesConfig"; +import {ServicesConfig} from "./services/ServicesConfig"; +var properties = require('../resources/app.properties.json'); + +@Import(ControllersConfig, RepositoriesConfig, ServicesConfig) +@EnableCaching() +@PropertySource(properties) +@Configuration() +export class AppConfig {} \ No newline at end of file diff --git a/src/app/controllers/ControllersConfig.ts b/src/app/controllers/ControllersConfig.ts new file mode 100644 index 0000000..15cf287 --- /dev/null +++ b/src/app/controllers/ControllersConfig.ts @@ -0,0 +1,5 @@ +import {Configuration, ComponentScan} from "@sklechko/framework"; + +@ComponentScan(__dirname) +@Configuration() +export class ControllersConfig {} \ No newline at end of file diff --git a/src/app/controllers/GreetingsController.ts b/src/app/controllers/GreetingsController.ts index b79bb6a..1bbaca0 100644 --- a/src/app/controllers/GreetingsController.ts +++ b/src/app/controllers/GreetingsController.ts @@ -1,6 +1,7 @@ -import {Controller, RequestMapping, RequestMethod, Profile, Inject} from "@sklechko/framework"; +import {Controller, RequestMapping, RequestMethod, Inject} from "@sklechko/framework"; import {Request} from "express-serve-static-core"; import {GreetService} from "../services/GreetService"; +import {CacheableService} from "../services/CacheableService"; class AbstractGreetingCtrl { @@ -9,10 +10,12 @@ class AbstractGreetingCtrl { } -@Profile('dev') @Controller() export class GreetingsController extends AbstractGreetingCtrl { + @Inject() + private cacheService: CacheableService; + getName(request: Request) { return new Promise(function (resolve) { setTimeout(function () { @@ -33,12 +36,13 @@ export class GreetingsController extends AbstractGreetingCtrl { }; } - @RequestMapping({ path: '/hi', method: RequestMethod.GET }) - async sayHi() { - var greet = await this.greetService.getGreeting(); + @RequestMapping({ path: '/cache', method: RequestMethod.GET }) + async get() { + return await this.cacheService.getModel('id'); + } - return { - greet: `Today's greet: ${greet}` - }; + @RequestMapping({ path: '/cacheDelete', method: RequestMethod.GET }) + async delete() { + return await this.cacheService.deleteModel('id'); } } \ No newline at end of file diff --git a/src/app/repositories/CacheProviders/RedisCacheProvider.ts b/src/app/repositories/CacheProviders/RedisCacheProvider.ts new file mode 100644 index 0000000..ede59cf --- /dev/null +++ b/src/app/repositories/CacheProviders/RedisCacheProvider.ts @@ -0,0 +1,71 @@ +import {I_CACHE_PROVIDER_TOKEN, ICacheProvider} from "@sklechko/framework/lib/Cache/ICacheProvider"; +import {Component, Qualifier} from "@sklechko/framework"; +var redis = require('redis'); + +@Qualifier(I_CACHE_PROVIDER_TOKEN) +@Component() +export class RedisCacheProvider implements ICacheProvider{ + + private client; + private caches: Map; + + constructor () { + this.caches = new Map(); + this.client = redis.createClient(); + } + + async get(key, cacheName): Promise { + await this.getCache(cacheName); + let result = await this.getPromise(this.client, this.client.get, key); + return JSON.parse(result); + } + async set(key, result, cacheName): Promise { + await this.getCache(cacheName); + return await this.getPromise(this.client, this.client.set, [key, JSON.stringify(result)]); + } + + async flushdb(cacheName): Promise { + await this.getCache(cacheName); + this.client.flushdb(); + } + + async del(key, cacheName): Promise { + await this.getCache(cacheName); + this.client.del(key); + } + + private async getCache(cacheName: string) { + let cacheNumber: number = this.caches.get(cacheName); + if(cacheNumber === undefined) { + cacheNumber = this.createNewCache(); + this.caches.set(cacheName, cacheNumber); + } + await this.getPromise(this.client, this.client.select, cacheNumber); + } + + private createNewCache() { + let max = 0; + let cacheIter = this.caches.values(); + while(true) { + let value = cacheIter.next().value; + if(value === undefined) break; + max++; + } + return max; + } + + private getPromise(thisArg, method, ...args): Promise { + return new Promise((resolve, reject) => { + let callback = function (error, result) { + if (error) { + reject(error); + } else { + resolve(result); + } + }; + + args.push(callback); + Reflect.apply(method, thisArg, args); + }); + } +} \ No newline at end of file diff --git a/src/app/repositories/ITodoRepository.ts b/src/app/repositories/ITodoRepository.ts new file mode 100644 index 0000000..c374250 --- /dev/null +++ b/src/app/repositories/ITodoRepository.ts @@ -0,0 +1,41 @@ +import {TodoModel} from "../models/TodoModel"; + +export const ITodoRepositoryToken = Symbol('I-TODO-REPOSITORY-TOKEN'); + +export interface ITodoRepository { + + /** + * Gets the todo with the given id. + * @param todoId todo id + * @returns todo + * */ + get(todoId: number | string): Promise; + + /** + * Gets all todos. + * @returns all todos + * */ + getAll(): Promise; + + /** + * Persists the given todo. + * @param todo todo + * @returns the persisted todo + * */ + save(todo: TodoModel): Promise; + + /** + * Updates the given todo. + * @param todo todo + * @returns the updated todo + * */ + update(todo: TodoModel): Promise; + + /** + * Deletes the todo with the given id. + * @param todoId todo id + * @returns delete result + * */ + delete(todoId: number | string): Promise<{ success: boolean }>; + +} \ No newline at end of file diff --git a/src/app/repositories/RepositoriesConfig.ts b/src/app/repositories/RepositoriesConfig.ts new file mode 100644 index 0000000..71ba7f0 --- /dev/null +++ b/src/app/repositories/RepositoriesConfig.ts @@ -0,0 +1,5 @@ +import {Configuration, ComponentScan} from "@sklechko/framework"; + +@ComponentScan(__dirname) +@Configuration() +export class RepositoriesConfig {} \ No newline at end of file diff --git a/src/app/repositories/TodoRepositoryMongoImpl.ts b/src/app/repositories/TodoRepositoryMongoImpl.ts new file mode 100644 index 0000000..c69d309 --- /dev/null +++ b/src/app/repositories/TodoRepositoryMongoImpl.ts @@ -0,0 +1,63 @@ +import {Component, Inject, Profile, Qualifier} from "@sklechko/framework"; +import {MongoDataSource} from "./dataSources/MongoDataSource"; +import {ITodoRepository, ITodoRepositoryToken} from "./ITodoRepository"; +import {TodoModel} from "../models/TodoModel"; +import {Db} from "mongodb"; +import {ObjectID} from "mongodb"; +import * as _ from 'lodash'; + +@Profile('mongo') +@Qualifier(ITodoRepositoryToken) +@Component() +export class TodoRepositoryMongoImpl implements ITodoRepository { + + @Inject() + private mongoDataSource: MongoDataSource; + + async get(todoId:number | string):Promise { + let db: Db = await this.mongoDataSource.getConnection(); + let query = { "_id" : new ObjectID(todoId) }; + let todoCollection = await db.collection('todoCollection').find(query).toArray(); + return TodoRepositoryMongoImpl.convertTodoResultArray(todoCollection).pop(); + } + + async getAll():Promise { + let db: Db = await this.mongoDataSource.getConnection(); + let todoCollection = await db.collection('todoCollection').find().toArray(); + return TodoRepositoryMongoImpl.convertTodoResultArray(todoCollection); + } + + async save(todo:TodoModel):Promise { + let db: Db = await this.mongoDataSource.getConnection(); + let insert = { name : todo.name, description : todo.description, completed : todo.completed }; + let persistedTodo = await db.collection('todoCollection').insertOne(insert); + let persistedTodoId: string = persistedTodo.insertedId.toString(); + return await this.get(persistedTodoId); + } + + async update(todo:TodoModel):Promise { + let db: Db = await this.mongoDataSource.getConnection(); + let query = { "_id" : new ObjectID(todo.id) }; + let update = { $set: { name : todo.name, description : todo.description, completed : todo.completed } }; + let persistedTodo = await db.collection('todoCollection').findOneAndUpdate(query, update); + return this.get(persistedTodo.value._id.toString()); + } + + async delete(todoId:number | string):Promise<{success:boolean}> { + let db: Db = await this.mongoDataSource.getConnection(); + let query = { "_id" : new ObjectID(todoId) }; + await db.collection('todoCollection').deleteOne(query); + return { success: true }; + } + + private static convertTodoResultArray(result: Array): Array { + return _.map(result, TodoRepositoryMongoImpl.convertTodoResult); + } + + private static convertTodoResult(result: any): TodoModel { + let todo: TodoModel = new TodoModel(result.name, result.description); + todo.id = result._id; + todo.completed = result.completed; + return todo; + } +} \ No newline at end of file diff --git a/src/app/repositories/TodoRepositoryPgImpl.ts b/src/app/repositories/TodoRepositoryPgImpl.ts new file mode 100644 index 0000000..fb79438 --- /dev/null +++ b/src/app/repositories/TodoRepositoryPgImpl.ts @@ -0,0 +1,56 @@ +import {TodoModel} from "../models/TodoModel"; +import {Component, Inject, Profile, Qualifier} from "@sklechko/framework"; +import {ITodoRepository, ITodoRepositoryToken} from "./ITodoRepository"; +import {DataSourceService} from "./dataSources/DataSourceService"; +import * as _ from 'lodash'; + +@Profile('pg') +@Qualifier(ITodoRepositoryToken) +@Component() +export class TodoRepositoryPgImpl implements ITodoRepository { + + @Inject() + private dataSourceService: DataSourceService; + + async get(todoId: number): Promise { + let query = 'select * from TodoModel where id = $1'; + let todoResult = await this.dataSourceService.executeQuery(query, [todoId]); + return TodoRepositoryPgImpl.convertTodoResult(todoResult.rows[0]); + } + + async getAll(): Promise> { + let query = 'select * from TodoModel'; + let todoResult = await this.dataSourceService.executeQuery(query); + return TodoRepositoryPgImpl.convertTodoResultArray(todoResult.rows); + } + + async save(todo: TodoModel): Promise { + let query = 'insert into TodoModel(name, description, completed) values($1, $2, $3) returning id'; + let insertResult = await this.dataSourceService.executeQuery(query, [todo.name, todo.description, todo.completed]); + return this.get(insertResult.rows[0].id); + } + + async update(todo: TodoModel): Promise { + let query = 'update TodoModel set name = $2, description = $3, completed = $4 where id = $1'; + await this.dataSourceService.executeQuery(query, [todo.id, todo.name, todo.description, todo.completed]); + let updatedTodo = await this.get(todo.id); + return TodoRepositoryPgImpl.convertTodoResult(updatedTodo); + } + + async delete(todoId: number): Promise<{ success: boolean }> { + let query = 'delete from TodoModel where id = $1'; + await this.dataSourceService.executeQuery(query, [todoId]); + return { success: true }; + } + + private static convertTodoResultArray(result: Array): Array { + return _.map(result, TodoRepositoryPgImpl.convertTodoResult); + } + + private static convertTodoResult(result: any): TodoModel { + let todo: TodoModel = new TodoModel(result.name, result.description); + todo.id = result.id; + todo.completed = result.completed; + return todo; + } +} \ No newline at end of file diff --git a/src/app/repositories/dataSources/DataSource.ts b/src/app/repositories/dataSources/DataSource.ts new file mode 100644 index 0000000..d6bdef5 --- /dev/null +++ b/src/app/repositories/dataSources/DataSource.ts @@ -0,0 +1,50 @@ +import {Component, Value} from "@sklechko/framework"; +import * as pg from "pg"; +import {Client} from "pg"; + +@Component() +export class DataSource { + + @Value('db.pg.host') + private host: string; + + @Value('db.pg.database') + private database: string; + + @Value('db.pg.port') + private port: number; + + @Value('db.pg.pool.minConnections') + private minConnections: number; + + @Value('db.pg.pool.maxConnections') + private maxConnections: number; + + @Value('db.pg.pool.idleTimeoutMillis') + private idleTimeoutMillis: number; + + private pool; + + public async getConnection():Promise { + return await this.getPool().connect(); + } + + private getPool() { + if(!this.pool) { + this.createPool(); + } + return this.pool; + } + + private createPool() { + let config = { + database: this.database, //env var: PGDATABASE + port: this.port, //env var: PGPORT + min: this.minConnections, // min number of clients in the pool + max: this.maxConnections, // max number of clients in the pool + idleTimeoutMillis: this.idleTimeoutMillis, // how long a client is allowed to remain idle before being closed + }; + // NOTE: we cast because the typing is not correct. Remove when typing is upgraded + this.pool = new ( pg).Pool(config); + } +} \ No newline at end of file diff --git a/src/app/repositories/dataSources/DataSourceService.ts b/src/app/repositories/dataSources/DataSourceService.ts new file mode 100644 index 0000000..8bb27e6 --- /dev/null +++ b/src/app/repositories/dataSources/DataSourceService.ts @@ -0,0 +1,24 @@ +import {QueryResult} from "pg"; +import {Component, Inject} from "@sklechko/framework"; +import {DataSource} from "./DataSource"; + +@Component() +export class DataSourceService { + + @Inject() + private dataSource: DataSource; + + public async executeQuery(sqlQuery: string, parameters?: Array): Promise { + let client = await this.dataSource.getConnection(); + try { + // NOTE: workaround because typings for 'pg' are not correct. Remove this on when they are updated. + let queryResult = await client.query(sqlQuery, parameters); + return queryResult; + } catch (err) { + console.error(err); + } finally { + ( client).release(); + } + return null; + } +} \ No newline at end of file diff --git a/src/app/repositories/dataSources/MongoDataSource.ts b/src/app/repositories/dataSources/MongoDataSource.ts new file mode 100644 index 0000000..ddb8bd6 --- /dev/null +++ b/src/app/repositories/dataSources/MongoDataSource.ts @@ -0,0 +1,29 @@ +import {Component, Value} from "@sklechko/framework"; +import {MongoClient} from "mongodb"; +import {Db} from "mongodb"; + +@Component() +export class MongoDataSource { + + @Value('db.mongo.connectionString') + private connectionString: string; + + @Value('db.mongo.options.poolSize') + private poolSize: number; + + private db: Db; + + public async getConnection(): Promise { + if(!this.db) { + await this.createConnection(); + } + return this.db; + } + + private async createConnection() { + let options = { + poolSize: this.poolSize, + }; + this.db = await MongoClient.connect(this.connectionString , options); + } +} \ No newline at end of file diff --git a/src/app/services/CacheableService.ts b/src/app/services/CacheableService.ts new file mode 100644 index 0000000..fedff24 --- /dev/null +++ b/src/app/services/CacheableService.ts @@ -0,0 +1,19 @@ +import {Component, CacheEvict, Cacheable} from "@sklechko/framework"; + +@Component() +export class CacheableService { + + @Cacheable('model') + async getModel(id: string): Promise { + return new Promise(function (resolve) { + setTimeout(function () { + resolve("Returns the model for the given id!"); + }, 5000); + }); + } + + @CacheEvict('model', true) + async deleteModel(id: string): Promise { + return "The todo with the given id was deleted"; + } +} \ No newline at end of file diff --git a/src/app/services/ServicesConfig.ts b/src/app/services/ServicesConfig.ts new file mode 100644 index 0000000..feefdf7 --- /dev/null +++ b/src/app/services/ServicesConfig.ts @@ -0,0 +1,5 @@ +import {Configuration, ComponentScan} from "@sklechko/framework"; + +@ComponentScan(__dirname) +@Configuration() +export class ServicesConfig {} \ No newline at end of file diff --git a/src/app/services/TodoService.ts b/src/app/services/TodoService.ts index 8b39dec..99b1b3a 100644 --- a/src/app/services/TodoService.ts +++ b/src/app/services/TodoService.ts @@ -1,6 +1,6 @@ import {Component, Inject} from "@sklechko/framework"; import {TodoModel} from "../models/TodoModel"; -import {ITodoRepository, ITodoRepositoryToken} from "../repository/ITodoRepository"; +import {ITodoRepository, ITodoRepositoryToken} from "../repositories/ITodoRepository"; @Component() export class TodoService { diff --git a/src/main.ts b/src/main.ts index 1191f8d..4bfee9c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,7 @@ import {WebAppInitializer} from "./app/WebAppInitializer"; -import {ComponentScan, PropertySource, Configuration, ApplicationContext} from "@sklechko/framework"; +import {ApplicationContext} from "@sklechko/framework"; -var properties = require('./resources/app.properties.json'); +import {AppConfig} from "./app/AppConfig" -@ComponentScan(__dirname + '/app') -@PropertySource(properties) -@Configuration() -class Config {} - -let applicationContext = new ApplicationContext(Config); +let applicationContext = new ApplicationContext(AppConfig); var app = WebAppInitializer.bootstrap(applicationContext).getApplication(); \ No newline at end of file diff --git a/test/TodoController.spec.ts b/test/TodoController.spec.ts index a1f6509..f2c9341 100644 --- a/test/TodoController.spec.ts +++ b/test/TodoController.spec.ts @@ -1,8 +1,8 @@ import {expect} from "chai"; import {stub} from "sinon"; import {TodoController} from "../src/app/controllers/TodoController"; -import {TodoRepositoryPgImpl} from "../src/app/repository/TodoRepositoryPgImpl"; -import {ITodoRepository} from "../src/app/repository/ITodoRepository"; +import {TodoRepositoryPgImpl} from "../src/app/repositories/TodoRepositoryPgImpl"; +import {ITodoRepository} from "../src/app/repositories/ITodoRepository"; describe('TodoController', () => { From c16f5fd83cda7b81f1fd53c43546084bb7b39da0 Mon Sep 17 00:00:00 2001 From: Dragan Andonovski Date: Fri, 2 Sep 2016 14:01:35 +0200 Subject: [PATCH 2/2] [#14] Usage of @Cacheable, @CacheEvict and @CachePut decorators - added usage of @Cacheable, @CacheEvict and @CachePut - added methods in the GreetingsController - added RedisCacheProvider --- src/app/AppConfig.ts | 3 +- src/app/controllers/GreetingsController.ts | 47 ++++++++++++++++++- .../CacheProviders/RedisCacheProvider.ts | 2 +- src/app/services/CacheableService.ts | 17 +++++-- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/app/AppConfig.ts b/src/app/AppConfig.ts index 1c713c3..c9a2113 100644 --- a/src/app/AppConfig.ts +++ b/src/app/AppConfig.ts @@ -1,4 +1,4 @@ -import { Configuration, PropertySource, Import } from "@sklechko/framework"; +import { Configuration, PropertySource, Import, EnableCaching } from "@sklechko/framework"; import { ControllersConfig } from "./controllers/ControllersConfig"; import { RepositoriesConfig } from "./repositories/RepositoriesConfig"; import { ServicesConfig } from "./services/ServicesConfig"; @@ -9,6 +9,7 @@ import { AspectsConfig } from "./aspects/AspectsConfig"; @Import(ControllersConfig, RepositoriesConfig, ServicesConfig, InterceptorsConfig, PostProcessorsConfig, AspectsConfig) @PropertySource(__dirname + '/../resources/app.properties.json') +@EnableCaching() @ActiveProfiles('mongo') @Configuration() export class AppConfig {} \ No newline at end of file diff --git a/src/app/controllers/GreetingsController.ts b/src/app/controllers/GreetingsController.ts index 24664e8..8d10ed0 100644 --- a/src/app/controllers/GreetingsController.ts +++ b/src/app/controllers/GreetingsController.ts @@ -4,6 +4,7 @@ import { import {GreetService} from "../services/GreetService"; import { Environment } from "@sklechko/framework/lib/di/Environment"; import { Timed } from "../postProcessors/timed/Timed"; +import { CacheableService } from "../services/CacheableService"; class AbstractGreetingCtrl { @@ -19,11 +20,14 @@ export class GreetingsController extends AbstractGreetingCtrl { @Inject() private env: Environment; + @Inject() + private cacheableService: CacheableService; + getName() { return new Promise(function (resolve) { setTimeout(function () { resolve(RequestContextHolder.getRequest().params.name); - }, 2000); + }, 5000); }); } @@ -43,4 +47,45 @@ export class GreetingsController extends AbstractGreetingCtrl { var preHandleMessage = ( RequestContextHolder.getResponse()).preHandleProperty; return { greet, someProperty, preHandleMessage }; } + + @RequestMapping({ path: '/hi/cacheable', method: RequestMethod.GET }) + async cacheable () { + await this.cacheableService.getModel('name', 2, new CustomClass()); + return { greet: 'Model Saved !!!' }; + } + + @RequestMapping({ path: '/hi/cacheEvict', method: RequestMethod.GET }) + async deleteCache () { + await this.cacheableService.deleteModel('name'); + return { greet: 'Model deleted !!!' }; + } + + @RequestMapping({ path: '/hi/cachePut', method: RequestMethod.GET }) + async saveCache () { + await this.cacheableService.getModelPut('otherProp', new CustomClass()); + return { greet: 'Model Saved and cache updated!!!' }; + } +} + +export class CustomClass { + private property1; + property2; + private prop; + private nestedProp; + + constructor() { + this.prop = 'name'; + this.property2 = 'publicProperty'; + this.nestedProp = new OtherClass(); + } + + methodOne(){} +} + +export class OtherClass { + private className; + + constructor() { + this.className = 'class One'; + } } \ No newline at end of file diff --git a/src/app/repositories/CacheProviders/RedisCacheProvider.ts b/src/app/repositories/CacheProviders/RedisCacheProvider.ts index ede59cf..5414158 100644 --- a/src/app/repositories/CacheProviders/RedisCacheProvider.ts +++ b/src/app/repositories/CacheProviders/RedisCacheProvider.ts @@ -1,5 +1,5 @@ -import {I_CACHE_PROVIDER_TOKEN, ICacheProvider} from "@sklechko/framework/lib/Cache/ICacheProvider"; import {Component, Qualifier} from "@sklechko/framework"; +import { I_CACHE_PROVIDER_TOKEN, ICacheProvider } from "@sklechko/framework/lib/processors/cache/ICacheProvider"; var redis = require('redis'); @Qualifier(I_CACHE_PROVIDER_TOKEN) diff --git a/src/app/services/CacheableService.ts b/src/app/services/CacheableService.ts index fedff24..92fafce 100644 --- a/src/app/services/CacheableService.ts +++ b/src/app/services/CacheableService.ts @@ -1,10 +1,10 @@ -import {Component, CacheEvict, Cacheable} from "@sklechko/framework"; +import {Component, CacheEvict, Cacheable, CachePut} from "@sklechko/framework"; @Component() export class CacheableService { - @Cacheable('model') - async getModel(id: string): Promise { + @Cacheable({ cacheName: 'model', key: '#third.prop' }) + async getModel(id: string, second, third): Promise { return new Promise(function (resolve) { setTimeout(function () { resolve("Returns the model for the given id!"); @@ -12,8 +12,17 @@ export class CacheableService { }); } - @CacheEvict('model', true) + @CacheEvict({ cacheName: 'model', allEntries: false, key: '#id' }) async deleteModel(id: string): Promise { return "The todo with the given id was deleted"; } + + @CachePut({ cacheName: 'model', key: '#second.prop' }) + async getModelPut(id: string, second): Promise { + return new Promise(function (resolve) { + setTimeout(function () { + resolve("Returns the model for the given id and sets it in the cache!"); + }, 5000); + }); + } } \ No newline at end of file