Skip to content

Commit f16336b

Browse files
author
Artem
committed
#RI-2937 BE Modify lastDeliveredId
1 parent e9b5b50 commit f16336b

File tree

4 files changed

+69
-7
lines changed

4 files changed

+69
-7
lines changed

redisinsight/api/src/modules/browser/constants/browser-tool-commands.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export enum BrowserToolStreamCommands {
8383
XInfoGroups = 'xinfo groups',
8484
XPending = 'xpending',
8585
XGroupCreate = 'xgroup create',
86+
XGroupSetId = 'xgroup setid',
8687
}
8788

8889
export enum BrowserToolTSCommands {

redisinsight/api/src/modules/browser/controllers/stream/consumer-group.controller.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import {
22
Body,
33
Controller,
4-
Param,
4+
Param, Patch,
55
Post,
66
UsePipes,
77
ValidationPipe,
88
} from '@nestjs/common';
99
import { ApiTags } from '@nestjs/swagger';
1010
import { ApiRedisInstanceOperation } from 'src/decorators/api-redis-instance-operation.decorator';
1111
import {
12-
ConsumerGroupDto, CreateConsumerGroupsDto,
13-
GetStreamEntriesResponse,
12+
ConsumerGroupDto, CreateConsumerGroupsDto, UpdateConsumerGroupDto,
1413
} from 'src/modules/browser/dto/stream.dto';
1514
import { ConsumerGroupService } from 'src/modules/browser/services/stream/consumer-group.service';
1615
import { KeyDto } from 'src/modules/browser/dto';
@@ -28,8 +27,9 @@ export class ConsumerGroupController {
2827
responses: [
2928
{
3029
status: 200,
31-
description: 'Returns ordered stream entries in defined range.',
32-
type: GetStreamEntriesResponse,
30+
description: 'Returns stream consumer groups.',
31+
type: ConsumerGroupDto,
32+
isArray: true,
3333
},
3434
],
3535
})
@@ -51,4 +51,16 @@ export class ConsumerGroupController {
5151
): Promise<void> {
5252
return this.service.createGroups({ instanceId }, dto);
5353
}
54+
55+
@Patch('')
56+
@ApiRedisInstanceOperation({
57+
description: 'Modify last delivered ID of the Consumer Group',
58+
statusCode: 200,
59+
})
60+
async updateGroup(
61+
@Param('dbInstance') instanceId: string,
62+
@Body() dto: UpdateConsumerGroupDto,
63+
): Promise<void> {
64+
return this.service.updateGroup({ instanceId }, dto);
65+
}
5466
}

redisinsight/api/src/modules/browser/dto/stream.dto.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
ApiProperty, ApiPropertyOptional, IntersectionType
2+
ApiProperty, ApiPropertyOptional, IntersectionType,
33
} from '@nestjs/swagger';
44
import {
55
ArrayNotEmpty,
@@ -261,3 +261,8 @@ export class CreateConsumerGroupsDto extends KeyDto {
261261
@Type(() => CreateConsumerGroupDto)
262262
consumerGroups: CreateConsumerGroupDto[];
263263
}
264+
265+
export class UpdateConsumerGroupDto extends IntersectionType(
266+
KeyDto,
267+
CreateConsumerGroupDto,
268+
) {}

redisinsight/api/src/modules/browser/services/stream/consumer-group.service.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { BrowserToolService } from 'src/modules/browser/services/browser-tool/browser-tool.service';
1212
import { KeyDto } from 'src/modules/browser/dto';
1313
import ERROR_MESSAGES from 'src/constants/error-messages';
14-
import { ConsumerGroupDto, CreateConsumerGroupsDto } from 'src/modules/browser/dto/stream.dto';
14+
import {ConsumerGroupDto, CreateConsumerGroupsDto, UpdateConsumerGroupDto} from 'src/modules/browser/dto/stream.dto';
1515

1616
@Injectable()
1717
export class ConsumerGroupService {
@@ -152,6 +152,50 @@ export class ConsumerGroupService {
152152
}
153153
}
154154

155+
/**
156+
* Updates last delivered id for Consumer Group
157+
* @param clientOptions
158+
* @param dto
159+
*/
160+
async updateGroup(
161+
clientOptions: IFindRedisClientInstanceByOptions,
162+
dto: UpdateConsumerGroupDto,
163+
): Promise<void> {
164+
try {
165+
this.logger.log('Updating consumer group.');
166+
167+
const exists = await this.browserTool.execCommand(
168+
clientOptions,
169+
BrowserToolKeysCommands.Exists,
170+
[dto.keyName],
171+
);
172+
173+
if (!exists) {
174+
return Promise.reject(new NotFoundException(ERROR_MESSAGES.KEY_NOT_EXIST));
175+
}
176+
177+
await this.browserTool.execCommand(
178+
clientOptions,
179+
BrowserToolStreamCommands.XGroupSetId,
180+
[dto.keyName, dto.name, dto.lastDeliveredId],
181+
);
182+
183+
this.logger.log('Consumer group was updated.');
184+
185+
return undefined;
186+
} catch (error) {
187+
if (error instanceof NotFoundException) {
188+
throw error;
189+
}
190+
191+
if (error?.message.includes(RedisErrorCodes.WrongType)) {
192+
throw new BadRequestException(error.message);
193+
}
194+
195+
throw catchAclError(error);
196+
}
197+
}
198+
155199
/**
156200
* Converts RESP response from Redis
157201
* [

0 commit comments

Comments
 (0)