mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-08 03:00:28 -04:00
feat(backend): Prevent duplicate slugs for store submissions (#11155)
<!-- Clearly explain the need for these changes: --> This PR prevents users from creating multiple store submissions with the same slug, which could lead to confusion and potential conflicts in the marketplace. Each user's submissions should have unique slugs to ensure proper identification and navigation. ### Changes 🏗️ <!-- Concisely describe all of the changes made in this pull request: --> - **Backend**: Added validation to check for existing slugs before creating new store submissions in `backend/server/v2/store/db.py` - **Backend**: Introduced new `SlugAlreadyInUseError` exception in `backend/server/v2/store/exceptions.py` for clearer error handling - **Backend**: Updated store routes to return HTTP 409 Conflict when slug is already in use in `backend/server/v2/store/routes.py` - **Backend**: Cleaned up test file in `backend/server/v2/store/db_test.py` - **Frontend**: Enhanced error handling in the publish agent modal to display specific error messages to users in `frontend/src/components/contextual/PublishAgentModal/components/AgentInfoStep/useAgentInfoStep.ts` ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: <!-- Put your test plan here: --> - [x] Add a store submission with a specific slug - [x] Attempt to add another store submission with the same slug for the same user - Verify a 409 conflict error is returned with appropriate error message - [x] Add a store submission with the same slug, but for a different user - Verify the submission is successful - [x] Verify frontend displays the specific error message when slug conflict occurs - [x] Existing tests pass without modification --------- Co-authored-by: seer-by-sentry[bot] <157164994+seer-by-sentry[bot]@users.noreply.github.com> Co-authored-by: Swifty <craigswift13@gmail.com>
This commit is contained in:
committed by
GitHub
parent
63076a67e1
commit
7b8499ec69
@@ -742,7 +742,21 @@ async def create_store_submission(
|
||||
store_listing_version_id=store_listing_version_id,
|
||||
changes_summary=changes_summary,
|
||||
)
|
||||
|
||||
except prisma.errors.UniqueViolationError as exc:
|
||||
# Attempt to check if the error was due to the slug field being unique
|
||||
error_str = str(exc)
|
||||
if "slug" in error_str.lower():
|
||||
logger.debug(
|
||||
f"Slug '{slug}' is already in use by another agent (agent_id: {agent_id}) for user {user_id}"
|
||||
)
|
||||
raise backend.server.v2.store.exceptions.SlugAlreadyInUseError(
|
||||
f"The URL slug '{slug}' is already in use by another one of your agents. Please choose a different slug."
|
||||
) from exc
|
||||
else:
|
||||
# Reraise as a generic database error for other unique violations
|
||||
raise backend.server.v2.store.exceptions.DatabaseError(
|
||||
f"Unique constraint violated (not slug): {error_str}"
|
||||
) from exc
|
||||
except (
|
||||
backend.server.v2.store.exceptions.AgentNotFoundError,
|
||||
backend.server.v2.store.exceptions.ListingExistsError,
|
||||
|
||||
@@ -279,7 +279,6 @@ async def test_create_store_submission(mocker):
|
||||
|
||||
# Verify mocks called correctly
|
||||
mock_agent_graph.return_value.find_first.assert_called_once()
|
||||
mock_store_listing.return_value.find_first.assert_called_once()
|
||||
mock_store_listing.return_value.create.assert_called_once()
|
||||
|
||||
|
||||
|
||||
@@ -106,3 +106,9 @@ class UnauthorizedError(StoreError):
|
||||
"""Raised when a user is not authorized to perform an action"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class SlugAlreadyInUseError(StoreError):
|
||||
"""Raised when a slug is already in use by another agent owned by the user"""
|
||||
|
||||
pass
|
||||
|
||||
@@ -547,6 +547,12 @@ async def create_submission(
|
||||
)
|
||||
|
||||
return result
|
||||
except backend.server.v2.store.exceptions.SlugAlreadyInUseError as e:
|
||||
logger.warning("Slug already in use: %s", str(e))
|
||||
return fastapi.responses.JSONResponse(
|
||||
status_code=409,
|
||||
content={"detail": str(e)},
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Exception occurred whilst creating store submission")
|
||||
return fastapi.responses.JSONResponse(
|
||||
|
||||
@@ -116,6 +116,7 @@ export function useAgentInfoStep({
|
||||
toast({
|
||||
title: "Submit Agent Error",
|
||||
description:
|
||||
(error instanceof Error ? error.message : undefined) ||
|
||||
"An error occurred while submitting the agent. Please try again.",
|
||||
duration: 3000,
|
||||
variant: "destructive",
|
||||
|
||||
Reference in New Issue
Block a user