feat: add response models to endpoints

This commit is contained in:
swve 2023-11-28 20:49:20 +01:00
parent 7738316200
commit 71279a1294
20 changed files with 148 additions and 68 deletions

View file

@ -26,3 +26,5 @@ class OrganizationCreate(OrganizationBase):
class OrganizationRead(OrganizationBase):
id: int
org_uuid: str
creation_date: str
update_date: str

View file

@ -40,7 +40,7 @@ class RoleTypeEnum(str, Enum):
class RoleBase(SQLModel):
name: str
description: Optional[str]
rights: Optional[Union[Rights,dict]] = Field(default={}, sa_column=Column(JSON))
rights: Optional[Union[Rights, dict]] = Field(default={}, sa_column=Column(JSON))
class Role(RoleBase, table=True):
@ -52,13 +52,21 @@ class Role(RoleBase, table=True):
update_date: str = ""
class RoleRead(RoleBase):
id: Optional[int] = Field(default=None, primary_key=True)
org_id: int = Field(default=None, foreign_key="organization.id")
role_type: RoleTypeEnum = RoleTypeEnum.TYPE_GLOBAL
role_uuid: str
creation_date: str
update_date: str
class RoleCreate(RoleBase):
org_id: Optional[int] = Field(default=None, foreign_key="organization.id")
class RoleUpdate(SQLModel):
role_id: int = Field(default=None, foreign_key="role.id")
name: Optional[str]
description: Optional[str]
rights: Optional[Union[Rights,dict]] = Field(default={}, sa_column=Column(JSON))
rights: Optional[Union[Rights, dict]] = Field(default={}, sa_column=Column(JSON))

View file

