{"id":26214940,"url":"https://github.com/kamil20020/books","last_synced_at":"2026-04-10T03:56:45.073Z","repository":{"id":280508851,"uuid":"940271628","full_name":"kamil20020/Books","owner":"kamil20020","description":"It is the simple books and their related data management with user's normal and admin accounts. Data management is divided into few parts: users, roles, authors, books, publishers.  Unlogged users can view data about authors, books and publishers. Logged user can additionally manage data from unlogged user. Admin can view and manage roles and users","archived":false,"fork":false,"pushed_at":"2025-04-10T20:22:17.000Z","size":1973,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T20:42:35.625Z","etag":null,"topics":["docker","docker-compose","github-actions","hibernate","java","kubernetes","lombok","mapstruct","mockito","postgresql","reactjs","rest-assured","spring","spring-boot","spring-data-jpa","spring-security","spring-web","sql","testcontainers","typescript"],"latest_commit_sha":null,"homepage":"","language":"Java","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/kamil20020.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,"zenodo":null}},"created_at":"2025-02-27T22:27:28.000Z","updated_at":"2025-04-10T20:03:47.000Z","dependencies_parsed_at":"2025-03-03T20:36:02.757Z","dependency_job_id":"a86ab661-16af-4bf5-97e5-ea7e545f768d","html_url":"https://github.com/kamil20020/Books","commit_stats":null,"previous_names":["kamil20020/books"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kamil20020/Books","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamil20020%2FBooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamil20020%2FBooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamil20020%2FBooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamil20020%2FBooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kamil20020","download_url":"https://codeload.github.com/kamil20020/Books/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamil20020%2FBooks/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268657993,"owners_count":24285610,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-04T02:00:09.867Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["docker","docker-compose","github-actions","hibernate","java","kubernetes","lombok","mapstruct","mockito","postgresql","reactjs","rest-assured","spring","spring-boot","spring-data-jpa","spring-security","spring-web","sql","testcontainers","typescript"],"created_at":"2025-03-12T10:19:08.888Z","updated_at":"2025-12-30T19:04:17.690Z","avatar_url":"https://github.com/kamil20020.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Books\nBasic crud web app to manage basic data related to books (very simplified). The user will manage users, roles, books, authors, publishers and relations between them.\n\nParts of the system e.g. frontend and backnd are independently developed on individual branches. The main branch has all the code from the project.\n\n## Running app\nI propose to run this app by using command `docker-compose up` in the directory with the docker-compose.yml file. To use this command you need to have Docker (e.g. Docker Desktop on Windows) installed on your\ncomputer and Docker Compose will be installed with it.\n\nFrontend will be available on the http://localhost:80.\n\nBackend will be available on the http://localhost:9000 and you can access swagger (api doc and you can try to send some requests on this page)\nfrom the http://localhost:9000/swagger-ui/index.html. From swagger you can send requests to public endpoints, mainly gets from authors, books and publishers.\nIt is that, because I didn't configure jwt in swagger yet, but it is possible because of extension based nature of swagger.\nI propose to use Postman to have possibility to test all endpoints of the app.\n\nOn the start of the app should be created few accounts. These accounts can be used to quickly test the app main functions.\n\nCreated accounts details:\n| Role      | Admin    | Normal user |\n|-----------|----------|-------------|\n| Username  | admin    | kamil       |\n| Password  | admin123 | nowak       |\n\n\n## Functional requirements\n* Register,\n* Login,\n* Logout,\n* Users:\n  * Search,\n  * Add,\n  * Remove,\n  * View roles,\n  * Grant/revoke roles.\n* Roles:\n  * View,\n  * Add,\n  * Remove.\n* Books:\n  * Search,\n  * Simple and detailed views,\n  * Add,\n  * Edit,\n  * Remove.\n* Authors:\n  * View,\n  * Add,\n  * Remove,\n  * View author's books.\n* Publishers:\n  * View,\n  * Add,\n  * Remove,\n  * View publisher's books,\n  * View publisher's authors.\n\n## Functional requirements for actors:\n* A logged user can view and manage books, authors and publishers,\n* A logged user can additionally add and edit books, add authors and add publishers,\n* An admin can additionally view and manage data about users and roles e.g. creating accounts and assigning roles to users.\n\n## Nonfunctional requirements:\n\n### General:\n* Test backend by unit and integration tests in close to 100% test coverage.\n\n### Auth:\n* Auth and authorization based on JWT - from scratch in Spring Security with both access and refresh tokens,\n* Logout by revoking refresh tokens - revocated refresh tokens are stored in the additional table. I assumed that token is revocated when backend have checked, that the token is expired or when the user log out. Backend checks if there are expired tokens every 24 hours,\n\n### Technologies:\n* Backend:\n  * REST,\n  * Java,\n  * Spring,\n  * Spring Boot,\n  * Spring Data JPA,\n  * Spring Security,\n  * Testcontainers.\n* Frontend:\n  * React,\n  * Redux Toolkit,\n  * Context Api. \n* DevOps:\n  * Docker,\n  * Docker Compose,\n  * Kubernetes,\n  * Helm (I don't know very much about this technology yet)\n  * ArgoCD,\n  * Github Actions.\n* Database - PostgreSQL.\n\n## ERD\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"project/erd.png\"\u003e\n\u003cp\u003e\n\n## API\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"swagger/swagger-1.png\"\u003e\n\u003cp\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"swagger/swagger-2.png\"\u003e\n\u003cp\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"swagger/swagger-3.png\"\u003e\n\u003cp\u003e\n\n## Screenshots\n\n### Page layout\nHeader, content and footer:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/layout/layout.png\"\u003e\n\u003cp\u003e\n\nThe app is responsive to about 500px width:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/layout/responsive.png\"\u003e\n\u003cp\u003e\n\nOpen menu:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/layout/responsive-menu.png\"\u003e\n\u003cp\u003e\n\n### Login:\nLogin:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/login/login.png\"\u003e\n\u003cp\u003e\n\nSuccess login:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/login/login-1.png\"\u003e\n\u003cp\u003e\n\n### Users\nUsers view:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/users/users.png\"\u003e\n\u003cp\u003e\n\nAdd user:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/users/add-user.png\"\u003e\n\u003cp\u003e\n\nAssign role to user:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/users/assign-role.png\"\u003e\n\u003cp\u003e\n\nEdit user:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/users/edit-user.png\"\u003e\n\u003cp\u003e\n\nDelete user:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/users/remove-user.png\"\u003e\n\u003cp\u003e\n\n\n### Roles:\nRoles view:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/roles/roles.png\"\u003e\n\u003cp\u003e\n\nAdd role:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/roles/add-role.png\"\u003e\n\u003cp\u003e\n\n\n### Authors:\nAuthors view:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/authors/authors.png\"\u003e\n\u003cp\u003e\n\nAdd author:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/authors/add-author.png\"\u003e\n\u003cp\u003e\n\nAuthor's books:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/authors/author-books.png\"\u003e\n\u003cp\u003e\n\n\n### Books:\nBooks view:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/books/books.png\"\u003e\n\u003cp\u003e\n\nBook's details:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/books/book-details.png\"\u003e\n\u003cp\u003e\n\nAdd book (1/2):\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/books/add-book.png\"\u003e\n\u003cp\u003e\n\nAdd book (2/2):\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/books/add-book-1.png\"\u003e\n\u003cp\u003e\n\nEdit book:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/books/edit-book.png\"\u003e\n\u003cp\u003e\n\n\n### Publishers:\nPublishers view:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/publishers/publishers.png\"\u003e\n\u003cp\u003e\n\nAdd publisher:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/publishers/add-publisher.png\"\u003e\n\u003cp\u003e\n\nPublisher's authors:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/publishers/publisher-authors.png\"\u003e\n\u003cp\u003e\n\nPublisher's books:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/publishers/publisher-books-view.png\"\u003e\n\u003cp\u003e\n\n\n### General details:\nAlmost all data returned from backend are paged:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/pagination.png\"\u003e\n\u003cp\u003e\n\nOperations create notifications:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/notification.png\"\u003e\n\u003cp\u003e\n\nMost important forms are validated:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/validation.png\"\u003e\n\u003cp\u003e\n\nBefore deletes, there is required confirmation:\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/delete-confirmation.png\"\u003e\n\u003cp\u003e\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamil20020%2Fbooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkamil20020%2Fbooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamil20020%2Fbooks/lists"}