Skip to content

Commit 59210da

Browse files
authored
Merge pull request #4 from OZ-Coding-School/day8
Day8
2 parents 4d19893 + ec0a130 commit 59210da

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+2883
-576
lines changed

.env

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
SECRET_KEY=secretkey123123124133123
2+
MYSQL_HOST=127.0.0.1
3+
MYSQL_PORT=3306
4+
MYSQL_USER=root
5+
MYSQL_PASSWORD=1234
6+
MYSQL_DB=fastapi_assignment_hard

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ __pycache__/
44
.venv/
55
.coverage
66
.dmypy.json
7+
media/

conftest.py

+37-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,43 @@
1+
import asyncio
2+
from typing import Any, Generator
3+
from unittest.mock import Mock, patch
4+
15
import pytest
6+
from pytest import FixtureRequest
7+
from tortoise.backends.base.config_generator import generate_config
8+
from tortoise.contrib.test import finalizer, initializer
29

3-
from src.models.movies import MovieModel
4-
from src.models.users import UserModel
10+
from src.configs import config
11+
from src.configs.database import TORTOISE_APP_MODELS
512

613
TEST_BASE_URL = "http://test"
14+
TEST_DB_LABEL = "models"
15+
TEST_DB_TZ = "Asia/Seoul"
16+
17+
18+
def get_test_db_config() -> dict[str, Any]:
19+
tortoise_config = generate_config(
20+
db_url=f"mysql://{config.MYSQL_USER}:{config.MYSQL_PASSWORD}@{config.MYSQL_HOST}:{config.MYSQL_PORT}/test",
21+
app_modules={TEST_DB_LABEL: TORTOISE_APP_MODELS},
22+
connection_label=TEST_DB_LABEL,
23+
testing=True,
24+
)
25+
tortoise_config["timezone"] = TEST_DB_TZ
26+
27+
return tortoise_config
28+
29+
30+
@pytest.fixture(scope="session", autouse=True)
31+
def initialize(request: FixtureRequest) -> Generator[None, None, None]:
32+
loop = asyncio.new_event_loop()
33+
asyncio.set_event_loop(loop)
34+
with patch("tortoise.contrib.test.getDBConfig", Mock(return_value=get_test_db_config())):
35+
initializer(modules=TORTOISE_APP_MODELS)
36+
yield
37+
finalizer()
38+
loop.close()
739

840

9-
@pytest.fixture(scope="function", autouse=True)
10-
def user_model_clear() -> None:
11-
UserModel.clear()
12-
MovieModel.clear()
41+
@pytest.fixture(scope="session", autouse=True)
42+
def event_loop() -> None:
43+
pass

main.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
from fastapi import FastAPI
22

3+
from src.configs.database import initialize_tortoise
34
from src.middleware.auth import AuthMiddleware
4-
from src.models.movies import MovieModel
5-
from src.models.users import UserModel
5+
from src.routers.like_router import like_router
66
from src.routers.movie_router import movie_router
7+
from src.routers.review_router import review_router
78
from src.routers.user_router import user_router
89

910
app = FastAPI()
1011

1112
# include custom middleware
1213
app.add_middleware(AuthMiddleware)
14+
1315
# include router in app
1416
app.include_router(user_router)
1517
app.include_router(movie_router)
18+
app.include_router(review_router)
19+
app.include_router(like_router)
1620

17-
# create dummy for test
18-
UserModel.create_dummy()
19-
MovieModel.create_dummy()
21+
# initialize_tortoise-orm
22+
initialize_tortoise(app=app)
2023

