Skip to content

Commit ab68553

Browse files
committed
Initialize the repo
0 parents  commit ab68553

File tree

15 files changed

+1569
-0
lines changed

15 files changed

+1569
-0
lines changed

.gitignore

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
*.so
6+
.Python
7+
env/
8+
build/
9+
develop-eggs/
10+
dist/
11+
downloads/
12+
eggs/
13+
.eggs/
14+
lib/
15+
lib64/
16+
parts/
17+
sdist/
18+
var/
19+
wheels/
20+
*.egg-info/
21+
.installed.cfg
22+
*.egg
23+
24+
# Virtual Environment
25+
venv/
26+
ENV/
27+
28+
# IDE
29+
.idea/
30+
.vscode/
31+
*.swp
32+
*.swo
33+
34+
# Environment Variables
35+
.env
36+
37+
# Project-specific
38+
uploads/
39+
*.db
40+
*.sqlite3
41+
42+
# Logs
43+
*.log
44+
45+
# macOS
46+
.DS_Store
47+
.AppleDouble
48+
.LSOverride
49+
._*
50+

app/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from fastapi import FastAPI
2+
from fastapi.staticfiles import StaticFiles
3+
from fastapi.templating import Jinja2Templates
4+
5+
from app.routers import clips, pages
6+
7+
def create_app():
8+
app = FastAPI(title="ClipShare", description="A minimalist online clipboard")
9+
10+
# Mount static files
11+
app.mount("/static", StaticFiles(directory="app/static"), name="static")
12+
13+
# Include routers
14+
app.include_router(pages.router)
15+
app.include_router(clips.router, prefix="/api")
16+
17+
return app

app/models/clip.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from datetime import datetime
2+
from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean
3+
from app.models.database import Base
4+
5+
class Clip(Base):
6+
__tablename__ = "clips"
7+
8+
id = Column(Integer, primary_key=True, index=True)
9+
access_code = Column(String, unique=True, index=True)
10+
content = Column(Text)
11+
filename = Column(String, nullable=True) # For backward compatibility
12+
filenames = Column(Text, nullable=True) # Comma-separated list of filenames
13+
file_path = Column(String, nullable=True)
14+
language = Column(String, nullable=True)
15+
created_at = Column(DateTime, default=datetime.utcnow)
16+
expires_at = Column(DateTime)
17+
is_file = Column(Boolean, default=False)
18+
is_image = Column(Boolean, default=False)

app/models/database.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from sqlalchemy import create_engine
2+
from sqlalchemy.ext.declarative import declarative_base
3+
from sqlalchemy.orm import sessionmaker
4+
5+
SQLALCHEMY_DATABASE_URL = "sqlite:///./clipshare.db"
6+
7+
engine = create_engine(
8+
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
9+
)
10+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
11+
12+
Base = declarative_base()
13+
14+
def get_db():
15+
db = SessionLocal()
16+
try:
17+
yield db
18+
finally:
19+
db.close()

app/models/schemas.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from datetime import datetime
2+
from typing import Optional
3+
from pydantic import BaseModel
4+
5+
class ClipBase(BaseModel):
6+
content: Optional[str] = None
7+
language: Optional[str] = None
8+
filename: Optional[str] = None
9+
filenames: Optional[str] = None
10+
11+
class ClipCreate(ClipBase):
12+
expiration_hours: int = 24
13+
14+
class ClipResponse(ClipBase):
15+
access_code: str
16+
created_at: datetime
17+
expires_at: datetime
18+
is_file: bool = False
19+
is_image: bool = False
20+
21+
class Config:
22+
orm_mode = True
23+
24+
class ClipAccess(BaseModel):
25+
access_code: str

0 commit comments

Comments
 (0)