Skip to content

Commit 96f5d1a

Browse files
authored
Merge pull request #325 from VariantEffect/estelle/userAuthorizationCheck
Add router functions to check whether users have authorization in experiment, experiment set and score set.
2 parents ec79402 + 010c229 commit 96f5d1a

File tree

5 files changed

+428
-9
lines changed

5 files changed

+428
-9
lines changed

src/mavedb/lib/permissions.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515

1616

1717
class Action(Enum):
18-
READ = 1
19-
UPDATE = 2
20-
DELETE = 3
21-
ADD_EXPERIMENT = 4
22-
ADD_SCORE_SET = 5
23-
SET_SCORES = 6
24-
ADD_ROLE = 7
25-
PUBLISH = 8
18+
READ = 'read'
19+
UPDATE = 'update'
20+
DELETE = 'delete'
21+
ADD_EXPERIMENT = 'add_experiment'
22+
ADD_SCORE_SET = 'add_score_set'
23+
SET_SCORES = 'set_scores'
24+
ADD_ROLE = 'add_role'
25+
PUBLISH = 'publish'
2626

2727

2828
class PermissionResponse:

src/mavedb/routers/experiments.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from fastapi import APIRouter, Depends, HTTPException
66
from fastapi.encoders import jsonable_encoder
77
import pydantic
8-
from sqlalchemy import or_, and_
98
from sqlalchemy.orm import Session
109

1110
from mavedb import deps

src/mavedb/routers/permissions.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import logging
2+
from enum import Enum
3+
4+
from fastapi import APIRouter, Depends, HTTPException
5+
from sqlalchemy.orm import Session
6+
from typing import Union, Optional
7+
8+
from mavedb import deps
9+
from mavedb.lib.authentication import get_current_user, UserData
10+
from mavedb.lib.permissions import has_permission, Action
11+
from mavedb.lib.logging import LoggedRoute
12+
from mavedb.lib.logging.context import logging_context, save_to_logging_context
13+
from mavedb.models.experiment import Experiment
14+
from mavedb.models.experiment_set import ExperimentSet
15+
from mavedb.models.score_set import ScoreSet
16+
17+
router = APIRouter(
18+
prefix="/api/v1/permissions",
19+
tags=["permissions"],
20+
responses={404: {"description": "Not found"}},
21+
route_class=LoggedRoute,
22+
)
23+
24+
logger = logging.getLogger(__name__)
25+
26+
27+
class ModelName(str, Enum):
28+
experiment = "experiment"
29+
experiment_set = "experiment-set"
30+
score_set = "score-set"
31+
32+
33+
@router.get(
34+
"/user-is-permitted/{model_name}/{urn}/{action}",
35+
status_code=200,
36+
response_model=bool
37+
)
38+
async def check_permission(
39+
*,
40+
model_name: ModelName,
41+
urn: str,
42+
action: Action,
43+
db: Session = Depends(deps.get_db),
44+
user_data: UserData = Depends(get_current_user),
45+
) -> bool:
46+
"""
47+
Check whether users have authorizations in adding/editing/deleting/publishing experiment or score set.
48+
"""
49+
save_to_logging_context({"requested_resource": urn})
50+
51+
item: Optional[Union[ExperimentSet, Experiment, ScoreSet]] = None
52+
53+
if model_name == ModelName.experiment_set:
54+
item = db.query(ExperimentSet).filter(ExperimentSet.urn == urn).one_or_none()
55+
elif model_name == ModelName.experiment:
56+
item = db.query(Experiment).filter(Experiment.urn == urn).one_or_none()
57+
elif model_name == ModelName.score_set:
58+
item = db.query(ScoreSet).filter(ScoreSet.urn == urn).one_or_none()
59+
60+
if item:
61+
permission = has_permission(user_data, item, action).permitted
62+
return permission
63+
else:
64+
logger.debug(msg="The requested resources does not exist.", extra=logging_context())
65+
raise HTTPException(status_code=404, detail=f"{model_name.value} with URN '{urn}' not found")

src/mavedb/server_main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
log,
3737
mapped_variant,
3838
orcid,
39+
permissions,
3940
publication_identifiers,
4041
target_gene_identifiers,
4142
taxonomies,
@@ -82,6 +83,7 @@
8283
# app.include_router(log.router)
8384
app.include_router(mapped_variant.router)
8485
app.include_router(orcid.router)
86+
app.include_router(permissions.router)
8587
app.include_router(publication_identifiers.router)
8688
app.include_router(raw_read_identifiers.router)
8789
app.include_router(score_sets.router)

0 commit comments

Comments
 (0)