chore: switch purchaseService to take inventory document #848

Merged
Sainan merged 1 commits from optimise-purchase into main 2025-01-24 06:24:29 -08:00
Owner
No description provided.
coderabbitai[bot] commented 2025-01-21 22:51:55 -08:00 (Migrated from github.com)
Author
Owner

Warning

Rate limit exceeded

@Sainan has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 22 minutes and 38 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 3de204b906763e8f8b18959e8e9994eafe85598a and 98d0e6d585.

📒 Files selected for processing (5)
  • src/controllers/api/getVoidProjectionRewardsController.ts (1 hunks)
  • src/controllers/api/purchaseController.ts (1 hunks)
  • src/controllers/api/syndicateSacrificeController.ts (1 hunks)
  • src/services/inventoryService.ts (1 hunks)
  • src/services/purchaseService.ts (15 hunks)

Walkthrough

The pull request introduces significant changes to inventory management across multiple files in the project. The primary modification involves shifting from using account IDs to directly passing inventory objects in various service and controller functions. This change affects how inventory-related operations are performed, particularly in the purchaseService, inventoryService, and related API controllers.

The modifications include updating function signatures to accept TInventoryDatabaseDocument instead of accountId, removing asynchronous inventory retrieval within functions, and adjusting the control flow for inventory manipulation. The changes aim to streamline inventory handling by passing the inventory object directly and moving the responsibility of saving inventory state to the calling functions.

These modifications impact multiple services and controllers, including getVoidProjectionRewardsController, purchaseController, syndicateSacrificeController, inventoryService, and purchaseService, creating a more consistent approach to inventory management throughout the application.


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 > > @Sainan has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait **22 minutes and 38 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 3de204b906763e8f8b18959e8e9994eafe85598a and 98d0e6d58504d19e80dda059231e7a1f77f7956a. > > </details> > > <details> > <summary>📒 Files selected for processing (5)</summary> > > * `src/controllers/api/getVoidProjectionRewardsController.ts` (1 hunks) > * `src/controllers/api/purchaseController.ts` (1 hunks) > * `src/controllers/api/syndicateSacrificeController.ts` (1 hunks) > * `src/services/inventoryService.ts` (1 hunks) > * `src/services/purchaseService.ts` (15 hunks) > > </details> <!-- end of auto-generated comment: rate limited by coderabbit.ai --> <!-- walkthrough_start --> ## Walkthrough The pull request introduces significant changes to inventory management across multiple files in the project. The primary modification involves shifting from using account IDs to directly passing inventory objects in various service and controller functions. This change affects how inventory-related operations are performed, particularly in the `purchaseService`, `inventoryService`, and related API controllers. The modifications include updating function signatures to accept `TInventoryDatabaseDocument` instead of `accountId`, removing asynchronous inventory retrieval within functions, and adjusting the control flow for inventory manipulation. The changes aim to streamline inventory handling by passing the inventory object directly and moving the responsibility of saving inventory state to the calling functions. These modifications impact multiple services and controllers, including `getVoidProjectionRewardsController`, `purchaseController`, `syndicateSacrificeController`, `inventoryService`, and `purchaseService`, creating a more consistent approach to inventory management throughout the application. <!-- 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-21 22:56:37 -08:00
coderabbitai[bot] (Migrated from github.com) left a comment
Author
Owner

Actionable comments posted: 3

🔭 Outside diff range comments (2)
src/services/purchaseService.ts (1)

Line range hint 362-372: Handle unknown booster types more explicitly

In the handleBoostersPurchase function, when an unknown booster type is detected, the function logs an error and returns an empty InventoryChanges. This could lead to silent failures where the caller assumes the purchase was successful.

Consider throwing an exception to inform the caller that the booster type is unknown. This ensures that issues are caught during execution rather than failing silently.

Apply this diff to throw an error:

         const ItemType = boosterStoreName.replace("StoreItem", "");
         if (!boosterCollection.find(x => x == ItemType)) {
             logger.error(`unknown booster type: ${ItemType}`);
-            return { InventoryChanges: {} };
+            throw new Error(`Unknown booster type: ${ItemType}`);
         }
