kin: KIN-OBS-021 Вынести raw SQL из cli/watch.py в core/models.py

This commit is contained in:
Gros Frumos 2026-03-17 18:23:48 +02:00
parent 669ed2fbc9
commit a4e5497401
4 changed files with 22 additions and 24 deletions

View file

@ -91,24 +91,22 @@ If verdict is "changes_requested", findings must be non-empty with actionable su
If verdict is "revise", include `"target_role": "..."` and findings must be non-empty with actionable suggestions.
If verdict is "blocked", include `"blocked_reason": "..."` (e.g. unable to read files).
**Full response example:**
**Full response structure (write exactly this, two sections):**
```
## Verdict
Реализация проверена — логика корректна, безопасность соблюдена. Найдено одно незначительное замечание по документации, не блокирующее. Задачу можно закрывать.
## Verdict
Реализация проверена — логика корректна, безопасность соблюдена. Найдено одно незначительное замечание по документации, не блокирующее. Задачу можно закрывать.
## Details
```json
{
"verdict": "approved",
"findings": [...],
"security_issues": [],
"conventions_violations": [],
"test_coverage": "adequate",
"summary": "..."
}
` ` `
```
## Details
```json
{
"verdict": "approved",
"findings": [...],
"security_issues": [],
"conventions_violations": [],
"test_coverage": "adequate",
"summary": "..."
}
```
## Verdict definitions

View file

@ -330,7 +330,7 @@ class TestProjectLinksAPI:
"type": "depends_on",
"description": "P1 depends on P2",
})
assert r.status_code == 200
assert r.status_code == 201
data = r.json()
assert data["from_project"] == "p1"
assert data["to_project"] == "p2"

View file

@ -439,7 +439,7 @@ class ProjectLinkCreate(BaseModel):
description: str | None = None
@app.post("/api/project-links")
@app.post("/api/project-links", status_code=201)
def create_project_link(body: ProjectLinkCreate):
"""Create a project dependency link."""
conn = get_conn()

View file

@ -53,14 +53,14 @@ describe('api.projectLinks', () => {
// ─────────────────────────────────────────────────────────────
describe('api.createProjectLink', () => {
it('делает POST /api/project-links', async () => {
const spy = mockFetch({ id: 1, from_project: 'KIN', to_project: 'BRS', link_type: 'depends_on', description: null, created_at: '' })
await api.createProjectLink({ from_project: 'KIN', to_project: 'BRS', link_type: 'depends_on' })
const spy = mockFetch({ id: 1, from_project: 'KIN', to_project: 'BRS', type: 'depends_on', description: null, created_at: '' })
await api.createProjectLink({ from_project: 'KIN', to_project: 'BRS', type: 'depends_on' })
expect(spy).toHaveBeenCalledWith('/api/project-links', expect.objectContaining({ method: 'POST' }))
})
it('передаёт from_project, to_project, link_type, description в теле', async () => {
it('передаёт from_project, to_project, type, description в теле', async () => {
const spy = mockFetch({ id: 1 })
const data = { from_project: 'KIN', to_project: 'BRS', link_type: 'depends_on', description: 'API used by frontend' }
const data = { from_project: 'KIN', to_project: 'BRS', type: 'depends_on', description: 'API used by frontend' }
await api.createProjectLink(data)
const body = JSON.parse((spy.mock.calls[0][1] as RequestInit).body as string)
expect(body).toMatchObject(data)
@ -68,10 +68,10 @@ describe('api.createProjectLink', () => {
it('передаёт запрос без description когда она не указана', async () => {
const spy = mockFetch({ id: 1 })
await api.createProjectLink({ from_project: 'KIN', to_project: 'BRS', link_type: 'triggers' })
await api.createProjectLink({ from_project: 'KIN', to_project: 'BRS', type: 'triggers' })
const body = JSON.parse((spy.mock.calls[0][1] as RequestInit).body as string)
expect(body.from_project).toBe('KIN')
expect(body.link_type).toBe('triggers')
expect(body.type).toBe('triggers')
})
})