소스 검색

mod backend

tomoya 2 년 전
부모
커밋
094d0b2c45

+ 1 - 1
.env

@@ -15,7 +15,7 @@ DOCKER_IMAGE_CELERYWORKER=gpuceleryworker
 DOCKER_IMAGE_FRONTEND=frontend
 
 # Backend
-BACKEND_CORS_ORIGINS=["https://cloud.choozmo", "http://cloud.choozmo.com", "https://cloud.choozmo.com", "http://cloud.choozmo.com","http://172.105.219.42", "http://local.ai-anchor.com:5173", "http://local.ai-anchor.com:8080", "http://localhost", "http://localhost:4200", "http://localhost:3000", "http://localhost:5173", "http://localhost:8080", "https://localhost", "https://localhost:4200", "https://localhost:3000", "https://localhost:8080", "http://dev.ai-anchor.com:3000", "http://dev.ai-anchor.com:5173", "http://dev.ai-anchor.com:8080", "https://stag.ai-anchor.com", "https://ai-anchor.com", "http://local.dockertoolbox.tiangolo.com", "http://localhost.tiangolo.com"]
+BACKEND_CORS_ORIGINS=["http://dev.cloud.choozmo.com:5173", "http://dev.cloud.choozmo.com:8080", "http://cloud.choozmo.com:8080", "https://cloud.choozmo.com", "http://cloud.choozmo.com","http://172.105.219.42", "http://local.ai-anchor.com:5173", "http://local.ai-anchor.com:8080", "http://localhost", "http://localhost:4200", "http://localhost:3000", "http://localhost:5173", "http://localhost:8080", "https://localhost", "https://localhost:4200", "https://localhost:3000", "https://localhost:8080", "http://dev.ai-anchor.com:3000", "http://dev.ai-anchor.com:5173", "http://dev.ai-anchor.com:8080", "https://stag.ai-anchor.com", "https://ai-anchor.com"]
 PROJECT_NAME=AI anchor
 SECRET_KEY=1df1f2180c7b2550e76a8ccf5e67a76e5321d8c2d3fee4a725f8b80baf9a0c91
 FIRST_SUPERUSER=admin@ai-anchor.com

+ 3 - 1
backend/app/app/api/api_v1/api.py

@@ -1,9 +1,11 @@
 from fastapi import APIRouter
 
-from app.api.api_v1.endpoints import  login, users, utils, videos
+from app.api.api_v1.endpoints import  login, users, utils, videos, images, reputations
 
 api_router = APIRouter()
 api_router.include_router(login.router, tags=["login"])
 api_router.include_router(users.router, prefix="/users", tags=["users"])
 api_router.include_router(utils.router, prefix="/utils", tags=["utils"])
 api_router.include_router(videos.router, prefix="/videos", tags=["videos"])
+api_router.include_router(images.router, prefix="/images", tags=["iamges"])
+api_router.include_router(reputations.router, prefix="/reputations", tags=["reputations"])

+ 55 - 0
backend/app/app/api/api_v1/endpoints/images.py

@@ -0,0 +1,55 @@
+from typing import Any, List, Optional
+import subprocess
+from fastapi import UploadFile, File, Form
+from fastapi.responses import FileResponse
+from fastapi import APIRouter, Depends, HTTPException
+from sqlalchemy.orm import Session
+
+import app.crud as crud
+import app.models as models
+import app.schemas as schemas 
+from app.api import deps
+
+from app.core.celery_app import celery_app
+from app.core.config import settings
+from pathlib import Path
+from app.utils import random_name
+
+from app.core.celery_app import celery_app
+
+BACKEND_ZIP_STORAGE = Path("/app").joinpath(settings.BACKEND_ZIP_STORAGE)
+LOCAL_ZIP_STORAGE = Path("/").joinpath(settings.LOCAL_ZIP_STORAGE)
+
+
+router = APIRouter()
+
+
+
+@router.post("/sr")
+async def supser_resolution(
+    *,
+    db: Session = Depends(deps.get_db),
+    current_user: models.User = Depends(deps.get_current_active_user),
+    upload_files: List[UploadFile]=File(description="Multiple files as UploadFile"),
+) -> Any:
+    """
+    Super Resolution.
+    """
+    filenames = [random_name(20) for file in upload_files]
+    return {"filenames": filenames}
+
+@router.get("/sr")
+def get_image(
+    *,
+    db: Session = Depends(deps.get_db),
+    current_user: models.User = Depends(deps.get_current_active_user),
+    stored_file_name: str,
+    file_name: str,
+) -> Any:
+    """
+    Download image
+    """
+    filename = Path(file_name)
+    response_filename = filename.stem + "_hr.png"
+    return FileResponse(path="test_medias/superman_resolution.png", media_type='image/png', filename=response_filename)
+

+ 41 - 0
backend/app/app/api/api_v1/endpoints/reputations.py

@@ -0,0 +1,41 @@
+from typing import Any, List, Optional
+import subprocess
+from fastapi import UploadFile, File, Form
+from fastapi.responses import FileResponse
+from fastapi import APIRouter, Depends, HTTPException
+from sqlalchemy.orm import Session
+from datetime import datetime
+import app.crud as crud
+import app.models as models
+import app.schemas as schemas 
+from app.api import deps
+
+from app.core.celery_app import celery_app
+from app.core.config import settings
+from pathlib import Path
+
+from app.core.celery_app import celery_app
+
+BACKEND_ZIP_STORAGE = Path("/app").joinpath(settings.BACKEND_ZIP_STORAGE)
+LOCAL_ZIP_STORAGE = Path("/").joinpath(settings.LOCAL_ZIP_STORAGE)
+
+
+router = APIRouter()
+
+
+
+@router.post("/")
+async def post_reputation(
+    *,
+    db: Session = Depends(deps.get_db),
+    current_user: models.User = Depends(deps.get_current_active_user),
+    posted_article: schemas.ArticleCreate = Depends(schemas.ArticleCreate.as_form)
+) -> Any:
+    """
+    Create new video.
+    """
+    
+    #print(posted_article)
+    article = crud.artivle.create_with_owner(db=db, obj_in=posted_article, owner_id=current_user.id, posted_datetime=str(datetime.now()))
+    if article:
+      return {"id":article.id}

