Skip to content

Commit 54925db

Browse files
Merge pull request #3 from monicasmith463/feature/file-upload
Feature: document upload to s3
2 parents 30a4777 + 28e3662 commit 54925db

File tree

24 files changed

+1152
-1262
lines changed

24 files changed

+1152
-1262
lines changed

.github/workflows/deploy-production.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ jobs:
2424
SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
2525
EMAILS_FROM_EMAIL: ${{ secrets.EMAILS_FROM_EMAIL }}
2626
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
27+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
28+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
29+
AWS_REGION: ${{ secrets.AWS_REGION }}
30+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
2731
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
2832
steps:
2933
- name: Checkout

.github/workflows/deploy-staging.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ jobs:
2424
SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
2525
EMAILS_FROM_EMAIL: ${{ secrets.EMAILS_FROM_EMAIL }}
2626
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
27+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
28+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
29+
AWS_REGION: ${{ secrets.AWS_REGION }}
30+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
2731
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
2832
steps:
2933
- name: Checkout

.github/workflows/generate-client.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ jobs:
1111
permissions:
1212
contents: write
1313
runs-on: ubuntu-latest
14+
env:
15+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
16+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
17+
AWS_REGION: ${{ secrets.AWS_REGION }}
18+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
1419
steps:
1520
# For PRs from forks
1621
- uses: actions/checkout@v4

.github/workflows/playwright.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ on:
1818
jobs:
1919
changes:
2020
runs-on: ubuntu-latest
21+
env:
22+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
23+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
24+
AWS_REGION: ${{ secrets.AWS_REGION }}
25+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
2126
# Set job outputs to values from filter step
2227
outputs:
2328
changed: ${{ steps.filter.outputs.changed }}
@@ -41,6 +46,11 @@ jobs:
4146
if: ${{ needs.changes.outputs.changed == 'true' }}
4247
timeout-minutes: 60
4348
runs-on: ubuntu-latest
49+
env:
50+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
51+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
52+
AWS_REGION: ${{ secrets.AWS_REGION }}
53+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
4454
strategy:
4555
matrix:
4656
shardIndex: [1, 2, 3, 4]
@@ -92,6 +102,11 @@ jobs:
92102
# Merge reports after playwright-tests, even if some shards have failed
93103
if: ${{ !cancelled() && needs.changes.outputs.changed == 'true' }}
94104
runs-on: ubuntu-latest
105+
env:
106+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
107+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
108+
AWS_REGION: ${{ secrets.AWS_REGION }}
109+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
95110
steps:
96111
- uses: actions/checkout@v4
97112
- uses: actions/setup-node@v4
@@ -123,6 +138,11 @@ jobs:
123138
needs:
124139
- test-playwright
125140
runs-on: ubuntu-latest
141+
env:
142+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
143+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
144+
AWS_REGION: ${{ secrets.AWS_REGION }}
145+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
126146
steps:
127147
- name: Decide whether the needed jobs succeeded or failed
128148
uses: re-actors/alls-green@release/v1

.github/workflows/test-backend.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ on:
1212
jobs:
1313
test-backend:
1414
runs-on: ubuntu-latest
15+
env:
16+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
17+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
18+
AWS_REGION: ${{ secrets.AWS_REGION }}
19+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
1520
steps:
1621
- name: Checkout
1722
uses: actions/checkout@v4

.github/workflows/test-docker-compose.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ jobs:
1313

1414
test-docker-compose:
1515
runs-on: ubuntu-latest
16+
env:
17+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
18+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
19+
AWS_REGION: ${{ secrets.AWS_REGION }}
20+
S3_BUCKET: ${{ secrets.S3_BUCKET }}
1621
steps:
1722
- name: Checkout
1823
uses: actions/checkout@v4

backend/app/api/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from fastapi import APIRouter
22

3-
from app.api.routes import items, login, private, users, utils
3+
from app.api.routes import documents, login, private, users, utils
44
from app.core.config import settings
55

66
api_router = APIRouter()
77
api_router.include_router(login.router)
88
api_router.include_router(users.router)
99
api_router.include_router(utils.router)
10-
api_router.include_router(items.router)
10+
api_router.include_router(documents.router)
1111

1212

1313
if settings.ENVIRONMENT == "local":
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from typing import Any
2+
3+
from fastapi import APIRouter, BackgroundTasks, File, HTTPException, UploadFile
4+
5+
from app.api.deps import CurrentUser, SessionDep
6+
from app.models import Document, DocumentCreate, DocumentPublic
7+
from app.s3 import generate_s3_url, upload_file_to_s3
8+
9+
router = APIRouter(prefix="/documents", tags=["documents"])
10+
11+
12+
@router.post("/", response_model=DocumentPublic)
13+
def create_document(
14+
*,
15+
session: SessionDep,
16+
current_user: CurrentUser,
17+
background_tasks: BackgroundTasks, # noqa: ARG001
18+
file: UploadFile = File(...),
19+
) -> Any:
20+
key = None
21+
try:
22+
key = upload_file_to_s3(file, str(current_user.id))
23+
except Exception as e:
24+
raise HTTPException(500, f"Failed to upload file. Error: {str(e)}")
25+
26+
try:
27+
url = generate_s3_url(key)
28+
except Exception:
29+
raise HTTPException(500, f"Could not generate URL for file key: {key}")
30+
31+
document_in = DocumentCreate(
32+
filename=file.filename,
33+
content_type=file.content_type,
34+
size=file.size,
35+
s3_url=url,
36+
)
37+
38+
document = Document.model_validate(
39+
document_in, update={"owner_id": current_user.id}
40+
)
41+
42+
session.add(document)
43+
session.commit()
44+
session.refresh(document)
45+
46+
# 3. Kick off background job
47+
print("Document created, starting background task...")
48+
# background_tasks.add_task(generate_questions, document.id)
49+
50+
return document

backend/app/api/routes/items.py

Lines changed: 0 additions & 109 deletions
This file was deleted.

backend/app/api/routes/users.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from app.core.config import settings
1414
from app.core.security import get_password_hash, verify_password
1515
from app.models import (
16-
Item,
16+
Document,
1717
Message,
1818
UpdatePassword,
1919
User,
@@ -219,7 +219,7 @@ def delete_user(
219219
raise HTTPException(
220220
status_code=403, detail="Super users are not allowed to delete themselves"
221221
)
222-
statement = delete(Item).where(col(Item.owner_id) == user_id)
222+
statement = delete(Document).where(col(Document.owner_id) == user_id)
223223
session.exec(statement) # type: ignore
224224
session.delete(user)
225225
session.commit()

0 commit comments

Comments
 (0)