Skip to content

chore: migrate chat.reportMessage endpoint to new OpenAPI pattern with AJV validation#39230

Open
alchemycodess wants to merge 4 commits intoRocketChat:developfrom
alchemycodess:chore/migrate-chat-reportMessage-to-openapi
Open

chore: migrate chat.reportMessage endpoint to new OpenAPI pattern with AJV validation#39230
alchemycodess wants to merge 4 commits intoRocketChat:developfrom
alchemycodess:chore/migrate-chat-reportMessage-to-openapi

Conversation

@alchemycodess
Copy link

@alchemycodess alchemycodess commented Mar 1, 2026

Proposed changes (including videos or screenshots)

Migrated chat.reportMessage endpoint from the legacy addRoute pattern to the new chained API definition style with AJV validation and openAPI documentation support.

  • Replaced addRoute with new .post() chained pattern
  • Added AJV schema validation for request body (messageId, description)
  • Added response validation for 200, 400, 401
  • Removed manual validation checks since AJV handles them automatically
  • Removed old manual typings from rest-typings

Part of Rocket.Chat-Open-API#150

Issue(s)

RocketChat/Rocket.Chat-Open-API#150

Steps to test or reproduce

  1. Send a POST request to /api/v1/chat.reportMessage with valid messageId and description
  2. Verify it returns success
  3. Send without messageId or description and verify 400 error returns
  4. Check Swagger UI shows endpoint documentation correctly

Swagger UI - chat.reportMessage (200)
Screenshot 2026-03-02 164010

Swagger UI - chat.reportMessage (400)
Screenshot 2026-03-02 164400

Summary by CodeRabbit

  • Refactor
    • Migrated the chat.reportMessage endpoint to an updated OpenAPI/AJV validation pattern; reporting behavior for users remains unchanged.
  • Documentation
    • Added a migration note describing the change.
  • Chores
    • Recorded minor version bumps for two packages.

@alchemycodess alchemycodess requested review from a team as code owners March 1, 2026 22:56
@changeset-bot
Copy link

changeset-bot bot commented Mar 1, 2026

🦋 Changeset detected

Latest commit: 4c4ed70

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 41 packages
Name Type
@rocket.chat/meteor Minor
@rocket.chat/rest-typings Minor
@rocket.chat/api-client Patch
@rocket.chat/core-services Patch
@rocket.chat/ddp-client Patch
@rocket.chat/http-router Patch
@rocket.chat/models Patch
@rocket.chat/ui-contexts Major
@rocket.chat/web-ui-registration Major
@rocket.chat/account-service Patch
@rocket.chat/authorization-service Patch
@rocket.chat/ddp-streamer Patch
@rocket.chat/federation-matrix Patch
@rocket.chat/omnichannel-services Patch
@rocket.chat/presence Patch
rocketchat-services Patch
@rocket.chat/omnichannel-transcript Patch
@rocket.chat/presence-service Patch
@rocket.chat/queue-worker Patch
@rocket.chat/abac Patch
@rocket.chat/network-broker Patch
@rocket.chat/omni-core-ee Patch
@rocket.chat/livechat Patch
@rocket.chat/mock-providers Patch
@rocket.chat/cron Patch
@rocket.chat/instance-status Patch
@rocket.chat/omni-core Patch
@rocket.chat/server-fetch Patch
@rocket.chat/ui-client Major
@rocket.chat/media-calls Patch
@rocket.chat/uikit-playground Patch
@rocket.chat/fuselage-ui-kit Major
@rocket.chat/gazzodown Major
@rocket.chat/ui-avatar Major
@rocket.chat/ui-video-conf Major
@rocket.chat/ui-voip Major
@rocket.chat/core-typings Minor
@rocket.chat/apps Patch
@rocket.chat/model-typings Patch
@rocket.chat/license Patch
@rocket.chat/pdf-worker Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@dionisio-bot
Copy link
Contributor

dionisio-bot bot commented Mar 1, 2026

Looks like this PR is not ready to merge, because of the following issues:

  • This PR is missing the 'stat: QA assured' label
  • This PR is missing the required milestone or project

Please fix the issues and try again

If you have any trouble, please check the PR guidelines

@CLAassistant
Copy link

CLAassistant commented Mar 1, 2026

CLA assistant check
All committers have signed the CLA.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 1, 2026

Important

Review skipped

Too many files!

This PR contains 183 files, which is 33 over the limit of 150.

📥 Commits

Reviewing files that changed from the base of the PR and between 4a7717c and 4c4ed70.