+ 1 - 1
backend/app/app/crud/__init__.py

@@ -1,6 +1,6 @@
 from .crud_user import user
 from .crud_video import video
-
+from .crud_article import artivle
 # For a new basic set of CRUD operations you could just do
 
 # from .base import CRUDBase

+ 23 - 0
backend/app/app/crud/crud_article.py

@@ -0,0 +1,23 @@
+from typing import List
+
+from fastapi.encoders import jsonable_encoder
+from sqlalchemy.orm import Session
+
+from app.crud.base import CRUDBase
+from app.models.article import Article
+from app.schemas.article import ArticleCreate, ArticleUpdate
+
+from app.utils import random_name
+
+class CRUDArticle(CRUDBase[Article, ArticleCreate, ArticleUpdate]):
+    def create_with_owner(
+        self, db: Session, *, obj_in: ArticleCreate, owner_id: int, posted_datetime: str
+    ) -> Article:
+        obj_in_data = jsonable_encoder(obj_in)
+        db_obj = self.model(**obj_in_data, owner_id=owner_id, posted_datetime=posted_datetime)
+        db.add(db_obj)
+        db.commit()
+        db.refresh(db_obj)
+        return db_obj
+    
+artivle = CRUDArticle(Article)

+ 1 - 0
backend/app/app/db/base.py

@@ -5,3 +5,4 @@ from app.models.user import User  # noqa
 from app.models.video import Video
 from app.models.enum import Progress, Membership
 from app.models.character import Character
+from app.models.article import Article

+ 2 - 1
backend/app/app/models/__init__.py

@@ -1,3 +1,4 @@
 from .user import User
 from .video import Video
-from .enum import Membership, Progress
+from .enum import Membership, Progress
+from .article import Article

+ 20 - 0
backend/app/app/models/article.py

@@ -0,0 +1,20 @@
+from typing import TYPE_CHECKING
+
+from sqlalchemy import Column, ForeignKey, Integer, String, Enum, DateTime, Text
+from sqlalchemy.orm import relationship
+
+from app.db.base_class import Base
+
+
+if TYPE_CHECKING:
+  from .user import User  # noqa: F401
+
+
+class Article(Base):
+  id = Column(Integer, primary_key=True, index=True)
+  title = Column(String(30), index=True, nullable=False)
+  link = Column(Text)
+  content = Column(Text)
+  posted_datetime = Column(DateTime)
+  owner_id = Column(Integer, ForeignKey("user.id"))
+  owner = relationship("User", back_populates="articles")

+ 1 - 1
backend/app/app/models/character.py

@@ -7,5 +7,5 @@ from app.db.base_class import Base
 
 class Character(Base):
   id = Column(Integer, primary_key=True, index=True)
-  naem = Column(String(20), index=True)
+  name = Column(String(20), index=True)
   stored_file_name = Column(String(30), unique=True, nullable=False)

+ 1 - 0
backend/app/app/models/user.py

@@ -20,3 +20,4 @@ class User(Base):
   is_active = Column(Boolean(), default=True)
   is_superuser = Column(Boolean(), default=False)
   videos = relationship("Video", back_populates="owner")
+  articles = relationship("Article", back_populates="owner")

+ 1 - 0
backend/app/app/schemas/__init__.py

@@ -2,3 +2,4 @@ from .token import Token, TokenPayload
 from .user import User, UserCreate, UserInDB, UserUpdate
 from .msg import Msg
 from .video import Video, VideoCreate, VideoInDB, VideoUpdate
+from .article import ArticleBase, ArticleCreate, ArticleUpdate

+ 28 - 0
backend/app/app/schemas/article.py

@@ -0,0 +1,28 @@
+from typing import Optional, Any
+
+from pydantic import BaseModel
+
+from fastapi import Form
+
+# Shared properties
+class ArticleBase(BaseModel):
+    title: Optional[str] = None
+    link: Optional[str] = None
+    content: Optional[str] = None
+
+# Properties to receive on video creation
+class ArticleCreate(ArticleBase):
+    title: str
+
+    @classmethod
+    def as_form(
+        cls,
+        title: str = Form(...),
+        link: str = Form(None),
+        content: str = Form(None)
+    ) -> Any:
+        return cls(title=title, link=link, content=content)
+    
+# Properties to receive via API on update
+class ArticleUpdate(ArticleBase):
+    pass

+ 2 - 2
backend/app/app/utils.py

@@ -3,8 +3,8 @@ from datetime import datetime, timedelta
 from pathlib import Path
 from typing import Any, Dict, Optional
 
-#import emails
-#from emails.template import JinjaTemplate
+import emails
+from emails.template import JinjaTemplate
 from jose import jwt
 
 from app.core.config import settings

+ 1 - 1
traefik.yml

@@ -7,7 +7,7 @@ services:
     image: traefik:v2.2
     ports:
       # Listen on port 80, default for HTTP, necessary to redirect to HTTPS
-      - 8080:80
+      - 80:80
       # Listen on port 443, default for HTTPS
       - 443:443
     deploy: