Skip to content

Conversation

@Vinod-shipsy
Copy link

@Vinod-shipsy Vinod-shipsy commented Jan 15, 2026

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • Feature (non-breaking change which adds functionality)
  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring
  • Performance improvements
  • Documentation update

Screenshots and Media (if applicable)

Test Scenarios

References


Note

Implements end-to-end deployment and expands API capabilities while optimizing runtime and permissions.

  • CI/CD: New Jenkinsfile fetches secrets from Vault, builds/pushes web, admin, apiserver images, and deploys ECS services (frontend, admin, apiserver, celery, beat) with Slack notification.
  • Docker/runtime: apiserver/Dockerfile.api adds Flower, multi-mode ENV_TYPE entrypoint (api/celery/beat), port 5555, and copies env via ENV_FILE_PATH; admin/Dockerfile.admin exposes 3000 with start CMD; aio/nginx.conf increases body size and enables chunked encoding.
  • Auth/rate limiting: APIKeyAuthentication supports static STATIC_API_TOKEN and X-Assume-Role; throttles bypass static token.
  • Permissions: Adds ProjectEntityGuestPermission; broadens member checks and allows superuser bypass.
  • Issues & custom properties: Adds IssueCustomProperty support across serializers/views; create/update handles typed values and user auto-provision by username; filtering and aggregation on custom properties; new dropdown options endpoint.
  • Search: New global search and field-specific search endpoints with role-aware filtering.
  • Attachments: Replaces issue attachment with IssueAttachmentV2Endpoint using S3 presigned uploads and download URLs.
  • Webhooks: Adds webhook CRUD, secret regeneration, and logs with URL/domain safety checks.
  • Routing: Many API paths now accept str project_id; new issue type CRUD and custom property endpoints.
  • Admin UI minor: Removes upgrade/help controls in admin sidebar and stubs UpgradeButton.

Written by Cursor Bugbot for commit 307828f. This will update automatically on new commits. Configure here.

ritchaddha and others added 26 commits August 14, 2025 22:56
…collaborators_production

Feature/iss 274028/remove recent collaborators production
…h-fix

ISS-274818 changes added for projectId fetching in case of custom pro…
…-for-sequence-id

[Feature] [Prod] ISS-274744 : Lock on db for fixing sequence id RACE condition
…d-notification-count-production

[Production] Add limit to unread notification count - ISS-274914
…ultiple-language-Support

[Feature][Prob]-ISS-275671-Multiple-language-Support-for-Portuguese
…emove-hide-profile

[Feature] [Prod] ISS-273505/remove hide profile
* Basic Dev to add dropdown functionallity

* change in loading

* wb url

* to selected the value from the shown list

* to check and save value

* sending some extra infromation for the px

* Fix WB API URL in custom_property.py

Updated the WB API URL to production url

* env calling

* error handling

* the reponse handlling

* making the dropdowm option generalised as others

* new view for dropdown

* to send the get properly

* some removal of issue_type_custom_property which was not used

* the final changes

* Remove unused variable assignment in custom_property.py

* remove_commit

* Fix WB_API_URL environment variable assignment

* Final url changes

* API changes

* remove  label from dropdown
* PT translation

* Some final translation

* change in the translation of stays

* type safety error
* sub-issue creation idempotency

