starry / backend /omr-service /src /routes /issueMeasures.ts
k-l-lambda's picture
update: export from starry-refactor 2026-02-21 (add example score seed)
ad438b8
import { FastifyInstance } from 'fastify';
import * as issueMeasureService from '../services/issueMeasure.service.js';
interface ScoreParams {
id: string;
}
interface MeasureParams extends ScoreParams {
measureIndex: string;
}
interface ListQuery {
offset?: string;
limit?: string;
status?: string | string[];
}
interface UpsertBody {
measureIndex: number;
measure: any;
status: number;
annotator?: string;
}
export default async function issueMeasuresRoutes(fastify: FastifyInstance) {
// List issue measures for a score
fastify.get<{ Params: ScoreParams; Querystring: ListQuery }>('/scores/:id/issueMeasures', async (request) => {
const { offset, limit, status } = request.query;
const statusArr = status ? (Array.isArray(status) ? status : [status]).map(Number).filter((n) => !isNaN(n)) : undefined;
const result = await issueMeasureService.list(request.params.id, {
offset: offset ? parseInt(offset, 10) : 0,
limit: limit ? parseInt(limit, 10) : 200,
status: statusArr,
});
return { code: 0, data: result };
});
// Upsert issue measure for a score
fastify.put<{ Params: ScoreParams; Body: UpsertBody }>('/scores/:id/issueMeasures', async (request, reply) => {
const { measureIndex, measure, status, annotator } = request.body || {};
if (measureIndex === undefined || !measure || status === undefined) {
reply.code(400);
return { code: 400, message: 'measureIndex, measure, and status are required' };
}
const result = await issueMeasureService.upsert(request.params.id, measureIndex, measure, status, annotator);
return { code: 0, data: result };
});
// Delete all issue measures for a score
fastify.delete<{ Params: ScoreParams }>('/scores/:id/issueMeasures', async (request) => {
const count = await issueMeasureService.deleteByScore(request.params.id);
return { code: 0, data: { deleted: count } };
});
}