Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] get market one #21

Merged
merged 4 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"]