2124
if __name__ == "__main__":
2225
import uvicorn
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
CREATE TABLE IF NOT EXISTS `users` (
7+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
8+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
9+
`username` VARCHAR(50) NOT NULL UNIQUE,
10+
`hashed_password` VARCHAR(128) NOT NULL,
11+
`age` INT NOT NULL,
12+
`gender` VARCHAR(6) NOT NULL COMMENT 'MALE: male\nFEMALE: female',
13+
`last_login` DATETIME(6),
14+
KEY `idx_users_usernam_266d85` (`username`)
15+
) CHARACTER SET utf8mb4;
16+
CREATE TABLE IF NOT EXISTS `movies` (
17+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
18+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
19+
`title` VARCHAR(255) NOT NULL,
20+
`plot` LONGTEXT NOT NULL,
21+
`cast` JSON NOT NULL,
22+
`playtime` INT NOT NULL,
23+
`genre` VARCHAR(9) NOT NULL COMMENT 'SF: SF\nADVENTURE: Adventure\nROMANCE: Romance\nCOMIC: Comic\nFANTASY: Fantasy\nSCIENCE: Science\nMYSTERY: Mystery\nACTION: Action\nHORROR: Horror'
24+
) CHARACTER SET utf8mb4;
25+
CREATE TABLE IF NOT EXISTS `aerich` (
26+
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
27+
`version` VARCHAR(255) NOT NULL,
28+
`app` VARCHAR(100) NOT NULL,
29+
`content` JSON NOT NULL
30+
) CHARACTER SET utf8mb4;"""
31+
32+
33+
async def downgrade(db: BaseDBAsyncClient) -> str:
34+
return """
35+
"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
ALTER TABLE `users` ADD `profile_image_url` VARCHAR(255);
7+
ALTER TABLE `movies` ADD `poster_image_url` VARCHAR(255);"""
8+
9+
10+
async def downgrade(db: BaseDBAsyncClient) -> str:
11+
return """
12+
ALTER TABLE `users` DROP COLUMN `profile_image_url`;
13+
ALTER TABLE `movies` DROP COLUMN `poster_image_url`;"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
CREATE TABLE IF NOT EXISTS `reviews` (
7+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
8+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
9+
`title` VARCHAR(50) NOT NULL,
10+
`content` VARCHAR(255) NOT NULL,
11+
`review_image_url` VARCHAR(255),
12+
`movie_id` BIGINT NOT NULL,
13+
`user_id` BIGINT NOT NULL,
14+
UNIQUE KEY `uid_reviews_user_id_44b823` (`user_id`, `movie_id`),
15+
CONSTRAINT `fk_reviews_movies_56a147b9` FOREIGN KEY (`movie_id`) REFERENCES `movies` (`id`) ON DELETE CASCADE,
16+
CONSTRAINT `fk_reviews_users_8aed0759` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
17+
) CHARACTER SET utf8mb4;
18+
CREATE TABLE IF NOT EXISTS `review_likes` (
19+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
20+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
21+
`is_liked` BOOL NOT NULL DEFAULT 1,
22+
`review_id` BIGINT NOT NULL,
23+
`user_id` BIGINT NOT NULL,
24+
UNIQUE KEY `uid_review_like_user_id_c69f9e` (`user_id`, `review_id`),
25+
CONSTRAINT `fk_review_l_reviews_6cb49859` FOREIGN KEY (`review_id`) REFERENCES `reviews` (`id`) ON DELETE CASCADE,
26+
CONSTRAINT `fk_review_l_users_5cd4a3e1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
27+
) CHARACTER SET utf8mb4;"""
28+
29+
30+
async def downgrade(db: BaseDBAsyncClient) -> str:
31+
return """
32+
DROP TABLE IF EXISTS `reviews`;
33+
DROP TABLE IF EXISTS `review_likes`;"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
CREATE TABLE IF NOT EXISTS `genres` (
7+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
8+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
9+
`external_id` INT NOT NULL UNIQUE,
10+
`name` VARCHAR(255) NOT NULL
11+
) CHARACTER SET utf8mb4;
12+
ALTER TABLE `movies` ADD `release_date` DATETIME(6) NOT NULL;
13+
ALTER TABLE `movies` RENAME COLUMN `plot` TO `overview`;
14+
ALTER TABLE `movies` RENAME COLUMN `playtime` TO `runtime`;
15+
ALTER TABLE `movies` ADD `external_id` INT NOT NULL UNIQUE;
16+
ALTER TABLE `movies` DROP COLUMN `genre`;
17+
ALTER TABLE `movies` MODIFY COLUMN `cast` VARCHAR(255) NOT NULL;
18+
CREATE TABLE IF NOT EXISTS `movie_genres` (
19+
`id` BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
20+
`created_at` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
21+
`genre_id` BIGINT NOT NULL,
22+
`movie_id` BIGINT NOT NULL,
23+
CONSTRAINT `fk_movie_ge_genres_c7d0356e` FOREIGN KEY (`genre_id`) REFERENCES `genres` (`id`) ON DELETE CASCADE,
24+
CONSTRAINT `fk_movie_ge_movies_014c0d12` FOREIGN KEY (`movie_id`) REFERENCES `movies` (`id`) ON DELETE CASCADE
25+
) CHARACTER SET utf8mb4;"""
26+
27+
28+
async def downgrade(db: BaseDBAsyncClient) -> str:
29+
return """
30+
ALTER TABLE `movies` ADD `genre` VARCHAR(9) NOT NULL COMMENT 'SF: SF\nADVENTURE: Adventure\nROMANCE: Romance\nCOMIC: Comic\nFANTASY: Fantasy\nSCIENCE: Science\nMYSTERY: Mystery\nACTION: Action\nHORROR: Horror';
31+
ALTER TABLE `movies` RENAME COLUMN `runtime` TO `playtime`;
32+
ALTER TABLE `movies` RENAME COLUMN `overview` TO `plot`;
33+
ALTER TABLE `movies` DROP COLUMN `release_date`;
34+
ALTER TABLE `movies` DROP COLUMN `external_id`;
35+
ALTER TABLE `movies` MODIFY COLUMN `cast` JSON NOT NULL;
36+
DROP TABLE IF EXISTS `movie_genres`;
37+
DROP TABLE IF EXISTS `genres`;"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
ALTER TABLE `movies` MODIFY COLUMN `external_id` INT;"""
7+
8+
9+
async def downgrade(db: BaseDBAsyncClient) -> str:
10+
return """
11+
ALTER TABLE `movies` MODIFY COLUMN `external_id` INT NOT NULL;"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
DROP TABLE IF EXISTS `movie_genres`;
7+
CREATE TABLE `movies_genres` (
8+
`genre_id` BIGINT NOT NULL REFERENCES `genres` (`id`) ON DELETE CASCADE,
9+
`movies_id` BIGINT NOT NULL REFERENCES `movies` (`id`) ON DELETE CASCADE
10+
) CHARACTER SET utf8mb4;"""
11+
12+
13+
async def downgrade(db: BaseDBAsyncClient) -> str:
14+
return """
15+
DROP TABLE IF EXISTS `movies_genres`;"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from tortoise import BaseDBAsyncClient
2+
3+
4+
async def upgrade(db: BaseDBAsyncClient) -> str:
5+
return """
6+
ALTER TABLE `movies` MODIFY COLUMN `release_date` DATE NOT NULL;"""
7+
8+
9+
async def downgrade(db: BaseDBAsyncClient) -> str:
10+
return """
11+
ALTER TABLE `movies` MODIFY COLUMN `release_date` DATETIME(6) NOT NULL;"""

0 commit comments

Comments
 (0)