feat: implement Redis caching for business activities and consumers

- Added Redis caching to BusinessActivitiesService for findAll and findOne methods.
- Integrated Redis caching in BusinessActivityComplexesService for findAll and findOne methods.
- Enhanced ConsumersService with Redis caching for findAll and findOne methods.
- Introduced cache invalidation for partner consumers and business activities.
- Created RedisKeyMaker utility for generating cache keys for consumers, partners, and POS.
- Implemented cache invalidation services for partners and POS.
- Added Redis service methods for JSON handling and key deletion by patterns.
- Updated goods service to include caching and invalidation for goods list.
- Introduced DTO for updating goods.
This commit is contained in:
2026-05-19 15:40:45 +03:30
parent c5c522f69c
commit 62b659246f
32 changed files with 1146 additions and 42 deletions
+33 -2
View File
@@ -1,8 +1,10 @@
import { QUERY_CONSTANTS } from '@/common/queryConstants'
import { ResponseMapper } from '@/common/response/response-mapper'
import { PasswordUtil } from '@/common/utils'
import { RedisKeyMaker } from '@/common/utils/redisKeyMaker'
import { ConsumerUpdateInput } from '@/generated/prisma/models'
import { PrismaService } from '@/prisma/prisma.service'
import { RedisService } from '@/redis/redis.service'
import { Injectable } from '@nestjs/common'
import consumer_mappersUtil from '../../common/utils/mappers/consumer_mappers.util'
import { UpdateConsumerInfoDto } from './dto/update-info-request.dto'
@@ -10,9 +12,20 @@ import { UpdateConsumerPasswordDto } from './dto/update-password-request.dto'
@Injectable()
export class ConsumerService {
constructor(private readonly prisma: PrismaService) {}
constructor(
private readonly prisma: PrismaService,
private readonly redisService: RedisService,
) {}
private readonly infoCacheTtlSeconds = 300
async getInfo(consumer_id: string) {
const cacheKey = RedisKeyMaker.consumerInfo(consumer_id)
const cached = await this.redisService.getJson<unknown>(cacheKey)
if (cached) {
return ResponseMapper.single(cached)
}
const consumer = await this.prisma.consumer.findUniqueOrThrow({
where: {
id: consumer_id,
@@ -24,7 +37,9 @@ export class ConsumerService {
},
})
return ResponseMapper.single(consumer_mappersUtil(consumer))
const mappedConsumer = consumer_mappersUtil(consumer)
await this.redisService.setJson(cacheKey, mappedConsumer, this.infoCacheTtlSeconds)
return ResponseMapper.single(mappedConsumer)
}
async updateInfo(consumer_id: string, data: UpdateConsumerInfoDto) {
@@ -69,6 +84,22 @@ export class ConsumerService {
},
})
await this.redisService.delete(RedisKeyMaker.consumerInfo(consumer_id))
const partnerOwner = await this.prisma.consumer.findUnique({
where: { id: consumer_id },
select: {
legal: { select: { partner_id: true } },
individual: { select: { partner_id: true } },
},
})
const partnerId =
partnerOwner?.legal?.partner_id || partnerOwner?.individual?.partner_id || null
if (partnerId) {
await this.redisService.delete(
RedisKeyMaker.partnerConsumerInfo(partnerId, consumer_id),
)
}
return ResponseMapper.update(consumer)
}