feat(schema-workflow): Phase 1b — SchemaDraftDrawer with status-aware actions
This commit is contained in:
@@ -542,6 +542,100 @@ export type ChangelogResponse = {
|
||||
* definition_create. Для draft_* (не publish) — after=proposed_schema,
|
||||
* before=live schema на момент event'а (то что предлагалось vs реальность).
|
||||
*/
|
||||
// === Schema workflow (maker-checker drafts, v2.2.0 backend) ===
|
||||
|
||||
/**
|
||||
* Server возвращает status в lowercase ({@code "draft"}, {@code "review_pending"},
|
||||
* ...) — match'им backend dbValue() напрямую, без перевода в frontend.
|
||||
*
|
||||
* Terminal: REJECTED, PUBLISHED, WITHDRAWN.
|
||||
* Active: DRAFT, REVIEW_PENDING, APPROVED, CHANGES_REQUESTED.
|
||||
*/
|
||||
export type SchemaDraftStatus =
|
||||
| 'draft'
|
||||
| 'review_pending'
|
||||
| 'approved'
|
||||
| 'changes_requested'
|
||||
| 'rejected'
|
||||
| 'published'
|
||||
| 'withdrawn'
|
||||
|
||||
export const TERMINAL_SCHEMA_DRAFT_STATUSES: ReadonlySet<SchemaDraftStatus> = new Set([
|
||||
'rejected',
|
||||
'published',
|
||||
'withdrawn',
|
||||
])
|
||||
|
||||
export const isActiveSchemaDraft = (s: SchemaDraftStatus): boolean =>
|
||||
!TERMINAL_SCHEMA_DRAFT_STATUSES.has(s)
|
||||
|
||||
export type SchemaDraft = {
|
||||
draftId: string
|
||||
dictionaryId: string
|
||||
dictionaryName: string
|
||||
status: SchemaDraftStatus
|
||||
branchedFromVersion: string
|
||||
/** Full proposed JSON Schema. */
|
||||
proposedSchema: unknown
|
||||
reason?: string | null
|
||||
makerId: string
|
||||
createdAt: string
|
||||
submittedAt?: string | null
|
||||
/** Optional reviewer list (NULL = open pool). */
|
||||
reviewers?: unknown | null
|
||||
reviewNote?: string | null
|
||||
decisionUserId?: string | null
|
||||
decisionAt?: string | null
|
||||
decisionComment?: string | null
|
||||
publishedAt?: string | null
|
||||
publishedVersion?: string | null
|
||||
publishNote?: string | null
|
||||
/** JPA optimistic lock counter. */
|
||||
version: number
|
||||
}
|
||||
|
||||
export type CreateSchemaDraftRequest = {
|
||||
/** Current HEAD schema version this draft branches from. */
|
||||
fromVersion: string
|
||||
reason?: string
|
||||
/** Full proposed JSON Schema (replace, not patch). */
|
||||
proposedSchema: unknown
|
||||
}
|
||||
|
||||
export type SubmitForReviewRequest = {
|
||||
/** Optional explicit reviewer IDs. NULL/[] = pool. */
|
||||
reviewers?: string[] | null
|
||||
note?: string | null
|
||||
}
|
||||
|
||||
export type SchemaDraftVerdict = 'APPROVE' | 'REQUEST_CHANGES' | 'REJECT'
|
||||
|
||||
export type DecisionRequest = {
|
||||
decision: SchemaDraftVerdict
|
||||
comment?: string
|
||||
}
|
||||
|
||||
export type PublishSchemaDraftRequest = {
|
||||
/** Optimistic lock — current schema version от UI. */
|
||||
expectedHeadVersion: string
|
||||
publishNote?: string
|
||||
}
|
||||
|
||||
/** Response для POST /publish — wraps draft + computed bump. */
|
||||
export type PublishSchemaDraftResult = {
|
||||
draft: SchemaDraft
|
||||
newVersion: string
|
||||
publishedAt: string
|
||||
}
|
||||
|
||||
/** Pool queue для /admin/schema-reviews/pending. */
|
||||
export type SchemaReviewQueuePage = {
|
||||
items: SchemaDraft[]
|
||||
page: number
|
||||
size: number
|
||||
total: number
|
||||
}
|
||||
|
||||
export type ChangelogDiff = {
|
||||
id: number
|
||||
dictionaryName: string
|
||||
|
||||
Reference in New Issue
Block a user