diff --git a/src/07-funktionsprogrammierung/KATA/solution.ts b/src/07-funktionsprogrammierung/KATA/solution.ts new file mode 100644 index 0000000..ff3d37f --- /dev/null +++ b/src/07-funktionsprogrammierung/KATA/solution.ts @@ -0,0 +1,101 @@ +// Funktionsprogrammierung in TypeScript - Kata Lösung + +interface Entity { + id: number; +} + +interface User extends Entity { + firstName: string; + age: number; + gender: 'male' | 'female'; + role: 'admin' | 'moderator' | 'user'; +} + +interface Product extends Entity { + title: string; + price: number; +} + +const fetchData = async ( + apiUrl: string, + key: string +): Promise => { + try { + const response = await fetch(apiUrl); + if (!response.ok) throw new Error('Fehler beim Abrufen der Daten'); + const data = await response.json(); + return data[key] || []; + } catch (error) { + console.error('API Fehler:', error); + return []; + } +}; + +class Store { + private dataMap: Record = {}; + + save(data: T[]): void { + this.dataMap = data.reduce((acc, item) => { + acc[item.id] = item; + return acc; + }, {} as Record); + } + + filterBy(predicate: (item: T) => boolean): T[] { + return Object.values(this.dataMap).filter(predicate); + } +} + +const createDataStore = () => { + let dataMap: Record = {}; + + const save = (data: T[]): void => { + dataMap = data.reduce((acc, item) => { + acc[item.id] = item; + return acc; + }, {} as Record); + }; + + const filterBy = (predicate: (item: T) => boolean): T[] => { + return Object.values(dataMap).filter(predicate); + }; + + return { save, filterBy }; +}; + +(async () => { + const usersStore = new Store(); + const productsStore = new Store(); + + // const usersStore = createDataStore(); + // const productsStore = createDataStore(); + + const users = await fetchData('https://dummyjson.com/users', 'users'); + usersStore.save(users); + + const products = await fetchData( + 'https://dummyjson.com/products', + 'products' + ); + productsStore.save(products); + + const mapUser = (user: User) => ({ name: user.firstName, role: user.role }); + + console.log( + 'Administratoren:', + usersStore.filterBy((user) => user.role === 'admin').map(mapUser) + ); + console.log( + 'Moderatoren:', + usersStore.filterBy((user) => user.role === 'moderator').map(mapUser) + ); + console.log( + 'Normale Benutzer:', + usersStore.filterBy((user) => user.role === 'user').map(mapUser) + ); + + // console.log( + // 'Günstige Produkte:', + // productsStore.filterBy((product) => product.price < 50) + // ); +})();