Production deploy: stream API field mapping, Caddy domain config, systemd service, Docker bridge binding

This commit is contained in:
BizzleBot
2026-02-19 17:36:51 +00:00
parent c6b8fb752a
commit 8f4e5dea40
11 changed files with 46 additions and 22 deletions
+5
View File
@@ -0,0 +1,5 @@
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export default prisma;
+1 -2
View File
@@ -1,12 +1,11 @@
import { Router, Request, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { hashPassword, verifyPassword } from '../utils/password';
import { signToken } from '../utils/jwt';
import { authenticate, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
const validateRegister = [
body('email').isEmail().normalizeEmail(),
+1 -2
View File
@@ -1,10 +1,9 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { authenticate, requireRole, optionalAuth, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// GET /api/burrows — public
router.get('/', optionalAuth, async (_req: AuthRequest, res: Response, next: NextFunction) => {
+1 -2
View File
@@ -1,10 +1,9 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { optionalAuth, authenticate, requireRole, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// POST /api/donations — public (guest) or authenticated
// Stripe integration stub: stores intent, returns client_secret placeholder
+1 -2
View File
@@ -1,10 +1,9 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { authenticate, requireRole, optionalAuth, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// GET /api/events — public
router.get('/', optionalAuth, async (_req: AuthRequest, res: Response, next: NextFunction) => {
+1 -2
View File
@@ -1,10 +1,9 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { authenticate, requireRole, optionalAuth, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// GET /api/sightings — public
router.get('/', optionalAuth, async (_req: AuthRequest, res: Response, next: NextFunction) => {
+1 -2
View File
@@ -1,9 +1,8 @@
import { Router, Response, NextFunction } from 'express';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// GET /api/stats — public dashboard stats
router.get('/', async (_req: AuthRequest, res: Response, next: NextFunction) => {
+16 -4
View File
@@ -1,16 +1,28 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { authenticate, requireRole, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// GET /api/streams — public
function mapStream(s: any) {
return {
id: s.id,
name: s.name,
location: s.camera_location,
status: s.status,
viewerCount: 0,
hlsUrl: s.stream_url,
thumbnailUrl: s.thumbnail_url,
createdAt: s.created_at,
};
}
router.get('/', async (_req: AuthRequest, res: Response, next: NextFunction) => {
try {
const streams = await prisma.livestreamSource.findMany({ orderBy: { status: 'asc' } });
res.json(streams);
res.json(streams.map(mapStream));
} catch (err) { next(err); }
});
@@ -19,7 +31,7 @@ router.get('/:id', async (req: AuthRequest, res: Response, next: NextFunction) =
try {
const stream = await prisma.livestreamSource.findUnique({ where: { id: req.params.id } });
if (!stream) { res.status(404).json({ error: 'Stream not found' }); return; }
res.json(stream);
res.json(mapStream(stream));
} catch (err) { next(err); }
});
+1 -2
View File
@@ -1,10 +1,9 @@
import { Router, Response, NextFunction } from 'express';
import { body, validationResult } from 'express-validator';
import { PrismaClient } from '@prisma/client';
import prisma from '../lib/prisma';
import { authenticate, requireRole, AuthRequest } from '../middleware/auth';
const router = Router();
const prisma = new PrismaClient();
// ─── VOLUNTEER HOURS ─────────────────────────────────────────────────────────