{"id":16764962,"url":"https://github.com/kacperkapusciak/caffavo-be","last_synced_at":"2026-04-24T20:31:15.691Z","repository":{"id":100272409,"uuid":"230158735","full_name":"kacperkapusciak/caffavo-be","owner":"kacperkapusciak","description":null,"archived":false,"fork":false,"pushed_at":"2020-01-20T01:55:16.000Z","size":2288,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-28T16:49:53.863Z","etag":null,"topics":["express","javascript","sql"],"latest_commit_sha":null,"homepage":"https://kacperkapusciak.github.io/caffavo-fe/","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kacperkapusciak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-25T22:09:16.000Z","updated_at":"2025-02-23T13:13:24.000Z","dependencies_parsed_at":"2023-05-13T09:00:33.738Z","dependency_job_id":null,"html_url":"https://github.com/kacperkapusciak/caffavo-be","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kacperkapusciak/caffavo-be","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kacperkapusciak%2Fcaffavo-be","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kacperkapusciak%2Fcaffavo-be/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kacperkapusciak%2Fcaffavo-be/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kacperkapusciak%2Fcaffavo-be/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kacperkapusciak","download_url":"https://codeload.github.com/kacperkapusciak/caffavo-be/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kacperkapusciak%2Fcaffavo-be/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32239458,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","javascript","sql"],"created_at":"2024-10-13T05:27:52.809Z","updated_at":"2026-04-24T20:31:15.678Z","avatar_url":"https://github.com/kacperkapusciak.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Caffavo\nFirma poświęcona parzeniu i dostarczaniu kawy.\n\n[https://kacperkapusciak.github.io/caffavo-fe/](https://kacperkapusciak.github.io/caffavo-fe/)\n\nPrzykładowe konto użytkownika:\n```\nLogin: user-2@caffavo.com\nHasło: 1234567890\n```\nPrzykładowe konto administratora:\n```$xslt\nLogin: admin@caffavo.com\nHasło: password\n```\n\n## Założenia projektowe:\n### Ogólnie dla systemu:\n- [x] Każdy rodzaj kawy ma swój przepis.\n- [ ] Po przygotowaniu kawy jest zużywana odpowiednia ilość składników.\n\n#### System umozliwia zarządzanie:\n- [x] ilością składników dostępnych w magazynie (kilogramy kawy, cukru, litry mleka, syropów etc.)\n- [x] zamówieniami, użytkownikami, przepisami, rodzajami kawy oraz składnikami\n- [x] Kalkulować koszt danego zamówienia:\nkoszt zamówenia = ilość kaw * (cena składników + marża) + ilość produktów * (cena + marża) + koszt dostawy. 'Produktem' jest np. sernik, szarlotka, ciastko itp.\n- [x] Blokować możliwość zamawiania kaw na które nie ma składników\n- [x] Na bieżąco kalkulować ilość kaw które mogą zostać zaparzone z danych składników oraz informować administratora o brakach.\n\n#### Jako użytkownik mogę:\n- [x] zarejestrować się na stronie\n- [x] edytować swoje dane, również adresowe (imię, nazwisko, telefon, email, haslo, adres zamieszkania\n- [x] przeglądać menu dostępnych kaw oraz produktów wraz z ich cenami\n- [x] złożyć zamówienie na kawy/produkty przeze mnie wybrane, poznać koszt zamówienia i status jego realizacji w każdym z jego etapów (przyjęte do realizacji, w trakcie, anulowane, zrealizowane) \n- [x] anulować zamówienie (do 5 minut po złożeniu zamówienia)\n- [ ] wyrazic swoje zadowolenie w postaci opinii do zrealizowanego zamówienia\n- [x] mieć podgląd na moje zamówienia, również przeszłe\n- [x] poznac moją ulubioną kawę - najczesciej przeze mnie zamawianą\n\n#### Jako administator mogę:\n- [ ] dodawać nowe rodzaje składników, przepisów, produktów i rodzajów kawy\n- [x] uzupełniać braki w magazynach tj. kupować składniki, produkty\n- [x] zarządzać finansami - bilans konta, pieniądze z zamówień, koszta składników, koszta dostawy, nadawanie marży na produkty oraz kawy\n- [x] zarządzać zamówieniami, znać ich stan, ilość, edytować, tworzyć, usuwać\n- [x] znać najpopularniejsze kawy zamawiane przez klientów\n- [ ] mieć możliwość poznania opinii klientów i umieszczania na stronie głównej\n\nZaznaczone pola oznajmiają, które założenia udało się zrealizować.\n\n## Diagramy\n### Diagram Przepływu Danych\nDiagram można znaleźć pod: [diagrams/DFD.pdf](diagrams/DFD.pdf)\n\n### Diagram ERD\nDiagram znajduje się pod: [diagrams/ERD.pdf](diagrams/ERD.pdf)\n\n## Projekt logiczny\nTabele, typy oraz widoki wraz z komentarzami znajdują się w pliku [sql/init.sql](sql/init.sql).\n\nTriggery można znaleźć w pliku [sql/triggers.sql](sql/triggers.sql).\n\n## Operacje na danych\n\n#### Autoryzacja\n\n##### Logowanie użytkownika: [routes/auth.js#L43](routes/auth.js#L43)\n```sql\nSELECT id, email, admin \nFROM uzytkownik \nWHERE email=${email} AND haslo=${password};\n```\n\n##### Rejestracja/dodawanie użytkowników: \n[routes/users.js#L154](routes/users.js#L154)\n```sql\nINSERT INTO uzytkownik (email, haslo) \nVALUES (${email}, ${password})`);\n```\n[routes/users.js#L158](routes/users.js#L158)\n```sql\nINSERT INTO uzytkownik (email, haslo, imie, nazwisko, telefon) \nVALUES (${email}, ${password}, ${firstName}, ${lastName}, ${phone})`);;\n```\n\n#### Użytkownicy\n\n##### Wyświetlenie wszystkich użytkowników: [routes/users.js#L46](routes/users.js#L46)\n```sql\nSELECT * FROM uzytkownik;\n```\n\n##### Dane o użytkowniku przy podanym id: [routes/users.js#L99](routes/users.js#L99)\n```sql\nSELECT * FROM pelne_dane_uzytkownika\nWHERE id=${req.params.id};\n```\n\n##### Edycja danych użytkownika\n[routes/users.js#L202](routes/users.js#L202)\n```sql\nUPDATE uzytkownik\nSET imie=${firstName}, nazwisko=${lastName}, telefon=${phone}\nWHERE id=${req.params.id}\nRETURNING adres_id;\n```\n\n[routes/users.js#L210](routes/users.js#L210)\n```sql\nUPDATE adres\nSET ulica=${street}, nr_budynku=${building},\nnr_lokalu=${apartment}, kod_pocztowy=${postal},\nmiasto=${city}\nWHERE id=${rows[0].adres_id};\n```\n\n[routes/users.js#L218](routes/users.js#L218)\n```sql\nINSERT INTO adres (ulica, nr_budynku, nr_lokalu, kod_pocztowy, miasto)\nVALUES (${street}, ${building}, ${apartment}, ${postal}, ${city})\nRETURNING id;\n```\n\n[routes/users.js#L224](routes/users.js#L224)\n```sql\nUPDATE uzytkownik\nSET adres_id=${id}\nWHERE id=${req.params.id};\n```\n\n##### Usunięcie użytkownika: [routes/users.js#L241](routes/users.js#L241)\n```sql\nDELETE FROM uzytkownik\nWHERE id=${req.params.id};\n```\n\n#### Składniki\n\n##### Wypisanie wszystkich składników: [routes/ingredients.js#L41](routes/ingredients.js#L41)\n```sql\nSELECT * FROM skladniki ORDER BY jednostka ASC, ilosc DESC;\n```\n\n##### Dodawanie składnika: [routes/ingredients.js#L84](routes/ingredients.js#L84)\n```sql\nINSERT INTO skladniki (nazwa, ilosc, jednostka, cena)\nVALUES (${name}, ${amount}, ${unit}, ${price})`);\n```\n\n##### Edycja składnika: [routes/ingredients.js#L122](routes/ingredients.js#L122)\n```sql\nUPDATE skladniki\nSET nazwa=${name}, ilosc=${amount}, jednostka=${unit}, cena=${price}\nWHERE id=${req.params.id}`);\n```\n\n##### Usunięcie składnika: [routes/ingredients.js#L141](routes/ingredients.js#L141)\n```sql\nDELETE FROM skladniki\nWHERE id=${req.params.id}`);\n```\n\n#### Wyroby cukiernicze\n\n##### Wypisanie wyrobów cukierniczych: [routes/bakery.js#L45](routes/bakery.js#L45)\n```sql\nSELECT * FROM wyroby_cukiernicze ORDER BY jednostka ASC, ilosc DESC;\n```\n\n##### Dodawanie wyrobu cukierniczego: [routes/bakery.js#L94](routes/bakery.js#L94)\n```sql\nINSERT INTO wyroby_cukiernicze (nazwa, porcja, ilosc, jednostka, cena, marza)\nVALUES (${name}, ${portion}, ${amount}, ${unit}, ${price}, ${priceMargin});\n```\n\n##### Edycja wyrobu cukierniczego: [routes/bakery.js#L137](routes/bakery.js#L137)\n```sql\nUPDATE wyroby_cukiernicze\nSET\n    nazwa=${name}, \n    porcja=${portion}, \n    ilosc=${amount}, \n    jednostka=${unit}, \n    cena=${price}, \n    marza=${priceMargin}\nWHERE id=${req.params.id};\n```\n\n##### Usunięcie wyrobu cukierniczego: [routes/bakery.js#L163](routes/bakery.js#L163)\n```sql\nDELETE FROM wyroby_cukiernicze\nWHERE id=${req.params.id}`);\n```\n\n#### Zamówienia\n\n##### Wyświetlenie wszystkich zamówień: [routes/orders.js#L49](routes/bakery.js#L49)\n```sql\nSELECT z.id, uzytkownik_id, email, z.adres_id, status, data_zlozenia,\ndata_realizacji, koszt, koszt_dostawy, oplacone, opinie_id\nFROM zamowienia z\nJOIN uzytkownik u\nON z.uzytkownik_id = u.id\nORDER BY data_zlozenia DESC;\n```\n\n##### Wyświetla zamówienia użytkownika o podanym id: [routes/orders.js#112](routes/orders.js#112)\n```sql\nSELECT id, status, data_zlozenia, data_realizacji,\nkoszt, koszt_dostawy, oplacone, opinie_id FROM zamowienia\nWHERE uzytkownik_id=${req.params.id}\nORDER BY data_zlozenia DESC;\n```\n\n##### Wyświetla pełne dane o zamówieniu:\n[routes/orders.js#208](routes/orders.js#208)\n```sql\nSELECT * FROM zamowienia\nWHERE id=${req.params.id};\n```\n[routes/orders.js#214](routes/orders.js#214)\n```sql\nSELECT * FROM zamowione_produkty\nWHERE zamowienie_id=${req.params.id}\n```\n[routes/orders.js#221](routes/orders.js#221)\n```sql\nSELECT * FROM pelne_dane_uzytkownika\nWHERE id=${userId};\n```\n\n##### Dodawanie nowego zamówienia: \n[routes/orders.js#313](routes/orders.js#313)\n```sql\nSELECT ${obj.amount} * cena as price\nFROM oferta_kaw\nWHERE rodzaj_kawy_id=${obj.coffeeTypeId};\n```\n[routes/orders.js#324](routes/orders.js#324)\n```sql\nSELECT ${obj.amount} * cena as price\nFROM oferta_wyrobow_cukierniczych\nWHERE wyrob_cukierniczy_id=${obj.bakeryId};\n```\n[routes/orders.js#335](routes/orders.js#335)\n```sql\nINSERT INTO zamowienia (uzytkownik_id, koszt) \nVALUES (${userId}, ${totalOrderCost})\nRETURNING id;\n```\n[routes/orders.js#344](routes/orders.js#344)\n```sql\nINSERT INTO zamowiony_produkt (zamowienie_id, ilosc) \nVALUES (${orderId}, ${coffee.amount})\nRETURNING id;\n```\n[routes/orders.js#350](routes/orders.js#350)\n```sql\nINSERT INTO zamowiona_kawa (zamowiony_produkt_id, rodzaj_kawy_id) \nVALUES (${orderedItemId}, ${coffee.coffeeTypeId});\n```\n[routes/orders.js#357](routes/orders.js#357)\n```sql\nINSERT INTO zamowiony_produkt (zamowienie_id, ilosc) \nVALUES (${orderId}, ${bakeryItem.amount})\nRETURNING id;\n```\n[routes/orders.js#363](routes/orders.js#363)\n```sql\nINSERT INTO zamowiony_wyrob_cukierniczy (zamowiony_produkt_id, wyrob_cukierniczy_id) \nVALUES (${orderedItemId}, ${bakeryItem.bakeryId});\n```\n\n##### Opłacenie zamówienia: \n[routes/orders.js#380](routes/orders.js#380)\n```sql\nUPDATE zamowienia\nSET oplacone='true'\nWHERE id=${id}\nRETURNING koszt, koszt_dostawy;\n```\n[routes/orders.js#393](routes/orders.js#393)\n```sql\nINSERT INTO transakcje (wartosc, tytul, zamowienie_id)\nVALUES (${paymentValue}, ${paymentTitle}, ${id});\n```\n##### Anulowanie zamówienia:\n[routes/orders.js#409](routes/orders.js#409)\n```sql\nSELECT data_zlozenia FROM zamowienia\nWHERE id=${id};\n```\n[routes/orders.js#419](routes/orders.js#419)\n```sql\nUPDATE zamowienia\nSET status='anulowane'\nWHERE id=${id}\nRETURNING oplacone, koszt, koszt_dostawy;\n```\n[routes/orders.js#430](routes/orders.js#430)\n```sql\nINSERT INTO transakcje (wartosc, tytul, zamowienie_id)\nVALUES (${-(parseFloat(koszt) + parseFloat(koszt_dostawy))}, ${title}, ${id});\n```\n\n##### Usunięcie zamówienia o podanym id: [routes/orders.js#446](routes/orders.js#446)\n```sql\nDELETE FROM zamowienia\nWHERE id=${req.params.id};\n```\n\n#### Oferta\n##### Wyświetlenie dostępnej oferty:\n[routes/offer.js#39](routes/offer.js#39)\n```sql\nSELECT * FROM oferta_kaw;\n```\n[routes/offer.js#40](routes/offer.js#40)\n```sql\nSELECT * FROM oferta_wyrobow_cukierniczych;\n```\n\n##### Najczęściej zamawiana kawa:\n[routes/offer.js#88](routes/offer.js#88)\n```sql\nSELECT uk.rodzaj_kawy_id, nazwa, cena, SUM(ile_razy_zamowiona) as ile_razy_zamowiona \nFROM ulubiona_kawa uk\nINNER JOIN oferta_kaw ok\nON uk.rodzaj_kawy_id = ok.rodzaj_kawy_id\nGROUP BY uk.rodzaj_kawy_id, nazwa, cena\nORDER BY ile_razy_zamowiona DESC\nLIMIT 1;\n```\n\n#### Finanse\n##### Wyświetlenie wszystkich transakcji: [routes/finance.js#39](routes/finance.js#39)\n```sql\nSELECT * FROM transakcje ORDER BY wykonana_o DESC;\n```\n##### Wyświetlenie wszystkich transakcji użytkownika o podanym id: [routes/finance.js#84](routes/finance.js#84)\n```sql\nSELECT\n  t.id, t.wykonana_o, t.wartosc, t.tytul, t.zamowienie_id\nFROM transakcje t\nINNER JOIN zamowienia z\nON t.zamowienie_id = z.id\nWHERE z.uzytkownik_id=${req.params.id};\n```\n##### Informacje o stanie konta bankowego: [routes/finance.js#126](routes/finance.js#126)\n```sql\nSELECT * FROM konto_bankowe;\n```\n\n#### Kawy\n##### Wyświetlenie kaw wraz z przepisami:\n[routes/coffee.js#59](routes/coffee.js#59)\n```sql\nSELECT * FROM rodzaje_kawy;\n```\n[routes/coffee.js#72](routes/coffee.js#72)\n```sql\nSELECT rodzaj_kawy_id, skladnik_id, p.ilosc, nazwa, jednostka\nFROM przepisy p\nJOIN skladniki s\nON p.skladnik_id = s.id;\n```\n##### Dodawanie kawy wraz z przepisem:\n[routes/coffee.js#135](routes/coffee.js#135)\n```sql\nINSERT INTO rodzaje_kawy (nazwa, marza)\nVALUES (${name}, ${priceMargin})\nRETURNING id;\n```\n[routes/coffee.js#143](routes/coffee.js#143)\n```sql\nINSERT INTO przepisy (rodzaj_kawy_id, skladnik_id, ilosc)\nVALUES (${coffeeId}, ${item.id}, ${item.amount});\n```\n\n##### Usunięcie kawy: \n[routes/coffee.js#163](routes/coffee.js#163)\n```sql\nDELETE FROM przepisy\nWHERE rodzaj_kawy_id=${id};\n```\n[routes/coffee.js#168](routes/coffee.js#168)\n```sql\nDELETE FROM rodzaje_kawy\nWHERE id=${id};\n```\n\n## Interfejs graficzny\n#### Ekran logowania\n![](screenshots/login_screen.png)\n#### Ekran rejestracji\n![](screenshots/register_screen.png)\n#### Oferta\n![](screenshots/offer_screen.png)\n#### Szczegóły konta\n![](screenshots/account_screen.png)\n#### Ekran zamówień\n![](screenshots/orders_screen.png)\n#### Potwierdzenie zamówienia\n![](screenshots/confirmation_screen.png)\n#### Finanse\n![](screenshots/finance_screen.png)\n#### Składniki\n![](screenshots/ingredients_screen.png)\n#### Wyroby cukiernicze\n![](screenshots/bakery_screen.png)\n#### Przepisy\n![](screenshots/recipes_screen.png)\n\n## Wprowadzanie danych\nInicjalizacja danych w bazie odbywa się poprzez import pliku [sql/populate.sql](sql/populate.sql). \nNastępnie dane mogą być wprowadzane ręcznie przy pomocy formularzy. Niektóre dane takie jak\ncena kawy, status kawy, składnika, wyrobu cukierniczego bądź zamówienia aktualizowane są automatycznie poprzez triggery.\n\n## Dokumentacja kodu\nZnajduje się w kodzie.\n\n## Wykaz literatury\n* [https://node-postgres.com/](https://node-postgres.com/)\n* [https://www.taniarascia.com/node-express-postgresql-heroku/](https://www.taniarascia.com/node-express-postgresql-heroku/)\n* [https://www.postgresql.org/docs/12/index.html](https://www.postgresql.org/docs/12/index.html)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkacperkapusciak%2Fcaffavo-be","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkacperkapusciak%2Fcaffavo-be","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkacperkapusciak%2Fcaffavo-be/lists"}