feat: trade fish for standing #681

Merged
Sainan merged 2 commits from fish-standing into main 2025-01-02 15:10:18 -08:00
Owner

Closes #664

Closes #664
coderabbitai[bot] commented 2025-01-01 21:51:38 -08:00 (Migrated from github.com)
Author
Owner

Walkthrough

The pull request introduces two primary changes. First, there is an update to the warframe-public-export-plus dependency version in the package.json file, upgrading from version ^0.5.17 to ^0.5.18. Second, and more substantially, the fishmongerController in src/controllers/api/fishmongerController.ts has been significantly refactored. The controller now handles fish processing with enhanced flexibility, supporting both dissection and syndicate standing updates based on query parameters. The changes modify the logic for processing fish items, including handling dissection parts and calculating syndicate standing changes dynamically.

Assessment against linked issues

Objective Addressed Explanation
Provide fish for standing [#664]

The changes in the fishmongerController directly address the objective of providing fish for standing by implementing a mechanism to calculate and update syndicate standing based on fish items. The controller now supports processing fish with syndicate tags and standing changes, which aligns with the issue's description of enabling standing-related functionality for the fishmonger endpoint.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.
<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough The pull request introduces two primary changes. First, there is an update to the `warframe-public-export-plus` dependency version in the `package.json` file, upgrading from version `^0.5.17` to `^0.5.18`. Second, and more substantially, the `fishmongerController` in `src/controllers/api/fishmongerController.ts` has been significantly refactored. The controller now handles fish processing with enhanced flexibility, supporting both dissection and syndicate standing updates based on query parameters. The changes modify the logic for processing fish items, including handling dissection parts and calculating syndicate standing changes dynamically. ## Assessment against linked issues | Objective | Addressed | Explanation | |-----------|-----------|-------------| | Provide fish for standing [#664] | ✅ | | The changes in the `fishmongerController` directly address the objective of providing fish for standing by implementing a mechanism to calculate and update syndicate standing based on fish items. The controller now supports processing fish with syndicate tags and standing changes, which aligns with the issue's description of enabling standing-related functionality for the fishmonger endpoint. <!-- walkthrough_end --> <!-- internal state start --> <!-- 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 --> <!-- internal state end --> <!-- tips_start --> --- Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? <details> <summary>❤️ Share</summary> - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code) </details> <details> <summary>🪧 Tips</summary> ### Chat There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai): - Review comments: Directly reply to a review comment made by CodeRabbit. Example: - `I pushed a fix in commit <commit_id>, please review it.` - `Generate unit testing code for this file.` - `Open a follow-up GitHub issue for this discussion.` - Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples: - `@coderabbitai generate unit testing code for this file.` - `@coderabbitai modularize this function.` - PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples: - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.` - `@coderabbitai read src/utils.ts and generate unit testing code.` - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.` - `@coderabbitai help me debug CodeRabbit configuration file.` Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. ### CodeRabbit Commands (Invoked using PR comments) - `@coderabbitai pause` to pause the reviews on a PR. - `@coderabbitai resume` to resume the paused reviews. - `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository. - `@coderabbitai full review` to do a full review from scratch and review all the files again. - `@coderabbitai summary` to regenerate the summary of the PR. - `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR. ([Beta](https://docs.coderabbit.ai/early-access#beta)) - `@coderabbitai resolve` resolve all the CodeRabbit review comments. - `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository. - `@coderabbitai help` to get help. ### Other keywords and placeholders - Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed. - Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description. - Add `@coderabbitai` anywhere in the PR title to generate the title automatically. ### Documentation and Community - Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit. - Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback. - Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements. </details> <!-- tips_end -->
coderabbitai[bot] (Migrated from github.com) reviewed 2025-01-01 21:54:44 -08:00
coderabbitai[bot] (Migrated from github.com) left a comment
Author
Owner

Actionable comments posted: 2

🧹 Nitpick comments (3)
src/controllers/api/fishmongerController.ts (3)

13-14: Separate concerns for clarity
Defining both syndicateTag and standingChange at the top-level of the loop is fine, but consider moving them closer to the relevant logic for clarity. This can make the code more self-explanatory and reduce the chance of accidental misuse.


33-43: Add boundary checks for standing updates
When adjusting or adding standing, ensure that negative or overly large values don’t break game logic. You can add checks to cap standing at specific bounds or handle negative standing more purposefully.


48-50: Conditionally include SyndicateTag and StandingChange
Currently, SyndicateTag and StandingChange are returned even if no dissect or standing update was requested. Consider omitting them if they don’t apply, to avoid confusion for API consumers.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 48aa145a20 and 99f01958db.

Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (2)
  • package.json (1 hunks)
  • src/controllers/api/fishmongerController.ts (1 hunks)
🔇 Additional comments (2)
src/controllers/api/fishmongerController.ts (1)

26-28: Validate fields for standing calculation
Using fishData.syndicateTag! and fishData.standingBonus! relies on them always being present. If any fish lacks syndicateTag or standingBonus, this code will break. Consider adding default values or error checks.

package.json (1)

19-19: Check compatibility with the new dependency version
Updating to "warframe-public-export-plus": "^0.5.18" is a minor release, but confirm if there are any breaking changes or additional features you need to leverage.

Verification successful

Let me search for more specific information about the version changes.


Let me check the actual version change.


Minor version update appears safe to use

Based on the analysis:

  1. The package is extensively used across the codebase for importing various Warframe-related data exports (enemies, resources, recipes, etc.)
  2. No type errors were found in the codebase related to these imports
  3. The imports follow a consistent pattern and are well-structured
  4. The package is used for data exports rather than complex functionality, which reduces the risk of breaking changes

Since this is a minor version update (^0.5.18) and the codebase shows no immediate compatibility issues with the types and exports being used, the update should be safe. The semantic versioning convention suggests that minor updates should be backward compatible.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there's a changelog or release notes highlighting necessary changes
rg -A 10 'warframe-public-export-plus'  # Searching across the repo for references 

Length of output: 17263


Script:

#!/bin/bash
# Check git history for changes in package.json
git log -p package.json | grep -A 5 "warframe-public-export-plus"

# Let's also check if there are any TypeScript imports that might be affected
ast-grep --pattern 'import { $$$ } from "warframe-public-export-plus"'

Length of output: 5559


Script:

#!/bin/bash
# Let's find the previous version in git history
git log -p package.json | grep -B 5 -A 5 '"warframe-public-export-plus":'

# Also check if there are any breaking changes in the types by looking for type errors
rg "TS2305|TS2307|TS2339" -A 5

Length of output: 32

**Actionable comments posted: 2** <details> <summary>🧹 Nitpick comments (3)</summary><blockquote> <details> <summary>src/controllers/api/fishmongerController.ts (3)</summary><blockquote> `13-14`: **Separate concerns for clarity** Defining both `syndicateTag` and `standingChange` at the top-level of the loop is fine, but consider moving them closer to the relevant logic for clarity. This can make the code more self-explanatory and reduce the chance of accidental misuse. --- `33-43`: **Add boundary checks for standing updates** When adjusting or adding standing, ensure that negative or overly large values don’t break game logic. You can add checks to cap standing at specific bounds or handle negative standing more purposefully. --- `48-50`: **Conditionally include `SyndicateTag` and `StandingChange`** Currently, `SyndicateTag` and `StandingChange` are returned even if no dissect or standing update was requested. Consider omitting them if they don’t apply, to avoid confusion for API consumers. </blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used: .coderabbit.yaml** **Review profile: CHILL** **Plan: Pro** <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 48aa145a202624270600e73d2479e1a1c6fd7220 and 99f01958db0a9c8ae3e7456c61efc297b0dc9240. </details> <details> <summary>⛔ Files ignored due to path filters (1)</summary> * `package-lock.json` is excluded by `!**/package-lock.json` </details> <details> <summary>📒 Files selected for processing (2)</summary> * `package.json` (1 hunks) * `src/controllers/api/fishmongerController.ts` (1 hunks) </details> <details> <summary>🔇 Additional comments (2)</summary><blockquote> <details> <summary>src/controllers/api/fishmongerController.ts (1)</summary> `26-28`: **Validate fields for standing calculation** Using `fishData.syndicateTag!` and `fishData.standingBonus!` relies on them always being present. If any fish lacks `syndicateTag` or `standingBonus`, this code will break. Consider adding default values or error checks. </details> <details> <summary>package.json (1)</summary> `19-19`: **Check compatibility with the new dependency version** Updating to `"warframe-public-export-plus": "^0.5.18"` is a minor release, but confirm if there are any breaking changes or additional features you need to leverage. <details> <summary>✅ Verification successful</summary> Let me search for more specific information about the version changes. --- Let me check the actual version change. --- **Minor version update appears safe to use** Based on the analysis: 1. The package is extensively used across the codebase for importing various Warframe-related data exports (enemies, resources, recipes, etc.) 2. No type errors were found in the codebase related to these imports 3. The imports follow a consistent pattern and are well-structured 4. The package is used for data exports rather than complex functionality, which reduces the risk of breaking changes Since this is a minor version update (^0.5.18) and the codebase shows no immediate compatibility issues with the types and exports being used, the update should be safe. The semantic versioning convention suggests that minor updates should be backward compatible. </details> <details> <summary>🏁 Scripts executed</summary> The following scripts were executed for the analysis: Script: ```shell #!/bin/bash # Check if there's a changelog or release notes highlighting necessary changes rg -A 10 'warframe-public-export-plus' # Searching across the repo for references ``` Length of output: 17263 --- Script: ```shell #!/bin/bash # Check git history for changes in package.json git log -p package.json | grep -A 5 "warframe-public-export-plus" # Let's also check if there are any TypeScript imports that might be affected ast-grep --pattern 'import { $$$ } from "warframe-public-export-plus"' ``` Length of output: 5559 --- Script: ```shell #!/bin/bash # Let's find the previous version in git history git log -p package.json | grep -B 5 -A 5 '"warframe-public-export-plus":' # Also check if there are any breaking changes in the types by looking for type errors rg "TS2305|TS2307|TS2339" -A 5 ``` Length of output: 32 </details> </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -23,1 +22,4 @@
} else {
miscItemChanges.push({ ItemType: part.ItemType, ItemCount: part.ItemCount * fish.ItemCount });
}
}
coderabbitai[bot] (Migrated from github.com) commented 2025-01-01 21:54:43 -08:00
Author
Owner

