{"id":18000105,"url":"https://github.com/ryankaleligabriel/bookify","last_synced_at":"2026-04-06T08:01:45.435Z","repository":{"id":259936152,"uuid":"847780879","full_name":"RyanKaleliGabriel/Bookify","owner":"RyanKaleliGabriel","description":"Bookify is a scheduling and appointment booking Restful API .","archived":false,"fork":false,"pushed_at":"2024-10-29T11:18:11.000Z","size":223,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-04T07:43:57.044Z","etag":null,"topics":["docker","expressjs","jest","jwt","mvc-architecture","pug","typescript"],"latest_commit_sha":null,"homepage":"https://documenter.getpostman.com/view/21457016/2sAXjQ2Vwr","language":"TypeScript","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/RyanKaleliGabriel.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":"2024-08-26T14:32:27.000Z","updated_at":"2024-10-29T11:18:16.000Z","dependencies_parsed_at":"2024-10-28T18:49:58.984Z","dependency_job_id":"3092ec2b-638f-4301-9f3e-655c3c4cffc8","html_url":"https://github.com/RyanKaleliGabriel/Bookify","commit_stats":null,"previous_names":["ryankaleligabriel/bookify"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RyanKaleliGabriel/Bookify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyanKaleliGabriel%2FBookify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyanKaleliGabriel%2FBookify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyanKaleliGabriel%2FBookify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyanKaleliGabriel%2FBookify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RyanKaleliGabriel","download_url":"https://codeload.github.com/RyanKaleliGabriel/Bookify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RyanKaleliGabriel%2FBookify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31464102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"online","status_checked_at":"2026-04-06T02:00:07.287Z","response_time":112,"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","expressjs","jest","jwt","mvc-architecture","pug","typescript"],"created_at":"2024-10-29T23:09:33.196Z","updated_at":"2026-04-06T08:01:45.419Z","avatar_url":"https://github.com/RyanKaleliGabriel.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bookify API\nBookify is a scheduling and appointment booking Restful API that allows attendants and clients to interact seamlessly. Clients can book appointments, while attendants can manage their availability. \n\n## Table of Contents\n- [Features](#features)\n- [Tech Stack](#tech-stack)\n- [Architecture and principles](#architecture-and-principles)\n- [Testing](#testing)\n- [Some DevOps](#some-devops)\n- [Deployment](#deployment)\n- [Security Practices](#security-practices)\n- [Performance Practices](#performance-practices)\n\n\n## Features\n- **User Registration \u0026 Authentication**: Role-based sign-up as either elient or client\n- **Availability Management**: Attendants can specify their availability for flexible timeframes.\n- **Appointment Scheduling**: Clients can book, cancel, and reschedule appointments.\n- **Conflict Validation**: Availability and booking conflicts are validated and prevented.\n\n## Tech Stack\n- **Backend**: Node.js, Express.js\n- **Database**: MongoDB\n- **Authentication**: JWT (JSON Web Tokens), Cookies\n- **Testing**: Supertest for API testing, Jest, Postman\n- **Containerization**: Multi-Stage Docker Builds\n- **CI/CD**: Github Actions\n\n## Architecture and principle\n**MVC** - Utilised the Model-View-Controller Architecture, this ia a design pattern that separates and application into three main logical components Model, View and Controller. It isolates the business logic and presentation layer fro each other\n\n**DRY** - Don't repeat yourself is a principle used in this project to reduce the repition of patterns and code duplication in favour of abstractions and avoiding redundancy especially in the controller level.\n\n ## Testing\n**Unit Tests** - Focused on writing unit tests for the utility functions that were reusable.\n\n**Integration Tests** - Tested the interaction between different Components in the API. In this case tested the interaction between the controllers and database.\n\n## Some DevOps\n\n**Multi-Stage Docker Builds** - This separated the build environment from the final runtime environment, reducing the image size and attack surface.\n\n**Continuous Integartion and deployment** - Used github actions to build the applications pipeline that was linked to docker hub.\n\n - Installed dependencies\n - Run tests\n - Built the docker image\n - Pushed the image to docker hub.\n\n ## Deployment\n**Render** - Pulled the image from docker hub and run the image as a web service\n\n## Security Practices\n**X-Powered-By Header** - Disbaled this header to reduce fingerprinting. Reduces the ability of attacker to determine the software the server uses.\n\n**Setting Appropriate Headers** - Used the helmet package to protect the app from some well known vulnerabilities by setting HTTP headers appropriately.\n\n**Rate Limiting** - Used a package to limit the number of  requests coming from the same IP to 100 in an hour. This helps in preventing Brute force and DDOS attacks\n\n**NOSql injections** - Used mongo-sanitize package to prevent nosql injection attacks.\n\n## Performance Practices\n**Gzip Compression** - Decreased the size of the response body.\n\n**Logging** - Used morgan to log the application's activity\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryankaleligabriel%2Fbookify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryankaleligabriel%2Fbookify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryankaleligabriel%2Fbookify/lists"}