feat: Quests1 #852

Merged
OrdisPrime merged 8 commits from missioninventoryupdate-refactor-1 into main 2025-01-24 05:13:21 -08:00
OrdisPrime commented 2025-01-24 04:57:56 -08:00 (Migrated from github.com)

Not fully functional yet, quests won't complete.
Quests 2 will complete quests and will be pushed in a few days.

Not fully functional yet, quests won't complete. Quests 2 will complete quests and will be pushed in a few days.
coderabbitai[bot] commented 2025-01-24 04:58:02 -08:00 (Migrated from github.com)

Warning

Rate limit exceeded

@OrdisPrime has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 9 seconds before requesting another review.

How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 24984eccc1 and c208c14851.

📒 Files selected for processing (2)
  • src/services/inventoryService.ts (14 hunks)
  • src/services/missionInventoryUpdateService.ts (2 hunks)

Walkthrough

The pull request introduces a comprehensive set of changes across multiple files in the project, focusing on enhancing inventory management, quest handling, and game feature systems. The modifications span controllers, services, models, routes, and type definitions, with key additions including new controllers for updating quests, giving key chain triggered items, and unlocking ship features.

The changes involve significant refactoring of inventory-related logic, introducing more robust error handling and expanding the functionality of existing services. New methods have been added to handle mission rewards, inventory updates, and quest progression. The type system has been updated to support these new features, with modifications to interfaces and type definitions to provide more precise type checking and data management.

The pull request also includes updates to personal rooms and ship features, allowing for more dynamic management of player inventories and progression. The overall goal appears to be improving the game's backend infrastructure, providing more flexible and comprehensive systems for handling player interactions and game state management.


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 --> <!-- This is an auto-generated comment: rate limited by coderabbit.ai --> > [!WARNING] > ## Rate limit exceeded > > @OrdisPrime has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait **21 minutes and 9 seconds** before requesting another review. > > <details> > <summary>⌛ How to resolve this issue?</summary> > > After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR. > > We recommend that you space out your commits to avoid hitting the rate limit. > > </details> > > > <details> > <summary>🚦 How do rate limits work?</summary> > > CodeRabbit enforces hourly rate limits for each developer per organization. > > Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. > > Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information. > > </details> > > <details> > <summary>📥 Commits</summary> > > Reviewing files that changed from the base of the PR and between 24984eccc12e5279b5e7b2cb3d75919023afcca2 and c208c148515ee0c3ef462651987bb8cb10a963d3. > > </details> > > <details> > <summary>📒 Files selected for processing (2)</summary> > > * `src/services/inventoryService.ts` (14 hunks) > * `src/services/missionInventoryUpdateService.ts` (2 hunks) > > </details> <!-- end of auto-generated comment: rate limited by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough The pull request introduces a comprehensive set of changes across multiple files in the project, focusing on enhancing inventory management, quest handling, and game feature systems. The modifications span controllers, services, models, routes, and type definitions, with key additions including new controllers for updating quests, giving key chain triggered items, and unlocking ship features. The changes involve significant refactoring of inventory-related logic, introducing more robust error handling and expanding the functionality of existing services. New methods have been added to handle mission rewards, inventory updates, and quest progression. The type system has been updated to support these new features, with modifications to interfaces and type definitions to provide more precise type checking and data management. The pull request also includes updates to personal rooms and ship features, allowing for more dynamic management of player inventories and progression. The overall goal appears to be improving the game's backend infrastructure, providing more flexible and comprehensive systems for handling player interactions and game state management. <!-- 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-24 05:03:48 -08:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 6

🧹 Nitpick comments (21)
src/controllers/api/giveKeyChainTriggeredItemsController.ts (4)

15-17: Clarify error handling for empty inventory changes.
Currently the code throws a generic error. This means the client will receive a status 500. Consider returning a 400 or 404 if the request is invalid, or using next(error) to align with Express best practices and produce a custom response code.


21-23: Use more specific HTTP error response instead of throwing.
Throwing an uncaught error in an async route can lead to an unhandled rejection if not properly caught by an error middleware. Returning an HTTP error response (e.g., 404 if quest not found, or 400 for invalid data) could improve clarity for API consumers.

Also applies to: 24-25


28-38: Offer concurrency and race-condition safeguards.
If multiple or repeated requests for the same quest stage arrive concurrently, data conflicts might arise (e.g., if the stage is pushed more than once). Consider adding checks or concurrency control.


43-48: Address the wishlist tracking TODO.
This commented-out section indicates unknown functionality. Finalize the design soon to ensure items that must remain unique in the inventory are handled correctly.

src/controllers/api/missionInventoryUpdateController.ts (1)

76-77: Handle potential null return value from addMissionInventoryUpdates.
addMissionInventoryUpdates is not awaited, but presumably used synchronously. If it returns undefined or an unexpected shape, it might lead to runtime errors when spreading in the final response. Consider enforcing a return type.

src/services/missionInventoryUpdateService.ts (4)

25-36: Ensure rotation patterns are flexible or documented.
This basic [A, A, B, C] rotation logic might need to adapt to more mission types or future expansions. Consider externalizing it or adding a comment clarifying how additional rotations should be handled.


73-76: Remove or justify unused declarations.
Both TignoredInventoryUpdateKeys and knownUnhandledKeys are not used, triggering linter errors. If they're reserved for upcoming features, add a comment clarifying their future purpose. Otherwise, remove them to keep the code clean.

- type TignoredInventoryUpdateKeys = (typeof ignoredInventoryUpdateKeys)[number];
- const knownUnhandledKeys: readonly string[] = ["test"] as const;
🧰 Tools
🪛 eslint

[error] 75-75: 'TignoredInventoryUpdateKeys' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 76-76: 'knownUnhandledKeys' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


237-268: Make daily credit bonus configurable.
Currently, hasDailyCreditBonus is hard-coded to true, and there's logic branching on it. If daily bonuses can be disabled or replaced with dynamic logic, consider turning this into a config value or a parameter to avoid confusion.


269-276: Handle edge cases for level-based credits.
The function getLevelCreditRewards calculates credits based solely on minEnemyLevel. Ensure you handle non-standard missions (e.g., dynamic level scaling or special event nodes) gracefully, possibly returning 0 or a default.

src/services/inventoryService.ts (2)

77-77: Remove or document unused variable.
vorsPrizeRewards is assigned but never used, according to the linter. If needed in the future, add a comment explaining its upcoming usage. Otherwise, remove it to reduce clutter.

- const vorsPrizeRewards = [
-   ...
- ];
🧰 Tools
🪛 eslint

