Some checks failed
CI / Scraper / Test (push) Successful in 10s
CI / Scraper / Lint (push) Successful in 12s
CI / Scraper / Lint (pull_request) Successful in 8s
CI / Scraper / Test (pull_request) Successful in 19s
CI / UI / Build (push) Successful in 32s
CI / Scraper / Docker Push (pull_request) Has been skipped
CI / UI / Build (pull_request) Successful in 15s
CI / UI / Docker Push (pull_request) Has been skipped
CI / UI / Docker Push (push) Failing after 11s
CI / Scraper / Docker Push (push) Successful in 45s
iOS CI / Build (push) Failing after 2m44s
iOS CI / Test (push) Has been skipped
iOS CI / Build (pull_request) Failing after 5m46s
iOS CI / Test (pull_request) Has been skipped
- Add book_comments and comment_votes PocketBase collections (pb-init.sh + pocketbase.go EnsureCollections) - Web: CommentsSection.svelte with post form, vote buttons, lazy-loaded per-book - API routes: GET/POST /api/comments/[slug], POST /api/comments/[id]/vote - iOS: BookComment + CommentsResponse models, fetchComments/postComment/voteComment in APIClient, CommentsView + CommentsViewModel wired into BookDetailView - Fix profile page SSR crash (ERR_MODULE_NOT_FOUND cropperjs): lazy-load AvatarCropModal via dynamic import guarded by browser, move URL.createObjectURL into onMount
34 lines
1002 B
TypeScript
34 lines
1002 B
TypeScript
import { json, error } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types';
|
|
import { voteComment } from '$lib/server/pocketbase';
|
|
import { log } from '$lib/server/logger';
|
|
|
|
/**
|
|
* POST /api/comments/[id]/vote
|
|
* Body: { vote: 'up' | 'down' }
|
|
* Casts, changes, or toggles off a vote on a comment.
|
|
* Works for both authenticated and anonymous users (session-scoped).
|
|
* Returns the updated comment.
|
|
*/
|
|
export const POST: RequestHandler = async ({ params, request, locals }) => {
|
|
const { id } = params;
|
|
let body: { vote?: string };
|
|
try {
|
|
body = await request.json();
|
|
} catch {
|
|
error(400, 'Invalid JSON body');
|
|
}
|
|
|
|
if (body.vote !== 'up' && body.vote !== 'down') {
|
|
error(400, 'vote must be "up" or "down"');
|
|
}
|
|
|
|
try {
|
|
const updated = await voteComment(id, body.vote, locals.sessionId, locals.user?.id);
|
|
return json(updated);
|
|
} catch (e) {
|
|
log.error('api/comments/[id]/vote', 'voteComment failed', { id, err: String(e) });
|
|
error(500, 'Failed to record vote');
|
|
}
|
|
};
|