src/services/inventoryService.ts (1)

Line range hint 962-976: Refactor time calculation and improve code clarity.

  1. The magic number 129600 should be extracted into a named constant with proper documentation explaining its purpose.
  2. The booster expiry date calculation can be simplified.

Consider these improvements:

+// TODO: Investigate and document why this offset is needed
+const TIME_OFFSET_SECONDS = 129600;
+
 export const addBooster = (ItemType: string, time: number, inventory: TInventoryDatabaseDocument): void => {
-    const currentTime = Math.floor(Date.now() / 1000) - 129600; // Value is wrong without 129600. Figure out why, please. :)
+    const currentTime = Math.floor(Date.now() / 1000) - TIME_OFFSET_SECONDS;
 
     const { Boosters } = inventory;
     const itemIndex = Boosters.findIndex(booster => booster.ItemType === ItemType);
 
     if (itemIndex !== -1) {
         const existingBooster = Boosters[itemIndex];
-        existingBooster.ExpiryDate = Math.max(existingBooster.ExpiryDate, currentTime) + time;
+        const effectiveStartTime = Math.max(existingBooster.ExpiryDate, currentTime);
+        existingBooster.ExpiryDate = effectiveStartTime + time;
         inventory.markModified(`Boosters.${itemIndex}.ExpiryDate`);
     } else {
         Boosters.push({ ItemType, ExpiryDate: currentTime + time });
     }
 };

