From 7e707290bd6c2096d01bc51bc58bcc80471e3bfe Mon Sep 17 00:00:00 2001 From: Eeap Date: Mon, 27 Nov 2023 13:24:13 +0900 Subject: [PATCH 1/4] feat: add getting market data one route --- app/api/routes/markets.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/api/routes/markets.py b/app/api/routes/markets.py index 98b2622..be8c7d7 100644 --- a/app/api/routes/markets.py +++ b/app/api/routes/markets.py @@ -5,6 +5,8 @@ from app.api.dependencies import database from app.models.domain import markets from app.crud import crud_markets, crud_posts +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse router = APIRouter() @@ -27,3 +29,19 @@ def create_market_posts( status_code=500, detail="create failed", ) + + +@router.get("/get/{category}/{page}") +def get_market_posts( + *, db: Session = Depends(database.get_db), category: str, page: int +) -> tuple[Any, list[UploadFile] | list[Any]]: + # market data get + market_data = crud_posts.get(db=db, category=category, post_id=page) + if market_data: + res_data = jsonable_encoder(market_data) + return JSONResponse(content=res_data) + else: + raise HTTPException( + status_code=500, + detail="getting market data failed", + ) From 783dd6b7d5ff891f25b0f571ee207c9829c4ab7c Mon Sep 17 00:00:00 2001 From: Eeap Date: Mon, 27 Nov 2023 13:24:52 +0900 Subject: [PATCH 2/4] refactor: add s3 get with url & add region config --- app/core/config.py | 2 +- app/services/aws.py | 65 ++++++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index fd413ad..0d3ae9e 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -39,7 +39,7 @@ class Settings(BaseSettings): AWS_ACCESS_KEY: str = config("AWS_ACCESS_KEY", cast=str) AWS_SECRET_KEY: str = config("AWS_SECRET_KEY", cast=str) AWS_SESSION_TOKEN: str = config("AWS_SESSION_TOKEN", cast=str) - + AWS_REGION: str = config("AWS_REGION", cast=str) GOOGLE_CLIENT_ID: str = config("GOOGLE_CLIENT_ID", cast=str) GOOGLE_CLIENT_SECRET: str = config("GOOGLE_CLIENT_SECRET", cast=str) GOOGLE_CALLBACK_URL: str = config("GOOGLE_CALLBACK_URL", cast=str) diff --git a/app/services/aws.py b/app/services/aws.py index 1dd4243..c703cf6 100644 --- a/app/services/aws.py +++ b/app/services/aws.py @@ -6,17 +6,21 @@ from typing import List from app.models.domain.messages import Message + def get_aws_client(service_name: str): return boto3.client( service_name, - region_name="us-east-1", + region_name=settings.AWS_REGION, aws_access_key_id=settings.AWS_ACCESS_KEY, aws_secret_access_key=settings.AWS_SECRET_KEY, aws_session_token=settings.AWS_SESSION_TOKEN, ) -def s3_upload(files: List[UploadFile], post_id: int, user_email: str, category: str) -> bool: - client = get_aws_client('s3') + +def s3_upload( + files: List[UploadFile], post_id: int, user_email: str, category: str +) -> bool: + client = get_aws_client("s3") try: for file in files: new_filename = f"{user_email}/{category}/{post_id}/{file.filename}" @@ -30,14 +34,30 @@ def s3_upload(files: List[UploadFile], post_id: int, user_email: str, category: return False return True + +def s3_get(post_id: int, user_email: str, category: str) -> List[UploadFile]: + client = get_aws_client("s3") + try: + res = client.list_objects( + Bucket=settings.BUCKET_NAME, Prefix=f"{user_email}/{category}/{post_id}/" + ) + file_list = [] + for file_detail in res["Contents"]: + image_url = f'https://{settings.BUCKET_NAME}.s3.{settings.AWS_REGION}.amazonaws.com/{file_detail["Key"]}' + file_list.append(image_url) + return file_list + except ClientError as e: + return [] + + class DynamoDBHandler: def __init__(self): - self.client = get_aws_client('dynamodb') + self.client = get_aws_client("dynamodb") self.table_name = settings.DYNAMODB_TABLE_NAME self.table = self.get_table() def get_table(self): - dynamodb = boto3.resource('dynamodb', region_name='us-east-1') + dynamodb = boto3.resource("dynamodb", region_name="us-east-1") return dynamodb.Table(self.table_name) def create_table(self): @@ -45,14 +65,14 @@ def create_table(self): self.client.create_table( TableName=self.table_name, KeySchema=[ - {'AttributeName': 'user_id', 'KeyType': 'HASH'}, - {'AttributeName': 'created_at', 'KeyType': 'RANGE'} + {"AttributeName": "user_id", "KeyType": "HASH"}, + {"AttributeName": "created_at", "KeyType": "RANGE"}, ], AttributeDefinitions=[ - {'AttributeName': 'user_id', 'AttributeType': 'N'}, - {'AttributeName': 'created_at', 'AttributeType': 'S'} + {"AttributeName": "user_id", "AttributeType": "N"}, + {"AttributeName": "created_at", "AttributeType": "S"}, ], - ProvisionedThroughput={'ReadCapacityUnits': 5, 'WriteCapacityUnits': 5} + ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}, ) except ClientError as e: return False @@ -62,25 +82,26 @@ def put_object(self, message: Message): try: self.table.put_item( Item={ - 'user_id': message.user_id, - 'post_id': message.post_id, - 'created_at': message.created_at.isoformat(), - 'category': message.category, - 'sender': message.sender_id, - 'recipient': message.recipient_id, - 'content': message.content, + "user_id": message.user_id, + "post_id": message.post_id, + "created_at": message.created_at.isoformat(), + "category": message.category, + "sender": message.sender_id, + "recipient": message.recipient_id, + "content": message.content, } ) except ClientError as e: return False return True - + def get_object(self, user_id: int, created_at: str): try: - response = self.table.get_item(Key={'user_id':user_id, 'created_at':created_at}) + response = self.table.get_item( + Key={"user_id": user_id, "created_at": created_at} + ) except ClientError as err: - logging.error( - "Couldn't get message from table %s.", self.table_name) + logging.error("Couldn't get message from table %s.", self.table_name) raise else: - return response['Item'] \ No newline at end of file + return response["Item"] From 40e18f9295760b8b589d7320128c0cf84b4a345b Mon Sep 17 00:00:00 2001 From: Eeap Date: Mon, 27 Nov 2023 13:26:14 +0900 Subject: [PATCH 3/4] feat: add getting market data one method --- app/crud/crud_markets.py | 21 +++++++++++++++++++++ app/crud/crud_posts.py | 32 +++++++++++++++++++++++++++++--- app/models/domain/markets.py | 18 +++++++++++++++++- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/crud/crud_markets.py b/app/crud/crud_markets.py index fbde1b3..0f2c11a 100644 --- a/app/crud/crud_markets.py +++ b/app/crud/crud_markets.py @@ -1,6 +1,8 @@ from sqlalchemy.orm import Session from app.models.domain import markets from app.models.schemas.markets import Market +from app.models.schemas.posts import Post +from typing import Any, List def create(db: Session, *, obj_in: markets.MarketCreate, post_id: int) -> Market: @@ -24,3 +26,22 @@ def create(db: Session, *, obj_in: markets.MarketCreate, post_id: int) -> Market db.commit() db.refresh(db_obj) return db_obj + + +def get(db: Session, *, post_id: int, post_data: Post, file_list: List[str]) -> Any: + market_data = db.query(Market).filter(Market.post_id == post_id).one() + result = markets.MarketGet( + post_id=post_id, + starting_price=market_data.starting_price, + price=market_data.price, + auction=market_data.auction, + deadline=market_data.deadline, + title=post_data.title, + content=post_data.content, + status=post_data.status, + category=post_data.category, + user_id=post_data.user_id, + created_at=post_data.created_at, + image_list=file_list, + ) + return result diff --git a/app/crud/crud_posts.py b/app/crud/crud_posts.py index a313147..74147ac 100644 --- a/app/crud/crud_posts.py +++ b/app/crud/crud_posts.py @@ -1,11 +1,13 @@ from sqlalchemy.orm import Session from app.models.domain import posts from app.models.schemas.posts import Post -from app.services.aws import s3_upload -from fastapi import HTTPException +from app.services.aws import s3_upload, s3_get +from fastapi import HTTPException, UploadFile from fastapi import UploadFile -from typing import List +from typing import List, Tuple, Any import datetime +from app.models.domain import markets +from app.crud.crud_markets import get as get_market def create(db: Session, *, obj_in: posts.PostCreate, files: List[UploadFile]) -> Post: @@ -15,6 +17,7 @@ def create(db: Session, *, obj_in: posts.PostCreate, files: List[UploadFile]) -> status=obj_in.status, category=obj_in.category, created_at=datetime.datetime.today(), + user_id=1, # 추후 수정 ) # image bool value insert db_obj.image = True if files else False @@ -35,3 +38,26 @@ def create(db: Session, *, obj_in: posts.PostCreate, files: List[UploadFile]) -> detail="s3 upload failed", ) return db_obj + + +def get( + db: Session, *, category: str, post_id: int +) -> list[markets.MarketGet] | list[Any]: + post_data = db.query(Post).filter(Post.id == post_id).one() + if category == "market": + if post_data.image: + file_list = s3_get( + post_id=post_data.id, + user_email="sumink0903@gmail.com", + category=category, + ) + result = get_market( + db, post_id=post_id, post_data=post_data, file_list=file_list + ) + return result + else: + result = get_market(db, post_id=post_id, post_data=post_data, file_list=[]) + return result + + else: + return None diff --git a/app/models/domain/markets.py b/app/models/domain/markets.py index 02c2e58..8880eb5 100644 --- a/app/models/domain/markets.py +++ b/app/models/domain/markets.py @@ -1,7 +1,8 @@ -from typing import Optional +from typing import Optional, List from pydantic import BaseModel import datetime from app.resources.status import Status +from fastapi import UploadFile class MarketCreate(BaseModel): @@ -14,3 +15,18 @@ class MarketCreate(BaseModel): content: str status: Status category: str + + +class MarketGet(BaseModel): + post_id: int + starting_price: int + price: int + auction: bool + deadline: datetime.datetime + title: str + content: str + status: Status + category: str + user_id: int + created_at: datetime.datetime + image_list: List[str] From 2c900ae5b58cd74a5e2aa3eb459df9e8221187a0 Mon Sep 17 00:00:00 2001 From: Eeap Date: Mon, 27 Nov 2023 13:26:35 +0900 Subject: [PATCH 4/4] chore: fix comment --- app/crud/crud_posts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/crud/crud_posts.py b/app/crud/crud_posts.py index 74147ac..09afa22 100644 --- a/app/crud/crud_posts.py +++ b/app/crud/crud_posts.py @@ -17,7 +17,7 @@ def create(db: Session, *, obj_in: posts.PostCreate, files: List[UploadFile]) -> status=obj_in.status, category=obj_in.category, created_at=datetime.datetime.today(), - user_id=1, # 추후 수정 + user_id=1, # should be changed with user email ) # image bool value insert db_obj.image = True if files else False