[error] 77-77: 'vorsPrizeRewards' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


292-309: Enforce fallback logic for unrecognized credit/fusion bundles.
When typeName is found in creditBundles or fusionBundles, the code neatly handles them. In case of misspellings or missing entries, consider logging a warning or failing more transparently.

src/controllers/api/unlockShipFeatureController.ts (2)

1-5: Validate the parsed accountId and request body.

The parseString(req.query.accountId) and the raw JSON.parse(req.body.toString()) calls could potentially throw runtime errors if the query parameter or request body are malformed. Consider validating these inputs to avoid unhandled exceptions.


6-7: Remove or address the linter suppression comment.

Instead of disabling the rule globally, investigate if the rule (@typescript-eslint/no-misused-promises) can be satisfied by properly typing the function signature or adjusting the rule configuration.

src/services/questService.ts (1)

27-34: Improve clarity of interface property naming.

The property PS is vague and may cause confusion for future maintainers. Consider renaming it to a more descriptive identifier to improve readability.

src/controllers/api/updateQuestController.ts (1)

1-9: Switch from GET to a method better suited for updates.

Using a GET route (/updateQuest.php) for an operation that modifies data is counterintuitive and may violate REST best practices. Consider using POST or PATCH for clarity and semantic correctness.

src/models/personalRoomsModel.ts (1)

99-99: Confirm the default ship feature.
Including "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem" in the default features might unintentionally pre-unlock certain gameplay elements. If this is temporary, ensure follow-up tasks are clearly documented.

src/types/inventoryTypes/inventoryTypes.ts (1)

897-900: Consider more descriptive field names in IQuestStage.
Short single-letter fields like c, i, m, and b are not particularly clear. Provide doc comments or rename them if possible.

src/models/inventoryModels/inventoryModel.ts (4)

530-530: Verify Mongoose defaults for Progress.
Setting default: undefined omits the field if no data is provided. Confirm that downstream code can handle the case when Progress is missing. If not, consider using default: [].


547-547: Guard against undefined CompletionDate.
Before calling toMongoDate, check that CompletionDate is defined to avoid potential runtime errors if the field is absent.


944-944: Consider making the default ActiveQuest configurable.
Hardcoding /Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain might not be suitable for all scenarios. In certain cases, you may want to allow a "no active quest" state.


1168-1168: Expand InventoryDocumentProps to cover quest fields if appropriate.
Currently, QuestKeys resides outside this type. Including it in InventoryDocumentProps could streamline type-safe data handling of quest progress in the inventory.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8858b15693 and e283d95a50.

Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (18)
  • src/controllers/api/giveKeyChainTriggeredItemsController.ts (1 hunks)
  • src/controllers/api/inventorySlotsController.ts (0 hunks)
  • src/controllers/api/missionInventoryUpdateController.ts (3 hunks)
  • src/controllers/api/unlockShipFeatureController.ts (1 hunks)
  • src/controllers/api/updateQuestController.ts (1 hunks)
  • src/models/inventoryModels/inventoryModel.ts (6 hunks)
  • src/models/personalRoomsModel.ts (2 hunks)
  • src/routes/api.ts (3 hunks)
  • src/services/inventoryService.ts (14 hunks)
  • src/services/itemDataService.ts (3 hunks)
  • src/services/loginService.ts (1 hunks)
  • src/services/missionInventoryUpdateService.ts (2 hunks)
  • src/services/personalRoomsService.ts (2 hunks)
  • src/services/questService.ts (1 hunks)
  • src/types/inventoryTypes/inventoryTypes.ts (4 hunks)
  • src/types/missionTypes.ts (1 hunks)
  • src/types/requestTypes.ts (3 hunks)
  • static/fixed_responses/questCompletionRewards.json (1 hunks)
💤 Files with no reviewable changes (1)
  • src/controllers/api/inventorySlotsController.ts
Files skipped from review due to trivial changes (1)
  • src/services/loginService.ts
🧰 Additional context used
🪛 eslint
src/services/missionInventoryUpdateService.ts

[error] 75-75: 'TignoredInventoryUpdateKeys' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 76-76: 'knownUnhandledKeys' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)

src/services/inventoryService.ts

[error] 77-77: 'vorsPrizeRewards' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)

🪛 GitHub Check: build (22)
src/types/requestTypes.ts

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (20)
src/types/requestTypes.ts

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (18)
src/types/requestTypes.ts

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Actions: Build
src/types/requestTypes.ts