Also, consider adding validation for the time parameter to ensure it's positive:

 export const addBooster = (ItemType: string, time: number, inventory: TInventoryDatabaseDocument): void => {
+    if (time <= 0) {
+        throw new Error('Booster time must be positive');
+    }
🧹 Nitpick comments (1)
src/controllers/api/syndicateSacrificeController.ts (1)

63-63: Add error handling for asynchronous operation

When calling handleStoreItemAcquisition, consider adding error handling to manage any potential exceptions that might be thrown during the asynchronous operation.

Wrap the await call in a try-catch block:

     combineInventoryChanges(
-        res.InventoryChanges,
-        (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges
+        res.InventoryChanges,
+        (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges
     );
+} catch (err) {
+    // Handle the error appropriately
+    logger.error('Error handling store item acquisition:', err);
+    return response.status(500).json({ error: 'Failed to process syndicate sacrifice reward' });
+}
📜 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 3de204b906763e8f8b18959e8e9994eafe85598a.

📒 Files selected for processing (5)
  • src/controllers/api/getVoidProjectionRewardsController.ts (1 hunks)
  • src/controllers/api/purchaseController.ts (1 hunks)
  • src/controllers/api/syndicateSacrificeController.ts (1 hunks)
  • src/services/inventoryService.ts (1 hunks)
  • src/services/purchaseService.ts (15 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
src/services/purchaseService.ts

[error] 335-336: The default clause should be the last switch clause.

The following case clause is here:

Regardless its position, the default clause is always executed when there is no match. To avoid confusion, the default clause should be the last switch clause.

(lint/suspicious/useDefaultSwitchClauseLast)

🔇 Additional comments (4)
src/services/purchaseService.ts (1)

83-86: Verify the merging order of InventoryChanges

When merging currencyChanges and purchaseResponse.InventoryChanges, properties in purchaseResponse.InventoryChanges will overwrite those in currencyChanges if there are key conflicts. Ensure this merging order is intentional and that currency changes are not inadvertently overwritten.

Consider reviewing the merge to confirm that important currency changes are preserved:

         purchaseResponse.InventoryChanges = {
-            ...currencyChanges,
-            ...purchaseResponse.InventoryChanges
+            ...purchaseResponse.InventoryChanges,
+            ...currencyChanges
         };

If the intention is to have currencyChanges take precedence, swap the order of the spread operators as shown.

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

31-38: LGTM: Relic removal logic is correct.

The relic removal logic correctly uses addMiscItems with the inventory object, and the removal of the await is appropriate since addMiscItems is a synchronous operation.


39-40: Verify transaction safety for inventory operations.

The code performs two inventory modifications (relic removal and reward acquisition) before saving. While this is more efficient than saving twice, ensure that both operations are atomic and that partial updates cannot occur if one operation fails.

Consider adding a try-catch block:

-        await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount);
-        await inventory.save();
+        try {
+            await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount);
+            await inventory.save();
+        } catch (error) {
+            logger.error('Failed to process void projection reward:', error);
+            throw error;
+        }
src/services/inventoryService.ts (1)

962-962: Investigate the time offset requirement.

The code subtracts 129600 seconds (36 hours) from the current time with an unclear explanation. This could be masking a deeper issue with time handling.

Let's investigate the time offset usage:

**Actionable comments posted: 3** <details> <summary>🔭 Outside diff range comments (2)</summary><blockquote> <details> <summary>src/services/purchaseService.ts (1)</summary><blockquote> Line range hint `362-372`: **Handle unknown booster types more explicitly** In the `handleBoostersPurchase` function, when an unknown booster type is detected, the function logs an error and returns an empty `InventoryChanges`. This could lead to silent failures where the caller assumes the purchase was successful. Consider throwing an exception to inform the caller that the booster type is unknown. This ensures that issues are caught during execution rather than failing silently. Apply this diff to throw an error: ```diff const ItemType = boosterStoreName.replace("StoreItem", ""); if (!boosterCollection.find(x => x == ItemType)) { logger.error(`unknown booster type: ${ItemType}`); - return { InventoryChanges: {} }; + throw new Error(`Unknown booster type: ${ItemType}`); } ``` </blockquote></details> <details> <summary>src/services/inventoryService.ts (1)</summary><blockquote> Line range hint `962-976`: **Refactor time calculation and improve code clarity.** 1. The magic number `129600` should be extracted into a named constant with proper documentation explaining its purpose. 2. The booster expiry date calculation can be simplified. Consider these improvements: ```diff +// TODO: Investigate and document why this offset is needed +const TIME_OFFSET_SECONDS = 129600; + export const addBooster = (ItemType: string, time: number, inventory: TInventoryDatabaseDocument): void => { - const currentTime = Math.floor(Date.now() / 1000) - 129600; // Value is wrong without 129600. Figure out why, please. :) + const currentTime = Math.floor(Date.now() / 1000) - TIME_OFFSET_SECONDS; const { Boosters } = inventory; const itemIndex = Boosters.findIndex(booster => booster.ItemType === ItemType); if (itemIndex !== -1) { const existingBooster = Boosters[itemIndex]; - existingBooster.ExpiryDate = Math.max(existingBooster.ExpiryDate, currentTime) + time; + const effectiveStartTime = Math.max(existingBooster.ExpiryDate, currentTime); + existingBooster.ExpiryDate = effectiveStartTime + time; inventory.markModified(`Boosters.${itemIndex}.ExpiryDate`); } else { Boosters.push({ ItemType, ExpiryDate: currentTime + time }); } }; ``` Also, consider adding validation for the `time` parameter to ensure it's positive: ```diff export const addBooster = (ItemType: string, time: number, inventory: TInventoryDatabaseDocument): void => { + if (time <= 0) { + throw new Error('Booster time must be positive'); + } ``` </blockquote></details> </blockquote></details> <details> <summary>🧹 Nitpick comments (1)</summary><blockquote> <details> <summary>src/controllers/api/syndicateSacrificeController.ts (1)</summary><blockquote> `63-63`: **Add error handling for asynchronous operation** When calling `handleStoreItemAcquisition`, consider adding error handling to manage any potential exceptions that might be thrown during the asynchronous operation. Wrap the await call in a try-catch block: ```diff combineInventoryChanges( - res.InventoryChanges, - (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges + res.InventoryChanges, + (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges ); +} catch (err) { + // Handle the error appropriately + logger.error('Error handling store item acquisition:', err); + return response.status(500).json({ error: 'Failed to process syndicate sacrifice reward' }); +} ``` </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 3de204b906763e8f8b18959e8e9994eafe85598a. </details> <details> <summary>📒 Files selected for processing (5)</summary> * `src/controllers/api/getVoidProjectionRewardsController.ts` (1 hunks) * `src/controllers/api/purchaseController.ts` (1 hunks) * `src/controllers/api/syndicateSacrificeController.ts` (1 hunks) * `src/services/inventoryService.ts` (1 hunks) * `src/services/purchaseService.ts` (15 hunks) </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🪛 Biome (1.9.4)</summary> <details> <summary>src/services/purchaseService.ts</summary> [error] 335-336: The default clause should be the last switch clause. The following case clause is here: Regardless its position, the default clause is always executed when there is no match. To avoid confusion, the default clause should be the last switch clause. (lint/suspicious/useDefaultSwitchClauseLast) </details> </details> </details> <details> <summary>🔇 Additional comments (4)</summary><blockquote> <details> <summary>src/services/purchaseService.ts (1)</summary> `83-86`: **Verify the merging order of InventoryChanges** When merging `currencyChanges` and `purchaseResponse.InventoryChanges`, properties in `purchaseResponse.InventoryChanges` will overwrite those in `currencyChanges` if there are key conflicts. Ensure this merging order is intentional and that currency changes are not inadvertently overwritten. Consider reviewing the merge to confirm that important currency changes are preserved: ```diff purchaseResponse.InventoryChanges = { - ...currencyChanges, - ...purchaseResponse.InventoryChanges + ...purchaseResponse.InventoryChanges, + ...currencyChanges }; ``` If the intention is to have `currencyChanges` take precedence, swap the order of the spread operators as shown. </details> <details> <summary>src/controllers/api/getVoidProjectionRewardsController.ts (2)</summary> `31-38`: **LGTM: Relic removal logic is correct.** The relic removal logic correctly uses `addMiscItems` with the inventory object, and the removal of the await is appropriate since `addMiscItems` is a synchronous operation. --- `39-40`: **Verify transaction safety for inventory operations.** The code performs two inventory modifications (relic removal and reward acquisition) before saving. While this is more efficient than saving twice, ensure that both operations are atomic and that partial updates cannot occur if one operation fails. Consider adding a try-catch block: ```diff - await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount); - await inventory.save(); + try { + await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount); + await inventory.save(); + } catch (error) { + logger.error('Failed to process void projection reward:', error); + throw error; + } ``` </details> <details> <summary>src/services/inventoryService.ts (1)</summary> `962-962`: **Investigate the time offset requirement.** The code subtracts 129600 seconds (36 hours) from the current time with an unclear explanation. This could be masking a deeper issue with time handling. Let's investigate the time offset usage: </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
@ -10,1 +10,4 @@
const inventory = await getInventory(accountId);
const response = await handlePurchase(purchaseRequest, inventory);
await inventory.save();
res.json(response);
coderabbitai[bot] (Migrated from github.com) commented 2025-01-21 22:56:36 -08:00
Author
Owner

⚠️ Potential issue

Add error handling for inventory save operation

Currently, the inventory.save() operation is awaited without error handling. If the save operation fails, it could result in an unhandled promise rejection and potentially crash the server.

Consider wrapping the inventory.save() call in a try-catch block to handle any errors appropriately.

Apply this diff to add error handling:

     const response = await handlePurchase(purchaseRequest, inventory);
-    await inventory.save();
+    try {
+        await inventory.save();
+    } catch (err) {
+        // Handle the error appropriately
+        logger.error('Error saving inventory:', err);
+        return res.status(500).json({ error: 'Failed to save inventory' });
+    }
     res.json(response);

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

_:warning: Potential issue_ **Add error handling for inventory save operation** Currently, the `inventory.save()` operation is awaited without error handling. If the save operation fails, it could result in an unhandled promise rejection and potentially crash the server. Consider wrapping the `inventory.save()` call in a try-catch block to handle any errors appropriately. Apply this diff to add error handling: ```diff const response = await handlePurchase(purchaseRequest, inventory); - await inventory.save(); + try { + await inventory.save(); + } catch (err) { + // Handle the error appropriately + logger.error('Error saving inventory:', err); + return res.status(500).json({ error: 'Failed to save inventory' }); + } res.json(response); ``` > Committable suggestion skipped: line range outside the PR's diff. <!-- This is an auto-generated comment by CodeRabbit -->
@ -69,2 +67,4 @@
await inventory.save();
response.json(res);
};
coderabbitai[bot] (Migrated from github.com) commented 2025-01-21 22:56:37 -08:00
Author
Owner

