Production deploy: stream API field mapping, Caddy domain config, systemd service, Docker bridge binding
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
export default prisma;
|
||||
@@ -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,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,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,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,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,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) => {
|
||||
|
||||
@@ -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,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 ─────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user