{"id":15785959,"url":"https://github.com/mrin9/northwind_spring","last_synced_at":"2025-03-14T11:31:29.287Z","repository":{"id":97810493,"uuid":"85750473","full_name":"mrin9/northwind_spring","owner":"mrin9","description":"Springboot RESTfull api exposing Northwind DB ","archived":false,"fork":false,"pushed_at":"2017-03-21T20:35:54.000Z","size":792,"stargazers_count":5,"open_issues_count":0,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-11T21:04:52.096Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/mrin9.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}},"created_at":"2017-03-21T20:33:41.000Z","updated_at":"2023-03-13T10:23:32.000Z","dependencies_parsed_at":"2024-02-01T16:45:16.507Z","dependency_job_id":null,"html_url":"https://github.com/mrin9/northwind_spring","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrin9%2Fnorthwind_spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrin9%2Fnorthwind_spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrin9%2Fnorthwind_spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrin9%2Fnorthwind_spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrin9","download_url":"https://codeload.github.com/mrin9/northwind_spring/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243569550,"owners_count":20312453,"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","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":[],"created_at":"2024-10-04T21:00:24.019Z","updated_at":"2025-03-14T11:31:24.273Z","avatar_url":"https://github.com/mrin9.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"This is a REST implementation of popular Northwind database that deals with Customers, Orders, Products and Employees. It contains a stripped down version of Northwind database with some sample data. The project can serve as a source to understand some of the components of spring such as REST, Secirity, JDBC or can act as a RESTfull backend for an fornend App providing sample data, paginated data, heirarchial data and HTTP errors \n\n### Technology Stack\nComponent         | Technology\n---               | ---\nBackend (REST)    | [SpringBoot](https://projects.spring.io/spring-boot) (Java)\nSecurity          | Token Based (Spring Security and [JWT](https://github.com/auth0/java-jwt) )\nREST Documentation| [Swagger UI / Springfox](https://github.com/springfox/springfox) and [ReDoc](https://github.com/Rebilly/ReDoc)\nREST Spec         | [Open API Standard](https://www.openapis.org/) \nIn Memory DB      | H2 \nPersistence       | JPA (Using Spring Data)\nServer Build Tools| Maven(Java) or Gradle\n\n## Folder Structure\n```bash\nPROJECT_FOLDER\n│  README.md\n│  pom.xml           \n│  build.gradle\n└──[src]      \n│  └──[main]      \n│     └──[java]      \n│     └──[resources]\n│        │  application.properties #contains springboot cofigurations\n│        │  schema.sql  # Contains DB Script to create tables that executes during the App Startup          \n│        │  data.sql    # Contains DB Script to Insert data that executes during the App Startup (after schema.sql)\n│        └──[public]    # keep all html,css etc, resources that needs to be exposed to user without security\n│\n└──[target]              #Java build files, auto-created after running java build: mvn install\n│  └──[classes]\n│     └──[public]\n│     └──[webui]         #webui folder is created by (maven/gradle) which copies webui/dist folder \n│                        #the application.properties file list webui as a resource folder that means files can be accesses http://localhost/\u003cfiles_inside_webui\u003e \n│\n```\n\n## Prerequisites\nEnsure you have this installed before proceeding further\n- Java 8\n- Maven 3.3.9+ or Gradle 3.3+\n\n\n## In Memory DB (H2)\nI have included an in-memory database for the application. Database schema and sample data for the app is created everytime the app starts, and gets destroyed after the app stops, so the changes made to to the database are persistent only as long as the app is running\n\u003cbr/\u003e\nCreation of database schema and data are done using sql scripts that Springs runs automatically. \nTo modify the database schema or the data you can modify [schema.sql](./src/main/resources/schema.sql) and [data.sql](./src/main/resources/data.sql) which can be found at `/src/main/resources`\n\n\n## Spring security\nSecurity is **disabled** by default, to enable, you must uncomment [this line](./src/main/java/com/app/config/SecurityConfig.java#L15) in `src/main/java/com/config/SecurityConfig.java`\u003cbr/\u003e\nOnce security is enabled, none of the REST API will be accessesble directly.\n\nto test security access `http://localhost:9119/version` API and you should get a forbidden/Access denied error. \nIn order to access these secured API you must first obtain a token. Tokens can be obtained by passing a valid userid/password\n\nuserid and password are stored in H2 database. To add/remove users, modify the [data.sql](./src/main/resources/data.sql#L7)\ncouple of valid users and their passwords are `demo\\demo` and `admin\\admin`\n\u003cbr/\u003e\n\nTo get a token call `POST /session` API with a valid userid and password.\nfor example you may you can use the folliwing curl command to get a token \n```\ncurl -X POST --header 'Content-Type: application/json' -d '{ \"username\":\"demo\", \"password\":\"demo\" }' 'http://localhost:9119/session'\n```\nthe above curl command will return you a token, which should be in the format of `xxx.xxx.xxx`. This is a JSON web token format. \nYou can decode and validate this token at [jwt.io wesite](https://jwt.io/). Just paste the token there and decode the information.\nto validate the token you should provide the secret key which is `mrin` that i am using in this app.\n\u003cbr/\u003e\nafter receiving this token you must provide the token in the request-header of every API request. For instance try the `GET /version` api using the below \ncurl command (replace xxx.xxx.xxx with the token that you received in above command) and you should be able to access the API.\n```\ncurl -X GET --header 'Accept: application/json' --header 'Authorization: xxx.xxx.xxx' 'http://localhost:9119/version'\n``` \n\n### Install Backend (SpringBoot Java)\n```bash\n# Gradle Build : Navigate to the root folder where build.gradle is present \ngradle build\n\n#OR\n\n# Maven Build : Navigate to the root folder where pom.xml is present \nmvn clean install\n```\n\n### Start the API and WebUI server\n```bash\n# Start the server (9119)\n# port and other configurations for API servere is in [./src/main/resources/application.properties](/src/main/resources/application.properties) file\n\n# If you build with gradle jar location will be \njava -jar ./build/libs/app-1.0.0.jar\n\n# If you build with maven jar location will be \njava -jar ./target/app-1.0.0.jar\n```\n\n### Accessing Application\nCpmponent         | URL                                      | Credentials\n---               | ---                                      | ---\nH2 Database       |  http://localhost:9119/h2-console        |  Driver:`org.h2.Driver` \u003cbr/\u003e JDBC URL:`jdbc:h2:mem:demo` \u003cbr/\u003e User Name:`sa`\nSwagger (API Ref) |  http://localhost:9119/swagger-ui.html   |\nRedoc (API Ref)   |  http://localhost:9119/redoc/index.html  |\n\n\n**To get an authentication token** \n```bash\ncurl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{\"username\": \"demo\", \"password\": \"demo\" }' 'http://localhost:9119/session'\n```\nor POST the username and password to http://localhost:9119/session\n\n\nafter you get the authentication token you must provide this in the header for all the protected urls \n\n```bash\ncurl -X GET --header 'Accept: application/json' --header 'Authorization: [replace this with token ]' 'http://localhost:9119/version'\n```\n\n### Screenshots\n#### API\n![API](/screenshots/api.png?raw=true)\n---\n####Database ER Diagram\n![ER DIagram](/screenshots/ER_Model.png?raw=true)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrin9%2Fnorthwind_spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrin9%2Fnorthwind_spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrin9%2Fnorthwind_spring/lists"}