📒 Files selected for processing (183)
  • apps/meteor/.scripts/run-ha.ts
  • apps/meteor/app/2fa/server/code/EmailCheck.ts
  • apps/meteor/app/2fa/server/code/index.ts
  • apps/meteor/app/api/server/ApiClass.ts
  • apps/meteor/app/api/server/helpers/parseJsonQuery.ts
  • apps/meteor/app/api/server/lib/isValidQuery.ts
  • apps/meteor/app/api/server/v1/calendar.ts
  • apps/meteor/app/api/server/v1/channels.ts
  • apps/meteor/app/api/server/v1/chat.ts
  • apps/meteor/app/api/server/v1/custom-sounds.ts
  • apps/meteor/app/api/server/v1/custom-user-status.ts
  • apps/meteor/app/api/server/v1/e2e.ts
  • apps/meteor/app/api/server/v1/groups.ts
  • apps/meteor/app/api/server/v1/im.ts
  • apps/meteor/app/api/server/v1/integrations.ts
  • apps/meteor/app/api/server/v1/roles.ts
  • apps/meteor/app/api/server/v1/rooms.ts
  • apps/meteor/app/api/server/v1/subscriptions.ts
  • apps/meteor/app/api/server/v1/videoConference.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/apps/server/bridges/activation.ts
  • apps/meteor/app/apps/server/bridges/livechat.ts
  • apps/meteor/app/apps/server/bridges/roles.ts
  • apps/meteor/app/apps/server/bridges/scheduler.ts
  • apps/meteor/app/apps/server/converters/threads.ts
  • apps/meteor/app/authorization/server/functions/getUsersInRole.ts
  • apps/meteor/app/authorization/server/functions/hasRole.ts
  • apps/meteor/app/autotranslate/server/googleTranslate.ts
  • apps/meteor/app/crowd/server/crowd.ts
  • apps/meteor/app/discussion/server/methods/createDiscussion.ts
  • apps/meteor/app/emoji/client/emojiParser.ts
  • apps/meteor/app/error-handler/server/lib/RocketChat.ErrorHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
  • apps/meteor/app/importer/server/classes/converters/RoomConverter.ts
  • apps/meteor/app/integrations/server/api/api.ts
  • apps/meteor/app/integrations/server/lib/isolated-vm/buildSandbox.ts
  • apps/meteor/app/integrations/server/lib/triggerHandler.ts
  • apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts
  • apps/meteor/app/lib/server/functions/createRoom.ts
  • apps/meteor/app/lib/server/functions/deleteMessage.ts
  • apps/meteor/app/lib/server/functions/isTheLastMessage.ts
  • apps/meteor/app/lib/server/functions/saveUser/saveNewUser.ts
  • apps/meteor/app/lib/server/functions/setEmail.ts
  • apps/meteor/app/lib/server/functions/setRealName.ts
  • apps/meteor/app/lib/server/functions/setUsername.ts
  • apps/meteor/app/lib/server/functions/updateGroupDMsName.ts
  • apps/meteor/app/lib/server/lib/processDirectEmail.ts
  • apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts
  • apps/meteor/app/lib/server/methods/saveSettings.ts
  • apps/meteor/app/lib/server/methods/setEmail.ts
  • apps/meteor/app/livechat/server/api/v1/room.ts
  • apps/meteor/app/livechat/server/api/v1/visitor.ts
  • apps/meteor/app/livechat/server/business-hour/filterBusinessHoursThatMustBeOpened.spec.ts
  • apps/meteor/app/livechat/server/lib/Helper.ts
  • apps/meteor/app/livechat/server/lib/RoutingManager.ts
  • apps/meteor/app/livechat/server/lib/closeRoom.ts
  • apps/meteor/app/livechat/server/lib/contacts/resolveContactConflicts.ts
  • apps/meteor/app/livechat/server/lib/departmentsLib.ts
  • apps/meteor/app/livechat/server/roomAccessValidator.compatibility.ts
  • apps/meteor/app/livechat/server/statistics/LivechatAgentActivityMonitor.ts
  • apps/meteor/app/message-pin/server/pinMessage.ts
  • apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts
  • apps/meteor/app/meteor-accounts-saml/server/lib/Utils.ts
  • apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts
  • apps/meteor/app/settings/server/SettingsRegistry.ts
  • apps/meteor/app/settings/server/functions/settings.mocks.ts
  • apps/meteor/app/settings/server/startup.ts
  • apps/meteor/app/slackbridge/server/RocketAdapter.ts
  • apps/meteor/app/slackbridge/server/SlackAPI.ts
  • apps/meteor/app/slackbridge/server/SlackAdapter.ts
  • apps/meteor/app/slashcommands-create/server/server.ts
  • apps/meteor/app/slashcommands-invite/server/server.ts
  • apps/meteor/app/slashcommands-open/client/client.ts
  • apps/meteor/app/statistics/server/functions/sendUsageReport.ts
  • apps/meteor/app/ui-message/client/ActionManager.ts
  • apps/meteor/app/ui/client/lib/UserAction.ts
  • apps/meteor/app/utils/client/getURL.ts
  • apps/meteor/app/utils/lib/getURL.ts
  • apps/meteor/app/utils/server/getURL.ts
  • apps/meteor/app/utils/server/getUserNotificationPreference.ts
  • apps/meteor/client/apps/orchestrator.ts
  • apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.spec.tsx
  • apps/meteor/client/components/Sidebar/SidebarNavigationItem.tsx
  • apps/meteor/client/definitions/global.d.ts
  • apps/meteor/client/hooks/notification/useNotification.ts
  • apps/meteor/client/lib/2fa/process2faReturn.ts
  • apps/meteor/client/lib/chats/data.ts
  • apps/meteor/client/lib/customOAuth/CustomOAuth.ts
  • apps/meteor/client/lib/e2ee/crypto/shared.ts
  • apps/meteor/client/lib/e2ee/rocketchat.e2e.room.ts
  • apps/meteor/client/lib/getDirtyFields.ts
  • apps/meteor/client/lib/streamer/streamer.ts
  • apps/meteor/client/lib/userData.ts
  • apps/meteor/client/lib/userStatuses.ts
  • apps/meteor/client/lib/utils/getUidDirectMessage.ts
  • apps/meteor/client/navbar/NavBarSettingsToolbar/hooks/useAdministrationMenu.spec.tsx
  • apps/meteor/client/providers/AuthenticationProvider/AuthenticationProvider.tsx
  • apps/meteor/client/router/index.tsx
  • apps/meteor/client/sidebar/RoomList/SidebarItemTemplateWithData.tsx
  • apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.spec.tsx
  • apps/meteor/client/views/admin/EditableSettingsContext.ts
  • apps/meteor/client/views/admin/customEmoji/CustomEmoji.tsx
  • apps/meteor/client/views/admin/customEmoji/EditCustomEmojiWithData.tsx
  • apps/meteor/client/views/admin/engagementDashboard/channels/useChannelsList.ts
  • apps/meteor/client/views/admin/engagementDashboard/messages/useMessageOrigins.ts
  • apps/meteor/client/views/admin/engagementDashboard/messages/useMessagesSent.ts
  • apps/meteor/client/views/admin/engagementDashboard/messages/useTopFivePopularChannels.ts
  • apps/meteor/client/views/admin/engagementDashboard/users/useActiveUsers.ts
  • apps/meteor/client/views/admin/engagementDashboard/users/useHourlyChatActivity.ts
  • apps/meteor/client/views/admin/engagementDashboard/users/useUsersByTimeOfTheDay.ts
  • apps/meteor/client/views/admin/engagementDashboard/users/useWeeklyChatActivity.ts
  • apps/meteor/client/views/admin/integrations/IntegrationsTable.tsx
  • apps/meteor/client/views/admin/integrations/outgoing/OutgoingWebhookForm.tsx
  • apps/meteor/client/views/admin/invites/InvitesPage.tsx
  • apps/meteor/client/views/audit/hooks/useAuditTab.ts
  • apps/meteor/client/views/e2e/EnterE2EPasswordModal/EnterE2EPasswordModal.spec.tsx
  • apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPage.tsx
  • apps/meteor/client/views/marketplace/helpers.ts
  • apps/meteor/client/views/marketplace/hooks/useAppInfo.ts
  • apps/meteor/client/views/modal/uikit/ModalBlock.tsx
  • apps/meteor/client/views/navigation/sidebar/RoomList/SidebarItemWithData.tsx
  • apps/meteor/client/views/navigation/sidepanel/SidePanelInternal.tsx
  • apps/meteor/client/views/omnichannel/components/Tags.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/OutboundMessageWizard.stories.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/forms/RecipientForm/RecipientForm.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/forms/RepliesForm/RepliesForm.spec.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/MessageStep.spec.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/MessageStep.stories.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/RecipientStep.spec.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/RecipientStep.stories.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/RepliesStep.spec.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/components/OutboundMessageWizard/steps/RepliesStep.stories.tsx
  • apps/meteor/client/views/omnichannel/components/outboundMessage/utils/template.spec.ts
  • apps/meteor/client/views/omnichannel/directory/hooks/useDisplayFilters.ts
  • apps/meteor/client/views/room/composer/hooks/useComposerBoxPopup.ts
  • apps/meteor/client/views/room/composer/hooks/useComposerBoxPopupQueries.ts
  • apps/meteor/client/views/room/composer/hooks/useMessageComposerIsArchived.ts
  • apps/meteor/client/views/room/composer/messageBox/MessageBoxActionsToolbar/MessageBoxActionsToolbar.tsx
  • apps/meteor/client/views/room/contextualBar/UserInfo/UserInfoActions.tsx
  • apps/meteor/client/views/room/contextualBar/VideoConference/hooks/useVideoConfOpenCall.tsx
  • apps/meteor/client/views/root/MainLayout/LayoutWithSidebar.spec.tsx
  • apps/meteor/client/views/root/hooks/loggedIn/useUnread.ts
  • apps/meteor/client/views/teams/ChannelDesertionTable/ChannelDesertionTable.tsx
  • apps/meteor/definition/externals/meteor/accounts-base.d.ts
  • apps/meteor/ee/app/livechat-enterprise/server/api/lib/inquiries.ts
  • apps/meteor/ee/app/livechat-enterprise/server/hooks/afterOnHold.ts
  • apps/meteor/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.ts
  • apps/meteor/ee/app/livechat-enterprise/server/lib/QueueInactivityMonitor.ts
  • apps/meteor/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.ts
  • apps/meteor/ee/app/livechat-enterprise/server/lib/debounceByParams.ts
  • apps/meteor/ee/server/api/audit.ts
  • apps/meteor/ee/server/api/engagementDashboard/channels.ts
  • apps/meteor/ee/server/api/engagementDashboard/messages.ts
  • apps/meteor/ee/server/api/sessions.ts
  • apps/meteor/ee/server/apps/communication/endpoints/appsCountHandler.ts
  • apps/meteor/ee/server/apps/communication/uikit.ts
  • apps/meteor/ee/server/configuration/saml.ts
  • apps/meteor/ee/server/lib/engagementDashboard/channels.ts
  • apps/meteor/ee/server/lib/engagementDashboard/messages.ts
  • apps/meteor/ee/server/lib/ldap/Manager.ts
  • apps/meteor/server/lib/dataExport/exportRoomMessagesToFile.ts
  • apps/meteor/server/lib/dataExport/sendEmail.ts
  • apps/meteor/server/lib/http/call.ts
  • apps/meteor/server/lib/i18n.ts
  • apps/meteor/server/lib/ldap/Manager.ts
  • apps/meteor/server/lib/rooms/roomTypes/private.ts
  • apps/meteor/server/lib/rooms/roomTypes/public.ts
  • apps/meteor/server/services/analytics/service.ts
  • apps/meteor/server/services/image/service.ts
  • apps/meteor/server/services/meteor/userReactivity.ts
  • apps/meteor/server/services/omnichannel-analytics/AgentData.ts
  • apps/meteor/server/services/omnichannel-analytics/service.ts
  • apps/meteor/server/services/team/service.ts
  • apps/meteor/server/startup/migrations/v294.ts
  • apps/meteor/server/startup/migrations/v304.ts
  • apps/meteor/server/startup/migrations/v307.ts
  • apps/meteor/server/ufs/ufs-server.ts
  • apps/meteor/server/ufs/ufs-store.ts
  • apps/meteor/tests/data/rooms.helper.ts
  • apps/meteor/tests/e2e/e2e-encryption/e2ee-legacy-format.spec.ts
  • apps/meteor/tests/e2e/page-objects/login.ts
  • apps/meteor/tests/unit/app/license/server/canEnableApp.spec.ts
  • apps/meteor/tests/unit/server/services/omnichannel-analytics/AgentData.tests.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

