58 lines
2.9 KiB
TypeScript
58 lines
2.9 KiB
TypeScript
import {
|
|
getAllRows, getRowsWhereIn, insertRow, updateRow,
|
|
getRowsWhereEquals, deleteRowsWhereEquals, deleteRowById,
|
|
} from '../crud'
|
|
import type { FeedbackDimension, FeedbackCategory, FeedbackCriterionItem } from '../../../src/db/types'
|
|
|
|
export interface FeedbackStructure {
|
|
dimensions: FeedbackDimension[]
|
|
categories: FeedbackCategory[]
|
|
items: FeedbackCriterionItem[]
|
|
}
|
|
|
|
const byOrder = <T extends { order: number }>(rows: T[]) => [...rows].sort((a, b) => a.order - b.order)
|
|
|
|
/** Vollständige, nach `order` sortierte Feedback-Taxonomie. */
|
|
export function loadFeedbackStructure(): FeedbackStructure {
|
|
return {
|
|
dimensions: byOrder(getAllRows<FeedbackDimension>('feedbackDimensions')),
|
|
categories: byOrder(getAllRows<FeedbackCategory>('feedbackCategories')),
|
|
items: byOrder(getAllRows<FeedbackCriterionItem>('feedbackCriterionItems')),
|
|
}
|
|
}
|
|
|
|
export const listFeedbackCategoriesOrdered = (): FeedbackCategory[] => byOrder(getAllRows<FeedbackCategory>('feedbackCategories'))
|
|
export const listFeedbackCategoriesAll = (): FeedbackCategory[] => getAllRows<FeedbackCategory>('feedbackCategories')
|
|
export const listFeedbackCriterionItemsAll = (): FeedbackCriterionItem[] => getAllRows<FeedbackCriterionItem>('feedbackCriterionItems')
|
|
export const getFeedbackCriterionItemsByIds = (ids: number[]): FeedbackCriterionItem[] =>
|
|
getRowsWhereIn<FeedbackCriterionItem>('feedbackCriterionItems', 'id', ids)
|
|
|
|
export const addFeedbackDimension = (d: Omit<FeedbackDimension, 'id'>): number => insertRow('feedbackDimensions', d)
|
|
export const updateFeedbackDimension = (id: number, patch: Partial<FeedbackDimension>): number =>
|
|
updateRow('feedbackDimensions', id, patch)
|
|
|
|
/** Cascade: Items der Kategorien → Kategorien → Dimension. */
|
|
export function deleteFeedbackDimension(id: number): void {
|
|
const cats = getRowsWhereEquals<FeedbackCategory>('feedbackCategories', 'dimensionId', id)
|
|
for (const cat of cats) {
|
|
deleteRowsWhereEquals('feedbackCriterionItems', 'categoryId', cat.id!)
|
|
}
|
|
deleteRowsWhereEquals('feedbackCategories', 'dimensionId', id)
|
|
deleteRowById('feedbackDimensions', id)
|
|
}
|
|
|
|
export const addFeedbackCategory = (c: Omit<FeedbackCategory, 'id'>): number => insertRow('feedbackCategories', c)
|
|
export const updateFeedbackCategory = (id: number, patch: Partial<FeedbackCategory>): number =>
|
|
updateRow('feedbackCategories', id, patch)
|
|
|
|
/** Cascade: Items der Kategorie → Kategorie. */
|
|
export function deleteFeedbackCategory(id: number): void {
|
|
deleteRowsWhereEquals('feedbackCriterionItems', 'categoryId', id)
|
|
deleteRowById('feedbackCategories', id)
|
|
}
|
|
|
|
export const addFeedbackCriterionItem = (i: Omit<FeedbackCriterionItem, 'id'>): number => insertRow('feedbackCriterionItems', i)
|
|
export const updateFeedbackCriterionItem = (id: number, patch: Partial<FeedbackCriterionItem>): number =>
|
|
updateRow('feedbackCriterionItems', id, patch)
|
|
export const deleteFeedbackCriterionItem = (id: number): void => deleteRowById('feedbackCriterionItems', id)
|