Skip to content

Commit

Permalink
[Feat] get market one (#21)
Browse files Browse the repository at this point in the history
## Description
- add getting market data route & method
- fix aws config
- add s3 get with data url

## Related Issue
Closes #17
  • Loading branch information
Eeap authored Nov 27, 2023
2 parents 758b93d + 2c900ae commit 4b8693a
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 27 deletions.
18 changes: 18 additions & 0 deletions app/api/routes/markets.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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",
)
2 changes: 1 addition & 1 deletion app/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
21 changes: 21 additions & 0 deletions app/crud/crud_markets.py
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -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
32 changes: 29 additions & 3 deletions app/crud/crud_posts.py
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -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, # should be changed with user email
)
# image bool value insert
db_obj.image = True if files else False
Expand All @@ -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="[email protected]",
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
18 changes: 17 additions & 1 deletion app/models/domain/markets.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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]
65 changes: 43 additions & 22 deletions app/services/aws.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand All @@ -30,29 +34,45 @@ 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):
try:
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
Expand All @@ -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']
return response["Item"]

0 comments on commit 4b8693a

Please sign in to comment.