## 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!
66 lines
2.8 KiB
Markdown
66 lines
2.8 KiB
Markdown
# 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:
|
|
```bash
|
|
# Connect specifically to the 'sojorn' database
|
|
export PGPASSWORD='YOUR_PASSWORD'
|
|
psql -U postgres -h localhost -d sojorn
|
|
```
|
|
|
|
### Common Pitfalls
|
|
1. **Patching `postgres` instead of `sojorn`:** Running `psql` without `-d sojorn` defaults to the `postgres` system DB. Schema changes here WON'T affect the app.
|
|
2. **Null Scanning:** Go's `database/sql` driver will panic or error if you try to `Scan` a SQL `NULL` into a non-pointer primitive (e.g., `int` vs `*int` or `NullInt`). Always use `COALESCE` in SQL queries for nullable optional fields like `duration_ms`, `image_url`.
|
|
3. **Scan Mismatches:** If you add a column to a `SELECT` query, you MUST add a corresponding destination variable in `rows.Scan()`.
|
|
|
|
### Migration Strategy
|
|
- The project currently relies on imperative SQL patches or `golang-migrate` scripts.
|
|
- Ensure any migration scripts target the `DATABASE_URL` defined in `.env`.
|