@ -1,4 +1,5 @@
from fastapi import APIRouter, Depends, UploadFile, Form, Request
from src.db.blocks import BlockRead
from src.core.events.database import get_db_session
from src.security.auth import get_current_user
from src.services.blocks.block_types.imageBlock.imageBlock import (
@ -30,7 +31,7 @@ async def api_create_image_file_block(
activity_id: str = Form(),
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Create new image file
"""
@ -43,7 +44,7 @@ async def api_get_image_file_block(
block_uuid: str,
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Get image file
"""
@ -62,7 +63,7 @@ async def api_create_video_file_block(
activity_id: str = Form(),
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Create new video file
"""
@ -75,7 +76,7 @@ async def api_get_video_file_block(
block_uuid: str,
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Get video file
"""
@ -94,7 +95,7 @@ async def api_create_pdf_file_block(
activity_id: str = Form(),
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Create new pdf file
"""
@ -107,7 +108,7 @@ async def api_get_pdf_file_block(
block_uuid: str,
db_session=Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> BlockRead:
"""
Get pdf file
"""

View file

@ -1,5 +1,6 @@
from typing import List
from fastapi import APIRouter, Depends, UploadFile, Form, Request
from src.db.activities import ActivityCreate, ActivityUpdate
from src.db.activities import ActivityCreate, ActivityRead, ActivityUpdate
from src.db.users import PublicUser
from src.core.events.database import get_db_session
from src.services.courses.activities.activities import (
@ -26,7 +27,7 @@ async def api_create_activity(
activity_object: ActivityCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Create new activity
"""
@ -39,7 +40,7 @@ async def api_get_activity(
activity_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Get single activity by activity_id
"""
@ -54,7 +55,7 @@ async def api_get_activities(
coursechapter_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> List[ActivityRead]:
"""
Get CourseChapter activities
"""
@ -67,7 +68,7 @@ async def api_update_activity(
activity_object: ActivityUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Update activity by activity_id
"""
@ -98,7 +99,7 @@ async def api_create_video_activity(
current_user: PublicUser = Depends(get_current_user),
video_file: UploadFile | None = None,
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Create new activity
"""
@ -118,7 +119,7 @@ async def api_create_external_video_activity(
external_video: ExternalVideo,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Create new activity
"""
@ -135,7 +136,7 @@ async def api_create_documentpdf_activity(
current_user: PublicUser = Depends(get_current_user),
pdf_file: UploadFile | None = None,
db_session=Depends(get_db_session),
):
) -> ActivityRead:
"""
Create new activity
"""

View file

@ -60,7 +60,9 @@ async def api_get_chapter_meta(
"""
Get Chapters metadata
"""
return await get_depreceated_course_chapters(request, course_id, current_user, db_session)
return await get_depreceated_course_chapters(
request, course_id, current_user, db_session
)
@router.put("/order/{course_id}")
@ -85,12 +87,15 @@ async def api_get_chapter_by(
course_id: int,
page: int,
limit: int,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
) -> List[ChapterRead]:
"""
Get Course Chapters by page and limit
"""
return await get_course_chapters(request, course_id, db_session, page, limit)
return await get_course_chapters(
request, course_id, db_session, current_user, page, limit
)
@router.put("/{coursechapter_id}")
@ -118,6 +123,4 @@ async def api_delete_coursechapter(
Delete CourseChapters by ID
"""
return await delete_chapter(
request, coursechapter_id, current_user, db_session
)
return await delete_chapter(request, coursechapter_id, current_user, db_session)

View file

@ -1,6 +1,7 @@
from typing import List
from fastapi import APIRouter, Depends, Request
from src.core.events.database import get_db_session
from src.db.collections import CollectionCreate, CollectionUpdate
from src.db.collections import CollectionCreate, CollectionRead, CollectionUpdate
from src.security.auth import get_current_user
from src.services.users.users import PublicUser
from src.services.courses.collections import (
@ -21,7 +22,7 @@ async def api_create_collection(
collection_object: CollectionCreate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> CollectionRead:
"""
Create new Collection
"""
@ -34,7 +35,7 @@ async def api_get_collection(
collection_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> CollectionRead:
"""
Get single collection by ID
"""
@ -49,7 +50,7 @@ async def api_get_collections_by(
org_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> List[CollectionRead]:
"""
Get collections by page and limit
"""
@ -62,7 +63,7 @@ async def api_update_collection(
collection_object: CollectionUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session=Depends(get_db_session),
):
) -> CollectionRead:
"""
Update collection by ID
"""

View file

@ -1,8 +1,9 @@
from typing import List
from fastapi import APIRouter, Depends, UploadFile, Form, Request
from sqlmodel import Session
from src.core.events.database import get_db_session
from src.db.users import PublicUser
from src.db.courses import CourseCreate, CourseUpdate
from src.db.courses import CourseCreate, CourseRead, CourseUpdate, FullCourseReadWithTrail
from src.security.auth import get_current_user
from src.services.courses.courses import (
create_course,
@ -31,7 +32,7 @@ async def api_create_course(
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
thumbnail: UploadFile | None = None,
):
) -> CourseRead:
"""
Create new Course
"""
@ -55,7 +56,7 @@ async def api_create_course_thumbnail(
thumbnail: UploadFile | None = None,
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> CourseRead:
"""
Update new Course Thumbnail
"""
@ -70,7 +71,7 @@ async def api_get_course(
course_id: str,
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> CourseRead:
"""
Get single Course by course_id
"""
@ -85,7 +86,7 @@ async def api_get_course_meta(
course_id: int,
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> FullCourseReadWithTrail:
"""
Get single Course Metadata (chapters, activities) by course_id
"""
@ -102,9 +103,9 @@ async def api_get_course_by_orgslug(
org_slug: str,
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> List[CourseRead]:
"""
Get houses by page and limit
Get courses by page and limit
"""
return await get_courses_orgslug(
request, current_user, org_slug, db_session, page, limit
@ -117,7 +118,7 @@ async def api_update_course(
course_object: CourseUpdate,
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
):
) -> CourseRead:
"""
Update Course by course_id
"""

View file

@ -1,4 +1,5 @@
from fastapi import APIRouter, Depends, Request
from src.db.install import InstallRead
from src.core.events.database import get_db_session
from src.db.organizations import OrganizationCreate
from src.db.users import UserCreate
@ -18,8 +19,10 @@ router = APIRouter()
@router.post("/start")
async def api_create_install_instance(
request: Request, data: dict, db_session=Depends(get_db_session),
):
request: Request,
data: dict,
db_session=Depends(get_db_session),
) -> InstallRead:
# create install
install = await create_install_instance(request, data, db_session)
@ -27,7 +30,9 @@ async def api_create_install_instance(
@router.get("/latest")
async def api_get_latest_install_instance(request: Request, db_session=Depends(get_db_session),):
async def api_get_latest_install_instance(
request: Request, db_session=Depends(get_db_session)
) -> InstallRead:
# get latest created install
install = await get_latest_install_instance(request, db_session=db_session)
@ -35,7 +40,10 @@ async def api_get_latest_install_instance(request: Request, db_session=Depends(g
@router.post("/default_elements")
async def api_install_def_elements(request: Request, db_session=Depends(get_db_session),):
async def api_install_def_elements(
request: Request,
db_session=Depends(get_db_session),
):
elements = await install_default_elements(request, {}, db_session)
return elements
@ -43,7 +51,9 @@ async def api_install_def_elements(request: Request, db_session=Depends(get_db_s
@router.post("/org")
async def api_install_org(
request: Request, org: OrganizationCreate, db_session=Depends(get_db_session),
request: Request,
org: OrganizationCreate,
db_session=Depends(get_db_session),
):
organization = await install_create_organization(request, org, db_session)
@ -52,7 +62,10 @@ async def api_install_org(
@router.post("/user")
async def api_install_user(
request: Request, data: UserCreate, org_slug: str, db_session=Depends(get_db_session),
request: Request,
data: UserCreate,
org_slug: str,
db_session=Depends(get_db_session),
):
user = await install_create_organization_user(request, data, org_slug, db_session)
@ -61,8 +74,11 @@ async def api_install_user(
@router.post("/update")
async def api_update_install_instance(
request: Request, data: dict, step: int, db_session=Depends(get_db_session),
):
request: Request,
data: dict,
step: int,
db_session=Depends(get_db_session),
) -> InstallRead:
request.app.db["installs"]
# get latest created install

View file

@ -1,7 +1,13 @@
from typing import List
from fastapi import APIRouter, Depends, Request, UploadFile
from sqlmodel import Session
from src.db.users import PublicUser
from src.db.organizations import OrganizationCreate, OrganizationUpdate
from src.db.organizations import (
Organization,
OrganizationCreate,
OrganizationRead,
OrganizationUpdate,
)
from src.core.events.database import get_db_session
from src.security.auth import get_current_user
from src.services.orgs.orgs import (
@ -24,7 +30,7 @@ async def api_create_org(
org_object: OrganizationCreate,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
) -> OrganizationRead:
"""
Create new organization
"""
@ -37,7 +43,7 @@ async def api_get_org(
org_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
) -> OrganizationRead:
"""
Get single Org by ID
"""
@ -50,7 +56,7 @@ async def api_get_org_by_slug(
org_slug: str,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
) -> OrganizationRead:
"""
Get single Org by Slug
"""
@ -84,7 +90,7 @@ async def api_user_orgs(
limit: int,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
) -> List[Organization]:
"""
Get orgs by page and limit by user
"""
@ -99,7 +105,7 @@ async def api_update_org(
org_object: OrganizationUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
) -> OrganizationRead:
"""
Update Org by ID
"""

View file

@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends, Request
from sqlmodel import Session
from src.core.events.database import get_db_session
from src.db.roles import RoleCreate, RoleUpdate
from src.db.roles import RoleCreate, RoleRead, RoleUpdate
from src.security.auth import get_current_user
from src.services.roles.roles import create_role, delete_role, read_role, update_role
from src.db.users import PublicUser
@ -16,7 +16,7 @@ async def api_create_role(
role_object: RoleCreate,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
)-> RoleRead:
"""
Create new role
"""
@ -29,7 +29,7 @@ async def api_get_role(
role_id: str,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
)-> RoleRead:
"""
Get single role by role_id
"""
@ -42,7 +42,7 @@ async def api_update_role(
role_object: RoleUpdate,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
):
)-> RoleRead:
"""
Update role by role_id
"""

View file

@ -38,9 +38,7 @@ async def api_get_user_trail(
"""
Get a user trails
"""
return await get_user_trails(
request, user=user, db_session=db_session
)
return await get_user_trails(request, user=user, db_session=db_session)
@router.get("/org_slug/{org_id}/trail")
@ -58,9 +56,6 @@ async def api_get_trail_by_org_id(
)
# Courses in trail
@router.post("/add_course/{course_id}")
async def api_add_course_to_trail(
request: Request,

View file

@ -126,7 +126,7 @@ async def api_delete_user(
db_session: Session = Depends(get_db_session),
current_user: PublicUser = Depends(get_current_user),
user_id: int,
):
) :
"""
Delete User
"""

View file

@ -3,7 +3,7 @@ from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.blocks import Block, BlockRead, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
from src.services.users.users import PublicUser
@ -65,6 +65,8 @@ async def create_image_block(
db_session.commit()
db_session.refresh(block)
block = BlockRead.from_orm(block)
return block
@ -75,6 +77,9 @@ async def get_image_block(
block = db_session.exec(statement).first()
if block:
block = BlockRead.from_orm(block)
return block
else:
raise HTTPException(

View file

@ -3,7 +3,7 @@ from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.blocks import Block, BlockRead, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
@ -66,6 +66,8 @@ async def create_pdf_block(
db_session.commit()
db_session.refresh(block)
block = BlockRead.from_orm(block)
return block
@ -80,4 +82,6 @@ async def get_pdf_block(
status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist"
)
block = BlockRead.from_orm(block)
return block

View file

@ -3,7 +3,7 @@ from uuid import uuid4
from fastapi import HTTPException, status, UploadFile, Request
from sqlmodel import Session, select
from src.db.activities import Activity
from src.db.blocks import Block, BlockTypeEnum
from src.db.blocks import Block, BlockRead, BlockTypeEnum
from src.db.courses import Course
from src.services.blocks.utils.upload_files import upload_file_and_return_file_object
@ -66,6 +66,8 @@ async def create_video_block(
db_session.commit()
db_session.refresh(block)
block = BlockRead.from_orm(block)
return block
@ -79,5 +81,7 @@ async def get_video_block(
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="Video file does not exist"
)
block = BlockRead.from_orm(block)
return block

View file

@ -96,6 +96,8 @@ async def get_activity(
# RBAC check
await rbac_check(request, activity.activity_uuid, current_user, "read", db_session)
activity = ActivityRead.from_orm(activity)
return activity
@ -130,6 +132,8 @@ async def update_activity(
db_session.commit()
db_session.refresh(activity)
activity = ActivityRead.from_orm(activity)
return activity
@ -182,7 +186,7 @@ async def get_activities(
coursechapter_id: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
):
) -> list[ActivityRead]:
statement = select(ChapterActivity).where(
ChapterActivity.chapter_id == coursechapter_id
)
@ -197,6 +201,8 @@ async def get_activities(
# RBAC check
await rbac_check(request, "activity_x", current_user, "read", db_session)
activities = [ActivityRead.from_orm(activity) for activity in activities]
return activities

View file

@ -51,6 +51,8 @@ async def get_course(
# RBAC check
await rbac_check(request, course.course_uuid, current_user, "read", db_session)
course = CourseRead.from_orm(course)
return course
@ -188,6 +190,8 @@ async def update_course_thumbnail(
db_session.commit()
db_session.refresh(course)
course = CourseRead.from_orm(course)
return course
@ -223,6 +227,8 @@ async def update_course(
db_session.commit()
db_session.refresh(course)
course = CourseRead.from_orm(course)
return course
@ -277,6 +283,8 @@ async def get_courses_orgslug(
courses = db_session.exec(statement)
courses = [CourseRead.from_orm(course) for course in courses]
return courses

View file

@ -3,7 +3,7 @@ from uuid import uuid4
from fastapi import HTTPException, Request
from sqlalchemy import desc
from sqlmodel import Session, select
from src.db.install import Install
from src.db.install import Install, InstallRead
from src.db.organizations import Organization, OrganizationCreate
from src.db.roles import Permission, Rights, Role, RoleTypeEnum
from src.db.user_organizations import UserOrganization
@ -41,6 +41,8 @@ async def create_install_instance(request: Request, data: dict, db_session: Sess
# refresh install instance
db_session.refresh(install)
install = InstallRead.from_orm(install)
return install
@ -53,6 +55,8 @@ async def get_latest_install_instance(request: Request, db_session: Session):
status_code=404,
detail="No install instance found",
)
install = InstallRead.from_orm(install)
return install
@ -78,6 +82,8 @@ async def update_install_instance(
# refresh install instance
db_session.refresh(install)
install = InstallRead.from_orm(install)
return install

View file

@ -38,6 +38,8 @@ async def get_organization(
# RBAC check
await rbac_check(request, org.org_uuid, current_user, "read", db_session)
org = OrganizationRead.from_orm(org)
return org
@ -61,6 +63,8 @@ async def get_organization_by_slug(
# RBAC check
await rbac_check(request, org.org_uuid, current_user, "read", db_session)
org = OrganizationRead.from_orm(org)
return org
@ -160,6 +164,8 @@ async def update_org(
db_session.commit()
db_session.refresh(org)
org = OrganizationRead.from_orm(org)
return org
@ -197,6 +203,7 @@ async def update_org_logo(
db_session.commit()
db_session.refresh(org)
return {"detail": "Logo updated"}
@ -244,7 +251,7 @@ async def get_orgs_by_user(
user_id: str,
page: int = 1,
limit: int = 10,
):
) -> list[Organization]:
statement = (
select(Organization)
.join(UserOrganization)

View file

@ -7,7 +7,7 @@ from src.security.rbac.rbac import (
authorization_verify_if_user_is_author,
)
from src.db.users import AnonymousUser, PublicUser
from src.db.roles import Role, RoleCreate, RoleUpdate
from src.db.roles import Role, RoleCreate, RoleRead, RoleUpdate
from fastapi import HTTPException, Request
from datetime import datetime
@ -32,6 +32,8 @@ async def create_role(
db_session.commit()
db_session.refresh(role)
role = RoleRead(**role.dict())
return role
@ -52,6 +54,8 @@ async def read_role(
# RBAC check
await rbac_check(request, current_user, "read", role.role_uuid, db_session)
role = RoleRead(**role.dict())
return role
@ -90,6 +94,8 @@ async def update_role(
db_session.commit()
db_session.refresh(role)
role = RoleRead(**role.dict())
return role