Add facilities, contracts, orders, value lists, audit log, and desktop app modules

Extends omsorgCore with full CRUD for Facility/Contract/Order plus
configurable value lists and an audit trail, and wires the omsorgapp
frontend up to the new facilities, settings, and audit-log modules;
includes a sidebar active-nav-item highlight.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Felix Kemmler
2026-08-08 23:29:16 +02:00
co-authored by Claude Sonnet 5
parent ee74ed65f5
commit e9e96a57dc
528 changed files with 96814 additions and 456 deletions
+31 -16
View File
@@ -1,7 +1,9 @@
const { request } = require('./httpClient.cjs');
const { AuthApi } = require('omsorgcore-client-ts');
const { configFor, callApi } = require('./apiClientHelpers.cjs');
// Kapselt /api/auth/* von omsorgCore. Kennt die Feldnamen der LoginResponse
// (camelCase, da ASP.NET Core standardmäßig camelCase-JSON ausgibt).
// Kapselt /api/auth/* von omsorgCore über den generierten Client (omsorgcore-client-ts).
// Kennt die Feldnamen der LoginResponse (camelCase, da ASP.NET Core standardmäßig
// camelCase-JSON ausgibt).
function toTokenPair(data) {
return {
accessToken: data.accessToken,
@@ -12,7 +14,8 @@ function toTokenPair(data) {
}
async function login(username, password) {
const result = await request('POST', '/api/auth/login', { body: { username, password } });
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthLoginPostRaw({ loginRequest: { username, password } }));
if (!result.ok) {
return { ok: false, status: result.status, error: result.error || result.data?.error };
}
@@ -20,47 +23,58 @@ async function login(username, password) {
}
async function refresh(refreshToken) {
const result = await request('POST', '/api/auth/refresh', { body: { refreshToken } });
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthRefreshPostRaw({ refreshRequest: { refreshToken } }));
if (!result.ok) return { ok: false, status: result.status };
return { ok: true, ...toTokenPair(result.data) };
}
async function logout(refreshToken) {
const result = await request('POST', '/api/auth/logout', { body: { refreshToken } });
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthLogoutPostRaw({ logoutRequest: { refreshToken } }));
return { ok: result.ok, status: result.status };
}
async function me(accessToken) {
const result = await request('GET', '/api/auth/me', { accessToken });
const api = new AuthApi(configFor(accessToken));
const result = await callApi(api.apiAuthMeGetRaw());
if (!result.ok) return { ok: false, status: result.status };
return { ok: true, username: result.data.username, role: result.data.role, permissions: result.data.permissions };
}
async function requestPasswordReset(username) {
const result = await request('POST', '/api/auth/forgot-password/request', { body: { username } });
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthForgotPasswordRequestPostRaw({ forgotPasswordRequestRequest: { username } }));
if (!result.ok) return { ok: false, status: result.status };
return { ok: true, status: result.data.status };
}
async function verifyPasswordResetCode(username, pin) {
const result = await request('POST', '/api/auth/forgot-password/verify', { body: { username, pin } });
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthForgotPasswordVerifyPostRaw({ forgotPasswordVerifyRequest: { username, pin } }));
if (!result.ok) return { ok: false, status: result.status, error: result.data?.error };
return { ok: true, resetToken: result.data.resetToken };
}
async function resetPassword(resetToken, newPassword) {
const result = await request('POST', '/api/auth/forgot-password/reset', { body: { resetToken, newPassword } });
return { ok: result.ok, status: result.status };
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthForgotPasswordResetPostRaw({ forgotPasswordResetRequest: { resetToken, newPassword } }));
return { ok: result.ok, status: result.status, data: result.data };
}
async function changePassword(accessToken, currentPassword, newPassword) {
const result = await request('POST', '/api/auth/change-password', {
body: { currentPassword, newPassword },
accessToken
});
const api = new AuthApi(configFor(accessToken));
const result = await callApi(api.apiAuthChangePasswordPostRaw({ changePasswordRequest: { currentPassword, newPassword } }));
return { ok: result.ok, status: result.status, data: result.data };
}
async function getPasswordPolicy() {
const api = new AuthApi(configFor(undefined));
const result = await callApi(api.apiAuthPasswordPolicyGetRaw());
if (!result.ok) return { ok: false, status: result.status };
return { ok: true, minLength: result.data.minLength };
}
module.exports = {
login,
refresh,
@@ -69,5 +83,6 @@ module.exports = {
requestPasswordReset,
verifyPasswordResetCode,
resetPassword,
changePassword
changePassword,
getPasswordPolicy
};