Reimplements the chat.reportMessage endpoint: removes its public REST typing and validator, adds a local ChatReportMessage type, AJV schema and compiler in the Meteor app, and wires a new POST chat.reportMessage route using the local validation and existing reportMessage logic.

Changes

Cohort / File(s) Summary
Changelog
.changeset/migrate-chat-reportMessage-to-openapi.md
Adds a changeset recording minor bumps for @rocket.chat/meteor and @rocket.chat/rest-typings, noting migration of chat.reportMessage to OpenAPI/AJV validation.
API endpoint (meteor app)
apps/meteor/app/api/server/v1/chat.ts
Removes previous import/use of external isChatReportMessageProps. Adds local ChatReportMessage type, ChatReportMessageSchema, isChatReportMessageLocalProps (AJV), and a new chat.reportMessage POST endpoint wired to the local validator with 200/400/401 responses; old route using the external validator removed.
REST typings
packages/rest-typings/src/v1/chat.ts
Removes the '/v1/chat.reportMessage' entry and associated ChatReportMessage type, schema, and isChatReportMessageProps validator from public REST typings.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant Client as Client
participant Server as Meteor API Server
participant Validator as AJV Validator
participant Handler as reportMessage Handler
participant DB as Database
Client->>Server: POST /v1/chat.reportMessage {messageId, description}
Server->>Validator: validate(body) using ChatReportMessageSchema (rgba(0,128,0,0.5))
alt valid
Validator-->>Server: ok
Server->>Handler: call reportMessage logic
Handler->>DB: record report / fetch message
DB-->>Handler: result
Handler-->>Server: success boolean
Server-->>Client: 200 {success:true}
else invalid
Validator-->>Server: validation error
Server-->>Client: 400 error

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

