2424from mavedb .models .experiment import Experiment
2525from mavedb .models .score_set import ScoreSet
2626from mavedb .models .user import User
27+ from mavedb .routers .shared import (
28+ ACCESS_CONTROL_ERROR_RESPONSES ,
29+ BASE_400_RESPONSE ,
30+ BASE_409_RESPONSE ,
31+ PUBLIC_ERROR_RESPONSES ,
32+ ROUTER_BASE_PREFIX ,
33+ )
2734from mavedb .view_models import collection , collection_bundle
2835
2936logger = logging .getLogger (__name__ )
3037
3138router = APIRouter (
32- prefix = "/api/v1 " ,
39+ prefix = f" { ROUTER_BASE_PREFIX } " ,
3340 tags = ["Collections" ],
34- responses = {404 : { "description" : "Not found" }, 500 : { "description" : "Internal server error" } },
41+ responses = {** PUBLIC_ERROR_RESPONSES },
3542 route_class = LoggedRoute ,
3643)
3744
4148 status_code = 200 ,
4249 response_model = collection_bundle .CollectionBundle ,
4350 response_model_exclude_none = True ,
44- responses = {
45- 401 : {"description" : "Not authenticated" },
46- },
51+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES },
4752 summary = "List my collections" ,
4853)
4954def list_my_collections (
@@ -96,10 +101,7 @@ def list_my_collections(
96101 "/collections/{urn}" ,
97102 status_code = 200 ,
98103 response_model = collection .Collection ,
99- responses = {
100- 401 : {"description" : "Not authenticated" },
101- 403 : {"description" : "User lacks necessary permissions" },
102- },
104+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES },
103105 response_model_exclude_none = True ,
104106 summary = "Fetch a collection by URN" ,
105107)
@@ -145,11 +147,7 @@ def fetch_collection(
145147@router .post (
146148 "/collections/" ,
147149 response_model = collection .Collection ,
148- responses = {
149- 400 : {"description" : "Bad request" },
150- 401 : {"description" : "Not authenticated" },
151- 403 : {"description" : "User lacks necessary permissions" },
152- },
150+ responses = {** BASE_400_RESPONSE , ** ACCESS_CONTROL_ERROR_RESPONSES },
153151 response_model_exclude_none = True ,
154152 summary = "Create a collection" ,
155153)
@@ -210,7 +208,7 @@ async def create_collection(
210208 save_to_logging_context (format_raised_exception_info_as_dict (e ))
211209 logger .error (msg = "Multiple users found with the given ORCID iD" , extra = logging_context ())
212210 raise HTTPException (
213- status_code = 400 ,
211+ status_code = 500 ,
214212 detail = "Multiple MaveDB users found with the given ORCID iD" ,
215213 )
216214
@@ -233,7 +231,7 @@ async def create_collection(
233231 except MultipleResultsFound as e :
234232 save_to_logging_context (format_raised_exception_info_as_dict (e ))
235233 logger .error (msg = "Multiple resources found with the given URN" , extra = logging_context ())
236- raise HTTPException (status_code = 400 , detail = "Multiple resources found with the given URN" )
234+ raise HTTPException (status_code = 500 , detail = "Multiple resources found with the given URN" )
237235
238236 item = Collection (
239237 ** jsonable_encoder (
@@ -266,11 +264,7 @@ async def create_collection(
266264@router .patch (
267265 "/collections/{urn}" ,
268266 response_model = collection .Collection ,
269- responses = {
270- 400 : {"description" : "Bad request" },
271- 401 : {"description" : "Not authenticated" },
272- 403 : {"description" : "User lacks necessary permissions" },
273- },
267+ responses = {** BASE_400_RESPONSE , ** ACCESS_CONTROL_ERROR_RESPONSES },
274268 response_model_exclude_none = True ,
275269 summary = "Update a collection" ,
276270)
@@ -421,11 +415,7 @@ async def add_score_set_to_collection(
421415@router .delete (
422416 "/collections/{collection_urn}/score-sets/{score_set_urn}" ,
423417 response_model = collection .Collection ,
424- responses = {
425- 400 : {"description" : "Bad request" },
426- 401 : {"description" : "Not authenticated" },
427- 403 : {"description" : "User lacks necessary permissions" },
428- },
418+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES , ** BASE_409_RESPONSE },
429419 summary = "Remove a score set from a collection" ,
430420)
431421async def delete_score_set_from_collection (
@@ -463,7 +453,7 @@ async def delete_score_set_from_collection(
463453 extra = logging_context (),
464454 )
465455 raise HTTPException (
466- status_code = 400 ,
456+ status_code = 409 ,
467457 detail = f"association between score set '{ score_set_urn } ' and collection '{ collection_urn } ' not found" ,
468458 )
469459
@@ -506,10 +496,7 @@ async def delete_score_set_from_collection(
506496@router .post (
507497 "/collections/{collection_urn}/experiments" ,
508498 response_model = collection .Collection ,
509- responses = {
510- 401 : {"description" : "Not authenticated" },
511- 403 : {"description" : "User lacks necessary permissions" },
512- },
499+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES },
513500 summary = "Add an experiment to a collection" ,
514501)
515502async def add_experiment_to_collection (
@@ -581,11 +568,7 @@ async def add_experiment_to_collection(
581568@router .delete (
582569 "/collections/{collection_urn}/experiments/{experiment_urn}" ,
583570 response_model = collection .Collection ,
584- responses = {
585- 400 : {"description" : "Bad request" },
586- 401 : {"description" : "Not authenticated" },
587- 403 : {"description" : "User lacks necessary permissions" },
588- },
571+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES , ** BASE_409_RESPONSE },
589572 summary = "Remove an experiment from a collection" ,
590573)
591574async def delete_experiment_from_collection (
@@ -623,7 +606,7 @@ async def delete_experiment_from_collection(
623606 extra = logging_context (),
624607 )
625608 raise HTTPException (
626- status_code = 400 ,
609+ status_code = 409 ,
627610 detail = f"association between experiment '{ experiment_urn } ' and collection '{ collection_urn } ' not found" ,
628611 )
629612
@@ -666,11 +649,7 @@ async def delete_experiment_from_collection(
666649@router .post (
667650 "/collections/{urn}/{role}s" ,
668651 response_model = collection .Collection ,
669- responses = {
670- 400 : {"description" : "Bad request" },
671- 401 : {"description" : "Not authenticated" },
672- 403 : {"description" : "User lacks necessary permissions" },
673- },
652+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES , ** BASE_409_RESPONSE },
674653 summary = "Add a user to a collection role" ,
675654)
676655async def add_user_to_collection_role (
@@ -723,7 +702,7 @@ async def add_user_to_collection_role(
723702 extra = logging_context (),
724703 )
725704 raise HTTPException (
726- status_code = 400 ,
705+ status_code = 409 ,
727706 detail = f"user with ORCID iD '{ body .orcid_id } ' is already a { role } for collection '{ urn } '" ,
728707 )
729708 # A user can only be in one role per collection, so remove from any other roles
@@ -757,11 +736,7 @@ async def add_user_to_collection_role(
757736@router .delete (
758737 "/collections/{urn}/{role}s/{orcid_id}" ,
759738 response_model = collection .Collection ,
760- responses = {
761- 400 : {"description" : "Bad request" },
762- 401 : {"description" : "Not authenticated" },
763- 403 : {"description" : "User lacks necessary permissions" },
764- },
739+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES , ** BASE_409_RESPONSE },
765740 summary = "Remove a user from a collection role" ,
766741)
767742async def remove_user_from_collection_role (
@@ -817,7 +792,7 @@ async def remove_user_from_collection_role(
817792 extra = logging_context (),
818793 )
819794 raise HTTPException (
820- status_code = 400 ,
795+ status_code = 409 ,
821796 detail = f"user with ORCID iD '{ orcid_id } ' does not currently hold the role { role } for collection '{ urn } '" ,
822797 )
823798
@@ -845,10 +820,7 @@ async def remove_user_from_collection_role(
845820
846821@router .delete (
847822 "/collections/{urn}" ,
848- responses = {
849- 401 : {"description" : "Not authenticated" },
850- 403 : {"description" : "User lacks necessary permissions" },
851- },
823+ responses = {** ACCESS_CONTROL_ERROR_RESPONSES },
852824 summary = "Delete a collection" ,
853825)
854826async def delete_collection (
0 commit comments