mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-12-01 06:55:45 +01:00
changed role handling, employee name handling and availibilitie handling with shift.id
This commit is contained in:
@@ -34,9 +34,8 @@ export interface JWTPayload {
|
||||
export interface RegisterRequest {
|
||||
email: string;
|
||||
password: string;
|
||||
name: string;
|
||||
//employee_type?: string;
|
||||
//is_sufficiently_independent?: string;
|
||||
firstname: String;
|
||||
lastname: String;
|
||||
role?: string;
|
||||
}
|
||||
|
||||
@@ -53,7 +52,7 @@ export const login = async (req: Request, res: Response) => {
|
||||
|
||||
// Get user from database
|
||||
const user = await db.get<EmployeeWithPassword>(
|
||||
'SELECT id, email, password, name, role, employee_type as employeeType, contract_type as contractType, can_work_alone as canWorkAlone, is_active as isActive FROM employees WHERE email = ? AND is_active = 1',
|
||||
'SELECT id, email, password, firstname, lastname, role, employee_type as employeeType, contract_type as contractType, can_work_alone as canWorkAlone, is_active as isActive FROM employees WHERE email = ? AND is_active = 1',
|
||||
[email]
|
||||
);
|
||||
|
||||
@@ -117,7 +116,7 @@ export const getCurrentUser = async (req: Request, res: Response) => {
|
||||
}
|
||||
|
||||
const user = await db.get<Employee>(
|
||||
'SELECT id, email, name, role, employee_type as employeeType, contract_type as contractType, can_work_alone as canWorkAlone, is_active as isActive FROM employees WHERE id = ? AND is_active = 1',
|
||||
'SELECT id, email, firstname, lastname, role, employee_type as employeeType, contract_type as contractType, can_work_alone as canWorkAlone, is_active as isActive FROM employees WHERE id = ? AND is_active = 1',
|
||||
[jwtUser.userId]
|
||||
);
|
||||
|
||||
@@ -163,10 +162,10 @@ export const validateToken = async (req: Request, res: Response) => {
|
||||
|
||||
export const register = async (req: Request, res: Response) => {
|
||||
try {
|
||||
const { email, password, name, role = 'user' } = req.body as RegisterRequest;
|
||||
const { email, password, firstname, lastname, role = 'user' } = req.body as RegisterRequest;
|
||||
|
||||
// Validate required fields
|
||||
if (!email || !password || !name) {
|
||||
if (!email || !password || !firstname || !lastname) {
|
||||
return res.status(400).json({
|
||||
error: 'E-Mail, Passwort und Name sind erforderlich'
|
||||
});
|
||||
@@ -188,11 +187,11 @@ export const register = async (req: Request, res: Response) => {
|
||||
const hashedPassword = await bcrypt.hash(password, 10);
|
||||
|
||||
// Insert user
|
||||
const result = await db.run(
|
||||
`INSERT INTO employees (id, email, password, name, role, employee_type, contract_type, can_work_alone, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[uuidv4(), email, hashedPassword, name, role, 'experienced', 'small', false, 1]
|
||||
);
|
||||
const result = await db.run(
|
||||
`INSERT INTO employees (id, email, password, firstname, lastname, role, employee_type, contract_type, can_work_alone, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[uuidv4(), email, hashedPassword, firstname, lastname, role, 'experienced', 'small', false, 1]
|
||||
);
|
||||
|
||||
if (!result.lastID) {
|
||||
throw new Error('Benutzer konnte nicht erstellt werden');
|
||||
|
||||
@@ -15,7 +15,7 @@ export const getEmployees = async (req: AuthRequest, res: Response): Promise<voi
|
||||
|
||||
let query = `
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
id, email, firstname, lastname, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
@@ -46,7 +46,7 @@ export const getEmployee = async (req: AuthRequest, res: Response): Promise<void
|
||||
|
||||
const employee = await db.get<any>(`
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
id, email, firstname, lastname, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
@@ -78,15 +78,16 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
const {
|
||||
email,
|
||||
password,
|
||||
name,
|
||||
firstname,
|
||||
lastname,
|
||||
role,
|
||||
employeeType,
|
||||
contractType,
|
||||
canWorkAlone // Statt isSufficientlyIndependent
|
||||
canWorkAlone
|
||||
} = req.body as CreateEmployeeRequest;
|
||||
|
||||
// Validierung
|
||||
if (!email || !password || !name || !role || !employeeType || !contractType) {
|
||||
if (!email || !password || !firstname || !lastname || !role || !employeeType || !contractType) {
|
||||
console.log('❌ Validation failed: Missing required fields');
|
||||
res.status(400).json({
|
||||
error: 'Email, password, name, role, employeeType und contractType sind erforderlich'
|
||||
@@ -115,18 +116,19 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
|
||||
await db.run(
|
||||
`INSERT INTO employees (
|
||||
id, email, password, name, role, employee_type, contract_type, can_work_alone,
|
||||
id, email, password, firstname, lastname, role, employee_type, contract_type, can_work_alone,
|
||||
is_active
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[
|
||||
employeeId,
|
||||
email,
|
||||
hashedPassword,
|
||||
name,
|
||||
firstname, // Changed from name
|
||||
lastname, // Added
|
||||
role,
|
||||
employeeType,
|
||||
contractType,
|
||||
canWorkAlone ? 1 : 0, // Statt isSufficientlyIndependent
|
||||
canWorkAlone ? 1 : 0,
|
||||
1
|
||||
]
|
||||
);
|
||||
@@ -154,8 +156,7 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
export const updateEmployee = async (req: AuthRequest, res: Response): Promise<void> => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { name, role, isActive, employeeType, contractType, canWorkAlone } = req.body; // Statt isSufficientlyIndependent
|
||||
|
||||
const { firstname, lastname, role, isActive, employeeType, contractType, canWorkAlone } = req.body;
|
||||
console.log('📝 Update Employee Request:', { id, name, role, isActive, employeeType, contractType, canWorkAlone });
|
||||
|
||||
// Check if employee exists
|
||||
@@ -168,14 +169,15 @@ export const updateEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
// Update employee
|
||||
await db.run(
|
||||
`UPDATE employees
|
||||
SET name = COALESCE(?, name),
|
||||
role = COALESCE(?, role),
|
||||
is_active = COALESCE(?, is_active),
|
||||
employee_type = COALESCE(?, employee_type),
|
||||
contract_type = COALESCE(?, contract_type),
|
||||
can_work_alone = COALESCE(?, can_work_alone)
|
||||
WHERE id = ?`,
|
||||
[name, role, isActive, employeeType, contractType, canWorkAlone, id]
|
||||
SET firstname = COALESCE(?, firstname),
|
||||
lastname = COALESCE(?, lastname),
|
||||
role = COALESCE(?, role),
|
||||
is_active = COALESCE(?, is_active),
|
||||
employee_type = COALESCE(?, employee_type),
|
||||
contract_type = COALESCE(?, contract_type),
|
||||
can_work_alone = COALESCE(?, can_work_alone)
|
||||
WHERE id = ?`,
|
||||
[firstname, lastname, role, isActive, employeeType, contractType, canWorkAlone, id]
|
||||
);
|
||||
|
||||
console.log('✅ Employee updated successfully');
|
||||
@@ -290,9 +292,11 @@ export const getAvailabilities = async (req: AuthRequest, res: Response): Promis
|
||||
}
|
||||
|
||||
const availabilities = await db.all<any>(`
|
||||
SELECT * FROM employee_availability
|
||||
WHERE employee_id = ?
|
||||
ORDER BY day_of_week, time_slot_id
|
||||
SELECT ea.*, s.day_of_week, s.time_slot_id
|
||||
FROM employee_availability ea
|
||||
JOIN shifts s ON ea.shift_id = s.id
|
||||
WHERE ea.employee_id = ?
|
||||
ORDER BY s.day_of_week, s.time_slot_id
|
||||
`, [employeeId]);
|
||||
|
||||
//console.log('✅ Successfully got availabilities from employee:', availabilities);
|
||||
@@ -334,14 +338,13 @@ export const updateAvailabilities = async (req: AuthRequest, res: Response): Pro
|
||||
for (const availability of availabilities) {
|
||||
const availabilityId = uuidv4();
|
||||
await db.run(
|
||||
`INSERT INTO employee_availability (id, employee_id, plan_id, day_of_week, time_slot_id, preference_level, notes)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
||||
`INSERT INTO employee_availability (id, employee_id, plan_id, shift_id, preference_level, notes)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[
|
||||
availabilityId,
|
||||
employeeId,
|
||||
planId,
|
||||
availability.dayOfWeek,
|
||||
availability.timeSlotId,
|
||||
availability.shiftId,
|
||||
availability.preferenceLevel,
|
||||
availability.notes || null
|
||||
]
|
||||
|
||||
@@ -4,7 +4,6 @@ import bcrypt from 'bcrypt';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { randomUUID } from 'crypto';
|
||||
import { db } from '../services/databaseService.js';
|
||||
//import { initializeDefaultTemplates } from './shiftPlanController.js';
|
||||
|
||||
export const checkSetupStatus = async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
@@ -44,14 +43,14 @@ export const setupAdmin = async (req: Request, res: Response): Promise<void> =>
|
||||
return;
|
||||
}
|
||||
|
||||
const { password, name } = req.body;
|
||||
const { password, firstname, lastname } = req.body;
|
||||
const email = 'admin@instandhaltung.de';
|
||||
|
||||
console.log('👤 Creating admin with data:', { name, email });
|
||||
|
||||
// Validation
|
||||
if (!password || !name) {
|
||||
res.status(400).json({ error: 'Passwort und Name sind erforderlich' });
|
||||
if (!password || !firstname || !lastname) {
|
||||
res.status(400).json({ error: 'Passwort, Vorname und Nachname sind erforderlich' });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -73,9 +72,9 @@ export const setupAdmin = async (req: Request, res: Response): Promise<void> =>
|
||||
try {
|
||||
// Create admin user
|
||||
await db.run(
|
||||
`INSERT INTO employees (id, email, password, name, role, is_active, employee_type, contract_type)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[adminId, email, hashedPassword, name, 'admin', 1, 'manager', 'large']
|
||||
`INSERT INTO employees (id, email, password, firstname, lastname, role, employee_type, contract_type, can_work_alone, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[adminId, email, hashedPassword, firstname, lastname, 'admin', 'manager', 'large', true, 1]
|
||||
);
|
||||
|
||||
console.log('✅ Admin user created successfully');
|
||||
|
||||
@@ -12,7 +12,7 @@ import { createPlanFromPreset, TEMPLATE_PRESETS } from '../models/defaults/shift
|
||||
|
||||
async function getPlanWithDetails(planId: string) {
|
||||
const plan = await db.get<any>(`
|
||||
SELECT sp.*, e.name as created_by_name
|
||||
SELECT sp.*, e.firstname || ' ' || e.lastname as created_by_name
|
||||
FROM shift_plans sp
|
||||
LEFT JOIN employees e ON sp.created_by = e.id
|
||||
WHERE sp.id = ?
|
||||
@@ -69,7 +69,7 @@ async function getPlanWithDetails(planId: string) {
|
||||
export const getShiftPlans = async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
const plans = await db.all<any>(`
|
||||
SELECT sp.*, e.name as created_by_name
|
||||
SELECT sp.*, e.firstname || ' ' || e.lastname as created_by_name
|
||||
FROM shift_plans sp
|
||||
LEFT JOIN employees e ON sp.created_by = e.id
|
||||
ORDER BY sp.created_at DESC
|
||||
@@ -94,7 +94,7 @@ export const getShiftPlan = async (req: Request, res: Response): Promise<void> =
|
||||
const { id } = req.params;
|
||||
|
||||
const plan = await db.get<any>(`
|
||||
SELECT sp.*, e.name as created_by_name
|
||||
SELECT sp.*, e.firstname || ' ' || e.lastname as created_by_name
|
||||
FROM shift_plans sp
|
||||
LEFT JOIN employees e ON sp.created_by = e.id
|
||||
WHERE sp.id = ?
|
||||
@@ -555,7 +555,7 @@ export const deleteShiftPlan = async (req: Request, res: Response): Promise<void
|
||||
// Helper function to get plan by ID
|
||||
async function getShiftPlanById(planId: string): Promise<any> {
|
||||
const plan = await db.get<any>(`
|
||||
SELECT sp.*, e.name as created_by_name
|
||||
SELECT sp.*, e.firstname || ' ' || e.lastname as created_by_name
|
||||
FROM shift_plans sp
|
||||
LEFT JOIN employees e ON sp.created_by = e.id
|
||||
WHERE sp.id = ?
|
||||
|
||||
Reference in New Issue
Block a user