[error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported.

🔇 Additional comments (41)
src/controllers/api/giveKeyChainTriggeredItemsController.ts (3)

6-6: Well-structured function export.
No issues found with the function declaration or import paths.


53-56: Interface design is sound.
The IGiveKeyChainTriggeredItemsRequest fields are concise and straightforward. No immediate issues found.


7-10: Validate request data before parsing.
Although you call getJSONfromString on the body, it may fail or produce undefined if the request body is empty or invalid JSON. Consider adding a preliminary check or error handling to ensure the body is valid before proceeding further.

src/controllers/api/missionInventoryUpdateController.ts (4)

52-52: Exported controller looks good.
Converting this to an exported constant is a helpful step for modular code.


57-62: Verify behavior for mission failure.
The controller logs a message and returns an empty array JSON, but the final shape of the response for failed missions isn’t fully defined. Ensure consistency across the API by returning a clear status code and structure for failed missions.


74-75: Well-defined destructuring for mission rewards.
The destructured object from addMissionRewards clarifies which fields are used later for rendering the final response. This is clean and maintainable.


80-84: Cross-check credit calculations.
The final credits are composed of multiple fields. Implement thorough checks to prevent negative or unexpected totals, especially when missionReport data is missing.

src/types/requestTypes.ts (3)

105-105: Enumeration of mission statuses is clear.
This type alias captures known mission statuses effectively.


128-132: Solid design for IUnlockShipFeatureRequest.
This interface is concise and strongly typed, adequately communicating the keychain progression concept.


Line range hint 34-87: Review typed fields for mission update requests.
This expanded set of fields covers most mission data comprehensively. Verify that unneeded or outdated fields, such as PS, are used consistently in the codebase.

Verification successful

All fields in mission update request are actively used and consistent
The PS field is consistently used for anti-cheat data across different types, and other fields like hosts, sharedSessionId, GameModeId, and MissionFailed are integral parts of the mission update request structure. No stale or inconsistent usage was found.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Searching references of the newly added fields to confirm usage or identify stale data
ast-grep --pattern $'PropertyIdentifier( name: (PS|hosts|sharedSessionId|GameModeId|MissionFailed) )' 

Length of output: 102


Script:

#!/bin/bash
# Search for type definition and usage
ast-grep --pattern 'interface IMissionInventoryUpdateRequest { $$$ }'

# Search for field references in TypeScript/JavaScript files
rg -t ts -t js "PS|hosts|sharedSessionId|GameModeId|MissionFailed" -A 2 -B 2

# Search specifically for the type usage
rg -t ts -t js "IMissionInventoryUpdateRequest" -A 2 -B 2

Length of output: 67277

🧰 Tools
🪛 GitHub Check: build (22)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (20)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (18)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Actions: Build

[error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported.

src/services/missionInventoryUpdateService.ts (3)

78-180: Validate unhandled inventory keys.
The big switch statement handles different mission update keys. However, lines 169–176 remain commented out, meaning truly unhandled keys are ignored. Consider logging or explicitly handling them to avoid silently dropping data.


182-235: Consolidate or verify reward merges.
The code merges fixed level rewards, random mission drops, and direct mission credit rewards. Watch out for duplicated items in MissionRewards or repeated credit updates. Provide unit tests to confirm the correct merging of identical items and no double counting.


Line range hint 277-318: Validate mission drops for boundary conditions.
The function pulls data from ExportRegions and processes VaultsCracked, EnemyCachesFound, etc. Consider boundary checks for negative or oversized values (e.g., VaultsCracked > 3). Unit tests for these corner cases help ensure stability.

src/services/inventoryService.ts (1)

Line range hint 142-180: Ensure proper merging of numeric and object-based changes.
The combineInventoryChanges function handles arrays, numeric values, and specialized bins. Consider additional type checks or runtime validations for unexpected data, as it currently throws only after detecting an unrecognized type.

src/types/missionTypes.ts (1)

4-10: Confirm optional fields align with usage.
The new IMissionReward changes several properties from required to optional. Verify that all consumers handle potentially undefined fields safely, especially TypeName, TweetText, and ProductCategory.

src/services/personalRoomsService.ts (1)

2-2: Confirm usage and versioning of imported functions.

The functions addItem and getInventory are imported from inventoryService. Ensure they are tested and provide the expected functionality (e.g., no negative item counts) to avoid potential data inconsistencies.

src/controllers/api/updateQuestController.ts (1)

10-18: Reject requests with zero quest keys.

You throw an error if more than one key is provided. However, no check exists for an empty QuestKeys array. Provide an early guard to reject empty updates and prevent potential errors in downstream logic.

src/models/personalRoomsModel.ts (1)

73-73: Double-check the gardening schema reference.
Ensure that the gardeningSchema aligns with the expected structure of the Gardening field. It might be helpful to validate or test that Planters within gardeningSchema is correct for the intended usage.

Do you want me to create a test suite or open a new issue to track validation of gardening schema?

src/services/itemDataService.ts (11)

1-1: Typed request import looks good.
Using the IGiveKeyChainTriggeredItemsRequest interface enforces strong typing for key chain requests.


3-3: No concerns about importing ITypeCount.
It clarifies quantity-based inventory updates.


4-4: Good practice to use a centralized logger.
Helps maintain consistent logging across the codebase.


26-26: Correct usage of ExportRegions.
This is required for retrieving region data in subsequent functions (e.g., getNode).


32-32: No issues importing IRecipe.
Reads recipe data for relevant item retrieval.


33-33: No issues importing IRegion.
Used in getNode to type-check region data.


35-35: Directly importing questCompletionItems is fine.
Just be mindful of potential bundle size if the JSON file grows large.


159-176: Logic for key chain items is straightforward and robust.
The function properly checks if chain stages exist and returns items or throws an error otherwise.


178-193: Level key rewards retrieval is clearly handled.
Logs an error and throws if the data is missing, ensuring consistent error propagation.


195-202: Region fetching appears correct.
Throws an error if the node does not exist, which is consistent with the approach in similar functions.


204-211: Quest completion items loading is well-defined.
Throws a descriptive error if the quest is not found in the JSON data.

src/routes/api.ts (6)

81-81: Controller import recognized.
Adding updateQuestController is consistent with existing import style.


82-82: Controller import recognized.
Adding giveKeyChainTriggeredItemsController is consistent with existing import style.


83-83: Controller import recognized.
Adding unlockShipFeatureController is consistent with existing import style.


138-138: New route for giving key chain-triggered items.
Matches the typical .php endpoint pattern. Ensure proper authentication in the controller.


168-168: New route for unlocking ship features.
Aligns with the new ship feature logic.


173-173: New route for updating quests.
Check that relevant quest structures are properly updated in the connected controller.

src/types/inventoryTypes/inventoryTypes.ts (3)

46-46: New ActiveQuest property introduced.
If some players don’t have an active quest, consider making this optional or providing a default.


75-75: Switched to IQuestStage[] for Progress.
Ensure backward compatibility if the database previously stored a different structure.


893-893: Use of IQuestKeyClient with an IMongoDate is consistent.
No immediate issues.

src/models/inventoryModels/inventoryModel.ts (2)

29-31: Introduce usage checks for newly imported quest-related interfaces.
Your addition of IQuestStage, IQuestKeyDatabase, and IQuestKeyClient looks consistent with broader quest handling logic. Ensure references to the old IQuestProgress interface are fully replaced or cleaned up to prevent confusion.


521-521: Clarify the contents of the b array.
The field b: [] may benefit from a more explicit type definition. Consider specifying the intended element type for greater clarity and maintainability.

static/fixed_responses/questCompletionRewards.json (1)

1-13: Excellent structured approach to quest completion rewards.
Defining quest reward items by key chain is clear and maintainable. Should future expansions be needed, consider versioning or centralized validation to ensure consistent structure across the codebase.

**Actionable comments posted: 6** <details> <summary>🧹 Nitpick comments (21)</summary><blockquote> <details> <summary>src/controllers/api/giveKeyChainTriggeredItemsController.ts (4)</summary><blockquote> `15-17`: **Clarify error handling for empty inventory changes.** Currently the code throws a generic error. This means the client will receive a status 500. Consider returning a 400 or 404 if the request is invalid, or using next(error) to align with Express best practices and produce a custom response code. --- `21-23`: **Use more specific HTTP error response instead of throwing.** Throwing an uncaught error in an async route can lead to an unhandled rejection if not properly caught by an error middleware. Returning an HTTP error response (e.g., 404 if quest not found, or 400 for invalid data) could improve clarity for API consumers. Also applies to: 24-25 --- `28-38`: **Offer concurrency and race-condition safeguards.** If multiple or repeated requests for the same quest stage arrive concurrently, data conflicts might arise (e.g., if the stage is pushed more than once). Consider adding checks or concurrency control. --- `43-48`: **Address the wishlist tracking TODO.** This commented-out section indicates unknown functionality. Finalize the design soon to ensure items that must remain unique in the inventory are handled correctly. </blockquote></details> <details> <summary>src/controllers/api/missionInventoryUpdateController.ts (1)</summary><blockquote> `76-77`: **Handle potential null return value from addMissionInventoryUpdates.** `addMissionInventoryUpdates` is not awaited, but presumably used synchronously. If it returns `undefined` or an unexpected shape, it might lead to runtime errors when spreading in the final response. Consider enforcing a return type. </blockquote></details> <details> <summary>src/services/missionInventoryUpdateService.ts (4)</summary><blockquote> `25-36`: **Ensure rotation patterns are flexible or documented.** This basic [A, A, B, C] rotation logic might need to adapt to more mission types or future expansions. Consider externalizing it or adding a comment clarifying how additional rotations should be handled. --- `73-76`: **Remove or justify unused declarations.** Both `TignoredInventoryUpdateKeys` and `knownUnhandledKeys` are not used, triggering linter errors. If they're reserved for upcoming features, add a comment clarifying their future purpose. Otherwise, remove them to keep the code clean. ```diff - type TignoredInventoryUpdateKeys = (typeof ignoredInventoryUpdateKeys)[number]; - const knownUnhandledKeys: readonly string[] = ["test"] as const; ``` <details> <summary>🧰 Tools</summary> <details> <summary>🪛 eslint</summary> [error] 75-75: 'TignoredInventoryUpdateKeys' is defined but never used. (@typescript-eslint/no-unused-vars) --- [error] 76-76: 'knownUnhandledKeys' is assigned a value but never used. (@typescript-eslint/no-unused-vars) </details> </details> --- `237-268`: **Make daily credit bonus configurable.** Currently, `hasDailyCreditBonus` is hard-coded to `true`, and there's logic branching on it. If daily bonuses can be disabled or replaced with dynamic logic, consider turning this into a config value or a parameter to avoid confusion. --- `269-276`: **Handle edge cases for level-based credits.** The function `getLevelCreditRewards` calculates credits based solely on `minEnemyLevel`. Ensure you handle non-standard missions (e.g., dynamic level scaling or special event nodes) gracefully, possibly returning 0 or a default. </blockquote></details> <details> <summary>src/services/inventoryService.ts (2)</summary><blockquote> `77-77`: **Remove or document unused variable.** `vorsPrizeRewards` is assigned but never used, according to the linter. If needed in the future, add a comment explaining its upcoming usage. Otherwise, remove it to reduce clutter. ```diff - const vorsPrizeRewards = [ - ... - ]; ``` <details> <summary>🧰 Tools</summary> <details> <summary>🪛 eslint</summary> [error] 77-77: 'vorsPrizeRewards' is assigned a value but never used. (@typescript-eslint/no-unused-vars) </details> </details> --- `292-309`: **Enforce fallback logic for unrecognized credit/fusion bundles.** When `typeName` is found in `creditBundles` or `fusionBundles`, the code neatly handles them. In case of misspellings or missing entries, consider logging a warning or failing more transparently. </blockquote></details> <details> <summary>src/controllers/api/unlockShipFeatureController.ts (2)</summary><blockquote> `1-5`: **Validate the parsed accountId and request body.** The `parseString(req.query.accountId)` and the raw `JSON.parse(req.body.toString())` calls could potentially throw runtime errors if the query parameter or request body are malformed. Consider validating these inputs to avoid unhandled exceptions. --- `6-7`: **Remove or address the linter suppression comment.** Instead of disabling the rule globally, investigate if the rule (`@typescript-eslint/no-misused-promises`) can be satisfied by properly typing the function signature or adjusting the rule configuration. </blockquote></details> <details> <summary>src/services/questService.ts (1)</summary><blockquote> `27-34`: **Improve clarity of interface property naming.** The property `PS` is vague and may cause confusion for future maintainers. Consider renaming it to a more descriptive identifier to improve readability. </blockquote></details> <details> <summary>src/controllers/api/updateQuestController.ts (1)</summary><blockquote> `1-9`: **Switch from GET to a method better suited for updates.** Using a GET route (`/updateQuest.php`) for an operation that modifies data is counterintuitive and may violate REST best practices. Consider using POST or PATCH for clarity and semantic correctness. </blockquote></details> <details> <summary>src/models/personalRoomsModel.ts (1)</summary><blockquote> `99-99`: **Confirm the default ship feature.** Including `"/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem"` in the default features might unintentionally pre-unlock certain gameplay elements. If this is temporary, ensure follow-up tasks are clearly documented. </blockquote></details> <details> <summary>src/types/inventoryTypes/inventoryTypes.ts (1)</summary><blockquote> `897-900`: **Consider more descriptive field names in IQuestStage.** Short single-letter fields like `c`, `i`, `m`, and `b` are not particularly clear. Provide doc comments or rename them if possible. </blockquote></details> <details> <summary>src/models/inventoryModels/inventoryModel.ts (4)</summary><blockquote> `530-530`: **Verify Mongoose defaults for `Progress`.** Setting `default: undefined` omits the field if no data is provided. Confirm that downstream code can handle the case when `Progress` is missing. If not, consider using `default: []`. --- `547-547`: **Guard against undefined `CompletionDate`.** Before calling `toMongoDate`, check that `CompletionDate` is defined to avoid potential runtime errors if the field is absent. --- `944-944`: **Consider making the default `ActiveQuest` configurable.** Hardcoding `/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain` might not be suitable for all scenarios. In certain cases, you may want to allow a "no active quest" state. --- `1168-1168`: **Expand `InventoryDocumentProps` to cover quest fields if appropriate.** Currently, `QuestKeys` resides outside this type. Including it in `InventoryDocumentProps` could streamline type-safe data handling of quest progress in the inventory. </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 8858b156933563a40618a262af621ec89d4bcab2 and e283d95a50109201433eada3c782549f649227a2. </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 (18)</summary> * `src/controllers/api/giveKeyChainTriggeredItemsController.ts` (1 hunks) * `src/controllers/api/inventorySlotsController.ts` (0 hunks) * `src/controllers/api/missionInventoryUpdateController.ts` (3 hunks) * `src/controllers/api/unlockShipFeatureController.ts` (1 hunks) * `src/controllers/api/updateQuestController.ts` (1 hunks) * `src/models/inventoryModels/inventoryModel.ts` (6 hunks) * `src/models/personalRoomsModel.ts` (2 hunks) * `src/routes/api.ts` (3 hunks) * `src/services/inventoryService.ts` (14 hunks) * `src/services/itemDataService.ts` (3 hunks) * `src/services/loginService.ts` (1 hunks) * `src/services/missionInventoryUpdateService.ts` (2 hunks) * `src/services/personalRoomsService.ts` (2 hunks) * `src/services/questService.ts` (1 hunks) * `src/types/inventoryTypes/inventoryTypes.ts` (4 hunks) * `src/types/missionTypes.ts` (1 hunks) * `src/types/requestTypes.ts` (3 hunks) * `static/fixed_responses/questCompletionRewards.json` (1 hunks) </details> <details> <summary>💤 Files with no reviewable changes (1)</summary> * src/controllers/api/inventorySlotsController.ts </details> <details> <summary>✅ Files skipped from review due to trivial changes (1)</summary> * src/services/loginService.ts </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🪛 eslint</summary> <details> <summary>src/services/missionInventoryUpdateService.ts</summary> [error] 75-75: 'TignoredInventoryUpdateKeys' is defined but never used. (@typescript-eslint/no-unused-vars) --- [error] 76-76: 'knownUnhandledKeys' is assigned a value but never used. (@typescript-eslint/no-unused-vars) </details> <details> <summary>src/services/inventoryService.ts</summary> [error] 77-77: 'vorsPrizeRewards' is assigned a value but never used. (@typescript-eslint/no-unused-vars) </details> </details> <details> <summary>🪛 GitHub Check: build (22)</summary> <details> <summary>src/types/requestTypes.ts</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> </details> <details> <summary>🪛 GitHub Check: build (20)</summary> <details> <summary>src/types/requestTypes.ts</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> </details> <details> <summary>🪛 GitHub Check: build (18)</summary> <details> <summary>src/types/requestTypes.ts</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> </details> <details> <summary>🪛 GitHub Actions: Build</summary> <details> <summary>src/types/requestTypes.ts</summary> [error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported. </details> </details> </details> <details> <summary>🔇 Additional comments (41)</summary><blockquote> <details> <summary>src/controllers/api/giveKeyChainTriggeredItemsController.ts (3)</summary> `6-6`: **Well-structured function export.** No issues found with the function declaration or import paths. --- `53-56`: **Interface design is sound.** The `IGiveKeyChainTriggeredItemsRequest` fields are concise and straightforward. No immediate issues found. --- `7-10`: **Validate request data before parsing.** Although you call `getJSONfromString` on the body, it may fail or produce `undefined` if the request body is empty or invalid JSON. Consider adding a preliminary check or error handling to ensure the body is valid before proceeding further. </details> <details> <summary>src/controllers/api/missionInventoryUpdateController.ts (4)</summary> `52-52`: **Exported controller looks good.** Converting this to an exported constant is a helpful step for modular code. --- `57-62`: **Verify behavior for mission failure.** The controller logs a message and returns an empty array JSON, but the final shape of the response for failed missions isn’t fully defined. Ensure consistency across the API by returning a clear status code and structure for failed missions. --- `74-75`: **Well-defined destructuring for mission rewards.** The destructured object from `addMissionRewards` clarifies which fields are used later for rendering the final response. This is clean and maintainable. --- `80-84`: **Cross-check credit calculations.** The final credits are composed of multiple fields. Implement thorough checks to prevent negative or unexpected totals, especially when missionReport data is missing. </details> <details> <summary>src/types/requestTypes.ts (3)</summary> `105-105`: **Enumeration of mission statuses is clear.** This type alias captures known mission statuses effectively. --- `128-132`: **Solid design for IUnlockShipFeatureRequest.** This interface is concise and strongly typed, adequately communicating the keychain progression concept. --- Line range hint `34-87`: **Review typed fields for mission update requests.** This expanded set of fields covers most mission data comprehensively. Verify that unneeded or outdated fields, such as `PS`, are used consistently in the codebase. <details> <summary>✅ Verification successful</summary> <!-- [monologue] [task verify_fields_2/2] [observations] 1. Found references to fields in multiple files: - PS field appears in: * static/webui/script.js (with anti-cheat data comment) * src/types/loginTypes.ts * src/types/requestTypes.ts - MissionFailed, GameModeId, hosts, sharedSessionId found in src/types/requestTypes.ts 2. PS field seems to be used consistently for anti-cheat data across different types 3. All fields appear to be actively used in the codebase [analysis] 1. PS field is used consistently for anti-cheat data, not outdated 2. hosts, sharedSessionId, GameModeId, MissionFailed are all part of the mission update request structure 3. No evidence of stale or unused fields 4. Fields appear to be used in a consistent manner across the codebase [actions] 1. Generate final response indicating fields are verified and used consistently 2. Tag as since no issues were found --> **All fields in mission update request are actively used and consistent** The `PS` field is consistently used for anti-cheat data across different types, and other fields like `hosts`, `sharedSessionId`, `GameModeId`, and `MissionFailed` are integral parts of the mission update request structure. No stale or inconsistent usage was found. </details> <details> <summary>🏁 Scripts executed</summary> The following scripts were executed for the analysis: Script: ```shell #!/bin/bash # Searching references of the newly added fields to confirm usage or identify stale data ast-grep --pattern $'PropertyIdentifier( name: (PS|hosts|sharedSessionId|GameModeId|MissionFailed) )' ``` Length of output: 102 --- Script: ```shell #!/bin/bash # Search for type definition and usage ast-grep --pattern 'interface IMissionInventoryUpdateRequest { $$$ }' # Search for field references in TypeScript/JavaScript files rg -t ts -t js "PS|hosts|sharedSessionId|GameModeId|MissionFailed" -A 2 -B 2 # Search specifically for the type usage rg -t ts -t js "IMissionInventoryUpdateRequest" -A 2 -B 2 ``` Length of output: 67277 </details> <details> <summary>🧰 Tools</summary> <details> <summary>🪛 GitHub Check: build (22)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Check: build (20)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Check: build (18)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Actions: Build</summary> [error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported. </details> </details> </details> <details> <summary>src/services/missionInventoryUpdateService.ts (3)</summary> `78-180`: **Validate unhandled inventory keys.** The big switch statement handles different mission update keys. However, lines 169–176 remain commented out, meaning truly unhandled keys are ignored. Consider logging or explicitly handling them to avoid silently dropping data. --- `182-235`: **Consolidate or verify reward merges.** The code merges fixed level rewards, random mission drops, and direct mission credit rewards. Watch out for duplicated items in `MissionRewards` or repeated credit updates. Provide unit tests to confirm the correct merging of identical items and no double counting. --- Line range hint `277-318`: **Validate mission drops for boundary conditions.** The function pulls data from `ExportRegions` and processes `VaultsCracked`, `EnemyCachesFound`, etc. Consider boundary checks for negative or oversized values (e.g., `VaultsCracked > 3`). Unit tests for these corner cases help ensure stability. </details> <details> <summary>src/services/inventoryService.ts (1)</summary> Line range hint `142-180`: **Ensure proper merging of numeric and object-based changes.** The `combineInventoryChanges` function handles arrays, numeric values, and specialized bins. Consider additional type checks or runtime validations for unexpected data, as it currently throws only after detecting an unrecognized type. </details> <details> <summary>src/types/missionTypes.ts (1)</summary> `4-10`: **Confirm optional fields align with usage.** The new `IMissionReward` changes several properties from required to optional. Verify that all consumers handle potentially undefined fields safely, especially `TypeName`, `TweetText`, and `ProductCategory`. </details> <details> <summary>src/services/personalRoomsService.ts (1)</summary> `2-2`: **Confirm usage and versioning of imported functions.** The functions `addItem` and `getInventory` are imported from `inventoryService`. Ensure they are tested and provide the expected functionality (e.g., no negative item counts) to avoid potential data inconsistencies. </details> <details> <summary>src/controllers/api/updateQuestController.ts (1)</summary> `10-18`: **Reject requests with zero quest keys.** You throw an error if more than one key is provided. However, no check exists for an empty `QuestKeys` array. Provide an early guard to reject empty updates and prevent potential errors in downstream logic. </details> <details> <summary>src/models/personalRoomsModel.ts (1)</summary> `73-73`: **Double-check the gardening schema reference.** Ensure that the `gardeningSchema` aligns with the expected structure of the `Gardening` field. It might be helpful to validate or test that `Planters` within `gardeningSchema` is correct for the intended usage. Do you want me to create a test suite or open a new issue to track validation of gardening schema? </details> <details> <summary>src/services/itemDataService.ts (11)</summary> `1-1`: **Typed request import looks good.** Using the `IGiveKeyChainTriggeredItemsRequest` interface enforces strong typing for key chain requests. --- `3-3`: **No concerns about importing ITypeCount.** It clarifies quantity-based inventory updates. --- `4-4`: **Good practice to use a centralized logger.** Helps maintain consistent logging across the codebase. --- `26-26`: **Correct usage of ExportRegions.** This is required for retrieving region data in subsequent functions (e.g., `getNode`). --- `32-32`: **No issues importing IRecipe.** Reads recipe data for relevant item retrieval. --- `33-33`: **No issues importing IRegion.** Used in `getNode` to type-check region data. --- `35-35`: **Directly importing questCompletionItems is fine.** Just be mindful of potential bundle size if the JSON file grows large. --- `159-176`: **Logic for key chain items is straightforward and robust.** The function properly checks if chain stages exist and returns items or throws an error otherwise. --- `178-193`: **Level key rewards retrieval is clearly handled.** Logs an error and throws if the data is missing, ensuring consistent error propagation. --- `195-202`: **Region fetching appears correct.** Throws an error if the node does not exist, which is consistent with the approach in similar functions. --- `204-211`: **Quest completion items loading is well-defined.** Throws a descriptive error if the quest is not found in the JSON data. </details> <details> <summary>src/routes/api.ts (6)</summary> `81-81`: **Controller import recognized.** Adding `updateQuestController` is consistent with existing import style. --- `82-82`: **Controller import recognized.** Adding `giveKeyChainTriggeredItemsController` is consistent with existing import style. --- `83-83`: **Controller import recognized.** Adding `unlockShipFeatureController` is consistent with existing import style. --- `138-138`: **New route for giving key chain-triggered items.** Matches the typical .php endpoint pattern. Ensure proper authentication in the controller. --- `168-168`: **New route for unlocking ship features.** Aligns with the new ship feature logic. --- `173-173`: **New route for updating quests.** Check that relevant quest structures are properly updated in the connected controller. </details> <details> <summary>src/types/inventoryTypes/inventoryTypes.ts (3)</summary> `46-46`: **New ActiveQuest property introduced.** If some players don’t have an active quest, consider making this optional or providing a default. --- `75-75`: **Switched to IQuestStage[] for Progress.** Ensure backward compatibility if the database previously stored a different structure. --- `893-893`: **Use of IQuestKeyClient with an IMongoDate is consistent.** No immediate issues. </details> <details> <summary>src/models/inventoryModels/inventoryModel.ts (2)</summary> `29-31`: **Introduce usage checks for newly imported quest-related interfaces.** Your addition of `IQuestStage`, `IQuestKeyDatabase`, and `IQuestKeyClient` looks consistent with broader quest handling logic. Ensure references to the old `IQuestProgress` interface are fully replaced or cleaned up to prevent confusion. --- `521-521`: **Clarify the contents of the `b` array.** The field `b: []` may benefit from a more explicit type definition. Consider specifying the intended element type for greater clarity and maintainability. </details> <details> <summary>static/fixed_responses/questCompletionRewards.json (1)</summary> `1-13`: **Excellent structured approach to quest completion rewards.** Defining quest reward items by key chain is clear and maintainable. Should future expansions be needed, consider versioning or centralized validation to ensure consistent structure across the codebase. </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -0,0 +9,4 @@
const shipFeatureRequest = JSON.parse((req.body as string).toString()) as IUnlockShipFeatureRequest;
await updateShipFeature(accountId, shipFeatureRequest.Feature);
res.send([]);
};
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:47 -08:00

🛠️ Refactor suggestion

Add error handling for updateShipFeature.

This controller depends on updateShipFeature succeeding. If an error is thrown (e.g., feature is already unlocked), the request will hang without returning a meaningful error to the client. Consider wrapping this call in a try/catch or using an error-handling middleware to ensure consistent client responses.

_:hammer_and_wrench: Refactor suggestion_ **Add error handling for `updateShipFeature`.** This controller depends on `updateShipFeature` succeeding. If an error is thrown (e.g., feature is already unlocked), the request will hang without returning a meaningful error to the client. Consider wrapping this call in a try/catch or using an error-handling middleware to ensure consistent client responses. <!-- This is an auto-generated comment by CodeRabbit -->
@ -0,0 +38,4 @@
await inventory.save();
res.send({ MissionRewards: [] });
};
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:48 -08:00

🛠️ Refactor suggestion

Consider transactional or atomic updates.

Inventory modifications and quest completions could benefit from a transactional approach (e.g., two-phase commit) to avoid partial updates during concurrent requests or unexpected errors in the middle of the update loop. This helps maintain consistency between quest data and inventory.

_:hammer_and_wrench: Refactor suggestion_ **Consider transactional or atomic updates.** Inventory modifications and quest completions could benefit from a transactional approach (e.g., two-phase commit) to avoid partial updates during concurrent requests or unexpected errors in the middle of the update loop. This helps maintain consistency between quest data and inventory. <!-- This is an auto-generated comment by CodeRabbit -->
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:47 -08:00

🛠️ Refactor suggestion

Cache or bulk-add key chain items for performance.
addKeyChainItems calls addItem in a loop, which might be inefficient if there are numerous items. Consider a bulk insert or a single pass that groups identical types to reduce potential database hits.

_:hammer_and_wrench: Refactor suggestion_ **Cache or bulk-add key chain items for performance.** `addKeyChainItems` calls `addItem` in a loop, which might be inefficient if there are numerous items. Consider a bulk insert or a single pass that groups identical types to reduce potential database hits. <!-- This is an auto-generated comment by CodeRabbit -->
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:47 -08:00

🛠️ Refactor suggestion

Anticipate concurrency and integrity checks.

If multiple concurrent requests unlock the same feature or update the same inventory item, race conditions may arise. Also consider validating the inventory to ensure the user has a sufficient count of the specified shipFeature before decrementing it.

_:hammer_and_wrench: Refactor suggestion_ **Anticipate concurrency and integrity checks.** If multiple concurrent requests unlock the same feature or update the same inventory item, race conditions may arise. Also consider validating the inventory to ensure the user has a sufficient count of the specified `shipFeature` before decrementing it. <!-- This is an auto-generated comment by CodeRabbit -->
@ -0,0 +22,4 @@
if (questKeyUpdate[0].Completed) {
inventory.QuestKeys[questKeyIndex].CompletionDate = new Date();
}
};
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:47 -08:00

⚠️ Potential issue

Handle empty questKeyUpdate arrays.

The logic calls questKeyUpdate[0] without checking if questKeyUpdate is empty. An empty array will cause a runtime error. Add a safeguard to handle this scenario before attempting to read questKeyUpdate[0].

 if (questKeyUpdate.length === 0) {
   throw new Error("No questKey provided for update");
 }
 if (questKeyUpdate.length > 1) {
   logger.error(`more than 1 quest key not supported`);
   throw new Error("more than 1 quest key not supported");
 }
📝 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.

export const updateQuestKey = (
    inventory: HydratedDocument<IInventoryDatabase>,
    questKeyUpdate: IUpdateQuestRequest["QuestKeys"]
): void => {
    if (questKeyUpdate.length === 0) {
        throw new Error("No questKey provided for update");
    }
    if (questKeyUpdate.length > 1) {
        logger.error(`more than 1 quest key not supported`);
        throw new Error("more than 1 quest key not supported");
    }

    const questKeyIndex = inventory.QuestKeys.findIndex(questKey => questKey.ItemType === questKeyUpdate[0].ItemType);

    if (questKeyIndex === -1) {
        throw new Error(`quest key ${questKeyUpdate[0].ItemType} not found`);
    }

    inventory.QuestKeys[questKeyIndex] = questKeyUpdate[0];

    if (questKeyUpdate[0].Completed) {
        inventory.QuestKeys[questKeyIndex].CompletionDate = new Date();
    }
};
_:warning: Potential issue_ **Handle empty `questKeyUpdate` arrays.** The logic calls `questKeyUpdate[0]` without checking if `questKeyUpdate` is empty. An empty array will cause a runtime error. Add a safeguard to handle this scenario before attempting to read `questKeyUpdate[0]`. ```diff if (questKeyUpdate.length === 0) { throw new Error("No questKey provided for update"); } if (questKeyUpdate.length > 1) { logger.error(`more than 1 quest key not supported`); throw new Error("more than 1 quest key not supported"); } ``` <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **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. `````suggestion export const updateQuestKey = ( inventory: HydratedDocument<IInventoryDatabase>, questKeyUpdate: IUpdateQuestRequest["QuestKeys"] ): void => { if (questKeyUpdate.length === 0) { throw new Error("No questKey provided for update"); } if (questKeyUpdate.length > 1) { logger.error(`more than 1 quest key not supported`); throw new Error("more than 1 quest key not supported"); } const questKeyIndex = inventory.QuestKeys.findIndex(questKey => questKey.ItemType === questKeyUpdate[0].ItemType); if (questKeyIndex === -1) { throw new Error(`quest key ${questKeyUpdate[0].ItemType} not found`); } inventory.QuestKeys[questKeyIndex] = questKeyUpdate[0]; if (questKeyUpdate[0].Completed) { inventory.QuestKeys[questKeyIndex].CompletionDate = new Date(); } }; ````` </details> <!-- suggestion_end --> <!-- This is an auto-generated comment by CodeRabbit -->
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:03:47 -08:00

⚠️ Potential issue

Fix missing IQuestKeyDatabase definition.
The pipeline shows a build error: “Cannot find name 'IQuestKeyDatabase'.” Import or define IQuestKeyDatabase to resolve this.

Here is a possible fix:

-    QuestKeys?: IQuestKeyDatabase[]; //completionDate is not sent
+    import { IQuestKeyDatabase } from "@/src/types/inventoryTypes/questTypes";
+    // or define the interface if not declared anywhere
+    
+    // ...
+    QuestKeys?: IQuestKeyDatabase[];

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 GitHub Check: build (22)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (20)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Check: build (18)

[failure] 60-60:
Cannot find name 'IQuestKeyDatabase'.

🪛 GitHub Actions: Build

[error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported.

_:warning: Potential issue_ **Fix missing IQuestKeyDatabase definition.** The pipeline shows a build error: “Cannot find name 'IQuestKeyDatabase'.” Import or define `IQuestKeyDatabase` to resolve this. Here is a possible fix: ```diff - QuestKeys?: IQuestKeyDatabase[]; //completionDate is not sent + import { IQuestKeyDatabase } from "@/src/types/inventoryTypes/questTypes"; + // or define the interface if not declared anywhere + + // ... + QuestKeys?: IQuestKeyDatabase[]; ``` > Committable suggestion skipped: line range outside the PR's diff. <details> <summary>🧰 Tools</summary> <details> <summary>🪛 GitHub Check: build (22)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Check: build (20)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Check: build (18)</summary> [failure] 60-60: Cannot find name 'IQuestKeyDatabase'. </details> <details> <summary>🪛 GitHub Actions: Build</summary> [error] 60-60: Cannot find name 'IQuestKeyDatabase'. Type definition is missing or not imported. </details> </details> <!-- This is an auto-generated comment by CodeRabbit -->
coderabbitai[bot] (Migrated from github.com) reviewed 2025-01-24 05:06:48 -08:00
coderabbitai[bot] (Migrated from github.com) left a comment

Actionable comments posted: 2

🧹 Nitpick comments (4)
src/types/requestTypes.ts (4)

35-35: Consider keeping this as an interface for extensibility.

Converting from interface to type removes the ability to use declaration merging, which might be needed if other modules need to augment this type.


73-73: Define specific type for PS field.

The PS field is typed as string but seems to represent a specific format or enum. Consider creating a proper type/enum for better type safety.


Line range hint 90-105: Enhance documentation for reward fields.

Consider adding more descriptive JSDoc comments for each field to improve maintainability. For example:

  • What are the possible values for rewardTier?
  • What does EOM_AFK represent?
  • What's the format/structure of PurgatoryRewardQualifications?

129-133: Consider using enum for Feature field.

The Feature field could benefit from being a union type or enum to restrict possible values and provide better type safety.

+export type ShipFeature = "feature1" | "feature2" | /* add all possible features */;
+
 export interface IUnlockShipFeatureRequest {
-    Feature: string;
+    Feature: ShipFeature;
     KeyChain: string;
     ChainStage: number;
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e283d95a50 and 24984eccc1.

📒 Files selected for processing (1)
  • src/types/requestTypes.ts (4 hunks)
🔇 Additional comments (3)
src/types/requestTypes.ts (3)

13-14: LGTM! Import additions align with new type requirements.


106-106: LGTM! Mission status values are well-defined.


61-61: Previous build error about IQuestKeyDatabase still applies.

The pipeline is still showing the error about missing IQuestKeyDatabase type, even though the code now uses IQuestKeyClient. Please ensure all required types are properly defined and imported.

**Actionable comments posted: 2** <details> <summary>🧹 Nitpick comments (4)</summary><blockquote> <details> <summary>src/types/requestTypes.ts (4)</summary><blockquote> `35-35`: **Consider keeping this as an interface for extensibility.** Converting from interface to type removes the ability to use declaration merging, which might be needed if other modules need to augment this type. --- `73-73`: **Define specific type for PS field.** The `PS` field is typed as string but seems to represent a specific format or enum. Consider creating a proper type/enum for better type safety. --- Line range hint `90-105`: **Enhance documentation for reward fields.** Consider adding more descriptive JSDoc comments for each field to improve maintainability. For example: - What are the possible values for `rewardTier`? - What does `EOM_AFK` represent? - What's the format/structure of `PurgatoryRewardQualifications`? --- `129-133`: **Consider using enum for Feature field.** The `Feature` field could benefit from being a union type or enum to restrict possible values and provide better type safety. ```diff +export type ShipFeature = "feature1" | "feature2" | /* add all possible features */; + export interface IUnlockShipFeatureRequest { - Feature: string; + Feature: ShipFeature; KeyChain: string; ChainStage: number; } ``` </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 e283d95a50109201433eada3c782549f649227a2 and 24984eccc12e5279b5e7b2cb3d75919023afcca2. </details> <details> <summary>📒 Files selected for processing (1)</summary> * `src/types/requestTypes.ts` (4 hunks) </details> <details> <summary>🔇 Additional comments (3)</summary><blockquote> <details> <summary>src/types/requestTypes.ts (3)</summary> `13-14`: **LGTM! Import additions align with new type requirements.** --- `106-106`: **LGTM! Mission status values are well-defined.** --- `61-61`: **Previous build error about IQuestKeyDatabase still applies.** The pipeline is still showing the error about missing `IQuestKeyDatabase` type, even though the code now uses `IQuestKeyClient`. Please ensure all required types are properly defined and imported. </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -87,4 +110,3 @@
}
export interface IUpdateGlyphRequest {
AvatarImageType: string;
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:06:48 -08:00

🛠️ Refactor suggestion

Improve type safety for client-related fields.

  • hosts array should probably have a more specific type than string[]
  • currentClients using unknown[] loses type safety. Consider defining a proper client type.
-    hosts: string[];
-    currentClients: unknown[];
+    hosts: string[]; // TODO: Consider using specific host type/enum
+    currentClients: IGameClient[]; // Define proper client interface

Committable suggestion skipped: line range outside the PR's diff.

_:hammer_and_wrench: Refactor suggestion_ **Improve type safety for client-related fields.** - `hosts` array should probably have a more specific type than `string[]` - `currentClients` using `unknown[]` loses type safety. Consider defining a proper client type. ```diff - hosts: string[]; - currentClients: unknown[]; + hosts: string[]; // TODO: Consider using specific host type/enum + currentClients: IGameClient[]; // Define proper client interface ``` > Committable suggestion skipped: line range outside the PR's diff. <!-- This is an auto-generated comment by CodeRabbit -->
@ -106,3 +126,8 @@ export interface IUpgradeOperation {
PolarizeValue: ArtifactPolarity;
PolarityRemap: IPolarity[];
coderabbitai[bot] (Migrated from github.com) commented 2025-01-24 05:06:47 -08:00

🛠️ Refactor suggestion

Make FPS metrics optional.

FPS-related fields should be optional as they might not always be available, especially in different game modes or platforms.

-    FpsAvg: number;
-    FpsMin: number;
-    FpsMax: number;
-    FpsSamples: number;
+    FpsAvg?: number;
+    FpsMin?: number;
+    FpsMax?: number;
+    FpsSamples?: number;
📝 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.

    FpsAvg?: number;
    FpsMin?: number;
    FpsMax?: number;
    FpsSamples?: number;
_:hammer_and_wrench: Refactor suggestion_ **Make FPS metrics optional.** FPS-related fields should be optional as they might not always be available, especially in different game modes or platforms. ```diff - FpsAvg: number; - FpsMin: number; - FpsMax: number; - FpsSamples: number; + FpsAvg?: number; + FpsMin?: number; + FpsMax?: number; + FpsSamples?: number; ``` <!-- suggestion_start --> <details> <summary>📝 Committable suggestion</summary> > ‼️ **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. `````suggestion FpsAvg?: number; FpsMin?: number; FpsMax?: number; FpsSamples?: number; ````` </details> <!-- suggestion_end --> <!-- This is an auto-generated comment by CodeRabbit -->
Sign in to join this conversation.
No description provided.