feat: add TechLog project decision authoring

This commit is contained in:
DongHyeonka
2026-08-17 17:23:42 +09:00
parent 79e9aa8328
commit 0355b644a0
16 changed files with 532 additions and 33 deletions
@@ -233,7 +233,7 @@ components:
RequestValidationFailed: { description: Request validation failed, x-error-codes: [REQUEST_VALIDATION_FAILED], content: { application/problem+json: { schema: { $ref: "#/components/schemas/ProblemDetails" } } } }
StudioUnavailable: { description: Studio unavailable, x-error-codes: [STUDIO_UNAVAILABLE], content: { application/problem+json: { schema: { $ref: "#/components/schemas/ProblemDetails" } } } }
schemas:
RecordKind: { type: string, enum: [CASE, REFERENCE, QUESTION] }
RecordKind: { type: string, enum: [CASE, REFERENCE, QUESTION, PROJECT_DECISION] }
PublicationStatus: { type: string, enum: [NEVER_PUBLISHED, PUBLISHED, UNPUBLISHED] }
NextAction: { type: string, enum: [CONTINUE_EDITING, VALIDATE, FIX_VALIDATION, CREATE_PREVIEW, PUBLISH, NONE] }
RelationInput:
@@ -349,17 +349,32 @@ components:
oneOf:
- { $ref: "#/components/schemas/QuestionResolution" }
- { type: "null" }
ProjectDecisionInput:
unevaluatedProperties: false
allOf:
- { $ref: "#/components/schemas/WorkingCopyInputBase" }
- type: object
required: [kind, decisionStatus, decidedOn, statement, rationale, consequences]
properties:
kind: { type: string, const: PROJECT_DECISION }
decisionStatus: { type: [string, "null"], enum: [PROPOSED, ADOPTED, null] }
decidedOn: { type: [string, "null"], format: date }
statement: { type: string, maxLength: 100000 }
rationale: { type: string, maxLength: 100000 }
consequences: { type: array, maxItems: 50, items: { $ref: "#/components/schemas/OrderedText" } }
WorkingCopyInput:
oneOf:
- { $ref: "#/components/schemas/CaseInput" }
- { $ref: "#/components/schemas/ReferenceInput" }
- { $ref: "#/components/schemas/QuestionInput" }
- { $ref: "#/components/schemas/ProjectDecisionInput" }
discriminator:
propertyName: kind
mapping:
CASE: "#/components/schemas/CaseInput"
REFERENCE: "#/components/schemas/ReferenceInput"
QUESTION: "#/components/schemas/QuestionInput"
PROJECT_DECISION: "#/components/schemas/ProjectDecisionInput"
WorkingCopyBase:
allOf:
- { $ref: "#/components/schemas/WorkingCopyInputBase" }
@@ -417,17 +432,32 @@ components:
oneOf:
- { $ref: "#/components/schemas/QuestionResolution" }
- { type: "null" }
ProjectDecisionWorkingCopy:
unevaluatedProperties: false
allOf:
- { $ref: "#/components/schemas/WorkingCopyBase" }
- type: object
required: [kind, decisionStatus, decidedOn, statement, rationale, consequences]
properties:
kind: { type: string, const: PROJECT_DECISION }
decisionStatus: { type: [string, "null"], enum: [PROPOSED, ADOPTED, null] }
decidedOn: { type: [string, "null"], format: date }
statement: { type: string, maxLength: 100000 }
rationale: { type: string, maxLength: 100000 }
consequences: { type: array, maxItems: 50, items: { $ref: "#/components/schemas/OrderedText" } }
WorkingCopy:
oneOf:
- { $ref: "#/components/schemas/CaseWorkingCopy" }
- { $ref: "#/components/schemas/ReferenceWorkingCopy" }
- { $ref: "#/components/schemas/QuestionWorkingCopy" }
- { $ref: "#/components/schemas/ProjectDecisionWorkingCopy" }
discriminator:
propertyName: kind
mapping:
CASE: "#/components/schemas/CaseWorkingCopy"
REFERENCE: "#/components/schemas/ReferenceWorkingCopy"
QUESTION: "#/components/schemas/QuestionWorkingCopy"
PROJECT_DECISION: "#/components/schemas/ProjectDecisionWorkingCopy"
CreateDocumentInput: { $ref: "#/components/schemas/WorkingCopyInput" }
SaveDocumentCommand:
type: object
@@ -778,17 +808,32 @@ components:
oneOf:
- { $ref: "#/components/schemas/ResolvedQuestionResolution" }
- { type: "null" }
ProjectDecisionPublicRenderModel:
unevaluatedProperties: false
allOf:
- { $ref: "#/components/schemas/PublicRenderModelBase" }
- type: object
required: [kind, status, decidedOn, statement, rationale, consequences]
properties:
kind: { type: string, const: PROJECT_DECISION }
status: { type: string, enum: [PROPOSED, ADOPTED] }
decidedOn: { type: string, format: date }
statement: { type: string, minLength: 1, maxLength: 100000 }
rationale: { type: string, minLength: 1, maxLength: 100000 }
consequences: { type: array, minItems: 1, maxItems: 50, items: { $ref: "#/components/schemas/OrderedText" } }
PublicRenderModel:
oneOf:
- { $ref: "#/components/schemas/CasePublicRenderModel" }
- { $ref: "#/components/schemas/ReferencePublicRenderModel" }
- { $ref: "#/components/schemas/QuestionPublicRenderModel" }
- { $ref: "#/components/schemas/ProjectDecisionPublicRenderModel" }
discriminator:
propertyName: kind
mapping:
CASE: "#/components/schemas/CasePublicRenderModel"
REFERENCE: "#/components/schemas/ReferencePublicRenderModel"
QUESTION: "#/components/schemas/QuestionPublicRenderModel"
PROJECT_DECISION: "#/components/schemas/ProjectDecisionPublicRenderModel"
PublicPreview:
type: object
additionalProperties: false