type: chore

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: migrating the chat.reportMessage endpoint to a new OpenAPI pattern with AJV validation, which aligns with the core modifications across all changed files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/rest-typings/src/v1/chat.ts">

<violation number="1" location="packages/rest-typings/src/v1/chat.ts:982">
P2: The chat.reportMessage endpoint was removed from ChatEndpoints without a replacement, while the request type/validator and runtime usage remain. This breaks typed REST client access and causes API contract drift.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/meteor/app/api/server/v1/chat.ts`:
- Around line 214-222: The schema ChatReportMessageSchema currently allows empty
strings for messageId and description; update the properties for "messageId" and
"description" to require non-empty values (e.g., add "minLength": 1 or a
non-empty pattern) so that inputs like { "messageId": "", "description": "" }
fail validation; ensure you modify the ChatReportMessageSchema object's
properties for messageId and description only, preserving required and
additionalProperties settings.

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3c30636 and 6d531c1.

📒 Files selected for processing (3)
  • .changeset/migrate-chat-reportMessage-to-openapi.md
  • apps/meteor/app/api/server/v1/chat.ts
  • packages/rest-typings/src/v1/chat.ts
💤 Files with no reviewable changes (1)
  • packages/rest-typings/src/v1/chat.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: cubic · AI code reviewer
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • apps/meteor/app/api/server/v1/chat.ts
🧠 Learnings (14)
📓 Common learnings
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38974
File: apps/meteor/app/api/server/v1/im.ts:220-221
Timestamp: 2026-02-24T19:09:09.561Z
Learning: In RocketChat/Rocket.Chat OpenAPI migration PRs for apps/meteor/app/api/server/v1 endpoints, maintainers prefer to avoid any logic changes; style-only cleanups (like removing inline comments) may be deferred to follow-ups to keep scope tight.
Learnt from: ggazzo
Repo: RocketChat/Rocket.Chat PR: 35995
File: apps/meteor/app/api/server/v1/rooms.ts:1107-1112
Timestamp: 2026-02-23T17:53:18.785Z
Learning: In Rocket.Chat PR reviews, maintain strict scope boundaries—when a PR is focused on a specific endpoint (e.g., rooms.favorite), avoid reviewing or suggesting changes to other endpoints that were incidentally refactored (e.g., rooms.invite) unless explicitly requested by maintainers.
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 0
File: :0-0
Timestamp: 2026-02-24T19:05:56.710Z
Learning: Rocket.Chat repo context: When a workspace manifest on develop already pins a dependency version (e.g., packages/web-ui-registration → "rocket.chat/ui-contexts": "27.0.1"), a lockfile change in a feature PR that upgrades only that dependency’s resolution is considered a manifest-driven sync and can be kept, preferably as a small "chore: sync yarn.lock with manifests" commit.
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38913
File: packages/ddp-client/src/legacy/types/SDKLegacy.ts:34-34
Timestamp: 2026-02-25T20:10:16.987Z
Learning: In the RocketChat/Rocket.Chat monorepo, packages/ddp-client and apps/meteor do not use TypeScript project references. Module augmentations in apps/meteor (e.g., declare module 'rocket.chat/rest-typings') are not visible when compiling packages/ddp-client in isolation, which is why legacy SDK methods that depend on OperationResult types for OpenAPI-migrated endpoints must remain commented out.
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 38219
File: packages/core-typings/src/cloud/Announcement.ts:5-6
Timestamp: 2026-01-17T01:51:47.764Z
Learning: In packages/core-typings/src/cloud/Announcement.ts, the AnnouncementSchema.createdBy field intentionally overrides IBannerSchema.createdBy (object with _id and optional username) with a string enum ['cloud', 'system'] to match existing runtime behavior. This is documented as technical debt with a FIXME comment at apps/meteor/app/cloud/server/functions/syncWorkspace/handleCommsSync.ts:53 and should not be flagged as an error until the runtime behavior is corrected.
📚 Learning: 2026-02-24T19:09:01.522Z
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38974
File: apps/meteor/app/api/server/v1/im.ts:220-221
Timestamp: 2026-02-24T19:09:01.522Z
Learning: In Rocket.Chat OpenAPI migration PRs for endpoints under apps/meteor/app/api/server/v1, avoid introducing logic changes. Only perform scope-tight changes that preserve behavior; style-only cleanups (e.g., removing inline comments) may be deferred to follow-ups to keep the migration PR focused.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-02-25T20:10:16.987Z
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38913
File: packages/ddp-client/src/legacy/types/SDKLegacy.ts:34-34
Timestamp: 2026-02-25T20:10:16.987Z
Learning: In the RocketChat/Rocket.Chat monorepo, packages/ddp-client and apps/meteor do not use TypeScript project references. Module augmentations in apps/meteor (e.g., declare module 'rocket.chat/rest-typings') are not visible when compiling packages/ddp-client in isolation, which is why legacy SDK methods that depend on OperationResult types for OpenAPI-migrated endpoints must remain commented out.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
  • .changeset/migrate-chat-reportMessage-to-openapi.md
📚 Learning: 2026-02-24T19:36:55.089Z
Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 38493
File: apps/meteor/tests/e2e/page-objects/fragments/home-content.ts:60-82
Timestamp: 2026-02-24T19:36:55.089Z
Learning: In RocketChat/Rocket.Chat e2e tests (apps/meteor/tests/e2e/page-objects/fragments/home-content.ts), thread message preview listitems do not have aria-roledescription="message", so lastThreadMessagePreview locator cannot be scoped to messageListItems (which filters for aria-roledescription="message"). It should remain scoped to page.getByRole('listitem') or mainMessageList.getByRole('listitem').

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-01-17T01:51:47.764Z
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 38219
File: packages/core-typings/src/cloud/Announcement.ts:5-6
Timestamp: 2026-01-17T01:51:47.764Z
Learning: In packages/core-typings/src/cloud/Announcement.ts, the AnnouncementSchema.createdBy field intentionally overrides IBannerSchema.createdBy (object with _id and optional username) with a string enum ['cloud', 'system'] to match existing runtime behavior. This is documented as technical debt with a FIXME comment at apps/meteor/app/cloud/server/functions/syncWorkspace/handleCommsSync.ts:53 and should not be flagged as an error until the runtime behavior is corrected.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-02-24T19:16:35.307Z
Learnt from: sampaiodiego
Repo: RocketChat/Rocket.Chat PR: 39003
File: apps/meteor/client/lib/chats/flows/sendMessage.ts:39-45
Timestamp: 2026-02-24T19:16:35.307Z
Learning: In apps/meteor/client/lib/chats/flows/sendMessage.ts, when sdk.call('sendMessage', ...) throws an error, the message is intentionally left with temp: true (not deleted or cleaned up) to support a future retry UI feature. This allows users to retry sending failed messages rather than losing them.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2025-11-19T18:20:07.720Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 37419
File: packages/i18n/src/locales/en.i18n.json:918-921
Timestamp: 2025-11-19T18:20:07.720Z
Learning: Repo: RocketChat/Rocket.Chat — i18n/formatting
Learning: This repository uses a custom message formatting parser in UI blocks/messages; do not assume standard Markdown rules. For keys like Call_ended_bold, Call_not_answered_bold, Call_failed_bold, and Call_transferred_bold in packages/i18n/src/locales/en.i18n.json, retain the existing single-asterisk emphasis unless maintainers request otherwise.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
  • .changeset/migrate-chat-reportMessage-to-openapi.md
📚 Learning: 2026-02-23T17:53:06.802Z
Learnt from: ggazzo
Repo: RocketChat/Rocket.Chat PR: 35995
File: apps/meteor/app/api/server/v1/rooms.ts:1107-1112
Timestamp: 2026-02-23T17:53:06.802Z
Learning: During PR reviews that touch endpoint files under apps/meteor/app/api/server/v1, enforce strict scope: if a PR targets a specific endpoint (e.g., rooms.favorite), do not propose changes to unrelated endpoints (e.g., rooms.invite) unless maintainers explicitly request them. Focus feedback on the touched endpoint's behavior, API surface, and related tests; avoid broad cross-endpoint changes in the same PR unless requested.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In the Rocket.Chat repository, do not reference Biome lint rules in code review feedback. Biome is not used even if biome.json exists; only reference Biome rules if there is explicit, project-wide usage documented. For TypeScript files, review lint implications without Biome guidance unless the project enables Biome rules.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In this repository (RocketChat/Rocket.Chat), Biome lint rules are not used even if a biome.json exists. When reviewing TypeScript files (e.g., packages/ui-voip/src/providers/useMediaSession.ts), ensure lint suggestions do not reference Biome-specific rules. Rely on general ESLint/TypeScript lint rules and project conventions instead.

Applied to files:

  • apps/meteor/app/api/server/v1/chat.ts
📚 Learning: 2026-02-24T19:09:09.561Z
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38974
File: apps/meteor/app/api/server/v1/im.ts:220-221
Timestamp: 2026-02-24T19:09:09.561Z
Learning: In RocketChat/Rocket.Chat OpenAPI migration PRs for apps/meteor/app/api/server/v1 endpoints, maintainers prefer to avoid any logic changes; style-only cleanups (like removing inline comments) may be deferred to follow-ups to keep scope tight.

Applied to files:

  • .changeset/migrate-chat-reportMessage-to-openapi.md
📚 Learning: 2026-02-24T19:05:56.710Z
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 0
File: :0-0
Timestamp: 2026-02-24T19:05:56.710Z
Learning: Rocket.Chat repo context: When a workspace manifest on develop already pins a dependency version (e.g., packages/web-ui-registration → "rocket.chat/ui-contexts": "27.0.1"), a lockfile change in a feature PR that upgrades only that dependency’s resolution is considered a manifest-driven sync and can be kept, preferably as a small "chore: sync yarn.lock with manifests" commit.

Applied to files:

  • .changeset/migrate-chat-reportMessage-to-openapi.md
📚 Learning: 2026-01-08T15:03:59.621Z
Learnt from: d-gubert
Repo: RocketChat/Rocket.Chat PR: 38068
File: apps/meteor/tests/data/apps/app-packages/README.md:14-16
Timestamp: 2026-01-08T15:03:59.621Z
Learning: For the RocketChat/Rocket.Chat repository, do not analyze or report formatting issues (such as hard tabs vs spaces, line breaks, etc.). The project relies on automated linting tools to enforce formatting standards.

Applied to files:

  • .changeset/migrate-chat-reportMessage-to-openapi.md
📚 Learning: 2026-02-10T16:32:49.806Z
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 38528
File: apps/meteor/client/startup/roles.ts:14-14
Timestamp: 2026-02-10T16:32:49.806Z
Learning: In Rocket.Chat's Meteor client code, DDP streams use EJSON which automatically deserializes Date objects. Stream handlers (e.g., sdk.stream()) receive Date fields as Date objects directly and do not require manual conversion using `new Date()`. Only REST API responses require manual date conversion because they return plain JSON where dates are serialized as strings.

Applied to files:

  • .changeset/migrate-chat-reportMessage-to-openapi.md
🔇 Additional comments (2)
.changeset/migrate-chat-reportMessage-to-openapi.md (1)

1-6: Changeset entry is aligned with the migration scope.

The package bumps and summary text are consistent with the endpoint migration described in this PR.

apps/meteor/app/api/server/v1/chat.ts (1)

370-392: Endpoint migration is clean and scope-focused.

The new chained .post('chat.reportMessage') route correctly wires auth, AJV body validation, and 200/400/401 response schemas while keeping the core reportMessage(...) flow intact.

Comment on lines +214 to +222
const ChatReportMessageSchema = {
type: 'object',
properties: {
messageId: { type: 'string' },
description: { type: 'string' },
},
required: ['messageId', 'description'],
additionalProperties: false,
};
Copy link
Contributor

@coderabbitai coderabbitai bot Mar 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Preserve non-empty validation for messageId and description.

Line 217 and Line 218 allow empty strings, so { "messageId": "", "description": "" } passes schema validation. That relaxes input checks during a migration that should keep behavior unchanged.

Proposed minimal fix
 const ChatReportMessageSchema = {
 	type: 'object',
 	properties: {
-		messageId: { type: 'string' },
-		description: { type: 'string' },
+		messageId: { type: 'string', minLength: 1 },
+		description: { type: 'string', minLength: 1 },
 	},
 	required: ['messageId', 'description'],
 	additionalProperties: false,
 };

Based on learnings: In Rocket.Chat OpenAPI migration PRs for endpoints under apps/meteor/app/api/server/v1, avoid introducing logic changes and keep behavior preserved.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const ChatReportMessageSchema = {
type: 'object',
properties: {
messageId: { type: 'string' },
description: { type: 'string' },
},
required: ['messageId', 'description'],
additionalProperties: false,
};
const ChatReportMessageSchema = {
type: 'object',
properties: {
messageId: { type: 'string', minLength: 1 },
description: { type: 'string', minLength: 1 },
},
required: ['messageId', 'description'],
additionalProperties: false,
};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/meteor/app/api/server/v1/chat.ts` around lines 214 - 222, The schema
ChatReportMessageSchema currently allows empty strings for messageId and
description; update the properties for "messageId" and "description" to require
non-empty values (e.g., add "minLength": 1 or a non-empty pattern) so that
inputs like { "messageId": "", "description": "" } fail validation; ensure you
modify the ChatReportMessageSchema object's properties for messageId and
description only, preserving required and additionalProperties settings.

