feat: add app_config table with runtime log level control and POS structured logging
All checks were successful
CI / ci (pull_request) Successful in 20s
CI / e2e (pull_request) Successful in 56s

- New app_config key-value table for system settings, with in-memory cache (mirrors ModuleService pattern)
- GET/PATCH /v1/config endpoints for reading and updating config (settings.view/settings.edit permissions)
- Runtime log level: PATCH /v1/config/log_level applies immediately, persists across restarts
- Startup loads log level from DB in onReady hook (env var is default, DB overrides)
- Add structured request.log.info() to POS routes: transaction create/complete/void, drawer open/close, discount create/update/delete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ryan
2026-04-04 18:56:21 +00:00
parent 51e7902ee2
commit 772d5578ad
11 changed files with 154 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ export const discountRoutes: FastifyPluginAsync = async (app) => {
return reply.status(400).send({ error: { message: 'Validation failed', details: parsed.error.flatten(), statusCode: 400 } })
}
const discount = await DiscountService.create(app.db, parsed.data)
request.log.info({ discountId: discount.id, name: parsed.data.name, userId: request.user.id }, 'Discount created')
return reply.status(201).send(discount)
})
@@ -39,6 +40,7 @@ export const discountRoutes: FastifyPluginAsync = async (app) => {
}
const discount = await DiscountService.update(app.db, id, parsed.data)
if (!discount) return reply.status(404).send({ error: { message: 'Discount not found', statusCode: 404 } })
request.log.info({ discountId: id, userId: request.user.id }, 'Discount updated')
return reply.send(discount)
})
@@ -46,6 +48,7 @@ export const discountRoutes: FastifyPluginAsync = async (app) => {
const { id } = request.params as { id: string }
const discount = await DiscountService.softDelete(app.db, id)
if (!discount) return reply.status(404).send({ error: { message: 'Discount not found', statusCode: 404 } })
request.log.info({ discountId: id, userId: request.user.id }, 'Discount deactivated')
return reply.send(discount)
})
}