The service account is silently filtered out of Object Type 109 (Store
Address / Hierarchy) despite having schema-level read on schema 68, so
every AQL against the store type returns total=0. Until that permission
is granted, resolve store numbers from a local cache populated by a
personal PAT (different auth path, different account, has the role).
- new: src/services/jira/assetsSyncClient.js — Basic-auth axios against
api.atlassian.com/jsm/assets/workspace/{ws}/v1, credentials sourced
from ASSETS_SYNC_EMAIL / ASSETS_SYNC_TOKEN (loaded from Keychain by
bin/load-assets-sync-secret.sh so the PAT never touches .env)
- new: src/services/jira/storesCache.js — in-memory Map + on-disk JSON
at data/stores.json (gitignored), atomic write, paginated full sync
via AQL (objectTypeId=N), boot-time load + background refresh if
stale, periodic setInterval every STORES_CACHE_REFRESH_HOURS
- new: bin/load-assets-sync-secret.sh — Keychain -> env var wrapper
(security find-generic-password -s jira-assets-sync -a <email>)
- change: resolveStoreAssetReference now tries cache -> live PAT -> the
existing service-account AQL, in that order; the fallback path is
preserved so this cleanly deactivates once the permission on #1 is
fixed. Error message names all three routes and points at the refresh
endpoint.
- new admin routes: GET /api/wxccai/admin/storesCache/status,
POST /api/wxccai/admin/storesCache/refresh
- app.js kicks off storesCache.init() after listen()
- config: STORES_CACHE_ENABLED / _PATH / _REFRESH_HOURS /
_STALE_AFTER_HOURS / _PAGE_SIZE / _MAX_PAGES, plus intFromEnv /
boolFromEnv helpers
- .gitignore adds data/; .env.example documents the new vars; README
adds an "Admin" endpoints section and a "Stores cache" setup guide
Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
1.1 KiB
Text
59 lines
1.1 KiB
Text
# =============================================
|
|
# Secrets — NEVER commit these
|
|
# =============================================
|
|
.env
|
|
.env.*
|
|
!.env.example
|
|
*.pem
|
|
*.key
|
|
*.p12
|
|
*.pfx
|
|
credentials*
|
|
secrets*
|
|
|
|
# =============================================
|
|
# Node
|
|
# =============================================
|
|
node_modules/
|
|
npm-debug.log*
|
|
yarn-debug.log*
|
|
yarn-error.log*
|
|
pnpm-debug.log*
|
|
.npm/
|
|
.yarn/
|
|
.pnp.*
|
|
|
|
# =============================================
|
|
# Runtime / build artifacts
|
|
# =============================================
|
|
logs/
|
|
*.log
|
|
dist/
|
|
build/
|
|
coverage/
|
|
.nyc_output/
|
|
tmp/
|
|
.tmp/
|
|
|
|
# Stores cache and any other locally-generated app state.
|
|
# Never contains secrets, but is machine-specific and can be regenerated
|
|
# from Assets via POST /api/wxccai/admin/storesCache/refresh.
|
|
data/
|
|
|
|
# =============================================
|
|
# Editor / IDE / OS
|
|
# =============================================
|
|
.vscode/
|
|
.idea/
|
|
.continue/
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
.DS_Store
|
|
Thumbs.db
|
|
Desktop.ini
|
|
|
|
# =============================================
|
|
# Docker
|
|
# =============================================
|
|
docker-compose.override.yml
|