mirror of
				https://github.com/FutureOfMedTech-FITM-hack/backend.git
				synced 2025-10-30 23:27:32 +03:00 
			
		
		
		
	added posts
This commit is contained in:
		
							parent
							
								
									0c26353292
								
							
						
					
					
						commit
						69c521535d
					
				|  | @ -1,6 +1,7 @@ | ||||||
| from datetime import datetime | from datetime import date, datetime | ||||||
| 
 | 
 | ||||||
| from pydantic import BaseModel, EmailStr | from dateutil.relativedelta import relativedelta | ||||||
|  | from pydantic import BaseModel, EmailStr, root_validator | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Token(BaseModel): | class Token(BaseModel): | ||||||
|  | @ -31,6 +32,13 @@ class UserPublicInfo(UserBase): | ||||||
|     id: int |     id: int | ||||||
|     fullname: str | None |     fullname: str | None | ||||||
|     disabled: bool |     disabled: bool | ||||||
|  |     born: date | ||||||
|  | 
 | ||||||
|  |     @root_validator(pre=False) | ||||||
|  |     def _set_fields(cls, values): | ||||||
|  |         values["age"] = relativedelta(datetime.now(), values["born"]).years | ||||||
|  |         values.pop("born") | ||||||
|  |         return values | ||||||
| 
 | 
 | ||||||
|     class Config: |     class Config: | ||||||
|         orm_mode = True |         orm_mode = True | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								med_backend/db/models/posts.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								med_backend/db/models/posts.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | from sqlalchemy import Column, ForeignKey, Integer, String | ||||||
|  | from sqlalchemy.orm import relationship | ||||||
|  | 
 | ||||||
|  | from med_backend.db.base import Base | ||||||
|  | from med_backend.db.models.users import UserScheme | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PostScheme(Base): | ||||||
|  |     __tablename__ = "posts" | ||||||
|  | 
 | ||||||
|  |     id: int = Column( | ||||||
|  |         Integer, | ||||||
|  |         primary_key=True, | ||||||
|  |         autoincrement=True, | ||||||
|  |         unique=True, | ||||||
|  |         index=True, | ||||||
|  |     ) | ||||||
|  |     name: str = Column(String, nullable=False) | ||||||
|  |     description: str = Column(String, nullable=True) | ||||||
|  | 
 | ||||||
|  |     # creator | ||||||
|  |     user_id: int = Column(Integer, ForeignKey(UserScheme.id), primary_key=True) | ||||||
|  |     user: UserScheme = relationship("UserScheme", foreign_keys="PostScheme.user_id") | ||||||
							
								
								
									
										5
									
								
								med_backend/posts/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								med_backend/posts/__init__.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | """API for posts by doctors""" | ||||||
|  | 
 | ||||||
|  | from med_backend.posts.views import router | ||||||
|  | 
 | ||||||
|  | __all__ = ["router"] | ||||||
							
								
								
									
										48
									
								
								med_backend/posts/crud.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								med_backend/posts/crud.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | from typing import List | ||||||
|  | 
 | ||||||
|  | from fastapi import HTTPException | ||||||
|  | from sqlalchemy import select | ||||||
|  | from sqlalchemy.ext.asyncio import AsyncSession | ||||||
|  | from sqlalchemy.orm import selectinload | ||||||
|  | 
 | ||||||
|  | from med_backend.db.models.posts import PostScheme | ||||||
|  | from med_backend.posts.schemas import PostCreate | ||||||
|  | from med_backend.users.crud import get_user | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def get_posts( | ||||||
|  |     session: AsyncSession, | ||||||
|  |     skip: int = 0, | ||||||
|  |     limit: int = 100, | ||||||
|  | ) -> List[PostScheme] | None: | ||||||
|  |     r = await session.execute( | ||||||
|  |         select(PostScheme).offset(skip).limit(limit), | ||||||
|  |     ) | ||||||
|  |     posts = r.scalars().all() | ||||||
|  |     return posts | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def get_post(session: AsyncSession, post_id: int) -> PostScheme | None: | ||||||
|  |     r = await session.execute( | ||||||
|  |         select(PostScheme) | ||||||
|  |         .options(selectinload(PostScheme.user)) | ||||||
|  |         .where(PostScheme.id == post_id), | ||||||
|  |     ) | ||||||
|  |     post = r.scalars().first() | ||||||
|  |     return post | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async def create_post( | ||||||
|  |     session: AsyncSession, | ||||||
|  |     data: PostCreate, | ||||||
|  |     user_id: int, | ||||||
|  | ) -> PostScheme: | ||||||
|  |     user = await get_user(session, user_id) | ||||||
|  |     if not user or not user.is_manager: | ||||||
|  |         raise HTTPException(status_code=422, detail="User can't be used") | ||||||
|  | 
 | ||||||
|  |     obj = PostScheme(name=data.name, description=data.description, user_id=user_id) | ||||||
|  |     session.add(obj) | ||||||
|  |     await session.commit() | ||||||
|  |     await session.refresh(obj) | ||||||
|  |     return obj | ||||||
							
								
								
									
										27
									
								
								med_backend/posts/schemas.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								med_backend/posts/schemas.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | ||||||
