This commit is contained in:
Timothy Jaeryang Baek
2026-03-17 17:58:01 -05:00
parent fcf7208352
commit de3317e26b
220 changed files with 17200 additions and 22836 deletions
+55 -61
View File
@@ -36,18 +36,16 @@ router = APIRouter()
############################
@router.get("/", response_model=list[SkillUserResponse])
@router.get('/', response_model=list[SkillUserResponse])
async def get_skills(
request: Request,
user=Depends(get_verified_user),
db: Session = Depends(get_session),
):
if user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL:
if user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL:
skills = Skills.get_skills(db=db)
else:
user_group_ids = {
group.id for group in Groups.get_groups_by_member_id(user.id, db=db)
}
user_group_ids = {group.id for group in Groups.get_groups_by_member_id(user.id, db=db)}
all_skills = Skills.get_skills(db=db)
skills = [
skill
@@ -55,9 +53,9 @@ async def get_skills(
if skill.user_id == user.id
or AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="read",
permission='read',
user_group_ids=user_group_ids,
db=db,
)
@@ -71,7 +69,7 @@ async def get_skills(
############################
@router.get("/list", response_model=SkillAccessListResponse)
@router.get('/list', response_model=SkillAccessListResponse)
async def get_skill_list(
query: Optional[str] = None,
view_option: Optional[str] = None,
@@ -86,16 +84,16 @@ async def get_skill_list(
filter = {}
if query:
filter["query"] = query
filter['query'] = query
if view_option:
filter["view_option"] = view_option
filter['view_option'] = view_option
if not (user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL):
if not (user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL):
groups = Groups.get_groups_by_member_id(user.id, db=db)
if groups:
filter["group_ids"] = [group.id for group in groups]
filter['group_ids'] = [group.id for group in groups]
filter["user_id"] = user.id
filter['user_id'] = user.id
result = Skills.search_skills(user.id, filter=filter, skip=skip, limit=limit, db=db)
@@ -104,13 +102,13 @@ async def get_skill_list(
SkillAccessResponse(
**skill.model_dump(),
write_access=(
(user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL)
(user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL)
or user.id == skill.user_id
or AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
),
@@ -126,15 +124,15 @@ async def get_skill_list(
############################
@router.get("/export", response_model=list[SkillModel])
@router.get('/export', response_model=list[SkillModel])
async def export_skills(
request: Request,
user=Depends(get_verified_user),
db: Session = Depends(get_session),
):
if user.role != "admin" and not has_permission(
if user.role != 'admin' and not has_permission(
user.id,
"workspace.skills",
'workspace.skills',
request.app.state.config.USER_PERMISSIONS,
db=db,
):
@@ -143,10 +141,10 @@ async def export_skills(
detail=ERROR_MESSAGES.UNAUTHORIZED,
)
if user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL:
if user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL:
return Skills.get_skills(db=db)
else:
return Skills.get_skills_by_user_id(user.id, "read", db=db)
return Skills.get_skills_by_user_id(user.id, 'read', db=db)
############################
@@ -154,22 +152,22 @@ async def export_skills(
############################
@router.post("/create", response_model=Optional[SkillResponse])
@router.post('/create', response_model=Optional[SkillResponse])
async def create_new_skill(
request: Request,
form_data: SkillForm,
user=Depends(get_verified_user),
db: Session = Depends(get_session),
):
if user.role != "admin" and not has_permission(
user.id, "workspace.skills", request.app.state.config.USER_PERMISSIONS, db=db
if user.role != 'admin' and not has_permission(
user.id, 'workspace.skills', request.app.state.config.USER_PERMISSIONS, db=db
):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.UNAUTHORIZED,
)
form_data.id = form_data.id.lower().replace(" ", "-")
form_data.id = form_data.id.lower().replace(' ', '-')
existing = Skills.get_skill_by_id(form_data.id, db=db)
if existing is not None:
@@ -185,10 +183,10 @@ async def create_new_skill(
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT("Error creating skill"),
detail=ERROR_MESSAGES.DEFAULT('Error creating skill'),
)
except Exception as e:
log.exception(f"Failed to create skill: {e}")
log.exception(f'Failed to create skill: {e}')
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(str(e)),
@@ -200,34 +198,32 @@ async def create_new_skill(
############################
@router.get("/id/{id}", response_model=Optional[SkillAccessResponse])
async def get_skill_by_id(
id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)
):
@router.get('/id/{id}', response_model=Optional[SkillAccessResponse])
async def get_skill_by_id(id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)):
skill = Skills.get_skill_by_id(id, db=db)
if skill:
if (
user.role == "admin"
user.role == 'admin'
or skill.user_id == user.id
or AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="read",
permission='read',
db=db,
)
):
return SkillAccessResponse(
**skill.model_dump(),
write_access=(
(user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL)
(user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL)
or user.id == skill.user_id
or AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
),
@@ -249,7 +245,7 @@ async def get_skill_by_id(
############################
@router.post("/id/{id}/update", response_model=Optional[SkillModel])
@router.post('/id/{id}/update', response_model=Optional[SkillModel])
async def update_skill_by_id(
request: Request,
id: str,
@@ -268,12 +264,12 @@ async def update_skill_by_id(
skill.user_id != user.id
and not AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
and user.role != "admin"
and user.role != 'admin'
):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -282,7 +278,7 @@ async def update_skill_by_id(
try:
updated = {
**form_data.model_dump(exclude={"id"}),
**form_data.model_dump(exclude={'id'}),
}
skill = Skills.update_skill_by_id(id, updated, db=db)
@@ -292,7 +288,7 @@ async def update_skill_by_id(
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT("Error updating skill"),
detail=ERROR_MESSAGES.DEFAULT('Error updating skill'),
)
except Exception as e:
raise HTTPException(
@@ -310,7 +306,7 @@ class SkillAccessGrantsForm(BaseModel):
access_grants: list[dict]
@router.post("/id/{id}/access/update", response_model=Optional[SkillModel])
@router.post('/id/{id}/access/update', response_model=Optional[SkillModel])
async def update_skill_access_by_id(
request: Request,
id: str,
@@ -329,12 +325,12 @@ async def update_skill_access_by_id(
skill.user_id != user.id
and not AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
and user.role != "admin"
and user.role != 'admin'
):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -346,10 +342,10 @@ async def update_skill_access_by_id(
user.id,
user.role,
form_data.access_grants,
"sharing.public_skills",
'sharing.public_skills',
)
AccessGrants.set_access_grants("skill", id, form_data.access_grants, db=db)
AccessGrants.set_access_grants('skill', id, form_data.access_grants, db=db)
return Skills.get_skill_by_id(id, db=db)
@@ -359,20 +355,18 @@ async def update_skill_access_by_id(
############################
@router.post("/id/{id}/toggle", response_model=Optional[SkillModel])
async def toggle_skill_by_id(
id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)
):
@router.post('/id/{id}/toggle', response_model=Optional[SkillModel])
async def toggle_skill_by_id(id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)):
skill = Skills.get_skill_by_id(id, db=db)
if skill:
if (
user.role == "admin"
user.role == 'admin'
or skill.user_id == user.id
or AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
):
@@ -383,7 +377,7 @@ async def toggle_skill_by_id(
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT("Error toggling skill"),
detail=ERROR_MESSAGES.DEFAULT('Error toggling skill'),
)
else:
raise HTTPException(
@@ -402,7 +396,7 @@ async def toggle_skill_by_id(
############################
@router.delete("/id/{id}/delete", response_model=bool)
@router.delete('/id/{id}/delete', response_model=bool)
async def delete_skill_by_id(
request: Request,
id: str,
@@ -420,12 +414,12 @@ async def delete_skill_by_id(
skill.user_id != user.id
and not AccessGrants.has_access(
user_id=user.id,
resource_type="skill",
resource_type='skill',
resource_id=skill.id,
permission="write",
permission='write',
db=db,
)
and user.role != "admin"
and user.role != 'admin'
):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,