⚠️ Potential issue

Add error handling for inventory save operation

The inventory.save() operation is awaited without proper error handling. If the save operation fails, it may result in an unhandled promise rejection and potentially crash the server.

Consider wrapping the inventory.save() call in a try-catch block:

-    await inventory.save();
+    try {
+        await inventory.save();
+    } catch (err) {
+        // Handle the error appropriately
+        logger.error('Error saving inventory:', err);
+        return response.status(500).json({ error: 'Failed to save inventory' });
+    }

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

_:warning: Potential issue_ **Add error handling for inventory save operation** The `inventory.save()` operation is awaited without proper error handling. If the save operation fails, it may result in an unhandled promise rejection and potentially crash the server. Consider wrapping the `inventory.save()` call in a try-catch block: ```diff - await inventory.save(); + try { + await inventory.save(); + } catch (err) { + // Handle the error appropriately + logger.error('Error saving inventory:', err); + return response.status(500).json({ error: 'Failed to save inventory' }); + } ``` > Committable suggestion skipped: line range outside the PR's diff. <!-- This is an auto-generated comment by CodeRabbit -->
coderabbitai[bot] (Migrated from github.com) commented 2025-01-21 22:56:36 -08:00
Author
Owner

⚠️ Potential issue

Move the default case to the end of the switch statement