* 200 status return on existing issue
…ination (#244)

* Optimizing issueViewSet and pagination count

* Show 100+ instead of count in project issue view details

* Grouping paginator Skip_Count changes

* Reverting grouped paginator changes
…ination (#250)

* Optimizing issueViewSet and pagination count

* Show 100+ instead of count in project issue view details

* Grouping paginator Skip_Count changes

* Reverting grouped paginator changes

* type issues fix - issueView set pagination improvement

* type issue fixes

* type issue fixes

* type issue fixes

* type issue fixes
* whitelist Return Type / Return Detail

* final fix
- Remove redundant prefetch_related for assignees, labels, and modules
  (ArrayAgg annotations already fetch this data, avoiding duplicate queries)
- Optimize sub_issues_count to use base Issue.objects manager instead of
  IssueManager, avoiding unnecessary filters on simple child count
- Replace duplicate ProjectMember JOINs with Exists subquery for role-based
  filtering, eliminating cartesian product risk
- Add database indexes for common query patterns:
  - Issue: created_at desc, parent+deleted_at, project+archived_at+is_draft,
    workspace+created_at
  - IssueCustomProperty: issue+key, key, key+value
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 15, 2026

Important

Review skipped

Too many files!

150 files out of 300 files are above the max files limit of 150.

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


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

❤️ Share

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

@CLAassistant
Copy link

CLAassistant commented Jan 15, 2026

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
0 out of 9 committers have signed the CLA.

❌ rahulsahay-shipsy
❌ abu-b-sidq
❌ dhruv-shipsy
❌ Kunal-Nandeshwar-Shipsy
❌ ritchaddha
❌ mohit-sharma-shipsy
❌ claude
❌ sanskriti-malik-shipsy
❌ harsh-yadav-shipsy
You have signed the CLA already but the status is still pending? Let us recheck it.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

This PR is being reviewed by Cursor Bugbot

Details

Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

request.META.get("HTTP_ORIGIN"),
user,
serializer
)
Copy link

Choose a reason for hiding this comment

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

Project creation crashes due to undefined variable user

High Severity

The post method calls self.create_project() with an undefined variable user on line 253. This will cause a NameError crash when attempting to create a project. The variable should be request.user. Additionally, create_project is defined as a module-level function (not a class method), so calling it via self.create_project() will raise an AttributeError.

Fix in Cursor Fix in Web

Available on One
<SquareArrowOutUpRight className="h-3.5 w-3.5 p-0.5" />
</a>
<a />
Copy link

Choose a reason for hiding this comment

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

UpgradeButton renders empty non-functional anchor element

Medium Severity

The UpgradeButton component now renders just <a /> - an empty self-closing anchor tag with no href, content, or styling. The original functional button with the link to "plane.so/one" and "Available on One" text is commented out below it. This appears to be debugging or temporary code that was accidentally committed.

Fix in Cursor Fix in Web

else:
user = User.objects.filter(is_superuser=True).first()
self.rewite_project_id_in_url()
return (user, token)
Copy link

Choose a reason for hiding this comment

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

Static token authentication returns None user without validation

High Severity

When using the static API token with an X-Assume-Role header, if no user exists with the specified username, User.objects.filter(...).first() returns None. The authentication then returns (None, token) without raising an error, potentially allowing requests to proceed with an unauthenticated/null user, which could cause downstream failures or authorization bypasses.

Fix in Cursor Fix in Web

# Validate the API token
user, token = self.validate_api_token(token)
assume_role_value = request.headers.get(self.assume_header_role, None)
print("assume_role",assume_role_value)
Copy link

Choose a reason for hiding this comment

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

Debug print statements left in production API code

Medium Severity

Multiple debug print() statements were added across the API codebase that log sensitive information including exception details, request data, user assume-role values, and parsed HTML content. These statements pollute server logs, may expose sensitive data, and indicate incomplete cleanup of debugging code before commit.

Additional Locations (2)

Fix in Cursor Fix in Web


return user

return request.user # Default user if no assume role is found
Copy link

Choose a reason for hiding this comment

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

Base API view creates users from untrusted headers

High Severity

The get_or_create_user_from_headers method automatically creates new user accounts when an X-Assume-Role header is provided with a username that doesn't exist. This runs before authentication checks in dispatch(), allowing any request with this header to create arbitrary user accounts in the database with fake email addresses.

Fix in Cursor Fix in Web

serializer = WebhookSerializer(
webhook,
data=request.data,
context={request: request},
Copy link

Choose a reason for hiding this comment

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

Webhook serializer context uses object as dictionary key

Medium Severity

The patch method passes context={request: request} to the serializer, using the request object as a dictionary key instead of the string "request". This means self.context.get("request") in the serializer will return None, breaking any validation or processing that depends on accessing the request from context.

Fix in Cursor Fix in Web

data['created_by'] = User.objects.get(username=data['created_by'])
else:
user_data = {
"email": data['created_by'] + '@plane-shipsy.com',
Copy link

Choose a reason for hiding this comment

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

Issue serializer crashes on missing created_by field

Medium Severity

When created_by is not provided in the request (it's required=False), the code checks is_uuid(data.get('created_by')) which returns False for None. It then accesses data['created_by'] directly, causing a KeyError if the field wasn't provided, or a TypeError from None + '@plane-shipsy.com' if it was explicitly set to None.

Fix in Cursor Fix in Web

"""

// Debugging: Show the contents of the .env file (optional for development only)
sh "cat apiserver/${configStoragePath}/.env"
Copy link

Choose a reason for hiding this comment

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

Jenkinsfile logs secrets to console output

High Severity

The Jenkinsfile contains debug statements that output secrets to the Jenkins console: line 78 echoes the CONFIG variable value, and line 85 runs cat on the .env file. These expose sensitive configuration and credentials in build logs which may be accessible to unauthorized users or stored indefinitely.

Fix in Cursor Fix in Web

current_instance=current_instance,
epoch=epoch_timestamp,
)
return Response(serializer.data, status=status.HTTP_200_OK)
Copy link

Choose a reason for hiding this comment

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

Custom property PATCH returns stale cached serializer data

Medium Severity

The patch method creates a serializer before updating the model, then accesses serializer.data at line 1249 to capture the current instance for activity logging. This caches the old values. After modifying and saving custom_property, the method returns serializer.data which contains the cached pre-update values, not the newly saved values. Clients receive stale data in the response.

Additional Locations (1)

Fix in Cursor Fix in Web

for item in data :
if item.get("data_type") == "number":
int_value = int(item.get("value"))
item["int_value"] = int_value
Copy link

Choose a reason for hiding this comment

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

Number type custom property parsing crashes on invalid input

Medium Severity

When processing custom properties with data_type="number", the code calls int(item.get("value")) without error handling. If value is None, a non-numeric string like "abc", or missing, this raises TypeError or ValueError, causing a 500 error instead of a proper validation error response. The date type handling has try/except but number does not.

Fix in Cursor Fix in Web

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet