Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/migrate-chat-getStarredMessages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@rocket.chat/meteor": minor
"@rocket.chat/rest-typings": minor
---

Add OpenAPI support for the chat.getStarredMessages API endpoint by migrating to a modern chained route definition syntax and utilizing AJV schemas for query and response validation.
99 changes: 72 additions & 27 deletions apps/meteor/app/api/server/v1/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import {
isChatSyncThreadsListProps,
isChatGetThreadMessagesProps,
isChatSyncThreadMessagesProps,
isChatGetStarredMessagesProps,
isChatGetDiscussionsProps,
validateBadRequestErrorResponse,
validateUnauthorizedErrorResponse,
Expand Down Expand Up @@ -558,6 +557,78 @@ const chatEndpoints = API.v1

return API.v1.success();
},
)
.get(
'chat.getStarredMessages',
{
authRequired: true,
query: ajv.compile<{ roomId: string; count?: number; offset?: number; sort?: string }>({
type: 'object',
properties: {
roomId: {
type: 'string',
minLength: 1,
},
count: {
type: 'number',
nullable: true,
},
offset: {
type: 'number',
nullable: true,
},
sort: {
type: 'string',
nullable: true,
},
},
required: ['roomId'],
additionalProperties: false,
}),
response: {
200: ajv.compile<{ messages: IMessage[]; count: number; offset: number; total: number }>({
type: 'object',
properties: {
messages: {
type: 'array',
items: {
$ref: '#/components/schemas/IMessage',
},
},
count: { type: 'number' },
offset: { type: 'number' },
total: { type: 'number' },
success: {
type: 'boolean',
enum: [true],
},
},
required: ['messages', 'count', 'offset', 'total', 'success'],
additionalProperties: false,
}),
400: validateBadRequestErrorResponse,
401: validateUnauthorizedErrorResponse,
},
},
async function action() {
const { roomId } = this.queryParams;
const { sort } = await this.parseJsonQuery();
const { offset, count } = await getPaginationItems(this.queryParams);

const messages = await findStarredMessages({
uid: this.userId,
roomId,
pagination: {
offset,
count,
sort,
},
});

messages.messages = await normalizeMessagesForUser(messages.messages, this.userId);

return API.v1.success(messages);
},
);

API.v1.addRoute(
Expand Down Expand Up @@ -981,32 +1052,6 @@ API.v1.addRoute(
},
);

API.v1.addRoute(
'chat.getStarredMessages',
{ authRequired: true, validateParams: isChatGetStarredMessagesProps },
{
async get() {
const { roomId } = this.queryParams;
const { sort } = await this.parseJsonQuery();
const { offset, count } = await getPaginationItems(this.queryParams);

const messages = await findStarredMessages({
uid: this.userId,
roomId,
pagination: {
offset,
count,
sort,
},
});

messages.messages = await normalizeMessagesForUser(messages.messages, this.userId);

return API.v1.success(messages);
},
},
);

API.v1.addRoute(
'chat.getDiscussions',
{ authRequired: true, validateParams: isChatGetDiscussionsProps },
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/tests/end-to-end/api/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3429,7 +3429,7 @@ describe('[Chat]', () => {
.expect(400)
.expect((res) => {
expect(res.body).to.have.property('success', false);
expect(res.body.errorType).to.be.equal('invalid-params');
expect(res.body.errorType).to.be.equal('error-invalid-params');
})
.end(done);
});
Expand Down
41 changes: 0 additions & 41 deletions packages/rest-typings/src/v1/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -496,39 +496,6 @@ const ChatGetMessageReadReceiptsSchema = {

export const isChatGetMessageReadReceiptsProps = ajv.compile<ChatGetMessageReadReceipts>(ChatGetMessageReadReceiptsSchema);

type GetStarredMessages = {
roomId: IRoom['_id'];
count?: number;
offset?: number;
sort?: string;
};

const GetStarredMessagesSchema = {
type: 'object',
properties: {
roomId: {
type: 'string',
minLength: 1,
},
count: {
type: 'number',
nullable: true,
},
offset: {
type: 'number',
nullable: true,
},
sort: {
type: 'string',
nullable: true,
},
},
required: ['roomId'],
additionalProperties: false,
};

export const isChatGetStarredMessagesProps = ajv.compile<GetStarredMessages>(GetStarredMessagesSchema);

Comment thread
sezallagwal marked this conversation as resolved.
type GetPinnedMessages = {
roomId: IRoom['_id'];
count?: number;
Expand Down Expand Up @@ -946,14 +913,6 @@ export type ChatEndpoints = {
'/v1/chat.getMessageReadReceipts': {
GET: (params: ChatGetMessageReadReceipts) => { receipts: IReadReceiptWithUser[] };
};
'/v1/chat.getStarredMessages': {
GET: (params: GetStarredMessages) => {
messages: IMessage[];
count: number;
offset: number;
total: number;
};
};
'/v1/chat.getPinnedMessages': {
GET: (params: GetPinnedMessages) => {
messages: IMessage[];
Expand Down