create a versioned report

This commit is contained in:
Nate Kelley 2025-09-20 10:37:50 -06:00
parent fce52b5b2b
commit b8d5624304
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
4 changed files with 22 additions and 12 deletions

View File

@ -53,16 +53,13 @@ export default app;
* This is the TypeScript equivalent of the Rust get_metric_handler
*/
async function getMetricHandler(
params: GetMetricHandlerParams,
{ metricId, ...params }: GetMetricHandlerParams,
user: User
): Promise<GetMetricResponse> {
const { metricId, versionNumber, password } = params;
// Use shared helper to fetch and process metric data
const processedData = await fetchAndProcessMetricData(metricId, user, {
publicAccessPreviouslyVerified: false,
password,
versionNumber,
...params,
});
// Build and return the complete metric response

View File

@ -13,8 +13,8 @@ import { standardErrorHandler } from '../../../../utils/response';
export async function getReportHandler(
reportId: string,
user: { id: string },
_password?: string,
_version_number?: number
versionNumber?: number,
_password?: string
): Promise<GetReportResponse> {
// Get report metadata for access control
let reportData: Awaited<ReturnType<typeof getReportMetadata>>;
@ -48,6 +48,7 @@ export async function getReportHandler(
reportId,
userId: user.id,
permissionRole: assetPermissionResult.effectiveRole,
versionNumber,
});
const response: GetReportResponse = report;
@ -63,7 +64,7 @@ const app = new Hono()
async (c) => {
const { id: reportId } = c.req.valid('param');
const query = c.req.valid('query');
const { password, version_number } = query;
const { password, version_number: versionNumber } = query;
const user = c.get('busterUser');
if (!reportId) {
@ -73,8 +74,8 @@ const app = new Hono()
const response: GetReportResponse = await getReportHandler(
reportId,
user,
password,
version_number
versionNumber,
password
);
return c.json(response);
}

View File

@ -301,7 +301,7 @@ export async function buildMetricResponse(
/**
* Helper to get publicly enabled by user email
*/
export async function getPubliclyEnabledByUser(enabledById: string | null): Promise<string | null> {
async function getPubliclyEnabledByUser(enabledById: string | null): Promise<string | null> {
if (enabledById) {
const publicEnabledByUser = await getUser({ id: enabledById });
return publicEnabledByUser.email;

View File

@ -16,6 +16,7 @@ export const GetReportInputSchema = z.object({
reportId: z.string().uuid('Report ID must be a valid UUID'),
userId: z.string().uuid('User ID must be a valid UUID'),
permissionRole: AssetPermissionRoleSchema.optional(),
versionNumber: z.number().int().min(1).optional(),
});
type GetReportInput = z.infer<typeof GetReportInputSchema>;
@ -23,7 +24,7 @@ type GetReportInput = z.infer<typeof GetReportInputSchema>;
export async function getReport(input: GetReportInput) {
const validated = GetReportInputSchema.parse(input);
const { reportId, userId, permissionRole } = validated;
const { reportId, userId, permissionRole, versionNumber } = validated;
const userOrg = await getUserOrganizationId(userId);
@ -150,5 +151,16 @@ export async function getReport(input: GetReportInput) {
workspace_member_count: workspaceMemberCount,
};
// if versionNumber is provided, create a versioned report
if (versionNumber !== undefined) {
const versionExists = reportData.version_history[versionNumber.toString()];
if (!versionExists) {
throw new Error(`Version ${versionNumber} not found`);
}
report.content = versionExists.content;
report.version_number = versionExists.version_number;
report.updated_at = versionExists.updated_at;
}
return report;
}