The default case in the switch statement should be placed after all other case clauses. Placing it at the beginning can be confusing and may lead to unintended behavior. This change also addresses the static analysis warning from Biome.

Apply this diff to move the default case to the end:

         switch (typeCategory) {
-            default:
-                return await addItem(inventory, typesName, quantity);
             case "BoosterPacks":
                 return handleBoosterPackPurchase(typesName, inventory, quantity);
             case "SlotItems":
                 return handleSlotPurchase(typesName, inventory, quantity);
+            default:
+                return await addItem(inventory, typesName, quantity);
         }
📝 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.

        switch (typeCategory) {
            case "BoosterPacks":
                return handleBoosterPackPurchase(typesName, inventory, quantity);
            case "SlotItems":
                return handleSlotPurchase(typesName, inventory, quantity);
            default:
                return await addItem(inventory, typesName, quantity);
        }
🧰 Tools
🪛 Biome (1.9.4)

[error] 335-336: The default clause should be the last switch clause.

The following case clause is here:

Regardless its position, the default clause is always executed when there is no match. To avoid confusion, the default clause should be the last switch clause.

(lint/suspicious/useDefaultSwitchClauseLast)

_:warning: Potential issue_ **Move the default case to the end of the switch statement** The `default` case in the switch statement should be placed after all other case clauses. Placing it at the beginning can be confusing and may lead to unintended behavior. This change also addresses the static analysis warning from Biome. Apply this diff to move the `default` case to the end: ```diff switch (typeCategory) { - default: - return await addItem(inventory, typesName, quantity); case "BoosterPacks": return handleBoosterPackPurchase(typesName, inventory, quantity); case "SlotItems": return handleSlotPurchase(typesName, inventory, quantity); + default: + return await addItem(inventory, typesName, quantity); } ``` <!-- 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 switch (typeCategory) { case "BoosterPacks": return handleBoosterPackPurchase(typesName, inventory, quantity); case "SlotItems": return handleSlotPurchase(typesName, inventory, quantity); default: return await addItem(inventory, typesName, quantity); } ````` </details> <!-- suggestion_end --> <details> <summary>🧰 Tools</summary> <details> <summary>🪛 Biome (1.9.4)</summary> [error] 335-336: The default clause should be the last switch clause. The following case clause is here: Regardless its position, the default clause is always executed when there is no match. To avoid confusion, the default clause should be the last switch clause. (lint/suspicious/useDefaultSwitchClauseLast) </details> </details> <!-- This is an auto-generated comment by CodeRabbit -->
Sign in to join this conversation.
No description provided.