{"id":20235653,"url":"https://github.com/mhaidarhanif/median-api","last_synced_at":"2026-05-10T18:13:45.541Z","repository":{"id":262774116,"uuid":"649361928","full_name":"mhaidarhanif/median-api","owner":"mhaidarhanif","description":"Median API","archived":false,"fork":false,"pushed_at":"2023-06-05T00:47:55.000Z","size":515,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-14T00:45:13.236Z","etag":null,"topics":["api","backend","median","nestjs","prisma","swagger"],"latest_commit_sha":null,"homepage":"https://my-backend-infra.mhaidarhanif.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mhaidarhanif.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2023-06-04T15:59:55.000Z","updated_at":"2023-06-04T16:00:54.000Z","dependencies_parsed_at":"2024-11-14T08:18:00.867Z","dependency_job_id":"092f285a-9cdf-464c-b4c3-47cb101f8c69","html_url":"https://github.com/mhaidarhanif/median-api","commit_stats":null,"previous_names":["mhaidarhanif/median-api"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhaidarhanif%2Fmedian-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhaidarhanif%2Fmedian-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhaidarhanif%2Fmedian-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhaidarhanif%2Fmedian-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mhaidarhanif","download_url":"https://codeload.github.com/mhaidarhanif/median-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241678349,"owners_count":20001744,"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":["api","backend","median","nestjs","prisma","swagger"],"created_at":"2024-11-14T08:17:10.315Z","updated_at":"2026-05-10T18:13:45.500Z","avatar_url":"https://github.com/mhaidarhanif.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://nestjs.com\" target=\"blank\"\u003e\u003cimg src=\"https://nestjs.com/img/logo-small.svg\" width=\"200\" alt=\"NestJS Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eNestJS is a progressive \u003ca href=\"http://nodejs.org\" target=\"_blank\"\u003eNode.js\u003c/a\u003e framework for building efficient and scalable server-side applications.\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://npmjs.com/~nestjscore\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@nestjs/core.svg\" alt=\"NPM Version\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# My Backend Infra\n\nSimple REST API made with [NestJS](https://github.com/nestjs/nest) and Containerized with Docker.\n\n- Live: \u003chttps://my-backend-infra.mhaidarhanif.com\u003e\n- Images:\n  - \u003chttps://hub.docker.com/r/mhaidarh/my-backend-infra\u003e\n  - \u003chttps://asia-southeast2-docker.pkg.dev/manifest-glyph-385502/docker/my-backend-infra\u003e\n- Repo: \u003chttps://github.com/revou-fsse/my-backend-infra\u003e\n- Status: \u003chttps://my-status.mhaidarhanif.com\u003e\n\n## API Documentation\n\nBase API URLs:\n\n- \u003chttp://localhost:4000/api\u003e\n- \u003chttps://my-backend-infra.mhaidarhanif.com/api\u003e\n\nEndpoints:\n\n| HTTP     | Endpoint     | Description |\n|:-------- |:------------ |:----------- |\n| `GET`     | `/`              | Show welcome |\n| `POST`    | `/auth/register` | Register new user |\n| `POST`    | `/auth/login`    | Login to user |\n| `GET`     | `/articles`      | Get all articles |\n| `GET`     | `/articles/drafts` | Get all draft articles |\n| `GET`     | `/articles/:id`  | Get one article by id |\n| `POST`    | `/articles`      | Create new article |\n| `PUT`     | `/articles/:id`  | Update one article by id |\n| `PATCH`   | `/articles/:id`  | Update one article by id |\n| `DELETE`  | `/articles`      | Delete all articles |\n| `DELETE`  | `/articles/:id`  | Delete one article by id |\n\n## Architecture Diagram\n\n![diagram](assets/architecture-diagram.png)\n\n## Prepare Database\n\nMake sure the database is ready before doing any dependency installation.\n\nEdit `.env` file for the app:\n\n```sh\nDATABASE_URL=\"postgres://myuser:mypassword@localhost:5432/db\"\nJWT_SECRET=\"abdefghijklmnopqrstuvwxyzabcdefghi\"\nUNSPLASH_ACCESS_KEY=\"abdefghijklmnopqrstuvwxyzabcdefghi\"\n```\n\n- `DATABASE_URL`, can be retreived from your choice:\n  - Local database instance\n  - Local database container, explained below to run it\n- `JWT_SECRET`, recommended to generate with `scripts/random.sh`\n- `UNSPLASH_ACCESS_KEY`, get it from Unsplash Developer app portal\n\nRun Docker on your machine and run Docker Compose that specifically only run the database instance in the background:\n\n```sh\n$ docker compose -f docker-compose.dev.yaml up -d\n```\n\n## Install Dependencies\n\nInstall local dependencies:\n\n```sh\n$ pnpm i\n```\n\nInstall global dependencies:\n\n```sh\n$ pnpm i -g @nestjs/cli\n$ pnpm i -g prettier\n$ pnpm i -g eslint\n```\n\nCheck available scripts/commands:\n\n```sh\n$ pnpm run\n```\n\n## Run for Development\n\nPush schema to the database or generate Prisma schema while in development:\n\n```sh\n$ pnpm prisma:push      # prisma db push\n$ pnpm prisma:generate  # prisma generate\n```\n\nRun the NestJS server:\n\n```sh\n# with watch\n$ pnpm dev\n\n# without watch\n$ pnpm start\n```\n\nThen open \u003chttp://localhost:4000\u003e on your browser.\n\n## API Documentation with Swagger\n\nAfter running the server on local, open \u003chttp://localhost:4000/docs\u003e on your browser. Or if already deployed, check the `/docs` route.\n\n## Database Operation on Development\n\nCheck the Prisma commands accordingly:\n\n```sh\n$ pnpm prisma:format\n$ pnpm prisma:validate\n$ pnpm prisma:generate\n$ pnpm prisma:push\n$ pnpm prisma:studio\n$ pnpm prisma:seed\n```\n\n## Build for Production\n\n```sh\n$ pnpm build\n$ pnpm start:prod\n```\n\n## Build for Production with Container\n\nBuild the app image only:\n\n```sh\n$ docker compose build\n```\n\nRun Docker Compose for both app container and database container:\n\n```\n$ docker compose up\n$ curl -i localhost:4000/api\n```\n\nTo stop compose that was run without `-d`:\n\n```sh\n$ docker compose down\n```\n\n## Push the Image to Docker Hub\n\nLogin, tag, and push the image:\n\n```\n$ docker login\n\n$ docker tag my-backend-infra mhaidarh/my-backend-infra\n# or\n$ docker tag my-backend-infra \\\n  asia-southeast2-docker.pkg.dev/project-name/docker/my-backend-infra\n\n$ docker push mhaidarh/my-backend-infra\n# or\n$ docker push \\\n  asia-southeast2-docker.pkg.dev/project-name/docker/my-backend-infra\n```\n\n## Pull and Run the Container from Docker Hub\n\nCheck if it can be pulled and run:\n\n```sh\n$ docker pull mhaidarh/my-backend-infra\n# or\n$ docker pull \\\n  asia-southeast2-docker.pkg.dev/project-name/docker/my-backend-infra\n\n$ docker run -p 4000:4000 -d --name my-backend-infra-container mhaidarh/my-backend-infra\n# or\n$ docker run -p 4000:4000 -d --name my-backend-infra-container asia-southeast2-docker.pkg.dev/project-name/docker/my-backend-infra\n```\n\nCan also run via Docker Compose.\n\n```sh\n$ docker compose up\n```\n\n## Check Docker image size\n\n```sh\ndocker inspect -f \"{{ .Size }}\" mhaidarh/my-backend-infra | numfmt --to=si\n```\n\n## Deployment on Railway or Render\n\n1. Create a new project\n2. Create a PostgreSQL instance\n3. Connect GitHub repo to the project, add the environment variables\n   - `DATABASE_URL`, get automatically from Railway `${{Postgres.DATABASE_URL}}`\n   - `JWT_SECRET`, recommended to generate with `scripts/random.sh`\n   - `UNSPLASH_ACCESS_KEY`, get it from Unsplash Developer app portal\n\n## Test for Assurance\n\n```sh\n# unit tests\n$ pnpm test\n\n# e2e tests\n$ pnpm test:e2e\n\n# test coverage\n$ pnpm test:cov\n```\n\n## License\n\n[MIT](LICENSE).\n\n## References\n\n- [NestJS + Redis + Postgres Local Development With Docker Compose](https://tomray.dev/nestjs-docker-compose-postgres)\n- [AlexSKuznetsov/prisma-express](https://github.com/AlexSKuznetsov/prisma-express)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhaidarhanif%2Fmedian-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmhaidarhanif%2Fmedian-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhaidarhanif%2Fmedian-api/lists"}