Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Feature/pdct 1722 Raise ConflictError on create if exists already #277

Merged
merged 14 commits into from
Jan 7, 2025
Merged
9 changes: 8 additions & 1 deletion app/api/api_v1/routers/corpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@
set_default_query_params,
validate_query_params,
)
from app.errors import AuthorisationError, RepositoryError, ValidationError
from app.errors import (
AuthorisationError,
ConflictError,
RepositoryError,
ValidationError,
)
from app.model.corpus import CorpusCreateDTO, CorpusReadDTO, CorpusWriteDTO
from app.service import corpus as corpus_service

Expand Down Expand Up @@ -161,5 +166,7 @@ async def create_corpus(request: Request, new_corpus: CorpusCreateDTO) -> str:
raise HTTPException(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail=e.message
)
except ConflictError as e:
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail=e.message)
katybaulch marked this conversation as resolved.
Show resolved Hide resolved

return corpus_id
6 changes: 6 additions & 0 deletions app/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ class RepositoryError(ExceptionWithMessage):
pass


class ConflictError(ExceptionWithMessage):
"""Raised when entity already exists."""

pass


class TokenError(ExceptionWithMessage):
"""Raised when there is an error encoding/decoding the token."""

Expand Down
6 changes: 5 additions & 1 deletion app/service/corpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import app.clients.db.session as db_session
import app.repository.corpus as corpus_repo
import app.repository.organisation as org_repo
from app.errors import RepositoryError, ValidationError
from app.errors import ConflictError, RepositoryError, ValidationError
from app.model.corpus import CorpusCreateDTO, CorpusReadDTO, CorpusWriteDTO
from app.model.user import UserContext
from app.service import app_user, id
Expand Down Expand Up @@ -204,6 +204,10 @@ def create(
if corpus.import_id is not None:
validate_import_id(corpus.import_id, db)

corpus_exists = get(corpus.import_id)
if corpus_exists is not None:
raise ConflictError(f"Corpus '{corpus.import_id}' already exists")

try:
import_id = corpus_repo.create(db, corpus)
if len(import_id) == 0:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "admin_backend"
version = "2.17.27"
version = "2.17.28"
description = ""
authors = ["CPR-dev-team <tech@climatepolicyradar.org>"]
packages = [{ include = "app" }, { include = "tests" }]
Expand Down
17 changes: 17 additions & 0 deletions tests/integration_tests/corpus/test_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,3 +242,20 @@ def test_create_corpus_when_invalid_import_id(
data_db.query(Corpus).filter(Corpus.import_id == import_id).one_or_none()
)
assert actual_corpus is None


def test_create_corpus_raises_on_conflict(
client: TestClient, data_db: Session, superuser_header_token
):
setup_db(data_db)
new_corpus = create_corpus_create_dto(
"Laws and Policies", import_id="CCLW.corpus.i00000001.n0000"
)
response = client.post(
"/api/v1/corpora",
json=new_corpus.model_dump(),
headers=superuser_header_token,
)
assert response.status_code == status.HTTP_409_CONFLICT
data = response.json()
assert data["detail"] == f"Corpus '{new_corpus.import_id}' already exists"
Loading