✅ Addressed in commit f2c43fd

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for the reportMessage function implementation to check if it validates empty strings
ast-grep --pattern 'function reportMessage($$$) { $$$ }'

# Also search with async/export patterns
ast-grep --pattern 'export async function reportMessage($$$) { $$$ }'
ast-grep --pattern 'export const reportMessage = ($$$) => { $$$ }'

# Use rg to find the function definition and see surrounding context
rg -A 20 'export.*reportMessage.*=|function reportMessage' --type ts

Length of output: 1546


@ahmed-n-abdeltwab Actually, adding minLength validation is in scope for this migration! Here's why:

The original reportMessage function (which the legacy endpoint called) validates the description:

if (!description.trim()) {
    throw new Error('error-invalid-description');
}

So the legacy endpoint did reject empty descriptions — it just happened later in the call chain rather than at schema validation. Adding minLength: 1 preserves this existing behavior by moving the validation earlier (to the schema layer), which is the correct approach for OpenAPI migrations.

Result: Empty strings were already being rejected before your PR, so adding minLength: 1 maintains the original behavior rather than introducing a new restriction. This aligns with keeping the migration scope tight and behavior-preserving. ✅

🐰


✏️ Learnings added
Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 39230
File: apps/meteor/app/api/server/v1/chat.ts:214-222
Timestamp: 2026-03-03T11:11:45.505Z
Learning: In apps/meteor/server/lib/moderation/reportMessage.ts, the reportMessage function validates that description is not empty or whitespace-only with `if (!description.trim())`. When migrating the chat.reportMessage endpoint to OpenAPI, adding minLength validation to the schema preserves this existing behavior.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: sampaiodiego
Repo: RocketChat/Rocket.Chat PR: 39003
File: apps/meteor/client/lib/chats/flows/sendMessage.ts:39-45
Timestamp: 2026-02-24T19:16:35.307Z
Learning: In apps/meteor/client/lib/chats/flows/sendMessage.ts, when sdk.call('sendMessage', ...) throws an error, the message is intentionally left with temp: true (not deleted or cleaned up) to support a future retry UI feature. This allows users to retry sending failed messages rather than losing them.

Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38974
File: apps/meteor/app/api/server/v1/im.ts:220-221
Timestamp: 2026-02-24T19:09:01.522Z
Learning: In Rocket.Chat OpenAPI migration PRs for endpoints under apps/meteor/app/api/server/v1, avoid introducing logic changes. Only perform scope-tight changes that preserve behavior; style-only cleanups (e.g., removing inline comments) may be deferred to follow-ups to keep the migration PR focused.

