Compare commits

...

13 Commits

Author SHA1 Message Date
Barcode Betty 4eef2aff92 fix: resolve lint failures blocking CI
- src/cartsnitch_api/auth/dependencies.py: remove unused Cookie import
- src/cartsnitch_api/auth/routes.py: remove unused BaseModel, select, and User imports
- src/cartsnitch_api/main.py: fix import ordering

These were pre-existing issues unrelated to CAR-932 fix, blocking CI.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-23 22:19:38 +00:00
Savannah Savings 5c33b6ee38 Merge pull request 'Fix CI pipeline failures in cartsnitch/api' (#22) from cs_betty/api:barcode-betty/fix-ci-pipeline into dev
Merge PR #22: Fix CI pipeline failures in cartsnitch/api

Fixes:
- Remove cache: pip from setup-python to fix intermittent tar corruption
- Add CARTSNITCH_SERVICE_KEY and CARTSNITCH_FERNET_KEY test env vars

Reviewed-by: Savannah Savings (CTO)
Approved-by: Checkout Charlie (QA)
2026-05-23 22:13:56 +00:00
Flea Flicker cf4b29b8d3 Fix CI pipeline failures: remove pip cache from setup-python, add missing env vars
- Remove 'cache: pip' from setup-python in lint, typecheck, test jobs to fix
  intermittent 'archive/tar: write too long' errors on act_runner pods
- Add CARTSNITCH_SERVICE_KEY and CARTSNITCH_FERNET_KEY to test job env
  to satisfy Settings pydantic model requirements

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-23 21:57:04 +00:00
Savannah Savings 23899f6c8d Merge pull request 'fix: remove dead dispose_engine import from API main.py [CAR-932]' (#16) from betty/car-932-fix-dispose-engine into dev
fix: remove dead dispose_engine import from API main.py [CAR-932]

Moves dispose_engine import from module scope into the lifespan function
where it is actually used. Fixes ImportError crashing API pods.

Reviewed-by: cs_charlie (QA)
Approved-by: cs_savannah (CTO)
CI-override: pre-existing failures unrelated to this change
2026-05-23 21:51:56 +00:00
Savannah Savings 1805ff93cf Merge pull request 'fix: add UAT/dev domains to cors_origins' (#14) from cs_betty/api:car992-fix into dev
fix: add UAT/dev domains to cors_origins (#14)

Refs: CAR-992
2026-05-23 20:55:39 +00:00
Barcode Betty ba88fad48b fix: remove dead dispose_engine import from API main.py
The top-level import of dispose_engine from cartsnitch_api.database was
unused at module scope - the lifespan function already imported it locally.
This dead import caused ImportError at module load, crashing the API pods.

Fix: move dispose_engine import inside the lifespan function where it is
actually used, and remove the dead top-level import.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-23 20:54:39 +00:00
Barcode Betty 0127c16d0b fix: add UAT/dev domains to cors_origins
Add dev.cartsnitch.com and uat.cartsnitch.com to the CORS origins list
to match the infra HTTPRoute domains and fix auth blocking on UAT.

Refs: CAR-992
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-23 20:45:56 +00:00
Savannah Savings 7fd8e90b9c Merge pull request 'fix(ci): add uat branch to workflow triggers' (#9) from savannah/fix-ci-uat-trigger into dev
fix(ci): add uat branch to workflow triggers (#9)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 14:38:59 +00:00
Savannah Savings e429786696 fix(ci): add uat branch to workflow triggers
The on.push and on.pull_request triggers only listed [main, dev].
The deploy-uat job condition checks for refs/heads/uat but the
workflow never fires on uat pushes. Add uat to both trigger lists.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 14:37:47 +00:00
Savannah Savings 6b54a5ee7f Merge pull request 'chore: move workflows from .github to .gitea' (#6) from barcode-betty/move-workflows-to-gitea into dev
chore: move workflows from .github to .gitea (#6)

Part of Gitea migration (CAR-893).
2026-05-21 13:05:07 +00:00
Barcode Betty 4e38dd4a0e chore: move workflows from .github to .gitea
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 12:30:57 +00:00
Coupon Carl 3a4bf6fb30 Merge pull request 'ci: convert GitHub Actions to Gitea Actions (ubuntu-latest)' (#4) from betty/car-869-gitea-actions-api into dev 2026-05-21 04:54:50 +00:00
Barcode Betty 0c3c549a6a ci: convert GitHub Actions to Gitea Actions (ubuntu-latest)
- Replace runs-on: runners-cartsnitch with ubuntu-latest (6 jobs)
- Remove SARIF upload step (github/codeql-action/upload-sarif)
- Replace GitHub App token with secrets.GITEA_TOKEN in deploy-dev and deploy-uat

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 03:57:49 +00:00
5 changed files with 22 additions and 42 deletions
@@ -2,9 +2,9 @@ name: CI
on:
push:
branches: [main, dev]
branches: [main, dev, uat]
pull_request:
branches: [main, dev]
branches: [main, dev, uat]
concurrency:
group: ci-${{ github.ref }}
@@ -20,13 +20,12 @@ env:
jobs:
lint:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- run: pip install ruff
- name: Ruff lint
run: ruff check .
@@ -34,14 +33,13 @@ jobs:
run: ruff format --check .
typecheck:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libpq-dev build-essential
- run: pip install -e ".[dev]" mypy
@@ -49,7 +47,7 @@ jobs:
run: mypy src/cartsnitch_api
test:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15-alpine
@@ -83,12 +81,13 @@ jobs:
CARTSNITCH_DATABASE_URL: postgresql+asyncpg://cartsnitch:cartsnitch_test@localhost:5432/cartsnitch_test
CARTSNITCH_REDIS_URL: redis://localhost:6379/0
CARTSNITCH_JWT_SECRET_KEY: test-secret-do-not-use-in-prod
CARTSNITCH_SERVICE_KEY: test-service-key-do-not-use-in-prod
CARTSNITCH_FERNET_KEY: wXWQsC0FZlhSz2t_tfVQjNUSP8vgAGG3o3pkjrX8Bw0=
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libpq-dev build-essential
- run: pip install -e ".[dev]"
@@ -96,7 +95,7 @@ jobs:
run: pytest --tb=short -q
build-and-push:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
needs: [lint, test]
outputs:
calver_tag: ${{ steps.calver.outputs.version }}
@@ -172,11 +171,7 @@ jobs:
only-fixed: "true"
output-format: sarif
- name: Upload api scan results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ${{ steps.scan.outputs.sarif }}
- name: Push Docker image
if: github.event_name == 'push'
@@ -198,24 +193,15 @@ jobs:
git push origin "v${{ steps.calver.outputs.version }}"
deploy-dev:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
needs: [build-and-push]
if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main')
steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CARTSNITCH_APP_ID }}
private-key: ${{ secrets.CARTSNITCH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: infra
- name: Checkout infra repo
uses: actions/checkout@v4
with:
repository: cartsnitch/infra
token: ${{ steps.app-token.outputs.token }}
token: ${{ secrets.GITEA_TOKEN }}
ref: main
path: infra
@@ -251,24 +237,15 @@ jobs:
git push origin main
deploy-uat:
runs-on: runners-cartsnitch
runs-on: ubuntu-latest
needs: [build-and-push]
if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/uat' || github.ref == 'refs/heads/main')
steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CARTSNITCH_APP_ID }}
private-key: ${{ secrets.CARTSNITCH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: infra
- name: Checkout infra repo
uses: actions/checkout@v4
with:
repository: cartsnitch/infra
token: ${{ steps.app-token.outputs.token }}
token: ${{ secrets.GITEA_TOKEN }}
ref: main
path: infra
+2 -1
View File
@@ -5,7 +5,8 @@ Sessions are verified by querying the shared sessions table directly.
"""
from datetime import UTC, datetime
from fastapi import Cookie, Depends, Header, HTTPException, Request, status
from fastapi import Depends, Header, HTTPException, Request, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
-3
View File
@@ -6,13 +6,10 @@ endpoints that query our own user data from the shared database.
"""
from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from cartsnitch_api.auth.dependencies import get_current_user
from cartsnitch_api.database import get_db
from cartsnitch_api.models import User
from cartsnitch_api.schemas import (
UpdateUserRequest,
UserResponse,
+6 -1
View File
@@ -23,7 +23,12 @@ class Settings(BaseSettings):
auth_service_url: str = "http://auth:3001"
cors_origins: list[str] = ["http://localhost:3000", "https://cartsnitch.com"]
cors_origins: list[str] = [
"http://localhost:3000",
"https://cartsnitch.com",
"https://dev.cartsnitch.com",
"https://uat.cartsnitch.com",
]
receiptwitness_url: str = "http://receiptwitness:8001"
stickershock_url: str = "http://stickershock:8002"
+1 -1
View File
@@ -7,10 +7,10 @@ from fastapi import APIRouter, FastAPI
from cartsnitch_api.auth.routes import router as auth_router
from cartsnitch_api.cache import cache_client
from cartsnitch_api.database import dispose_engine
from cartsnitch_api.middleware.audit import add_audit_middleware
from cartsnitch_api.middleware.cors import add_cors_middleware
from cartsnitch_api.middleware.error_handler import add_error_handlers, add_error_monitor_middleware
from cartsnitch_api.middleware.rate_limit import add_rate_limit_middleware
from cartsnitch_api.middleware.audit import add_audit_middleware
from cartsnitch_api.routes.alerts import router as alerts_router
from cartsnitch_api.routes.coupons import router as coupons_router
from cartsnitch_api.routes.health import router as health_router