💡 Codebase verification

Based on the code analysis, I can now provide a final response:

Validation needed for fishData access

The code immediately uses fishData.dissectionParts without checking if fishData exists, which could cause runtime errors. The validation is particularly important because:

  1. ExportResources is accessed with a dynamic key fish.ItemType
  2. The value is immediately used to access dissectionParts property
  3. Other services like purchaseService and inventoryService implement existence checks with in operator before accessing ExportResources
  • src/controllers/api/fishmongerController.ts:16: Add null check before accessing fishData
🔗 Analysis chain

Verify existence of fishData
Accessing ExportResources[fish.ItemType] without any check can cause errors if fish.ItemType is missing from the export or is undefined. Consider adding a validation step or fallback logic.

+ if (!fishData) {
+   throw new Error(\`Missing fish data for type: \${fish.ItemType}\`);
+ }

Let me gather information about the ExportResources and its usage to verify this concern.


Let me analyze the usage of ExportResources to understand if we need validation. I'll search for its usage patterns and error handling.

🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Find the definition and structure of ExportResources
ast-grep --pattern 'const ExportResources = $_'

# Also search for any type definitions or interfaces related to it
rg "ExportResources" -A 5 -B 5

# Look for ItemType usage in the codebase
rg "ItemType" -A 2 -B 2

Length of output: 87233


Script:

#!/bin/bash
# Look for ExportResources usage patterns and error handling
ast-grep --pattern 'ExportResources[$_]'

# Look for any error handling around ExportResources
rg "ExportResources.*\{" -A 3 -B 3

# Look for the specific fishmonger controller implementation
rg -A 10 -B 10 "fishmongerController"

Length of output: 11028

_:bulb: Codebase verification_ Based on the code analysis, I can now provide a final response: **Validation needed for `fishData` access** The code immediately uses `fishData.dissectionParts` without checking if `fishData` exists, which could cause runtime errors. The validation is particularly important because: 1. `ExportResources` is accessed with a dynamic key `fish.ItemType` 2. The value is immediately used to access `dissectionParts` property 3. Other services like `purchaseService` and `inventoryService` implement existence checks with `in` operator before accessing `ExportResources` - `src/controllers/api/fishmongerController.ts:16`: Add null check before accessing `fishData` <details> <summary>🔗 Analysis chain</summary> **Verify existence of `fishData`** Accessing `ExportResources[fish.ItemType]` without any check can cause errors if `fish.ItemType` is missing from the export or is undefined. Consider adding a validation step or fallback logic. ```diff + if (!fishData) { + throw new Error(\`Missing fish data for type: \${fish.ItemType}\`); + } ``` --- Let me gather information about the `ExportResources` and its usage to verify this concern. --- Let me analyze the usage of `ExportResources` to understand if we need validation. I'll search for its usage patterns and error handling. </details> <details> <summary>🏁 Scripts executed</summary> The following scripts were executed for the analysis: Error: No shell scripts found --- Script: ```shell #!/bin/bash # Find the definition and structure of ExportResources ast-grep --pattern 'const ExportResources = $_' # Also search for any type definitions or interfaces related to it rg "ExportResources" -A 5 -B 5 # Look for ItemType usage in the codebase rg "ItemType" -A 2 -B 2 ``` Length of output: 87233 --- Script: ```shell #!/bin/bash # Look for ExportResources usage patterns and error handling ast-grep --pattern 'ExportResources[$_]' # Look for any error handling around ExportResources rg "ExportResources.*\{" -A 3 -B 3 # Look for the specific fishmonger controller implementation rg -A 10 -B 10 "fishmongerController" ``` Length of output: 11028 </details> <!-- This is an auto-generated comment by CodeRabbit -->
@ -25,3 +30,4 @@
miscItemChanges.push({ ItemType: fish.ItemType, ItemCount: fish.ItemCount * -1 });
}
addMiscItems(inventory, miscItemChanges);
if (standingChange && syndicateTag) {
coderabbitai[bot] (Migrated from github.com) commented 2025-01-01 21:54:44 -08:00
Author
Owner

💡 Codebase verification

Based on the code analysis, I can now provide the final response:

The non-null assertion on dissectionParts is potentially unsafe

The code shows that fishData comes from ExportResources[fish.ItemType] which is imported from warframe-public-export-plus. The non-null assertion (!) on dissectionParts is risky because:

  • There's no type checking or null check before accessing dissectionParts
  • The property is only accessed when dissect === "1", suggesting it's an optional operation
  • The same pattern of using non-null assertions on optional properties is seen with syndicateTag! and standingBonus! in the else branch

Recommend implementing the suggested null-safe approach:

if (req.query.dissect === "1") {
    const parts = fishData.dissectionParts || [];
    for (const part of parts) {
        // ...
    }
}
🔗 Analysis chain

Ensure safe usage of optional dissectionParts
The non-null assertion fishData.dissectionParts! assumes that dissectionParts is always defined. If there's a possibility of missing or empty dissection parts for new fish types, handle it gracefully to avoid runtime errors.

 if (req.query.dissect === "1") {
-   for (const part of fishData.dissectionParts!) {
+   const parts = fishData.dissectionParts || [];
+   for (const part of parts) {
       ...
   }
 }

Let me verify the safety concerns around the dissectionParts usage by examining the codebase.


Let me search for more context about the ExportResources type and its usage.


Let me check for the actual data structure and initialization of ExportResources.


Let me check the complete fishmongerController for more context about how dissectionParts is used.

🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Find the type definition or interface for fishData to understand the dissectionParts property
ast-grep --pattern 'interface $_ {
  $$$
  dissectionParts$_
  $$$
}'

# Also search for type declarations
ast-grep --pattern 'type $_ = {
  $$$
  dissectionParts$_
  $$$
}'

# Look for other usages of dissectionParts to understand the pattern
rg "dissectionParts" -A 2 -B 2

Length of output: 669


Script:

#!/bin/bash
# Find the ExportResources type/interface definition
ast-grep --pattern 'type ExportResources = {
  $$$
}'

ast-grep --pattern 'interface ExportResources {
  $$$
}'

# Look for the ExportResources declaration/initialization
rg "ExportResources.*=" -A 5

# Look for any fish-related types or interfaces
ast-grep --pattern 'interface $Fish {
  $$$
}'

ast-grep --pattern 'type $Fish = {
  $$$
}'

Length of output: 1806


Script:

#!/bin/bash
# Look for files that might contain ExportResources data
fd "resources|exports" --type f

# Look for dissectionParts initialization or usage in resource files
rg -l "dissectionParts.*[=:]" 

# Check for any fish or dissection related constants or configurations
rg -l "fish.*dissect|dissect.*fish" -i

Length of output: 150


Script:

#!/bin/bash
# Get the full content of fishmongerController
cat src/controllers/api/fishmongerController.ts

# Look for any test files related to fishmonger
fd "fishmonger.*test" --type f

# Look for any resource files with .json extension that might contain fish data
fd "\.(json|ts)$" --type f | rg -i "fish|resource"

Length of output: 2748

_:bulb: Codebase verification_ Based on the code analysis, I can now provide the final response: **The non-null assertion on `dissectionParts` is potentially unsafe** The code shows that `fishData` comes from `ExportResources[fish.ItemType]` which is imported from `warframe-public-export-plus`. The non-null assertion (`!`) on `dissectionParts` is risky because: - There's no type checking or null check before accessing `dissectionParts` - The property is only accessed when `dissect === "1"`, suggesting it's an optional operation - The same pattern of using non-null assertions on optional properties is seen with `syndicateTag!` and `standingBonus!` in the else branch Recommend implementing the suggested null-safe approach: ```typescript if (req.query.dissect === "1") { const parts = fishData.dissectionParts || []; for (const part of parts) { // ... } } ``` <details> <summary>🔗 Analysis chain</summary> **Ensure safe usage of optional `dissectionParts`** The non-null assertion `fishData.dissectionParts!` assumes that `dissectionParts` is always defined. If there's a possibility of missing or empty dissection parts for new fish types, handle it gracefully to avoid runtime errors. ```diff if (req.query.dissect === "1") { - for (const part of fishData.dissectionParts!) { + const parts = fishData.dissectionParts || []; + for (const part of parts) { ... } } ``` --- Let me verify the safety concerns around the `dissectionParts` usage by examining the codebase. --- Let me search for more context about the `ExportResources` type and its usage. --- Let me check for the actual data structure and initialization of `ExportResources`. --- Let me check the complete fishmongerController for more context about how dissectionParts is used. </details> <details> <summary>🏁 Scripts executed</summary> The following scripts were executed for the analysis: Error: No shell scripts found --- Script: ```shell #!/bin/bash # Find the type definition or interface for fishData to understand the dissectionParts property ast-grep --pattern 'interface $_ { $$$ dissectionParts$_ $$$ }' # Also search for type declarations ast-grep --pattern 'type $_ = { $$$ dissectionParts$_ $$$ }' # Look for other usages of dissectionParts to understand the pattern rg "dissectionParts" -A 2 -B 2 ``` Length of output: 669 --- Script: ```shell #!/bin/bash # Find the ExportResources type/interface definition ast-grep --pattern 'type ExportResources = { $$$ }' ast-grep --pattern 'interface ExportResources { $$$ }' # Look for the ExportResources declaration/initialization rg "ExportResources.*=" -A 5 # Look for any fish-related types or interfaces ast-grep --pattern 'interface $Fish { $$$ }' ast-grep --pattern 'type $Fish = { $$$ }' ``` Length of output: 1806 --- Script: ```shell #!/bin/bash # Look for files that might contain ExportResources data fd "resources|exports" --type f # Look for dissectionParts initialization or usage in resource files rg -l "dissectionParts.*[=:]" # Check for any fish or dissection related constants or configurations rg -l "fish.*dissect|dissect.*fish" -i ``` Length of output: 150 --- Script: ```shell #!/bin/bash # Get the full content of fishmongerController cat src/controllers/api/fishmongerController.ts # Look for any test files related to fishmonger fd "fishmonger.*test" --type f # Look for any resource files with .json extension that might contain fish data fd "\.(json|ts)$" --type f | rg -i "fish|resource" ``` Length of output: 2748 </details> <!-- This is an auto-generated comment by CodeRabbit -->
Sign in to join this conversation.
No description provided.