first commit

This commit is contained in:
Stefan Hacker
2026-01-29 01:16:54 +01:00
commit 32a7dc74e1
12111 changed files with 2480685 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=address.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"address.routes.d.ts","sourceRoot":"","sources":["../../src/routes/address.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAKxB,eAAe,MAAM,CAAC"}
+43
View File
@@ -0,0 +1,43 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const customerController = __importStar(require("../controllers/customer.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateAddress);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteAddress);
exports.default = router;
//# sourceMappingURL=address.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"address.routes.js","sourceRoot":"","sources":["../../src/routes/address.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;AAC1G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;AAE7G,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=appSetting.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"appSetting.routes.d.ts","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAwBxB,eAAe,MAAM,CAAC"}
+49
View File
@@ -0,0 +1,49 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const appSettingController = __importStar(require("../controllers/appSetting.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Öffentliche Einstellungen (für alle authentifizierten Benutzer, inkl. Kunden)
router.get('/public', auth_js_1.authenticate, appSettingController.getPublicSettings);
// Alle Einstellungen (nur Admin)
router.get('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:read'), appSettingController.getAllSettings);
// Einzelne Einstellung aktualisieren (nur Admin)
router.put('/:key', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), appSettingController.updateSetting);
// Mehrere Einstellungen aktualisieren (nur Admin)
router.put('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), appSettingController.updateSettings);
exports.default = router;
//# sourceMappingURL=appSetting.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"appSetting.routes.js","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,8FAAgF;AAChF,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,gFAAgF;AAChF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAE5E,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;AAEvG,iDAAiD;AACjD,MAAM,CAAC,GAAG,CACR,OAAO,EACP,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,aAAa,CACnC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,GAAG,CACR,GAAG,EACH,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,cAAc,CACpC,CAAC;AAEF,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=auth.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"auth.routes.d.ts","sourceRoot":"","sources":["../../src/routes/auth.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAOxB,eAAe,MAAM,CAAC"}
+45
View File
@@ -0,0 +1,45 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const authController = __importStar(require("../controllers/auth.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.post('/login', authController.login);
router.post('/customer-login', authController.customerLogin); // Kundenportal-Login
router.get('/me', auth_js_1.authenticate, authController.me);
router.post('/register', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:create'), authController.register);
exports.default = router;
//# sourceMappingURL=auth.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"auth.routes.js","sourceRoot":"","sources":["../../src/routes/auth.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,kFAAoE;AACpE,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;AAC5C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,CAAE,qBAAqB;AACpF,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,sBAAY,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;AACnD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEnG,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=bankcard.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"bankcard.routes.d.ts","sourceRoot":"","sources":["../../src/routes/bankcard.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAKxB,eAAe,MAAM,CAAC"}
+43
View File
@@ -0,0 +1,43 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const customerController = __importStar(require("../controllers/customer.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateBankCard);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteBankCard);
exports.default = router;
//# sourceMappingURL=bankcard.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"bankcard.routes.js","sourceRoot":"","sources":["../../src/routes/bankcard.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC3G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAE9G,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=cancellation-period.routes.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"cancellation-period.routes.d.ts","sourceRoot":"","sources":["../../src/routes/cancellation-period.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAQxB,eAAe,MAAM,CAAC"}
+46
View File
@@ -0,0 +1,46 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const cancellationPeriodController = __importStar(require("../controllers/cancellation-period.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.get('/', auth_js_1.authenticate, cancellationPeriodController.getCancellationPeriods);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:create'), cancellationPeriodController.createCancellationPeriod);
router.get('/:id', auth_js_1.authenticate, cancellationPeriodController.getCancellationPeriod);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:update'), cancellationPeriodController.updateCancellationPeriod);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:delete'), cancellationPeriodController.deleteCancellationPeriod);
exports.default = router;
//# sourceMappingURL=cancellation-period.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"cancellation-period.routes.js","sourceRoot":"","sources":["../../src/routes/cancellation-period.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,+GAAiG;AACjG,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,4BAA4B,CAAC,sBAAsB,CAAC,CAAC;AACnF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;AAC7H,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;AACrF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;AAC/H,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;AAElI,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=contract-duration.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contract-duration.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contract-duration.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAQxB,eAAe,MAAM,CAAC"}
+46
View File
@@ -0,0 +1,46 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const contractDurationController = __importStar(require("../controllers/contract-duration.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.get('/', auth_js_1.authenticate, contractDurationController.getContractDurations);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:create'), contractDurationController.createContractDuration);
router.get('/:id', auth_js_1.authenticate, contractDurationController.getContractDuration);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:update'), contractDurationController.updateContractDuration);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:delete'), contractDurationController.deleteContractDuration);
exports.default = router;
//# sourceMappingURL=contract-duration.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contract-duration.routes.js","sourceRoot":"","sources":["../../src/routes/contract-duration.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,2GAA6F;AAC7F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,0BAA0B,CAAC,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AACzH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;AACjF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAE9H,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=contract.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contract.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contract.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2BxB,eAAe,MAAM,CAAC"}
+58
View File
@@ -0,0 +1,58 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const contractController = __importStar(require("../controllers/contract.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.get('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getContracts);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:create'), contractController.createContract);
// Vertrags-Cockpit (muss VOR /:id stehen!)
router.get('/cockpit', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getCockpit);
router.get('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getContract);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractController.updateContract);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:delete'), contractController.deleteContract);
// Follow-up contract
router.post('/:id/follow-up', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:create'), contractController.createFollowUp);
// Get decrypted password
router.get('/:id/password', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getContractPassword);
// Get decrypted SimCard PIN/PUK
router.get('/simcard/:simCardId/credentials', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getSimCardCredentials);
// Get decrypted Internet password
router.get('/:id/internet-credentials', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getInternetCredentials);
// Get decrypted SIP password
router.get('/phonenumber/:phoneNumberId/sip-credentials', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractController.getSipCredentials);
exports.default = router;
//# sourceMappingURL=contract.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contract.routes.js","sourceRoot":"","sources":["../../src/routes/contract.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;AACpG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAEzG,2CAA2C;AAC3C,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAEzG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACtG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC3G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAE9G,qBAAqB;AACrB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAEtH,yBAAyB;AACzB,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;AAEvH,gCAAgC;AAChC,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;AAE3I,kCAAkC;AAClC,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;AAEtI,6BAA6B;AAC7B,MAAM,CAAC,GAAG,CAAC,6CAA6C,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;AAEnJ,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=contractCategory.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contractCategory.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAQxB,eAAe,MAAM,CAAC"}
+46
View File
@@ -0,0 +1,46 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const contractCategoryController = __importStar(require("../controllers/contractCategory.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.get('/', auth_js_1.authenticate, contractCategoryController.getContractCategories);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:create'), contractCategoryController.createContractCategory);
router.get('/:id', auth_js_1.authenticate, contractCategoryController.getContractCategory);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:update'), contractCategoryController.updateContractCategory);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:delete'), contractCategoryController.deleteContractCategory);
exports.default = router;
//# sourceMappingURL=contractCategory.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contractCategory.routes.js","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0GAA4F;AAC5F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;AAChF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AACzH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;AACjF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAE9H,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=contractTask.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contractTask.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contractTask.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAgIxB,eAAe,MAAM,CAAC"}
+74
View File
@@ -0,0 +1,74 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const contractTaskController = __importStar(require("../controllers/contractTask.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// ==================== ALL TASKS (vertragsübergreifend) ====================
// Alle Aufgaben über alle Verträge (für Dashboard & Task-Liste)
router.get('/tasks', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractTaskController.getAllTasks);
// Task-Statistik (offene Aufgaben)
router.get('/tasks/stats', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractTaskController.getTaskStats);
// ==================== TASKS BY CONTRACT ====================
// Alle Aufgaben eines Vertrags abrufen (auch für Kundenportal, aber nur sichtbare)
router.get('/contracts/:contractId/tasks', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractTaskController.getTasks);
// Neue Aufgabe erstellen (nur für Mitarbeiter mit contracts:update)
router.post('/contracts/:contractId/tasks', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.createTask);
// Support-Anfrage erstellen (für Kundenportal-Benutzer, nur contracts:read erforderlich)
router.post('/contracts/:contractId/support-ticket', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractTaskController.createSupportTicket);
// Aufgabe aktualisieren
router.put('/tasks/:taskId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.updateTask);
// Aufgabe als erledigt markieren
router.post('/tasks/:taskId/complete', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.completeTask);
// Aufgabe wieder öffnen
router.post('/tasks/:taskId/reopen', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.reopenTask);
// Aufgabe löschen
router.delete('/tasks/:taskId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:delete'), contractTaskController.deleteTask);
// ==================== SUBTASKS ====================
// Neue Unteraufgabe erstellen (Mitarbeiter)
router.post('/tasks/:taskId/subtasks', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.createSubtask);
// Antwort auf eigenes Ticket erstellen (Kundenportal)
router.post('/tasks/:taskId/reply', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:read'), contractTaskController.createCustomerReply);
// Unteraufgabe als erledigt markieren
router.post('/subtasks/:subtaskId/complete', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.completeSubtask);
// Unteraufgabe wieder öffnen
router.post('/subtasks/:subtaskId/reopen', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.reopenSubtask);
// Unteraufgabe aktualisieren
router.put('/subtasks/:subtaskId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), contractTaskController.updateSubtask);
// Unteraufgabe löschen
router.delete('/subtasks/:subtaskId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:delete'), contractTaskController.deleteSubtask);
exports.default = router;
//# sourceMappingURL=contractTask.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"contractTask.routes.js","sourceRoot":"","sources":["../../src/routes/contractTask.routes.ts"],"names":[],"mappings":"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"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=customer.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"customer.routes.d.ts","sourceRoot":"","sources":["../../src/routes/customer.routes.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAyCxB,eAAe,MAAM,CAAC"}
+73
View File
@@ -0,0 +1,73 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const customerController = __importStar(require("../controllers/customer.controller.js"));
const stressfreiEmailController = __importStar(require("../controllers/stressfreiEmail.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Customers
router.get('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), customerController.getCustomers);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:create'), customerController.createCustomer);
router.get('/:id', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, customerController.getCustomer);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateCustomer);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteCustomer);
// Addresses
router.get('/:customerId/addresses', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, customerController.getAddresses);
router.post('/:customerId/addresses', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.createAddress);
// Bank Cards
router.get('/:customerId/bank-cards', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, customerController.getBankCards);
router.post('/:customerId/bank-cards', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.createBankCard);
// Identity Documents
router.get('/:customerId/documents', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, customerController.getDocuments);
router.post('/:customerId/documents', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.createDocument);
// Meters
router.get('/:customerId/meters', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, customerController.getMeters);
router.post('/:customerId/meters', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.createMeter);
// Stressfrei-Wechseln E-Mail-Adressen
router.get('/:customerId/stressfrei-emails', auth_js_1.authenticate, auth_js_1.requireCustomerAccess, stressfreiEmailController.getEmailsByCustomer);
router.post('/:customerId/stressfrei-emails', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), stressfreiEmailController.createEmail);
// Portal Settings
router.get('/:customerId/portal', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.getPortalSettings);
router.put('/:customerId/portal', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updatePortalSettings);
router.post('/:customerId/portal/password', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.setPortalPassword);
router.get('/:customerId/portal/password', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.getPortalPassword);
// Representatives (Vertreter)
router.get('/:customerId/representatives', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), customerController.getRepresentatives);
router.post('/:customerId/representatives', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.addRepresentative);
router.delete('/:customerId/representatives/:representativeId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.removeRepresentative);
router.get('/:customerId/representatives/search', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), customerController.searchForRepresentative);
exports.default = router;
//# sourceMappingURL=customer.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"customer.routes.js","sourceRoot":"","sources":["../../src/routes/customer.routes.ts"],"names":[],"mappings":"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"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=developer.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"developer.routes.d.ts","sourceRoot":"","sources":["../../src/routes/developer.routes.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA0fxB,eAAe,MAAM,CAAC"}
+454
View File
@@ -0,0 +1,454 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const client_1 = require("@prisma/client");
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
const prisma = new client_1.PrismaClient();
// Setup-Endpunkt: Erstellt die developer:access Permission und fügt sie der Admin-Rolle hinzu
// Dieser Endpunkt erfordert keine Authentifizierung, da er nur einmalig zum Setup verwendet wird
router.post('/setup', async (req, res) => {
try {
// Create or get the developer:access permission
const developerPerm = await prisma.permission.upsert({
where: { resource_action: { resource: 'developer', action: 'access' } },
update: {},
create: { resource: 'developer', action: 'access' },
});
// Get the Admin role
const adminRole = await prisma.role.findUnique({
where: { name: 'Admin' },
include: { permissions: true },
});
if (!adminRole) {
res.status(404).json({ success: false, error: 'Admin-Rolle nicht gefunden' });
return;
}
// Check if Admin already has this permission
const hasPermission = adminRole.permissions.some((rp) => rp.permissionId === developerPerm.id);
if (!hasPermission) {
await prisma.rolePermission.create({
data: {
roleId: adminRole.id,
permissionId: developerPerm.id,
},
});
res.json({ success: true, message: 'developer:access Permission wurde zur Admin-Rolle hinzugefügt. Bitte neu einloggen!' });
}
else {
res.json({ success: true, message: 'Admin-Rolle hat bereits die developer:access Permission' });
}
}
catch (error) {
console.error('Setup error:', error);
res.status(500).json({ success: false, error: 'Fehler beim Setup' });
}
});
// Tabellen-Metadaten mit Beziehungen
const tableMetadata = {
User: {
model: 'user',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt', 'password'],
requiredFields: ['email', 'firstName', 'lastName'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'roles', targetTable: 'UserRole', type: 'many' },
],
foreignKeys: [{ field: 'customerId', targetTable: 'Customer' }],
},
Role: {
model: 'role',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['name'],
relations: [
{ field: 'permissions', targetTable: 'RolePermission', type: 'many' },
{ field: 'users', targetTable: 'UserRole', type: 'many' },
],
foreignKeys: [],
},
Permission: {
model: 'permission',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['resource', 'action'],
relations: [{ field: 'roles', targetTable: 'RolePermission', type: 'many' }],
foreignKeys: [],
},
RolePermission: {
model: 'rolePermission',
primaryKey: 'roleId,permissionId',
readonlyFields: [],
requiredFields: ['roleId', 'permissionId'],
relations: [],
foreignKeys: [
{ field: 'roleId', targetTable: 'Role' },
{ field: 'permissionId', targetTable: 'Permission' },
],
},
UserRole: {
model: 'userRole',
primaryKey: 'userId,roleId',
readonlyFields: [],
requiredFields: ['userId', 'roleId'],
relations: [],
foreignKeys: [
{ field: 'userId', targetTable: 'User' },
{ field: 'roleId', targetTable: 'Role' },
],
},
Customer: {
model: 'customer',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt', 'customerNumber'],
requiredFields: ['firstName', 'lastName'],
relations: [
{ field: 'user', targetTable: 'User', type: 'one' },
{ field: 'addresses', targetTable: 'Address', type: 'many' },
{ field: 'bankCards', targetTable: 'BankCard', type: 'many' },
{ field: 'identityDocuments', targetTable: 'IdentityDocument', type: 'many' },
{ field: 'meters', targetTable: 'Meter', type: 'many' },
{ field: 'contracts', targetTable: 'Contract', type: 'many' },
],
foreignKeys: [],
},
Address: {
model: 'address',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['customerId', 'street', 'houseNumber', 'postalCode', 'city'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'contracts', targetTable: 'Contract', type: 'many' },
],
foreignKeys: [{ field: 'customerId', targetTable: 'Customer' }],
},
BankCard: {
model: 'bankCard',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['customerId', 'accountHolder', 'iban'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'contracts', targetTable: 'Contract', type: 'many' },
],
foreignKeys: [{ field: 'customerId', targetTable: 'Customer' }],
},
IdentityDocument: {
model: 'identityDocument',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['customerId', 'documentNumber'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'contracts', targetTable: 'Contract', type: 'many' },
],
foreignKeys: [{ field: 'customerId', targetTable: 'Customer' }],
},
Meter: {
model: 'meter',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['customerId', 'meterNumber', 'type'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'readings', targetTable: 'MeterReading', type: 'many' },
{ field: 'energyDetails', targetTable: 'EnergyContractDetails', type: 'many' },
],
foreignKeys: [{ field: 'customerId', targetTable: 'Customer' }],
},
MeterReading: {
model: 'meterReading',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt'],
requiredFields: ['meterId', 'readingDate', 'value'],
relations: [{ field: 'meter', targetTable: 'Meter', type: 'one' }],
foreignKeys: [{ field: 'meterId', targetTable: 'Meter' }],
},
SalesPlatform: {
model: 'salesPlatform',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt'],
requiredFields: ['name'],
relations: [{ field: 'contracts', targetTable: 'Contract', type: 'many' }],
foreignKeys: [],
},
Contract: {
model: 'contract',
primaryKey: 'id',
readonlyFields: ['id', 'createdAt', 'updatedAt', 'contractNumber'],
requiredFields: ['customerId', 'type'],
relations: [
{ field: 'customer', targetTable: 'Customer', type: 'one' },
{ field: 'address', targetTable: 'Address', type: 'one' },
{ field: 'bankCard', targetTable: 'BankCard', type: 'one' },
{ field: 'identityDocument', targetTable: 'IdentityDocument', type: 'one' },
{ field: 'salesPlatform', targetTable: 'SalesPlatform', type: 'one' },
{ field: 'previousContract', targetTable: 'Contract', type: 'one' },
{ field: 'followUpContract', targetTable: 'Contract', type: 'one' },
{ field: 'energyDetails', targetTable: 'EnergyContractDetails', type: 'one' },
{ field: 'internetDetails', targetTable: 'InternetContractDetails', type: 'one' },
{ field: 'mobileDetails', targetTable: 'MobileContractDetails', type: 'one' },
{ field: 'tvDetails', targetTable: 'TvContractDetails', type: 'one' },
{ field: 'carInsuranceDetails', targetTable: 'CarInsuranceDetails', type: 'one' },
],
foreignKeys: [
{ field: 'customerId', targetTable: 'Customer' },
{ field: 'addressId', targetTable: 'Address' },
{ field: 'bankCardId', targetTable: 'BankCard' },
{ field: 'identityDocumentId', targetTable: 'IdentityDocument' },
{ field: 'salesPlatformId', targetTable: 'SalesPlatform' },
{ field: 'previousContractId', targetTable: 'Contract' },
],
},
EnergyContractDetails: {
model: 'energyContractDetails',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['contractId'],
relations: [
{ field: 'contract', targetTable: 'Contract', type: 'one' },
{ field: 'meter', targetTable: 'Meter', type: 'one' },
],
foreignKeys: [
{ field: 'contractId', targetTable: 'Contract' },
{ field: 'meterId', targetTable: 'Meter' },
],
},
InternetContractDetails: {
model: 'internetContractDetails',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['contractId'],
relations: [
{ field: 'contract', targetTable: 'Contract', type: 'one' },
{ field: 'phoneNumbers', targetTable: 'PhoneNumber', type: 'many' },
],
foreignKeys: [{ field: 'contractId', targetTable: 'Contract' }],
},
PhoneNumber: {
model: 'phoneNumber',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['internetContractDetailsId', 'phoneNumber'],
relations: [{ field: 'internetDetails', targetTable: 'InternetContractDetails', type: 'one' }],
foreignKeys: [{ field: 'internetContractDetailsId', targetTable: 'InternetContractDetails' }],
},
MobileContractDetails: {
model: 'mobileContractDetails',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['contractId'],
relations: [{ field: 'contract', targetTable: 'Contract', type: 'one' }],
foreignKeys: [{ field: 'contractId', targetTable: 'Contract' }],
},
TvContractDetails: {
model: 'tvContractDetails',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['contractId'],
relations: [{ field: 'contract', targetTable: 'Contract', type: 'one' }],
foreignKeys: [{ field: 'contractId', targetTable: 'Contract' }],
},
CarInsuranceDetails: {
model: 'carInsuranceDetails',
primaryKey: 'id',
readonlyFields: ['id'],
requiredFields: ['contractId'],
relations: [{ field: 'contract', targetTable: 'Contract', type: 'one' }],
foreignKeys: [{ field: 'contractId', targetTable: 'Contract' }],
},
};
// Schema-Informationen abrufen
router.get('/schema', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), async (req, res) => {
try {
const tables = Object.entries(tableMetadata).map(([name, meta]) => ({
name,
...meta,
}));
res.json({ success: true, data: tables });
}
catch (error) {
console.error('Schema error:', error);
res.status(500).json({ success: false, error: 'Fehler beim Laden des Schemas' });
}
});
// Tabellen-Daten abrufen
router.get('/table/:tableName', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), async (req, res) => {
try {
const { tableName } = req.params;
const { page = '1', limit = '50' } = req.query;
const meta = tableMetadata[tableName];
if (!meta) {
res.status(404).json({ success: false, error: 'Tabelle nicht gefunden' });
return;
}
const skip = (parseInt(page) - 1) * parseInt(limit);
const take = parseInt(limit);
const model = prisma[meta.model];
const [data, total] = await Promise.all([
model.findMany({
skip,
take,
orderBy: meta.primaryKey.includes(',') ? undefined : { [meta.primaryKey.split(',')[0]]: 'desc' },
}),
model.count(),
]);
res.json({
success: true,
data,
meta: {
...meta,
tableName,
},
pagination: {
page: parseInt(page),
limit: parseInt(limit),
total,
totalPages: Math.ceil(total / parseInt(limit)),
},
});
}
catch (error) {
console.error('Table data error:', error);
res.status(500).json({ success: false, error: 'Fehler beim Laden der Daten' });
}
});
// Einzelne Zeile aktualisieren
router.put('/table/:tableName/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), async (req, res) => {
try {
const { tableName, id } = req.params;
const updates = req.body;
const meta = tableMetadata[tableName];
if (!meta) {
res.status(404).json({ success: false, error: 'Tabelle nicht gefunden' });
return;
}
// Readonly-Felder aus Updates entfernen
const filteredUpdates = {};
for (const [key, value] of Object.entries(updates)) {
if (!meta.readonlyFields.includes(key)) {
filteredUpdates[key] = value;
}
}
// Prüfen ob required-Felder nicht auf null/leer gesetzt werden
for (const field of meta.requiredFields) {
if (field in filteredUpdates && (filteredUpdates[field] === null || filteredUpdates[field] === '')) {
res.status(400).json({ success: false, error: `Feld '${field}' ist erforderlich` });
return;
}
}
const model = prisma[meta.model];
// Composite Primary Key Handling
let where;
if (meta.primaryKey.includes(',')) {
const keys = meta.primaryKey.split(',');
const idParts = id.split('-');
where = {};
keys.forEach((key, idx) => {
where[key] = parseInt(idParts[idx]);
});
}
else {
where = { [meta.primaryKey]: parseInt(id) };
}
const updated = await model.update({
where,
data: filteredUpdates,
});
res.json({ success: true, data: updated });
}
catch (error) {
console.error('Update error:', error);
if (error.code === 'P2003') {
res.status(400).json({ success: false, error: 'Fremdschlüssel-Verletzung: Referenzierter Datensatz existiert nicht' });
}
else if (error.code === 'P2002') {
res.status(400).json({ success: false, error: 'Unique-Constraint-Verletzung: Wert existiert bereits' });
}
else {
res.status(500).json({ success: false, error: 'Fehler beim Aktualisieren' });
}
}
});
// Zeile löschen (nur wenn keine abhängigen Daten)
router.delete('/table/:tableName/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), async (req, res) => {
try {
const { tableName, id } = req.params;
const meta = tableMetadata[tableName];
if (!meta) {
res.status(404).json({ success: false, error: 'Tabelle nicht gefunden' });
return;
}
const model = prisma[meta.model];
// Composite Primary Key Handling
let where;
if (meta.primaryKey.includes(',')) {
const keys = meta.primaryKey.split(',');
const idParts = id.split('-');
where = {};
keys.forEach((key, idx) => {
where[key] = parseInt(idParts[idx]);
});
}
else {
where = { [meta.primaryKey]: parseInt(id) };
}
// Prüfen ob abhängige Daten existieren (nur "many"-Relations)
const record = await model.findUnique({
where,
include: meta.relations
.filter((r) => r.type === 'many')
.reduce((acc, r) => ({ ...acc, [r.field]: { take: 1 } }), {}),
});
if (!record) {
res.status(404).json({ success: false, error: 'Datensatz nicht gefunden' });
return;
}
// Prüfen auf abhängige Daten
for (const rel of meta.relations.filter((r) => r.type === 'many')) {
if (record[rel.field] && record[rel.field].length > 0) {
res.status(400).json({
success: false,
error: `Kann nicht gelöscht werden: Es existieren abhängige Daten in '${rel.targetTable}'`,
});
return;
}
}
await model.delete({ where });
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
if (error.code === 'P2003') {
res.status(400).json({ success: false, error: 'Kann nicht gelöscht werden: Fremdschlüssel-Abhängigkeit' });
}
else {
res.status(500).json({ success: false, error: 'Fehler beim Löschen' });
}
}
});
// Referenzierte Daten für Dropdowns abrufen
router.get('/reference/:tableName', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), async (req, res) => {
try {
const { tableName } = req.params;
const { search = '', limit = '50' } = req.query;
const meta = tableMetadata[tableName];
if (!meta) {
res.status(404).json({ success: false, error: 'Tabelle nicht gefunden' });
return;
}
const model = prisma[meta.model];
const data = await model.findMany({
take: parseInt(limit),
});
res.json({ success: true, data });
}
catch (error) {
console.error('Reference error:', error);
res.status(500).json({ success: false, error: 'Fehler beim Laden der Referenzdaten' });
}
});
exports.default = router;
//# sourceMappingURL=developer.routes.js.map
File diff suppressed because one or more lines are too long
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=document.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"document.routes.d.ts","sourceRoot":"","sources":["../../src/routes/document.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAKxB,eAAe,MAAM,CAAC"}
+43
View File
@@ -0,0 +1,43 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const customerController = __importStar(require("../controllers/customer.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateDocument);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteDocument);
exports.default = router;
//# sourceMappingURL=document.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"document.routes.js","sourceRoot":"","sources":["../../src/routes/document.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC3G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAE9G,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=emailProvider.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"emailProvider.routes.d.ts","sourceRoot":"","sources":["../../src/routes/emailProvider.routes.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAgBxB,eAAe,MAAM,CAAC"}
+54
View File
@@ -0,0 +1,54 @@
"use strict";
// ==================== EMAIL PROVIDER ROUTES ====================
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const emailProviderController = __importStar(require("../controllers/emailProvider.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Provider Config CRUD (Admin-only)
router.get('/configs', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:read'), emailProviderController.getProviderConfigs);
router.get('/configs/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:read'), emailProviderController.getProviderConfig);
router.post('/configs', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), emailProviderController.createProviderConfig);
router.put('/configs/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), emailProviderController.updateProviderConfig);
router.delete('/configs/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), emailProviderController.deleteProviderConfig);
// Email Operations
router.post('/test-connection', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), emailProviderController.testConnection);
router.get('/domain', auth_js_1.authenticate, emailProviderController.getProviderDomain);
router.get('/check/:localPart', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), emailProviderController.checkEmailExists);
router.post('/provision', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), emailProviderController.provisionEmail);
router.delete('/deprovision/:localPart', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), emailProviderController.deprovisionEmail);
exports.default = router;
//# sourceMappingURL=emailProvider.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"emailProvider.routes.js","sourceRoot":"","sources":["../../src/routes/emailProvider.routes.ts"],"names":[],"mappings":";AAAA,kEAAkE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAElE,qCAAiC;AACjC,oGAAsF;AACtF,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,oCAAoC;AACpC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,eAAe,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;AACrH,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,eAAe,CAAC,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;AACxH,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;AAC1H,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;AAC7H,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;AAEhI,mBAAmB;AACnB,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;AAC5H,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAY,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;AAC/E,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;AAC7H,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACvH,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;AAExI,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=meter.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"meter.routes.d.ts","sourceRoot":"","sources":["../../src/routes/meter.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAWxB,eAAe,MAAM,CAAC"}
+48
View File
@@ -0,0 +1,48 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const customerController = __importStar(require("../controllers/customer.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateMeter);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteMeter);
// Meter readings
router.get('/:meterId/readings', auth_js_1.authenticate, customerController.getMeterReadings);
router.post('/:meterId/readings', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.addMeterReading);
router.put('/:meterId/readings/:readingId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), customerController.updateMeterReading);
router.delete('/:meterId/readings/:readingId', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), customerController.deleteMeterReading);
exports.default = router;
//# sourceMappingURL=meter.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"meter.routes.js","sourceRoot":"","sources":["../../src/routes/meter.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAA+F;AAE/F,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACxG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAE3G,iBAAiB;AACjB,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,sBAAY,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;AACpF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAC3H,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;AACxI,MAAM,CAAC,MAAM,CAAC,+BAA+B,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;AAE3I,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=platform.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"platform.routes.d.ts","sourceRoot":"","sources":["../../src/routes/platform.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAQxB,eAAe,MAAM,CAAC"}
+46
View File
@@ -0,0 +1,46 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const platformController = __importStar(require("../controllers/platform.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
router.get('/', auth_js_1.authenticate, platformController.getPlatforms);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:create'), platformController.createPlatform);
router.get('/:id', auth_js_1.authenticate, platformController.getPlatform);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:update'), platformController.updatePlatform);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:delete'), platformController.deletePlatform);
exports.default = router;
//# sourceMappingURL=platform.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"platform.routes.js","sourceRoot":"","sources":["../../src/routes/platform.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AACzG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACjE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC3G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAE9G,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=provider.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"provider.routes.d.ts","sourceRoot":"","sources":["../../src/routes/provider.routes.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAaxB,eAAe,MAAM,CAAC"}
+51
View File
@@ -0,0 +1,51 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const providerController = __importStar(require("../controllers/provider.controller.js"));
const tariffController = __importStar(require("../controllers/tariff.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Provider routes
router.get('/', auth_js_1.authenticate, providerController.getProviders);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:create'), providerController.createProvider);
router.get('/:id', auth_js_1.authenticate, providerController.getProvider);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:update'), providerController.updateProvider);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:delete'), providerController.deleteProvider);
// Nested tariff routes
router.get('/:providerId/tariffs', auth_js_1.authenticate, tariffController.getTariffs);
router.post('/:providerId/tariffs', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:create'), tariffController.createTariff);
exports.default = router;
//# sourceMappingURL=provider.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"provider.routes.js","sourceRoot":"","sources":["../../src/routes/provider.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0FAA4E;AAC5E,sFAAwE;AACxE,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,kBAAkB;AAClB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AACzG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;AACjE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC3G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAE9G,uBAAuB;AACvB,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,sBAAY,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAC9E,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAExH,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=stressfreiEmail.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"stressfreiEmail.routes.d.ts","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAOxB,eAAe,MAAM,CAAC"}
+45
View File
@@ -0,0 +1,45 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const stressfreiEmailController = __importStar(require("../controllers/stressfreiEmail.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Einzelne Stressfrei-Email verwalten
router.get('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), stressfreiEmailController.getEmail);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), stressfreiEmailController.updateEmail);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), stressfreiEmailController.deleteEmail);
exports.default = router;
//# sourceMappingURL=stressfreiEmail.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"stressfreiEmail.routes.js","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,wGAA0F;AAC1F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,sCAAsC;AACtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AAC1G,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAC/G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAElH,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=tariff.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"tariff.routes.d.ts","sourceRoot":"","sources":["../../src/routes/tariff.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAOxB,eAAe,MAAM,CAAC"}
+45
View File
@@ -0,0 +1,45 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const tariffController = __importStar(require("../controllers/tariff.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Standalone tariff routes (for update/delete by tariff id)
router.get('/:id', auth_js_1.authenticate, tariffController.getTariff);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:update'), tariffController.updateTariff);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('providers:delete'), tariffController.deleteTariff);
exports.default = router;
//# sourceMappingURL=tariff.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"tariff.routes.js","sourceRoot":"","sources":["../../src/routes/tariff.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,sFAAwE;AACxE,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,4DAA4D;AAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAC7D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACvG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAE1G,kBAAe,MAAM,CAAC"}
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=upload.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"upload.routes.d.ts","sourceRoot":"","sources":["../../src/routes/upload.routes.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA4oBxB,eAAe,MAAM,CAAC"}
+473
View File
@@ -0,0 +1,473 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const multer_1 = __importDefault(require("multer"));
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const client_1 = require("@prisma/client");
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
const prisma = new client_1.PrismaClient();
// Uploads-Verzeichnis erstellen falls nicht vorhanden
const uploadsDir = path_1.default.join(process.cwd(), 'uploads');
if (!fs_1.default.existsSync(uploadsDir)) {
fs_1.default.mkdirSync(uploadsDir, { recursive: true });
}
// Multer-Konfiguration
const storage = multer_1.default.diskStorage({
destination: (req, file, cb) => {
const subDir = req.uploadSubDir || 'misc';
const targetDir = path_1.default.join(uploadsDir, subDir);
if (!fs_1.default.existsSync(targetDir)) {
fs_1.default.mkdirSync(targetDir, { recursive: true });
}
cb(null, targetDir);
},
filename: (req, file, cb) => {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
const ext = path_1.default.extname(file.originalname);
cb(null, `${uniqueSuffix}${ext}`);
},
});
const fileFilter = (req, file, cb) => {
// Nur PDFs und Bilder erlauben
const allowedTypes = ['application/pdf', 'image/jpeg', 'image/png', 'image/jpg'];
if (allowedTypes.includes(file.mimetype)) {
cb(null, true);
}
else {
cb(new Error('Nur PDF, JPG und PNG Dateien sind erlaubt'));
}
};
const upload = (0, multer_1.default)({
storage,
fileFilter,
limits: {
fileSize: 10 * 1024 * 1024, // 10MB max
},
});
// Middleware um Subdirectory zu setzen
function setUploadDir(subDir) {
return (req, res, next) => {
req.uploadSubDir = subDir;
next();
};
}
// Upload für Bankkarten-Dokumente
router.post('/bank-cards/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), setUploadDir('bank-cards'), upload.single('document'), async (req, res) => {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const bankCardId = parseInt(req.params.id);
const relativePath = `/uploads/bank-cards/${req.file.filename}`;
// Bankkarte in der DB aktualisieren
await prisma.bankCard.update({
where: { id: bankCardId },
data: { documentPath: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
});
// Upload für Ausweis-Dokumente
router.post('/documents/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), setUploadDir('documents'), upload.single('document'), async (req, res) => {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const documentId = parseInt(req.params.id);
const relativePath = `/uploads/documents/${req.file.filename}`;
// Ausweis in der DB aktualisieren
await prisma.identityDocument.update({
where: { id: documentId },
data: { documentPath: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
});
// Löschen von Bankkarten-Dokumenten
router.delete('/bank-cards/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), async (req, res) => {
try {
const bankCardId = parseInt(req.params.id);
// Bankkarte aus DB holen um Dateipfad zu bekommen
const bankCard = await prisma.bankCard.findUnique({
where: { id: bankCardId },
});
if (!bankCard) {
res.status(404).json({ success: false, error: 'Bankkarte nicht gefunden' });
return;
}
if (!bankCard.documentPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei von Festplatte löschen
const filePath = path_1.default.join(process.cwd(), bankCard.documentPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// documentPath in DB auf null setzen
await prisma.bankCard.update({
where: { id: bankCardId },
data: { documentPath: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
});
// Löschen von Ausweis-Dokumenten
router.delete('/documents/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), async (req, res) => {
try {
const documentId = parseInt(req.params.id);
// Ausweis aus DB holen um Dateipfad zu bekommen
const document = await prisma.identityDocument.findUnique({
where: { id: documentId },
});
if (!document) {
res.status(404).json({ success: false, error: 'Ausweis nicht gefunden' });
return;
}
if (!document.documentPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei von Festplatte löschen
const filePath = path_1.default.join(process.cwd(), document.documentPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// documentPath in DB auf null setzen
await prisma.identityDocument.update({
where: { id: documentId },
data: { documentPath: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
});
// ==================== FIRMEN-DOKUMENTE ====================
// Upload für Gewerbeanmeldung
router.post('/customers/:id/business-registration', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), setUploadDir('business-registrations'), upload.single('document'), async (req, res) => {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const customerId = parseInt(req.params.id);
const relativePath = `/uploads/business-registrations/${req.file.filename}`;
// Alte Datei löschen falls vorhanden
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (customer?.businessRegistrationPath) {
const oldPath = path_1.default.join(process.cwd(), customer.businessRegistrationPath);
if (fs_1.default.existsSync(oldPath)) {
fs_1.default.unlinkSync(oldPath);
}
}
// Kunde in der DB aktualisieren
await prisma.customer.update({
where: { id: customerId },
data: { businessRegistrationPath: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
});
// Upload für Handelsregisterauszug
router.post('/customers/:id/commercial-register', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), setUploadDir('commercial-registers'), upload.single('document'), async (req, res) => {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const customerId = parseInt(req.params.id);
const relativePath = `/uploads/commercial-registers/${req.file.filename}`;
// Alte Datei löschen falls vorhanden
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (customer?.commercialRegisterPath) {
const oldPath = path_1.default.join(process.cwd(), customer.commercialRegisterPath);
if (fs_1.default.existsSync(oldPath)) {
fs_1.default.unlinkSync(oldPath);
}
}
// Kunde in der DB aktualisieren
await prisma.customer.update({
where: { id: customerId },
data: { commercialRegisterPath: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
});
// Löschen der Gewerbeanmeldung
router.delete('/customers/:id/business-registration', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), async (req, res) => {
try {
const customerId = parseInt(req.params.id);
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (!customer) {
res.status(404).json({ success: false, error: 'Kunde nicht gefunden' });
return;
}
if (!customer.businessRegistrationPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei löschen
const filePath = path_1.default.join(process.cwd(), customer.businessRegistrationPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// Pfad in DB auf null setzen
await prisma.customer.update({
where: { id: customerId },
data: { businessRegistrationPath: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
});
// Löschen des Handelsregisterauszugs
router.delete('/customers/:id/commercial-register', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), async (req, res) => {
try {
const customerId = parseInt(req.params.id);
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (!customer) {
res.status(404).json({ success: false, error: 'Kunde nicht gefunden' });
return;
}
if (!customer.commercialRegisterPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei löschen
const filePath = path_1.default.join(process.cwd(), customer.commercialRegisterPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// Pfad in DB auf null setzen
await prisma.customer.update({
where: { id: customerId },
data: { commercialRegisterPath: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
});
// ==================== DATENSCHUTZERKLÄRUNG (für alle Kunden) ====================
// Upload für Datenschutzerklärung
router.post('/customers/:id/privacy-policy', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), setUploadDir('privacy-policies'), upload.single('document'), async (req, res) => {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const customerId = parseInt(req.params.id);
const relativePath = `/uploads/privacy-policies/${req.file.filename}`;
// Alte Datei löschen falls vorhanden
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (customer?.privacyPolicyPath) {
const oldPath = path_1.default.join(process.cwd(), customer.privacyPolicyPath);
if (fs_1.default.existsSync(oldPath)) {
fs_1.default.unlinkSync(oldPath);
}
}
// Kunde in der DB aktualisieren
await prisma.customer.update({
where: { id: customerId },
data: { privacyPolicyPath: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
});
// Löschen der Datenschutzerklärung
router.delete('/customers/:id/privacy-policy', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), async (req, res) => {
try {
const customerId = parseInt(req.params.id);
const customer = await prisma.customer.findUnique({ where: { id: customerId } });
if (!customer) {
res.status(404).json({ success: false, error: 'Kunde nicht gefunden' });
return;
}
if (!customer.privacyPolicyPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei löschen
const filePath = path_1.default.join(process.cwd(), customer.privacyPolicyPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// Pfad in DB auf null setzen
await prisma.customer.update({
where: { id: customerId },
data: { privacyPolicyPath: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
});
// ==================== VERTRAGS-DOKUMENTE ====================
// Generische Funktion für Vertrags-Dokument Upload
async function handleContractDocumentUpload(req, res, fieldName, subDir) {
try {
if (!req.file) {
res.status(400).json({ success: false, error: 'Keine Datei hochgeladen' });
return;
}
const contractId = parseInt(req.params.id);
const relativePath = `/uploads/${subDir}/${req.file.filename}`;
// Alte Datei löschen falls vorhanden
const contract = await prisma.contract.findUnique({ where: { id: contractId } });
if (!contract) {
res.status(404).json({ success: false, error: 'Vertrag nicht gefunden' });
return;
}
const oldPath = contract[fieldName];
if (oldPath) {
const fullPath = path_1.default.join(process.cwd(), oldPath);
if (fs_1.default.existsSync(fullPath)) {
fs_1.default.unlinkSync(fullPath);
}
}
// Vertrag in der DB aktualisieren
await prisma.contract.update({
where: { id: contractId },
data: { [fieldName]: relativePath },
});
res.json({
success: true,
data: {
path: relativePath,
filename: req.file.filename,
originalName: req.file.originalname,
size: req.file.size,
},
});
}
catch (error) {
console.error('Upload error:', error);
res.status(500).json({ success: false, error: 'Upload fehlgeschlagen' });
}
}
// Generische Funktion für Vertrags-Dokument Löschen
async function handleContractDocumentDelete(req, res, fieldName) {
try {
const contractId = parseInt(req.params.id);
const contract = await prisma.contract.findUnique({ where: { id: contractId } });
if (!contract) {
res.status(404).json({ success: false, error: 'Vertrag nicht gefunden' });
return;
}
const documentPath = contract[fieldName];
if (!documentPath) {
res.status(400).json({ success: false, error: 'Kein Dokument vorhanden' });
return;
}
// Datei löschen
const filePath = path_1.default.join(process.cwd(), documentPath);
if (fs_1.default.existsSync(filePath)) {
fs_1.default.unlinkSync(filePath);
}
// Pfad in DB auf null setzen
await prisma.contract.update({
where: { id: contractId },
data: { [fieldName]: null },
});
res.json({ success: true });
}
catch (error) {
console.error('Delete error:', error);
res.status(500).json({ success: false, error: 'Löschen fehlgeschlagen' });
}
}
// Kündigungsschreiben
router.post('/contracts/:id/cancellation-letter', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), setUploadDir('cancellation-letters'), upload.single('document'), (req, res) => handleContractDocumentUpload(req, res, 'cancellationLetterPath', 'cancellation-letters'));
router.delete('/contracts/:id/cancellation-letter', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), (req, res) => handleContractDocumentDelete(req, res, 'cancellationLetterPath'));
// Kündigungsbestätigung
router.post('/contracts/:id/cancellation-confirmation', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), setUploadDir('cancellation-confirmations'), upload.single('document'), (req, res) => handleContractDocumentUpload(req, res, 'cancellationConfirmationPath', 'cancellation-confirmations'));
router.delete('/contracts/:id/cancellation-confirmation', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), (req, res) => handleContractDocumentDelete(req, res, 'cancellationConfirmationPath'));
// Kündigungsschreiben Optionen
router.post('/contracts/:id/cancellation-letter-options', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), setUploadDir('cancellation-letters-options'), upload.single('document'), (req, res) => handleContractDocumentUpload(req, res, 'cancellationLetterOptionsPath', 'cancellation-letters-options'));
router.delete('/contracts/:id/cancellation-letter-options', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), (req, res) => handleContractDocumentDelete(req, res, 'cancellationLetterOptionsPath'));
// Kündigungsbestätigung Optionen
router.post('/contracts/:id/cancellation-confirmation-options', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), setUploadDir('cancellation-confirmations-options'), upload.single('document'), (req, res) => handleContractDocumentUpload(req, res, 'cancellationConfirmationOptionsPath', 'cancellation-confirmations-options'));
router.delete('/contracts/:id/cancellation-confirmation-options', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('contracts:update'), (req, res) => handleContractDocumentDelete(req, res, 'cancellationConfirmationOptionsPath'));
exports.default = router;
//# sourceMappingURL=upload.routes.js.map
File diff suppressed because one or more lines are too long
+3
View File
@@ -0,0 +1,3 @@
declare const router: import("express-serve-static-core").Router;
export default router;
//# sourceMappingURL=user.routes.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user.routes.d.ts","sourceRoot":"","sources":["../../src/routes/user.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAmBxB,eAAe,MAAM,CAAC"}
+55
View File
@@ -0,0 +1,55 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const userController = __importStar(require("../controllers/user.controller.js"));
const auth_js_1 = require("../middleware/auth.js");
const router = (0, express_1.Router)();
// Users (Admin only)
router.get('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:read'), userController.getUsers);
router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:create'), userController.createUser);
router.get('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:read'), userController.getUser);
router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:update'), userController.updateUser);
router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:delete'), userController.deleteUser);
// Roles
router.get('/roles/list', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:read'), userController.getRoles);
router.post('/roles', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:create'), userController.createRole);
router.get('/roles/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:read'), userController.getRole);
router.put('/roles/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:update'), userController.updateRole);
router.delete('/roles/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:delete'), userController.deleteRole);
// Permissions
router.get('/permissions/list', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('users:read'), userController.getPermissions);
exports.default = router;
//# sourceMappingURL=user.routes.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"user.routes.js","sourceRoot":"","sources":["../../src/routes/user.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,kFAAoE;AACpE,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,qBAAqB;AACrB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;AACxF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAC7F,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1F,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAC/F,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAElG,QAAQ;AACR,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAClG,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;AAChG,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AACrG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,cAAc,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAExG,cAAc;AACd,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;AAE9G,kBAAe,MAAM,CAAC"}