{"id":21879566,"url":"https://github.com/nerooc/company-api","last_synced_at":"2026-05-18T01:06:18.331Z","repository":{"id":124516967,"uuid":"354833594","full_name":"nerooc/company-api","owner":"nerooc","description":"Company API, using C# and SQL Server hierarchyid","archived":false,"fork":false,"pushed_at":"2021-05-29T12:04:10.000Z","size":373,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-22T00:17:10.539Z","etag":null,"topics":["csharp","hierarchyid","tsql"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"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/nerooc.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":"2021-04-05T12:52:54.000Z","updated_at":"2021-06-18T14:31:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"f43d554f-17eb-4013-b34c-d7ed5e6c15a4","html_url":"https://github.com/nerooc/company-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nerooc/company-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fcompany-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fcompany-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fcompany-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fcompany-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nerooc","download_url":"https://codeload.github.com/nerooc/company-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fcompany-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33161411,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"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":["csharp","hierarchyid","tsql"],"created_at":"2024-11-28T08:17:25.177Z","updated_at":"2026-05-18T01:06:18.315Z","avatar_url":"https://github.com/nerooc.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr/\u003e\n\n\n\u003cimg src=\"https://github.com/nerooc/company-api/blob/main/docs/cmAPI-logo.png\" height=\"60\" width=\"240\" /\u003e\n\n\u003cbr/\u003e\n\n### Company Management API (w oparciu o HierarchyID)\n# Przetwarzanie danych hierarchicznych\n\n\n\n- [1. Założenia projektu](#1-założenia-projektu)\n- [2. Krótki wstęp teoretyczny](#2-krótki-wstęp-teoretyczny)\n- [3. Zakres funkcjonalności](#3-zakres-funkcjonalności)\n- [4. Opis implementacji](#4-opis-implementacji)\n- [5. Przykładowe dane](#5-przykładowe-dane)\n- [6. Prezentacja testów jednostkowych](#6-prezentacja-testów-jednostkowych)\n- [7. Podsumowanie](#7-podsumowanie)\n- [8. Literatura](#8-literatura)\n- [9. Kod źródłowy](#9-kod-źródłowy)\n\n## 1. Założenia projektu\n\nCelem **CMAPI** (Company Management API) jest umożliwienie obsługi struktury firmy będącej strukturą **hierarchiczną**. Elementami w hierarchii będą pracownicy wraz z ich danymi personalnymi. Głównym założeniem projektu jest wykorzystanie typu **HierarchyID** do przechowywania wspomnianych danych hierarchicznych.\n\n### Stos technologiczny:\n\n- C#\n- Microsoft SQL Server\n- Typ HierarchyID\n- Visual Studio Testing Tools\n\nCMAPI jest biblioteką udostępniającą zestaw dwóch klas głównych (Employee i Company), z których jedna jest placeholderem do przechowywania danych o pracowniku, a druga daje dostęp do grupy metod działających na tych danych.\n\n## 2. Krótki wstęp teoretyczny\n\nDo stworzenia API wykorzystałem typ **HierarchyID** - używamy go, aby przedstawić pozycję w hierarchii. Kolumna typu hierarchyid nie reprezentuje automatycznie drzewa. Do aplikacji należy generowanie i przypisywanie wartości hierarchyid w taki sposób, aby pożądana relacja między wierszami była odzwierciedlona w wartościach.\n\n## 3. Zakres funkcjonalności\n\nPoprzez zestaw metod API pozwala użytkownikowi na dodawanie/usuwanie **pracowników** oraz tworzenie wybranych raportów.\n\nOprócz samego **API**, w projekcie uwzględniłem również testy jednostkowe, skrypty służące do utworzenia przykładowej bazy oraz aplikację konsolowa, służącą do przedstawienia przykładu działania stworzonego **API**.\n\n## 3.1 Tabela Employee\n\nPrzechowuje dane na temat pracowników\n\n![alt text](https://github.com/nerooc/company-api/blob/main/docs/employee_table.png)\n\n## 3.2 Metody klasy Company\n\nUdostępniają manipulację danymi pracowników\n\n### Dodawanie pracownika - AddEmployee()\n\n**Parametry**\n\n- id \\\u003c\u003cint\\\u003e\u003e\n- level \\\u003c\u003cstring\\\u003e\u003e\n- firstName \\\u003c\u003cstring\\\u003e\u003e\n- lastName \\\u003c\u003cstring\\\u003e\u003e\n- position \\\u003c\u003cstring\\\u003e\u003e\n- salary \\\u003c\u003cint\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Usuwanie pracownika po id - RemoveEmployeeById()\n\n**Parametry**\n\n- id \\\u003c\u003cint\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Usuwanie pracownika po imieniu - RemoveEmployeeByFirstName()\n\n**Parametry**\n\n- firstName \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Usuwanie pracownika po nazwisku - RemoveEmployeeByLastName()\n\n**Parametry**\n\n- lastName \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Usuwanie pracownika po hierarchii - RemoveEmployeeByLevel()\n\n**Parametry**\n\n- level \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Usuwanie wszystkich pracowników - RemoveAllEmployees()\n\n**Parametry**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n### Zwróć pracownika po id - GetEmployeeById()\n\n**Parametry**\n\n- id \\\u003c\u003cint\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cEmployee\\\u003e\u003e\n\n### Zwróć pracownika ze specyficznym HierarchyID - GetEmployeeByLevel()\n\n**Parametry**\n\n- level \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cEmployee\\\u003e\u003e\n\n### Zwróć pracownika po imieniu - GetEmployeeByFirstName()\n\n**Parametry**\n\n- firstName \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cEmployee\\\u003e\u003e\n\n### Zwróć pracownika po nazwisku - GetEmployeeByLastName()\n\n**Parametry**\n\n- lastName \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cEmployee\\\u003e\u003e\n\n### Zwróć pracownika ze specyficznym HierarchyID wraz z jego podwładnymi - GetEmployeeWithSubordinates()\n\n**Parametry**\n\n- level \\\u003c\u003cstring\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cList\u003cEmployee\\\u003e\u003e\u003e\n\n### Zwróć wszystkich pracowników - GetAllEmployees()\n\n**Parametry**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n**Typ zwracany**\n\n- \\\u003c\u003cList\u003cEmployee\\\u003e\u003e\u003e\n\n### Zwróć najwyższe wynagrodzenie - GetMaxSalary()\n\n**Parametry**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n**Typ zwracany**\n\n- salary \\\u003c\u003cint\\\u003e\u003e\n\n### Zwróć średnie wynagrodzenie - GetAverageSalary()\n\n**Parametry**\n\n- \\\u003c\u003cvoid\\\u003e\u003e\n\n**Typ zwracany**\n\n- salary \\\u003c\u003cint\\\u003e\u003e\n\n## 4. Opis implementacji\n\n**CMAPI** udostępnia procedury wykonujące operacje na rekordach tabeli pracowników (Employee) w bazie danych. Do zaimplementowania wykorzystałem klasy w języku **C#**, które wykonują **zapytania SQL** do bazy danych, które uruchamiają żądane **procedury**. W procedurach wykonywane są instrukcje SQL, które korzystają m. in. z typu **hierarchyid**.\n\nWszystkie funkcje są dostępne z poziomu interaktywnej konsolowej aplikacji **(demo)**, przyjmującej input od użytkownika, który decyduje co chce zrobić. Jest to przykład implementacji API w działającej aplikacji - funkcje można wdrożyć również do istniejącego wcześniej systemu.\n\n![console_app](https://github.com/nerooc/company-api/blob/main/docs/console_app1.png)\n\n## 5. Przykładowe dane\n\nW ramach aplikacji demonstrującej działanie **CMAPI**, możemy do bazy dodać gotowe przykładowe dane - są to testowe dane firmy, która korzysta z **hierarchicznej** struktury danych. **Zbieżność imion i nazwisk jest przypadkowa.**\n\n![example_data](https://github.com/nerooc/company-api/blob/main/docs/test_data_tree.png)\n\n## 6. Prezentacja testów jednostkowych\n\nDo testowania **CMAPI** wykorzystałem narzędzia do testowania udostępnione przez **Visual Studio**. W projekcie testowym, na przykładowych danych przetestowane zostały wszystkie metody wykorzystane w API, poniżej przedstawiam wyniki przeprowadzonych testów.\n\n![unit_tests](https://github.com/nerooc/company-api/blob/main/docs/api_testing_results.png)\n\n## 7. Podsumowanie\n\nTyp **hierarchyid** zdaje się być bardzo dobrą opcją do przetwarzania danych hierarchicznych - jest szybki i łatwy w użyciu. Oprócz tego, udostępnia również wiele pomocnicznych funkcji (takich jak IsDescendantOf), które są bardzo przydatne, a musiałyby być dodatkowo zaimplementowane w przypadku własnoręcznego rozwiązania problemów tego typu.\n\nZ drugiej strony, wsparcie C# dla hierarchyid nie jest pełne - przykładem może być konieczność ciągłego parsowania typu danych z **SqlHierarchyId** do **string,** by mogły one zostać przetworzone przez bazę danych. Słyszałem również że wydajność **hierarchyid** w bazach większego kalibru potrafi być nieakceptowalna - jednak w przypadku małych baz, może nadać się idealnie.\n\n## 8. Literatura\n\nDo stworzenia projektu wykorzystałem głównie **oficjalną dokumentację Microsoftu**, oraz pomniejsze strony służące jako poradniki do obsługi typu **hierarchyid**:\n\n- https://codingsight.com/how-to-use-sql-server-hierarchyid-through-easy-examples/\n- https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference?view=sql-server-ver15\n- https://docs.microsoft.com/en-us/dotnet/csharp/\n- https://docs.microsoft.com/en-us/sql/relational-databases/tables/tutorial-using-the-hierarchyid-data-type?view=sql-server-ver15\n- https://www.sqlshack.com/use-hierarchyid-sql-server/\n\n## 9. Kod źródłowy\n\nKod źródłowy wszystkich skryptów T-SQL wykorzystanych w projekcie znajduje się w folderze o nazwie “**dbsetup**”. Znajdują się tam skrypty dotyczące **tworzenia bazy, tabeli Employee, dodawania i usuwania potrzebnych procedur** oraz pomniejszych skryptów służących do testowania aktualnego stanu bazy danych.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnerooc%2Fcompany-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnerooc%2Fcompany-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnerooc%2Fcompany-api/lists"}