You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wiki/backend/api/schemas/approval.ts

182 lines
4.5 KiB

import { approvalMatchModes } from '../../models/approvals.ts'
import type { FastifyInstance } from 'fastify'
export async function registerSchemas(app: FastifyInstance): Promise<void> {
/**
* APPROVAL RULE - Which pages accept edit suggestions, from whom, and who reviews them
*/
app.addSchema({
$id: 'ApprovalRule',
type: 'object',
properties: {
id: {
type: 'string',
format: 'uuid'
},
name: {
type: 'string',
description: 'What the rule is called in the admin list.'
},
isEnabled: {
type: 'boolean',
description: 'A disabled rule keeps its configuration but covers nothing.'
},
match: {
type: 'string',
enum: [...approvalMatchModes],
description:
'How `path` is compared: the same modes group page rules use. `TAG` matches a page carrying any of the listed tags, `TAGALL` one carrying all of them.'
},
path: {
type: 'string',
description:
'The pattern, without a leading slash. A comma-separated list of tags for the tag modes.'
},
submitterGroups: {
type: 'array',
description: 'IDs of the groups whose members may submit edit suggestions.',
items: {
type: 'string',
format: 'uuid'
}
},
reviewerGroups: {
type: 'array',
description:
'IDs of the groups that review those submissions, and are notified when one comes in.',
items: {
type: 'string',
format: 'uuid'
}
},
createdAt: {
type: 'string',
format: 'date-time',
description: 'RFC 3339 Date Time'
},
updatedAt: {
type: 'string',
format: 'date-time',
description: 'RFC 3339 Date Time'
}
}
})
/**
* PAGE EDIT SUBMISSION - An edit somebody suggested, as its reviewer sees it
*/
app.addSchema({
$id: 'PageEditSubmission',
type: 'object',
properties: {
id: {
type: 'string',
format: 'uuid'
},
createdAt: {
type: 'string',
format: 'date-time',
description: 'RFC 3339 Date Time'
},
updatedAt: {
type: 'string',
format: 'date-time',
description: 'RFC 3339 Date Time'
},
isStale: {
type: 'boolean',
description:
'The page has changed since this was written against it, so accepting it wholesale would undo whatever changed in between.'
},
page: {
type: 'object',
properties: {
id: { type: 'string', format: 'uuid' },
path: { type: 'string' },
title: { type: 'string' },
locale: { type: 'string' }
}
},
author: {
type: 'object',
properties: {
id: {
type: ['string', 'null'],
description: 'Null for a guest, who has no account.'
},
name: { type: 'string' },
email: { type: 'string' },
isGuest: { type: 'boolean' }
}
}
}
})
/**
* PAGE EDIT SUBMISSION DETAIL - The same, with both sides of the diff
*/
app.addSchema({
$id: 'PageEditSubmissionDetail',
allOf: [
{ $ref: 'PageEditSubmission#' },
{
type: 'object',
properties: {
content: {
type: 'string',
description: 'What the suggestion proposes the page should say.'
},
pageContent: {
type: 'string',
description: 'What it currently says.'
},
patch: {
type: 'string',
description: 'Unified diff against the page as it stood when the suggestion was made.'
}
}
}
]
})
/**
* APPROVAL RULE INPUT - The fields a rule is written with
*/
app.addSchema({
$id: 'ApprovalRuleInput',
type: 'object',
properties: {
name: {
type: 'string',
minLength: 1,
maxLength: 255
},
isEnabled: {
type: 'boolean'
},
match: {
type: 'string',
enum: [...approvalMatchModes]
},
path: {
type: 'string',
maxLength: 2048
},
submitterGroups: {
type: 'array',
items: {
type: 'string',
format: 'uuid'
}
},
reviewerGroups: {
type: 'array',
items: {
type: 'string',
format: 'uuid'
}
}
}
})
}