Initial commit: Add project files
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
import { api } from '@/shared/api/client'
|
||||
import { requestSchema, responseSchema, type Request } from './schema'
|
||||
|
||||
export async function execute(request: Request) {
|
||||
const body = requestSchema.parse(request)
|
||||
const response = await api.post('/__ROUTE__', body)
|
||||
return responseSchema.parse(response.data)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
// Server state belongs to TanStack Query. Pinia is limited to session/UI preferences.
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<main>
|
||||
<h1>__FEATURE__</h1>
|
||||
<p>Contract-first scaffold. Complete Zod request/response schemas before enabling the route.</p>
|
||||
</main>
|
||||
</template>
|
||||
@@ -0,0 +1,5 @@
|
||||
import { useMutation, useQuery } from '@tanstack/vue-query'
|
||||
import { execute } from './api'
|
||||
|
||||
export const featureKeys = { all: ['__FEATURE__'] as const }
|
||||
export function useExecute() { return useMutation({ mutationFn: execute }) }
|
||||
@@ -0,0 +1,8 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { responseSchema } from './schema'
|
||||
|
||||
describe('__FEATURE__ response contract', () => {
|
||||
it('fails closed for an unapproved empty payload', () => {
|
||||
expect(responseSchema.safeParse({}).success).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,6 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
export const requestSchema = z.object({ /* approved contract */ })
|
||||
export const responseSchema = z.object({ /* runtime trust boundary */ })
|
||||
export type Request = z.infer<typeof requestSchema>
|
||||
export type Response = z.infer<typeof responseSchema>
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
import { DetailReadPage, EvidenceVersionSet } from '@/shared/ui'
|
||||
const versionSet = { datasetId: 'DECISION_REQUIRED', dataHash: 'DECISION_REQUIRED', modelVersion: 'DECISION_REQUIRED', configVersion: 'DECISION_REQUIRED', codeSha: 'DECISION_REQUIRED', contractVersion: '__CONTRACT_VERSION__' }
|
||||
</script>
|
||||
<template>
|
||||
<DetailReadPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }">
|
||||
<section class="ks-card ks-section">상세 내용</section>
|
||||
<template #evidence><EvidenceVersionSet :value="versionSet" /></template>
|
||||
</DetailReadPage>
|
||||
</template>
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
import { EditFormPage } from '@/shared/ui/screen-types'
|
||||
import { KsButton, KsTextField } from '@/shared/ui/components'
|
||||
</script>
|
||||
<template>
|
||||
<EditFormPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }" @submit="undefined">
|
||||
<KsTextField model-value="" label="이름" />
|
||||
<template #footer><KsButton label="저장" type="submit" /></template>
|
||||
</EditFormPage>
|
||||
</template>
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
import { SearchListCrudPage } from '@/shared/ui/screen-types'
|
||||
import { KsButton, KsDataGrid } from '@/shared/ui/components'
|
||||
</script>
|
||||
<template>
|
||||
<SearchListCrudPage title="__TITLE__" state="LOADING" :evidence="{ version: '__CONTRACT_VERSION__' }">
|
||||
<template #actions><KsButton label="등록" /></template>
|
||||
<KsDataGrid :rows="[]" :columns="[]" />
|
||||
</SearchListCrudPage>
|
||||
</template>
|
||||
@@ -0,0 +1,10 @@
|
||||
<script setup lang="ts">
|
||||
import { ApprovalWorkbenchPage } from '@/shared/ui/screen-types'
|
||||
</script>
|
||||
<template>
|
||||
<ApprovalWorkbenchPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }">
|
||||
<template #queue>검토 대기열</template>
|
||||
<template #detail>증거와 상세</template>
|
||||
<template #decision>승인/보류/기각</template>
|
||||
</ApprovalWorkbenchPage>
|
||||
</template>
|
||||
Reference in New Issue
Block a user