Learnt from: ggazzo
Repo: RocketChat/Rocket.Chat PR: 35995
File: apps/meteor/app/api/server/v1/rooms.ts:1107-1112
Timestamp: 2026-02-23T17:53:06.802Z
Learning: During PR reviews that touch endpoint files under apps/meteor/app/api/server/v1, enforce strict scope: if a PR targets a specific endpoint (e.g., rooms.favorite), do not propose changes to unrelated endpoints (e.g., rooms.invite) unless maintainers explicitly request them. Focus feedback on the touched endpoint's behavior, API surface, and related tests; avoid broad cross-endpoint changes in the same PR unless requested.

Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 38493
File: apps/meteor/tests/e2e/page-objects/fragments/home-content.ts:60-82
Timestamp: 2026-02-24T19:36:55.089Z
Learning: In RocketChat/Rocket.Chat e2e tests (apps/meteor/tests/e2e/page-objects/fragments/home-content.ts), thread message preview listitems do not have aria-roledescription="message", so lastThreadMessagePreview locator cannot be scoped to messageListItems (which filters for aria-roledescription="message"). It should remain scoped to page.getByRole('listitem') or mainMessageList.getByRole('listitem').

Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 38219
File: packages/core-typings/src/cloud/Announcement.ts:5-6
Timestamp: 2026-01-17T01:51:47.764Z
Learning: In packages/core-typings/src/cloud/Announcement.ts, the AnnouncementSchema.createdBy field intentionally overrides IBannerSchema.createdBy (object with _id and optional username) with a string enum ['cloud', 'system'] to match existing runtime behavior. This is documented as technical debt with a FIXME comment at apps/meteor/app/cloud/server/functions/syncWorkspace/handleCommsSync.ts:53 and should not be flagged as an error until the runtime behavior is corrected.

