···11# skywatched jetstream
2233-backend for [skywatched](https://skywatched.app). runs on fly.io.
33+backend/appview for [skywatched](https://skywatched.app). runs on fly.io.
4455sqlite database with litefs for persistence.
66+77+## Development
88+99+```
1010+npm i
1111+npm run dev
1212+```
1313+1414+if running with the frontend, change the backend url `BACKEND_URL` (in your `.env` file) in the frontend to `http://localhost:3001`.
···33import { Database, SQLQueryBindings } from 'bun:sqlite';
44import { getFormattedDetails } from './tmdb';
55import { getAllRated, getProfile } from './atp';
66+import { createLikesTable } from "./db/likes";
6778const litefsDir = process.env.NODE_ENV === 'production' ? '/var/lib/litefs' : './litefs';
89const litefsPath = join(litefsDir, 'db.sqlite');
···165166 CREATE INDEX IF NOT EXISTS idx_indexedAt ON latest_indexedAt (indexedAt);
166167 `);
167168168168- db.run(`
169169- CREATE TABLE IF NOT EXISTS likes (
170170- uri TEXT PRIMARY KEY,
171171- author_did TEXT NOT NULL,
172172- subject_cid TEXT NOT NULL,
173173- subject_uri TEXT NOT NULL,
174174- createdAt TEXT NOT NULL
175175- );
176176-177177- CREATE INDEX IF NOT EXISTS idx_uri ON likes (uri);
178178- CREATE INDEX IF NOT EXISTS idx_author_did ON likes (author_did);
179179- CREATE INDEX IF NOT EXISTS idx_subject_uri ON likes (subject_uri);
180180- CREATE INDEX IF NOT EXISTS idx_createdAt ON likes (createdAt);
181181- `);
169169+ createLikesTable();
182170}
183171184172// Function to get the latest timestamp (either creation or update)
···88 createdAt: string;
99};
10101111-export async function saveLikeToDatabase(json: LikeRecord) {
1111+export function createLikesTable() {
1212+ db.run(`
1313+ CREATE TABLE IF NOT EXISTS likes (
1414+ uri TEXT PRIMARY KEY,
1515+ author_did TEXT NOT NULL,
1616+ subject_cid TEXT NOT NULL,
1717+ subject_uri TEXT NOT NULL,
1818+ createdAt TEXT NOT NULL
1919+ );
2020+2121+ CREATE INDEX IF NOT EXISTS idx_uri ON likes (uri);
2222+ CREATE INDEX IF NOT EXISTS idx_author_did ON likes (author_did);
2323+ CREATE INDEX IF NOT EXISTS idx_subject_uri ON likes (subject_uri);
2424+ CREATE INDEX IF NOT EXISTS idx_createdAt ON likes (createdAt);
2525+ `);
2626+}
2727+2828+export function saveLikeToDatabase(json: LikeRecord) {
1229 // first check if the like already exists
1330 const existingLike = db
1431 .query("SELECT * FROM likes WHERE author_did = ? AND subject_uri = ?")
···3855 );
3956}
40574141-export async function deleteLikeFromDatabase(json: LikeRecord) {
5858+export function deleteLikeFromDatabase(json: LikeRecord) {
4259 db.query("DELETE FROM likes WHERE uri = ?").run(json.uri);
4360}
44614545-export async function getLikesByUser(did: string) {
6262+export function getLikesByUser(did: string) {
4663 return db
4764 .query(
4865 "SELECT * FROM likes WHERE author_did = ? ORDER BY createdAt DESC LIMIT 100"
···5067 .all(did);
5168}
52695353-export async function getAllUsersWithLikes() {
7070+export function getAllUsersWithLikes() {
5471 return db
5572 .query("SELECT DISTINCT author_did FROM likes")
5673 .all()