瀏覽代碼

mod backend

tomoya 2 年之前
父節點
當前提交
094d0b2c45

+ 1 - 1
.env

@@ -15,7 +15,7 @@ DOCKER_IMAGE_CELERYWORKER=gpuceleryworker
 DOCKER_IMAGE_FRONTEND=frontend
 DOCKER_IMAGE_FRONTEND=frontend
 
 
 # Backend
 # 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
 PROJECT_NAME=AI anchor
 SECRET_KEY=1df1f2180c7b2550e76a8ccf5e67a76e5321d8c2d3fee4a725f8b80baf9a0c91
 SECRET_KEY=1df1f2180c7b2550e76a8ccf5e67a76e5321d8c2d3fee4a725f8b80baf9a0c91
 FIRST_SUPERUSER=admin@ai-anchor.com
 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 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 = APIRouter()
 api_router.include_router(login.router, tags=["login"])
 api_router.include_router(login.router, tags=["login"])
 api_router.include_router(users.router, prefix="/users", tags=["users"])
 api_router.include_router(users.router, prefix="/users", tags=["users"])
 api_router.include_router(utils.router, prefix="/utils", tags=["utils"])
 api_router.include_router(utils.router, prefix="/utils", tags=["utils"])
 api_router.include_router(videos.router, prefix="/videos", tags=["videos"])
 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_user import user
 from .crud_video import video
 from .crud_video import video
-
+from .crud_article import artivle
 # For a new basic set of CRUD operations you could just do
 # For a new basic set of CRUD operations you could just do
 
 
 # from .base import CRUDBase
 # 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.video import Video
 from app.models.enum import Progress, Membership
 from app.models.enum import Progress, Membership
 from app.models.character import Character
 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 .user import User
 from .video import Video
 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):
 class Character(Base):
   id = Column(Integer, primary_key=True, index=True)
   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)
   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_active = Column(Boolean(), default=True)
   is_superuser = Column(Boolean(), default=False)
   is_superuser = Column(Boolean(), default=False)
   videos = relationship("Video", back_populates="owner")
   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 .user import User, UserCreate, UserInDB, UserUpdate
 from .msg import Msg
 from .msg import Msg
 from .video import Video, VideoCreate, VideoInDB, VideoUpdate
 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 pathlib import Path
 from typing import Any, Dict, Optional
 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 jose import jwt
 
 
 from app.core.config import settings
 from app.core.config import settings

+ 1 - 1
traefik.yml

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