Learnt from: MartinSchoeler
Repo: RocketChat/Rocket.Chat PR: 37408
File: apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.tsx:53-69
Timestamp: 2025-11-10T19:06:20.146Z
Learning: In the Rocket.Chat repository, do not provide suggestions or recommendations about code sections marked with TODO comments. The maintainers have already identified these as future work and external reviewers lack the full context about implementation plans and timing.

Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 38913
File: packages/ddp-client/src/legacy/types/SDKLegacy.ts:34-34
Timestamp: 2026-02-25T20:10:16.987Z
Learning: In the RocketChat/Rocket.Chat monorepo, packages/ddp-client and apps/meteor do not use TypeScript project references. Module augmentations in apps/meteor (e.g., declare module 'rocket.chat/rest-typings') are not visible when compiling packages/ddp-client in isolation, which is why legacy SDK methods that depend on OperationResult types for OpenAPI-migrated endpoints must remain commented out.

Learnt from: ahmed-n-abdeltwab
Repo: RocketChat/Rocket.Chat PR: 0
File: :0-0
Timestamp: 2026-02-24T19:05:56.710Z
Learning: Rocket.Chat repo context: When a workspace manifest on develop already pins a dependency version (e.g., packages/web-ui-registration → "rocket.chat/ui-contexts": "27.0.1"), a lockfile change in a feature PR that upgrades only that dependency’s resolution is considered a manifest-driven sync and can be kept, preferably as a small "chore: sync yarn.lock with manifests" commit.

Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In the Rocket.Chat repository, do not reference Biome lint rules in code review feedback. Biome is not used even if biome.json exists; only reference Biome rules if there is explicit, project-wide usage documented. For TypeScript files, review lint implications without Biome guidance unless the project enables Biome rules.

Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In this repository (RocketChat/Rocket.Chat), Biome lint rules are not used even if a biome.json exists. When reviewing TypeScript files (e.g., packages/ui-voip/src/providers/useMediaSession.ts), ensure lint suggestions do not reference Biome-specific rules. Rely on general ESLint/TypeScript lint rules and project conventions instead.

Copy link
Contributor

@ahmed-n-abdeltwab ahmed-n-abdeltwab left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to fix these AI issues. Since it isn't always right, try verifying its answers by asking, 'Are you sure?' or 'Can you explain the reasoning here?' Usually, it'll either admit to a mistake or explain itself more clearly

Copy link
Contributor

@ahmed-n-abdeltwab ahmed-n-abdeltwab left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but you just need to resolve the small issues that I've raised

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You moved the JSON schema, Ajv validation, and interface from rest-typings to chat.ts, but you should also remove the chat.reportMessage related code (the schema, Ajv, and interface) from rest-typings. Since it’s no longer needed there and we are making Meteor the single source of truth for the API, we need to ensure everything is moved to the Meteor file and fully removed from rest-typings to avoid redundancy.

Comment on lines +384 to +392
400: validateBadRequestErrorResponse,
401: validateUnauthorizedErrorResponse,
},
},
async function action() {
const { messageId, description } = this.bodyParams;
await reportMessage(messageId, description, this.userId);
return API.v1.success();
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You have removed the old checks for messageId and description because they are now handled by the body schema before entering the action function. That makes sense, nice

const isChatUnpinMessageProps = ajv.compile<ChatUnpinMessage>(ChatUnpinMessageSchema);

type ChatReportMessage = {
messageId: string;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this was IMessage['_id'] in rest-typings. I know it's technically just a string, but we should keep the code consistent with how it was defined in rest-typings

@ahmed-n-abdeltwab
Copy link
Contributor

@ggazzo 👍

@alchemycodess
Copy link
Author

@ahmed-n-abdeltwab , I've addressed all the review feedback:

  • Added minLength: 1 to messageId and description
  • Changed messageId type to IMessage['_id']
  • Removed all chat.reportMessage related code from rest-typings
  • Resolved merge conflicts
    Ready for review.

declare module '@rocket.chat/rest-typings' {
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface
interface Endpoints extends ChatEndpoints {}
interface Endpoints extends ChatEndpoints { }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to run this command locally: yarn eslint:fix to fix the formatting problems in the file

@alchemycodess alchemycodess requested review from a team as code owners March 3, 2026 20:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants