Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Hourly smoke watchdog + auto-fix loop + dashboard + multi-tenant guard + perf regression + cleanup job + README badge. 1. ~/quality-watchdog.sh (cron 5 * * * *) — 8 checks (~60s): /health/ready, signup→login→/api/me, GET products, Playwright UI smoke (3.1 product CRUD), /metrics format, /hubs/notifications negotiate with token, multi-tenant isolation, perf p95. 2. Auto-fix loop: 2× consecutive red → ~/.fm-watchdog/incident-*.txt + queue/0000-incident-* to bump it ahead of Server-Claude's sprint queue. fm-watchdog.sh sees prefix 0000- as next. 3. scripts/quality-dashboard.py — renders docs/quality-status.md (current emoji, 8-step table, perf baseline, 7-day history, 24-run sparkline) + injects README badge 🟢/🟡/🔴. 4. Multi-tenant smoke: signup 2 orgs `quality-{epoch}-A/B`, create product in A, verify B sees 404/403 + total=0. 5. Perf regression: p95 over 10 reqs for /api/me, products, sales/retail/stats. Baseline = median of last 10 samples (robust to noise). >50% from baseline → alert. First 5 runs always green (warm-up). 6. HousekeepingJobs.PruneQualityTestOrgsAsync (cron 30 2 * * * UTC): finds orgs `quality-%` older than 24h, dynamically scans information_schema for tables with OrganizationId, iteratively DELETEs with FK-violation retry (up to 10 passes), then cleans AspNetUser*/OpenIddict* by email pattern `quality-%@test-fm.local`, finally users + organizations. 7. README badge: <!-- quality-badge --> marker updated each run. Validated: stage deploy ✓, Hangfire job registered ✓, dry-run SQL on 24 stage candidates → 0 remaining ✓, 3 cron-triggered runs all 8/8 green (12:42/12:45/12:48 +05) ✓. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
import { login, makeClient } from './lib/api.js'
|
||
|
||
// Создаём 2 org'и с tokens, печатаем в формате shell env-vars.
|
||
async function main() {
|
||
const ts = Date.now()
|
||
const api = makeClient()
|
||
const orgs = []
|
||
for (const tag of ['A', 'B']) {
|
||
const email = `s23-${tag.toLowerCase()}-${ts}@food-market.local`
|
||
await api.post('/api/auth/signup', {
|
||
organizationName: `S23-${tag}-${ts}`, email, password: 'Stage12345!',
|
||
phone: '+77001234567',
|
||
})
|
||
const sess = await login(email, 'Stage12345!')
|
||
const t = makeClient(sess.accessToken)
|
||
const me = await t.get('/api/me')
|
||
orgs.push({ tag, token: sess.accessToken, orgId: me.data.orgId, email, userId: me.data.sub })
|
||
}
|
||
console.log('export S23_TS=' + ts)
|
||
for (const o of orgs) {
|
||
console.log(`export S23_${o.tag}_TOKEN='${o.token}'`)
|
||
console.log(`export S23_${o.tag}_ORG='${o.orgId}'`)
|
||
console.log(`export S23_${o.tag}_EMAIL='${o.email}'`)
|
||
console.log(`export S23_${o.tag}_USER='${o.userId}'`)
|
||
}
|
||
}
|
||
main().catch(e => { console.error('FAIL:', e.response?.status, e.response?.data ?? e.message); process.exit(1) })
|