163 lines
4.3 KiB
TypeScript
163 lines
4.3 KiB
TypeScript
import pool from '../config/database';
|
|
import logger from '../utils/logger';
|
|
|
|
async function getIssues(userId: string, canViewAll: boolean) {
|
|
try {
|
|
const query = `
|
|
SELECT i.*,
|
|
u1.name AS erstellt_von_name,
|
|
u2.name AS zugewiesen_an_name
|
|
FROM issues i
|
|
LEFT JOIN users u1 ON u1.id = i.erstellt_von
|
|
LEFT JOIN users u2 ON u2.id = i.zugewiesen_an
|
|
${canViewAll ? '' : 'WHERE i.erstellt_von = $1'}
|
|
ORDER BY i.created_at DESC
|
|
`;
|
|
const result = canViewAll
|
|
? await pool.query(query)
|
|
: await pool.query(query, [userId]);
|
|
return result.rows;
|
|
} catch (error) {
|
|
logger.error('IssueService.getIssues failed', { error });
|
|
throw new Error('Issues konnten nicht geladen werden');
|
|
}
|
|
}
|
|
|
|
async function getIssueById(id: number) {
|
|
try {
|
|
const result = await pool.query(
|
|
`SELECT i.*,
|
|
u1.name AS erstellt_von_name,
|
|
u2.name AS zugewiesen_an_name
|
|
FROM issues i
|
|
LEFT JOIN users u1 ON u1.id = i.erstellt_von
|
|
LEFT JOIN users u2 ON u2.id = i.zugewiesen_an
|
|
WHERE i.id = $1`,
|
|
[id]
|
|
);
|
|
return result.rows[0] || null;
|
|
} catch (error) {
|
|
logger.error('IssueService.getIssueById failed', { error, id });
|
|
throw new Error('Issue konnte nicht geladen werden');
|
|
}
|
|
}
|
|
|
|
async function createIssue(
|
|
data: { titel: string; beschreibung?: string; typ?: string; prioritaet?: string },
|
|
userId: string
|
|
) {
|
|
try {
|
|
const result = await pool.query(
|
|
`INSERT INTO issues (titel, beschreibung, typ, prioritaet, erstellt_von)
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
RETURNING *`,
|
|
[
|
|
data.titel,
|
|
data.beschreibung || null,
|
|
data.typ || 'sonstiges',
|
|
data.prioritaet || 'mittel',
|
|
userId,
|
|
]
|
|
);
|
|
return result.rows[0];
|
|
} catch (error) {
|
|
logger.error('IssueService.createIssue failed', { error });
|
|
throw new Error('Issue konnte nicht erstellt werden');
|
|
}
|
|
}
|
|
|
|
async function updateIssue(
|
|
id: number,
|
|
data: {
|
|
titel?: string;
|
|
beschreibung?: string;
|
|
typ?: string;
|
|
prioritaet?: string;
|
|
status?: string;
|
|
zugewiesen_an?: string | null;
|
|
}
|
|
) {
|
|
try {
|
|
const result = await pool.query(
|
|
`UPDATE issues
|
|
SET titel = COALESCE($1, titel),
|
|
beschreibung = COALESCE($2, beschreibung),
|
|
typ = COALESCE($3, typ),
|
|
prioritaet = COALESCE($4, prioritaet),
|
|
status = COALESCE($5, status),
|
|
zugewiesen_an = COALESCE($6, zugewiesen_an),
|
|
updated_at = NOW()
|
|
WHERE id = $7
|
|
RETURNING *`,
|
|
[
|
|
data.titel,
|
|
data.beschreibung,
|
|
data.typ,
|
|
data.prioritaet,
|
|
data.status,
|
|
data.zugewiesen_an,
|
|
id,
|
|
]
|
|
);
|
|
return result.rows[0] || null;
|
|
} catch (error) {
|
|
logger.error('IssueService.updateIssue failed', { error, id });
|
|
throw new Error('Issue konnte nicht aktualisiert werden');
|
|
}
|
|
}
|
|
|
|
async function deleteIssue(id: number) {
|
|
try {
|
|
const result = await pool.query(
|
|
`DELETE FROM issues WHERE id = $1 RETURNING id`,
|
|
[id]
|
|
);
|
|
return result.rows.length > 0;
|
|
} catch (error) {
|
|
logger.error('IssueService.deleteIssue failed', { error, id });
|
|
throw new Error('Issue konnte nicht gelöscht werden');
|
|
}
|
|
}
|
|
|
|
async function getComments(issueId: number) {
|
|
try {
|
|
const result = await pool.query(
|
|
`SELECT c.*, u.name AS autor_name
|
|
FROM issue_kommentare c
|
|
LEFT JOIN users u ON u.id = c.autor_id
|
|
WHERE c.issue_id = $1
|
|
ORDER BY c.created_at ASC`,
|
|
[issueId]
|
|
);
|
|
return result.rows;
|
|
} catch (error) {
|
|
logger.error('IssueService.getComments failed', { error, issueId });
|
|
throw new Error('Kommentare konnten nicht geladen werden');
|
|
}
|
|
}
|
|
|
|
async function addComment(issueId: number, autorId: string, inhalt: string) {
|
|
try {
|
|
const result = await pool.query(
|
|
`INSERT INTO issue_kommentare (issue_id, autor_id, inhalt)
|
|
VALUES ($1, $2, $3)
|
|
RETURNING *`,
|
|
[issueId, autorId, inhalt]
|
|
);
|
|
return result.rows[0];
|
|
} catch (error) {
|
|
logger.error('IssueService.addComment failed', { error, issueId });
|
|
throw new Error('Kommentar konnte nicht erstellt werden');
|
|
}
|
|
}
|
|
|
|
export default {
|
|
getIssues,
|
|
getIssueById,
|
|
createIssue,
|
|
updateIssue,
|
|
deleteIssue,
|
|
getComments,
|
|
addComment,
|
|
};
|