|  | from pydantic import BaseModel | ||||||
|  | 
 | ||||||
|  | from med_backend.auth.schemas import UserPublicInfo | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class BasePost(BaseModel): | ||||||
|  |     name: str | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PostCreate(BasePost): | ||||||
|  |     description: str | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PostList(BasePost): | ||||||
|  |     id: int | ||||||
|  | 
 | ||||||
|  |     class Config: | ||||||
|  |         orm_mode = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Post(BasePost): | ||||||
|  |     id: int | ||||||
|  |     description: str | ||||||
|  |     user: UserPublicInfo | ||||||
|  | 
 | ||||||
|  |     class Config: | ||||||
|  |         orm_mode = True | ||||||
							
								
								
									
										41
									
								
								med_backend/posts/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								med_backend/posts/views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | ||||||
|  | from fastapi import APIRouter, Depends | ||||||
|  | from sqlalchemy.ext.asyncio import AsyncSession | ||||||
|  | 
 | ||||||
|  | from med_backend.auth.schemas import User | ||||||
|  | from med_backend.auth.services import get_current_active_user | ||||||
|  | from med_backend.db.dependencies import get_db_session | ||||||
|  | from med_backend.posts import crud | ||||||
|  | from med_backend.posts.schemas import Post, PostCreate, PostList | ||||||
|  | 
 | ||||||
|  | router = APIRouter() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @router.get("/all", response_model=list[PostList]) | ||||||
|  | async def get_all_posts( | ||||||
|  |     skip: int = 0, | ||||||
|  |     limit: int = 100, | ||||||
|  |     current_user: User = Depends(get_current_active_user), | ||||||
|  |     session: AsyncSession = Depends(get_db_session), | ||||||
|  | ): | ||||||
|  |     posts = await crud.get_posts(session, skip, limit) | ||||||
|  |     return posts | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @router.get("/{post_id}", response_model=Post) | ||||||
|  | async def get_post( | ||||||
|  |     post_id: int, | ||||||
|  |     current_user: User = Depends(get_current_active_user), | ||||||
|  |     session: AsyncSession = Depends(get_db_session), | ||||||
|  | ): | ||||||
|  |     form = await crud.get_post(session, post_id) | ||||||
|  |     return form | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @router.post("/create", response_model=Post) | ||||||
|  | async def create_post( | ||||||
|  |     data: PostCreate, | ||||||
|  |     current_user: User = Depends(get_current_active_user), | ||||||
|  |     session: AsyncSession = Depends(get_db_session), | ||||||
|  | ): | ||||||
|  |     post = await crud.create_post(session, data, current_user.id) | ||||||
|  |     return post | ||||||
|  | @ -1,8 +1,9 @@ | ||||||
| from fastapi.routing import APIRouter | from fastapi.routing import APIRouter | ||||||
| 
 | 
 | ||||||
| from med_backend import auth, forms, users | from med_backend import auth, forms, posts, users | ||||||
| 
 | 
 | ||||||
| api_router = APIRouter() | api_router = APIRouter() | ||||||
| api_router.include_router(auth.router, prefix="/auth", tags=["auth"]) | api_router.include_router(auth.router, prefix="/auth", tags=["auth"]) | ||||||
|  | api_router.include_router(posts.router, prefix="/posts", tags=["posts"]) | ||||||
| api_router.include_router(users.router, prefix="/users", tags=["users"]) | api_router.include_router(users.router, prefix="/users", tags=["users"]) | ||||||
| api_router.include_router(forms.router, prefix="/forms", tags=["forms"]) | api_router.include_router(forms.router, prefix="/forms", tags=["forms"]) | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ from importlib import metadata | ||||||
| 
 | 
 | ||||||
| from fastapi import FastAPI | from fastapi import FastAPI | ||||||
| from fastapi.responses import UJSONResponse | from fastapi.responses import UJSONResponse | ||||||
|  | from starlette.middleware.cors import CORSMiddleware | ||||||
| 
 | 
 | ||||||
| from med_backend.web.api.router import api_router | from med_backend.web.api.router import api_router | ||||||
| from med_backend.web.lifetime import register_shutdown_event, register_startup_event | from med_backend.web.lifetime import register_shutdown_event, register_startup_event | ||||||
|  | @ -32,4 +33,11 @@ def get_app() -> FastAPI: | ||||||
|     # Main router for the API. |     # Main router for the API. | ||||||
|     app.include_router(router=api_router, prefix="/api") |     app.include_router(router=api_router, prefix="/api") | ||||||
| 
 | 
 | ||||||
|  |     app.add_middleware( | ||||||
|  |         CORSMiddleware, | ||||||
|  |         allow_origins=["*"], | ||||||
|  |         allow_credentials=True, | ||||||
|  |         allow_methods=["*"], | ||||||
|  |         allow_headers=["*"], | ||||||
|  |     ) | ||||||
|     return app |     return app | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user