mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage-server
synced 2026-04-11 18:08:16 +00:00
- Team module: POST /api/team/members (in-place employee creation with temp password + Redis cache), PUT /api/team/members/:id, GET temp password endpoint. Uses signUpInWorkspace — no email invites. - Dockerfile: rewritten as multi-stage build (builder + runtime) so native modules compile for target arch. Fixes darwin→linux crash. - .dockerignore: exclude dist, node_modules, .env, .git, data/ - package-lock.json: regenerated against public npmjs.org (was pointing at localhost:4873 Verdaccio — broke docker builds) - Doctor utils: shared DOCTOR_VISIT_SLOTS_FRAGMENT + normalizeDoctors helper for visit-slot-aware queries across 6 consumers - AI config: full admin CRUD (GET/PUT/POST reset), workspace-scoped setup-state with workspace ID isolation, AI prompt defaults overhaul - Agent config: camelCase field fix for SDK-synced workspaces - Session service: workspace-scoped Redis key prefixing for setup state - Recordings/supervisor/widget services: updated to use doctor-utils shared fragments instead of inline visitingHours queries Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
57 lines
2.4 KiB
TypeScript
57 lines
2.4 KiB
TypeScript
import { Body, Controller, Get, Logger, Param, Post, Put } from '@nestjs/common';
|
|
import { SetupStateService } from './setup-state.service';
|
|
import type { SetupStepName } from './setup-state.defaults';
|
|
|
|
// Public endpoint family for the onboarding wizard. Mounted under /api/config
|
|
// alongside theme/widget. No auth guard yet — matches existing convention with
|
|
// ThemeController. To be tightened when the staff portal admin auth is in place.
|
|
//
|
|
// GET /api/config/setup-state full state + isWizardRequired
|
|
// PUT /api/config/setup-state/steps/:step { completed: bool, completedBy?: string }
|
|
// POST /api/config/setup-state/dismiss dismiss the wizard for this workspace
|
|
// POST /api/config/setup-state/reset reset all steps to incomplete (admin)
|
|
@Controller('api/config')
|
|
export class SetupStateController {
|
|
private readonly logger = new Logger(SetupStateController.name);
|
|
|
|
constructor(private readonly setupState: SetupStateService) {}
|
|
|
|
@Get('setup-state')
|
|
async getState() {
|
|
// Use the checked variant so the platform workspace probe runs
|
|
// before we serialize. Catches workspace changes (DB resets,
|
|
// re-onboards) on the very first frontend GET.
|
|
const state = await this.setupState.getStateChecked();
|
|
return {
|
|
...state,
|
|
wizardRequired: this.setupState.isWizardRequired(),
|
|
};
|
|
}
|
|
|
|
@Put('setup-state/steps/:step')
|
|
updateStep(
|
|
@Param('step') step: SetupStepName,
|
|
@Body() body: { completed: boolean; completedBy?: string },
|
|
) {
|
|
const updated = body.completed
|
|
? this.setupState.markStepCompleted(step, body.completedBy ?? null)
|
|
: this.setupState.markStepIncomplete(step);
|
|
// Mirror GET shape — include `wizardRequired` so the frontend
|
|
// doesn't see a state object missing the field and re-render
|
|
// into an inconsistent shape.
|
|
return { ...updated, wizardRequired: this.setupState.isWizardRequired() };
|
|
}
|
|
|
|
@Post('setup-state/dismiss')
|
|
dismiss() {
|
|
const updated = this.setupState.dismissWizard();
|
|
return { ...updated, wizardRequired: this.setupState.isWizardRequired() };
|
|
}
|
|
|
|
@Post('setup-state/reset')
|
|
reset() {
|
|
const updated = this.setupState.resetState();
|
|
return { ...updated, wizardRequired: this.setupState.isWizardRequired() };
|
|
}
|
|
}
|