From 05b2354f0716a40039fbc53a4bb62ab0a74fd6cd Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Mon, 12 Jan 2026 13:15:19 +0200 Subject: [PATCH 1/8] docs: added documentation about keyspace notifications in redis --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 5ccbce8..2a1eff9 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,12 @@ npm install npx husky install ``` +#### Make sure you have keyspace notifications in Redis +In `redis-cli` +```bash +CONFIG SET notify-keyspace-events KEA +``` + ## Run Locally Clone the project From 19b1e28e2a2ab9faa0d1ceaa8cb88202a87467c5 Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Mon, 12 Jan 2026 13:23:32 +0200 Subject: [PATCH 2/8] fix: removed magic numbers --- tests/integration/feedback/feedback.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integration/feedback/feedback.spec.ts b/tests/integration/feedback/feedback.spec.ts index 4d5d396..5d295e5 100644 --- a/tests/integration/feedback/feedback.spec.ts +++ b/tests/integration/feedback/feedback.spec.ts @@ -69,6 +69,7 @@ describe('feedback', function () { }); it('Redis key should not exist in geocodingIndex after TTL has passed', async function () { + const redisTtl = config.get('redis.ttl'); const geocodingResponse: GeocodingResponse = { apiKey: '1', site: 'test', @@ -83,12 +84,13 @@ describe('feedback', function () { // eslint-disable-next-line @typescript-eslint/no-misused-promises setTimeout(async () => { expect(await redisClient.exists(redisKey)).toBe(0); - }, 3000); + }, (redisTtl + 1) * 1000); }); it('Should send feedback to kafka also when no response was chosen', async function () { const topic = config.get('outputTopic'); const requestId = crypto.randomUUID(); + const redisTtl = config.get('redis.ttl'); const geocodingResponse: GeocodingResponse = { apiKey: '1', @@ -98,7 +100,7 @@ describe('feedback', function () { }; await redisClient.set(requestId, JSON.stringify(geocodingResponse)); - await new Promise((resolve) => setTimeout(resolve, 3000)); + await new Promise((resolve) => setTimeout(resolve, (redisTtl + 1) * 1000)); // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockKafkaProducer.send).toHaveBeenCalledWith({ From bca85ace93c00c96e6175817e813dd33fbb60728 Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Mon, 12 Jan 2026 13:26:19 +0200 Subject: [PATCH 3/8] feat: added additional user validation support --- config/custom-environment-variables.json | 3 ++- config/default.json | 2 +- config/test.json | 2 +- src/feedback/models/feedbackManager.ts | 8 +++++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index a1873f5..2a4c627 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -77,6 +77,7 @@ "kafkaProducer": {}, "outputTopic": "KAFKA_OUTPUT_TOPIC", "application": { - "userValidation": "USER_ID_DOMAIN" + "userValidation": "USER_ID_DOMAIN", + "__format": "json" } } diff --git a/config/default.json b/config/default.json index 893588d..fd5fd3e 100644 --- a/config/default.json +++ b/config/default.json @@ -51,6 +51,6 @@ "kafkaProducer": {}, "outputTopic": "topic", "application": { - "userValidation": "@mycompany.net" + "userValidation": ["@mycompany.net"] } } diff --git a/config/test.json b/config/test.json index e3ef1e4..55331d2 100644 --- a/config/test.json +++ b/config/test.json @@ -19,6 +19,6 @@ "kafkaProducer": {}, "outputTopic": "testTopic", "application": { - "userValidation": "@mycompany.net" + "userValidation": ["@mycompany.net"] } } diff --git a/src/feedback/models/feedbackManager.ts b/src/feedback/models/feedbackManager.ts index 0847f7d..93d4112 100644 --- a/src/feedback/models/feedbackManager.ts +++ b/src/feedback/models/feedbackManager.ts @@ -19,10 +19,12 @@ export class FeedbackManager { public async createFeedback(feedback: IFeedbackModel, apiKey: string): Promise { const requestId = feedback.request_id; const userId = feedback.user_id; - const userValidation = this.config.get('application.userValidation'); + const userValidation = this.config.get('application.userValidation'); - if (!userId.endsWith(userValidation)) { - throw new BadRequestError(`user_id not valid. valid user_id ends with "${userValidation}"`); + const validateUser = !userValidation.some((validEnding) => validEnding && userId.endsWith(validEnding)); + + if (validateUser) { + throw new BadRequestError(`user_id not valid. valid user_id ends with "${JSON.stringify(userValidation)}"`); } const feedbackResponse: FeedbackResponse = { From ce7520deae9acd2c0d896e10118663a1179d1a2d Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Wed, 14 Jan 2026 13:44:43 +0200 Subject: [PATCH 4/8] feat: added redis ttl and prefix --- config/custom-environment-variables.json | 7 ++++++- config/default.json | 3 ++- config/test.json | 3 ++- src/feedback/models/feedbackManager.ts | 10 +++++++--- src/redis/subscribe.ts | 16 ++++++++++------ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index 2a4c627..e619892 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -59,7 +59,12 @@ "ttl": { "__name": "REDIS_TTL", "__format": "number" - } + }, + "expiredResponseTtl": { + "__name": "REDIS_EXPIRED_RESPONSE_TTL", + "__format": "number" + }, + "prefix": "REDIS_KEY_PREFIX" }, "kafka": { "brokers": "KAFKA_BROKERS", diff --git a/config/default.json b/config/default.json index fd5fd3e..db7ae83 100644 --- a/config/default.json +++ b/config/default.json @@ -36,7 +36,8 @@ "key": "", "cert": "" }, - "ttl": 300 + "ttl": 600, + "expiredResponseTtl": 300 }, "kafka": { "brokers": "KAFKA_URL:9092", diff --git a/config/test.json b/config/test.json index 55331d2..5e91e00 100644 --- a/config/test.json +++ b/config/test.json @@ -10,7 +10,8 @@ "key": "", "cert": "" }, - "ttl": 2 + "ttl": 600, + "expiredResponseTtl": 2 }, "kafka": { "brokers": "localhost:9092" diff --git a/src/feedback/models/feedbackManager.ts b/src/feedback/models/feedbackManager.ts index 93d4112..0cc40d6 100644 --- a/src/feedback/models/feedbackManager.ts +++ b/src/feedback/models/feedbackManager.ts @@ -20,21 +20,25 @@ export class FeedbackManager { const requestId = feedback.request_id; const userId = feedback.user_id; const userValidation = this.config.get('application.userValidation'); + const ttl = this.config.get('redis.ttl'); + const prefix = this.config.has('redis.prefix') ? this.config.get('redis.prefix') : undefined; const validateUser = !userValidation.some((validEnding) => validEnding && userId.endsWith(validEnding)); - if (validateUser) { throw new BadRequestError(`user_id not valid. valid user_id ends with "${JSON.stringify(userValidation)}"`); } + const fullRequestId = prefix !== undefined ? `${prefix}:${requestId}` : requestId; + const feedbackResponse: FeedbackResponse = { requestId: requestId, chosenResultId: feedback.chosen_result_id, userId: userId, responseTime: new Date(), - geocodingResponse: await this.getGeocodingResponse(requestId, userId, apiKey), + geocodingResponse: await this.getGeocodingResponse(fullRequestId, userId, apiKey), }; - await this.redisClient.set(requestId, JSON.stringify(feedbackResponse.geocodingResponse)); + + await this.redisClient.setEx(fullRequestId, ttl, JSON.stringify(feedbackResponse.geocodingResponse)); this.logger.info({ msg: 'creating feedback', requestId }); await this.send(feedbackResponse); diff --git a/src/redis/subscribe.ts b/src/redis/subscribe.ts index ebdd5f2..8a7263d 100644 --- a/src/redis/subscribe.ts +++ b/src/redis/subscribe.ts @@ -6,7 +6,7 @@ import { IConfig, FeedbackResponse, GeocodingResponse } from '../common/interfac import { NotFoundError } from '../common/errors'; import { RedisClient } from '../redis/index'; -const TTL_PREFIX = 'ttl_'; +const TTL_PREFIX = 'ttl:'; export const send = async (message: FeedbackResponse, logger: Logger, config: IConfig, kafkaProducer: Producer): Promise => { const topic = config.get('outputTopic'); @@ -31,20 +31,24 @@ export const redisSubscribe = async (deps: DependencyContainer): Promise(REDIS_SUB); logger.debug('Redis subscriber init'); - const redisTTL = config.get('redis.ttl'); + const redisTTL = config.get('redis.expiredResponseTtl'); + const redisPrefix = config.has('redis.prefix') ? config.get('redis.prefix') : undefined; + const prefixWithTtl = redisPrefix !== undefined ? `${redisPrefix}:${TTL_PREFIX}` : TTL_PREFIX; await subscriber.subscribe(`__keyevent@0__:set`, async (message) => { - if (!message.startsWith(TTL_PREFIX)) { + if (!message.startsWith(prefixWithTtl)) { logger.info(`Redis: Got new request ${message}`); - const ttlMessage = TTL_PREFIX + message; + + const noPrefixMessage = redisPrefix !== undefined ? message.split(':')[1] : message; + const ttlMessage = prefixWithTtl + noPrefixMessage; // eslint-disable-next-line @typescript-eslint/naming-convention await redisClient.set(ttlMessage, '', { EX: redisTTL }); } }); await subscriber.subscribe(`__keyevent@0__:expired`, async (message: string) => { - if (message.startsWith(TTL_PREFIX)) { - const geocodingMessage = message.substring(TTL_PREFIX.length); + if (message.startsWith(prefixWithTtl)) { + const geocodingMessage = message.substring(prefixWithTtl.length); let wasUsed; const redisResponse = (await redisClient.get(geocodingMessage)) as string; From 86a82ba4dad232bcee89849f438fc034df10c721 Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Wed, 14 Jan 2026 13:45:12 +0200 Subject: [PATCH 5/8] test: added test coverage --- tests/integration/feedback/feedback.spec.ts | 71 ++++++++++++- .../feedback/models/feedbackModel.spec.ts | 100 +++++++++++++++++- 2 files changed, 163 insertions(+), 8 deletions(-) diff --git a/tests/integration/feedback/feedback.spec.ts b/tests/integration/feedback/feedback.spec.ts index 5d295e5..5bec94e 100644 --- a/tests/integration/feedback/feedback.spec.ts +++ b/tests/integration/feedback/feedback.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ import * as crypto from 'node:crypto'; -import config from 'config'; +import config, { IConfig } from 'config'; import jsLogger, { Logger } from '@map-colonies/js-logger'; import { DependencyContainer } from 'tsyringe'; import { Producer } from 'kafkajs'; @@ -69,7 +69,7 @@ describe('feedback', function () { }); it('Redis key should not exist in geocodingIndex after TTL has passed', async function () { - const redisTtl = config.get('redis.ttl'); + const redisTtl = config.get('redis.expiredResponseTtl'); const geocodingResponse: GeocodingResponse = { apiKey: '1', site: 'test', @@ -90,7 +90,7 @@ describe('feedback', function () { it('Should send feedback to kafka also when no response was chosen', async function () { const topic = config.get('outputTopic'); const requestId = crypto.randomUUID(); - const redisTtl = config.get('redis.ttl'); + const redisTtl = config.get('redis.expiredResponseTtl'); const geocodingResponse: GeocodingResponse = { apiKey: '1', @@ -113,6 +113,71 @@ describe('feedback', function () { ], }); }); + + describe('Redis uses prefix key', () => { + it('should return 200 status code and add key to Redis with prefix', async function () { + const realConfig = depContainer.resolve(SERVICES.CONFIG); + const prefix = 'test-prefix-item'; + + const configWithPrefix: IConfig = { + ...realConfig, + get(key: string): T { + if (key === 'redis.prefix') { + return prefix as unknown as T; + } + if (key === 'redis') { + const realRedisConfig = realConfig.get('redis'); + return { ...realRedisConfig, prefix } as T; + } + return realConfig.get(key); + }, + has(key: string): boolean { + if (key === 'redis.prefix') { + return true; + } + return realConfig.has(key); + }, + }; + + const mockRegisterOptions = { + override: [ + { token: SERVICES.LOGGER, provider: { useValue: jsLogger({ enabled: false }) } }, + { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, + { token: SERVICES.KAFKA, provider: { useValue: mockKafkaProducer } }, + { token: SERVICES.CONFIG, provider: { useValue: configWithPrefix } }, + ], + useChild: true, + }; + const { app: mockApp, container: localContainer } = await getApp(mockRegisterOptions); + const localRequestSender = new FeedbackRequestSender(mockApp); + + const redisConnection = localContainer.resolve(SERVICES.REDIS); + + const geocodingResponse: GeocodingResponse = { + userId: '1', + apiKey: '1', + site: 'test', + response: JSON.parse('["USA"]') as JSON, + respondedAt: new Date('2024-08-29T14:39:10.602Z'), + }; + const redisKey = crypto.randomUUID(); + await redisConnection.set(`${prefix}:${redisKey}`, JSON.stringify(geocodingResponse)); + + const feedbackModel: IFeedbackModel = { + request_id: redisKey, + chosen_result_id: 3, + user_id: 'user1@mycompany.net', + }; + const response = await localRequestSender.createFeedback(feedbackModel); + + const keys = await redisConnection.keys(prefix + '*'); + expect(keys.length).toBeGreaterThanOrEqual(1); + expect(response.status).toBe(httpStatusCodes.NO_CONTENT); + + await redisConnection.del(`${prefix}:${redisKey}`); + await localContainer.dispose(); + }); + }); }); describe('Bad Path', function () { diff --git a/tests/unit/feedback/models/feedbackModel.spec.ts b/tests/unit/feedback/models/feedbackModel.spec.ts index 926f157..5cc26f5 100644 --- a/tests/unit/feedback/models/feedbackModel.spec.ts +++ b/tests/unit/feedback/models/feedbackModel.spec.ts @@ -8,6 +8,17 @@ import { IFeedbackModel } from '../../../../src/feedback/models/feedback'; import { BadRequestError, NotFoundError } from '../../../../src/common/errors'; import { RedisClient } from '../../../../src/redis'; +interface MockConfig { + get: jest.Mock; + has: jest.Mock; +} + +const makeConfig = (overrides?: Partial): MockConfig => ({ + get: jest.fn(), + has: jest.fn(), + ...overrides, +}); + const mockProducer = { connect: jest.fn(), send: jest.fn(), @@ -19,6 +30,7 @@ jest.mock('redis', () => ({ createClient: jest.fn().mockImplementation(() => ({ get: jest.fn(), set: jest.fn(), + setEx: jest.fn(), })), })); @@ -45,7 +57,7 @@ describe('FeedbackManager', () => { describe('#createFeadback', () => { it('should create feedback without errors', async function () { - const requestId = '417a4635-0c59-4b5c-877c-45b4bbaaac7a'; + const requestId = crypto.randomUUID(); const chosenResultId = 3; const userId = 'user1@mycompany.net'; @@ -62,8 +74,86 @@ describe('FeedbackManager', () => { expect(mockedRedis.get).toHaveBeenCalledTimes(1); }); + it('should use redis prefix when configured', async function () { + const requestId = crypto.randomUUID(); + const chosenResultId = 3; + const userId = 'user1@mycompany.net'; + + const mockedConfig = makeConfig(); + mockedConfig.has.mockImplementation((key: string) => key === 'redis.prefix'); + mockedConfig.get.mockImplementation((key: string) => { + if (key === 'application.userValidation') { + return ['@mycompany.net']; + } + if (key === 'redis.ttl') { + return 10; + } + if (key === 'redis.prefix') { + return 'feedback-test'; + } + if (key === 'outputTopic') { + return 'test-topic'; + } + throw new Error(`Unexpected key: ${key}`); + }); + + const mockedManager = new FeedbackManager( + jsLogger({ enabled: false }), + mockedRedis, + mockProducer as unknown as jest.Mocked, + mockedConfig + ); + + const feedbackRequest: IFeedbackModel = { request_id: requestId, chosen_result_id: chosenResultId, user_id: userId }; + (mockedRedis.get as jest.Mock).mockResolvedValue('{ "geocodingResponse": "completed" }'); + + const feedback = await mockedManager.createFeedback(feedbackRequest, 'token'); + + expect(feedback.requestId).toBe(requestId); + + const expectedKey = `feedback-test:${requestId}`; + expect(mockedRedis.get).toHaveBeenCalledWith(expectedKey); + expect(mockedRedis.setEx).toHaveBeenCalledWith(expectedKey, 10, JSON.stringify(feedback.geocodingResponse)); + }); + + it('should not use redis prefix when not configured', async () => { + const requestId = crypto.randomUUID(); + const userId = 'user1@mycompany.net'; + + const mockedConfig = makeConfig(); + mockedConfig.has.mockReturnValue(false); + mockedConfig.get.mockImplementation((key: string) => { + if (key === 'application.userValidation') { + return ['@mycompany.net']; + } + if (key === 'redis.ttl') { + return 10; + } + if (key === 'outputTopic') { + return 'test-topic'; + } + throw new Error(`Unexpected key: ${key}`); + }); + + const mockedManager = new FeedbackManager( + jsLogger({ enabled: false }), + mockedRedis, + mockProducer as unknown as jest.Mocked, + mockedConfig + ); + + (mockedRedis.get as jest.Mock).mockResolvedValue('{ "geocodingResponse": "completed" }'); + + const feedbackRequest: IFeedbackModel = { request_id: requestId, chosen_result_id: 3, user_id: userId }; + + await mockedManager.createFeedback(feedbackRequest, 'token'); + + // key should be raw + expect(mockedRedis.get).toHaveBeenCalledWith(requestId); + }); + it('should not create feedback when user_id is not valid', async function () { - const feedbackRequest: IFeedbackModel = { request_id: '417a4635-0c59-4b5c-877c-45b4bbaaac7a', chosen_result_id: 3, user_id: 'user1' }; + const feedbackRequest: IFeedbackModel = { request_id: crypto.randomUUID(), chosen_result_id: 3, user_id: 'user1' }; const feedback = feedbackManager.createFeedback(feedbackRequest, 'token'); await expect(feedback).rejects.toThrow(BadRequestError); @@ -71,7 +161,7 @@ describe('FeedbackManager', () => { it('should not create feedback when request_id is not found', async function () { const feedbackRequest: IFeedbackModel = { - request_id: '417a4635-0c59-4b5c-877c-45b4bbaaac7a', + request_id: crypto.randomUUID(), chosen_result_id: 3, user_id: 'user1@mycompany.net', }; @@ -82,7 +172,7 @@ describe('FeedbackManager', () => { it('should not be able to upload feedback to kafka', async function () { const feedbackRequest: IFeedbackModel = { - request_id: '417a4635-0c59-4b5c-877c-45b4bbaaac7a', + request_id: crypto.randomUUID(), chosen_result_id: 3, user_id: 'user1@mycompany.net', }; @@ -96,7 +186,7 @@ describe('FeedbackManager', () => { it('should not be able to upload feedback to kafka because redis is unavailable', async function () { const feedbackRequest: IFeedbackModel = { - request_id: '417a4635-0c59-4b5c-877c-45b4bbaaac7a', + request_id: crypto.randomUUID(), chosen_result_id: 3, user_id: 'user1@mycompany.net', }; From b9ab75724412df3c0bf56a7036344c96c9edf982 Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Wed, 14 Jan 2026 14:02:59 +0200 Subject: [PATCH 6/8] fix: added missing import --- tests/unit/feedback/models/feedbackModel.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/feedback/models/feedbackModel.spec.ts b/tests/unit/feedback/models/feedbackModel.spec.ts index 5cc26f5..d500d88 100644 --- a/tests/unit/feedback/models/feedbackModel.spec.ts +++ b/tests/unit/feedback/models/feedbackModel.spec.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import * as crypto from 'node:crypto'; import config from 'config'; import jsLogger from '@map-colonies/js-logger'; import { createClient } from 'redis'; From 0ab4999836de8f63c2602ee001cbefb03f3c9790 Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Thu, 15 Jan 2026 09:49:20 +0200 Subject: [PATCH 7/8] fix: client it closed in tests --- tests/integration/feedback/feedback.spec.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/integration/feedback/feedback.spec.ts b/tests/integration/feedback/feedback.spec.ts index 5bec94e..1c597b3 100644 --- a/tests/integration/feedback/feedback.spec.ts +++ b/tests/integration/feedback/feedback.spec.ts @@ -8,7 +8,7 @@ import { trace } from '@opentelemetry/api'; import httpStatusCodes from 'http-status-codes'; import { CleanupRegistry } from '@map-colonies/cleanup-registry'; import { getApp } from '../../../src/app'; -import { CLEANUP_REGISTRY, SERVICES } from '../../../src/common/constants'; +import { CLEANUP_REGISTRY, REDIS_SUB, SERVICES } from '../../../src/common/constants'; import { IFeedbackModel } from '../../../src/feedback/models/feedback'; import { FeedbackResponse, GeocodingResponse } from '../../../src/common/interfaces'; import { RedisClient } from '../../../src/redis'; @@ -81,10 +81,8 @@ describe('feedback', function () { await redisClient.set(redisKey, JSON.stringify(geocodingResponse)); expect(await redisClient.exists(redisKey)).toBe(1); - // eslint-disable-next-line @typescript-eslint/no-misused-promises - setTimeout(async () => { - expect(await redisClient.exists(redisKey)).toBe(0); - }, (redisTtl + 1) * 1000); + await new Promise((resolve) => setTimeout(resolve, (redisTtl + 1) * 1000)); + expect(await redisClient.exists(redisKey)).toBe(0); }); it('Should send feedback to kafka also when no response was chosen', async function () { @@ -175,7 +173,14 @@ describe('feedback', function () { expect(response.status).toBe(httpStatusCodes.NO_CONTENT); await redisConnection.del(`${prefix}:${redisKey}`); - await localContainer.dispose(); + const subscriber = localContainer.resolve(REDIS_SUB); + + await subscriber.unsubscribe('__keyevent@0__:set'); + await subscriber.unsubscribe('__keyevent@0__:expired'); + + const localCleanup = localContainer.resolve(CLEANUP_REGISTRY); + await localCleanup.trigger(); + localContainer.reset(); }); }); }); From 3bc90b4d013597f73ab534835a17a720f979d03c Mon Sep 17 00:00:00 2001 From: NatalieShaked Date: Sun, 18 Jan 2026 11:07:01 +0200 Subject: [PATCH 8/8] chore(release): 0.1.9 --- CHANGELOG.md | 15 +++++++++++++++ helm/Chart.yaml | 4 ++-- openapi3.yaml | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 200ac45..7668823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.1.9](https://github.com/MapColonies/feedback-api/compare/v0.1.8...v0.1.9) (2026-01-18) + + +### Features + +* added additional user validation support ([bca85ac](https://github.com/MapColonies/feedback-api/commit/bca85ace93c00c96e6175817e813dd33fbb60728)) +* added redis ttl and prefix ([ce7520d](https://github.com/MapColonies/feedback-api/commit/ce7520deae9acd2c0d896e10118663a1179d1a2d)) + + +### Bug Fixes + +* added missing import ([b9ab757](https://github.com/MapColonies/feedback-api/commit/b9ab75724412df3c0bf56a7036344c96c9edf982)) +* client it closed in tests ([0ab4999](https://github.com/MapColonies/feedback-api/commit/0ab4999836de8f63c2602ee001cbefb03f3c9790)) +* removed magic numbers ([19b1e28](https://github.com/MapColonies/feedback-api/commit/19b1e28e2a2ab9faa0d1ceaa8cb88202a87467c5)) + ### [0.1.8](https://github.com/MapColonies/feedback-api/compare/v0.1.7...v0.1.8) (2025-02-27) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index cf0c758..423988d 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: feedback-api description: A Helm chart for feedback-api service type: application -version: 0.1.8 -appVersion: 0.1.8 +version: 0.1.9 +appVersion: 0.1.9 dependencies: - name: common repository: oci://acrarolibotnonprod.azurecr.io/helm diff --git a/openapi3.yaml b/openapi3.yaml index 997c73c..1789ece 100644 --- a/openapi3.yaml +++ b/openapi3.yaml @@ -2,7 +2,7 @@ openapi: 3.0.1 info: title: feedback api description: Api to eventually do BI on the data from responses from Geocoding. - version: 0.1.8 + version: 0.1.9 license: name: MIT url: https://opensource.org/licenses/MIT diff --git a/package-lock.json b/package-lock.json index d1c1280..0c7b8d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "feedback-api", - "version": "0.1.8", + "version": "0.1.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "feedback-api", - "version": "0.1.8", + "version": "0.1.9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 81ac0e4..f85adac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feedback-api", - "version": "0.1.8", + "version": "0.1.9", "description": "Feedback-api service for MapColonies", "main": "./src/index.ts", "scripts": {