## Phase 1: Critical Feature Completion (Beacon Voting) - Add VouchBeacon, ReportBeacon, RemoveBeaconVote methods to PostRepository - Implement beacon voting HTTP handlers with confidence score calculations - Register new beacon routes: /beacons/:id/vouch, /beacons/:id/report, /beacons/:id/vouch (DELETE) - Auto-flag beacons at 5+ reports, confidence scoring (0.5 base + 0.1 per vouch) ## Phase 2: Feed Logic & Post Distribution Integrity - Verify unified feed logic supports all content types (Standard, Quips, Beacons) - Ensure proper distribution: Profile Feed + Main/Home Feed for followers - Beacon Map integration for location-based content - Video content filtering for Quips feed ## Phase 3: The Notification System - Create comprehensive NotificationService with FCM integration - Add CreateNotification method to NotificationRepository - Implement smart deep linking: beacon_map, quip_feed, main_feed - Trigger notifications for beacon interactions and cross-post comments - Push notification logic with proper content type detection ## Phase 4: The Great Supabase Purge - Delete function_proxy.go and remove /functions/:name route - Remove SupabaseURL, SupabaseKey from config.go - Remove SupabaseID field from User model - Clean all Supabase imports and dependencies - Sanitize codebase of legacy Supabase references ## Phase 5: Flutter Frontend Integration - Implement vouchBeacon(), reportBeacon(), removeBeaconVote() in ApiService - Replace TODO delay in video_comments_sheet.dart with actual publishComment call - Fix compilation errors (named parameters, orphaned child properties) - Complete frontend integration with Go API endpoints ## Additional Improvements - Fix compilation errors in threaded_comment_widget.dart (orphaned child property) - Update video_comments_sheet.dart to use proper named parameters - Comprehensive error handling and validation - Production-ready notification system with deep linking ## Migration Status: 100% Complete - Backend: Fully migrated from Supabase to custom Go/Gin API - Frontend: Integrated with new Go endpoints - Notifications: Complete FCM integration with smart routing - Database: Clean of all Supabase dependencies - Features: All functionality preserved and enhanced Ready for VPS deployment and production testing!
2.8 KiB
2.8 KiB
Sojorn Database Architecture & Context
Last Updated: January 27, 2026
Overview
The Sojorn backend uses a PostgreSQL database hosted on a VPS. It is critical to note that there are multiple databases present in the Postgres instance, and the application serves from a specific one.
Connection Details
- Host:
localhost(Internal to VPS) - Port:
5432 - Primary Database Name:
sojorn - User:
postgres - SSL Mode:
disable - Application Config Source:
/opt/sojorn/.env(on VPS)
Warning: Do not assume the database is named postgres. Always target the sojorn database for application schema changes.
Critical Key Tables & Schema Notes
1. Profiles (public.profiles)
Stores user identity and global configuration.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary Key |
handle |
Text | Unique user handle (username) |
is_private |
Boolean | Crucial: Controls visibility in global feeds. Defaults to FALSE. |
is_official |
Boolean | Crucial: Verification badge / official account status. |
identity_key |
Text | For E2EE (Signal Protocol) |
2. Follows (public.follows)
Manages the social graph.
| Column | Type | Notes |
|---|---|---|
follower_id |
UUID | User DOING the following |
following_id |
UUID | User BEING followed |
status |
Text | Crucial: Must be 'accepted' or 'pending'. Logic joins on status='accepted'. |
3. Posts (public.posts)
| Column | Type | Notes |
|---|---|---|
duration_ms |
Int | Nullable. Can be NULL for non-video posts. Queries MUST use COALESCE(duration_ms, 0). |
is_beacon |
Boolean | Determines if post is location-aware. |
location |
Geography | Post coordinates (PostGIS). |
Troubleshooting & Maintenance
Accessing the Database (CLI)
To manually inspect or patch the database, use the following command pattern on the VPS:
# Connect specifically to the 'sojorn' database
export PGPASSWORD='YOUR_PASSWORD'
psql -U postgres -h localhost -d sojorn
Common Pitfalls
- Patching
postgresinstead ofsojorn: Runningpsqlwithout-d sojorndefaults to thepostgressystem DB. Schema changes here WON'T affect the app. - Null Scanning: Go's
database/sqldriver will panic or error if you try toScana SQLNULLinto a non-pointer primitive (e.g.,intvs*intorNullInt). Always useCOALESCEin SQL queries for nullable optional fields likeduration_ms,image_url. - Scan Mismatches: If you add a column to a
SELECTquery, you MUST add a corresponding destination variable inrows.Scan().
Migration Strategy
- The project currently relies on imperative SQL patches or
golang-migratescripts. - Ensure any migration scripts target the
DATABASE_URLdefined in.env.