{"id":15706781,"url":"https://github.com/appcypher/requests","last_synced_at":"2025-10-06T22:59:34.969Z","repository":{"id":42353135,"uuid":"180578716","full_name":"appcypher/requests","owner":"appcypher","description":"Requests is a feature-request page for a larger app.","archived":false,"fork":false,"pushed_at":"2022-12-08T05:01:12.000Z","size":2201,"stargazers_count":7,"open_issues_count":10,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-08T16:39:25.916Z","etag":null,"topics":["aws","docker","docker-compose","ecs","elasticbeanstalk","flask","knockout","python"],"latest_commit_sha":null,"homepage":"http://requests2-env.ytcuuufw3p.us-east-2.elasticbeanstalk.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appcypher.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}},"created_at":"2019-04-10T12:38:27.000Z","updated_at":"2025-04-03T14:07:37.000Z","dependencies_parsed_at":"2023-01-24T13:00:33.926Z","dependency_job_id":null,"html_url":"https://github.com/appcypher/requests","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/appcypher/requests","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcypher%2Frequests","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcypher%2Frequests/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcypher%2Frequests/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcypher%2Frequests/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appcypher","download_url":"https://codeload.github.com/appcypher/requests/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appcypher%2Frequests/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271953150,"owners_count":24849291,"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-24T02:00:11.135Z","response_time":111,"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":["aws","docker","docker-compose","ecs","elasticbeanstalk","flask","knockout","python"],"created_at":"2024-10-03T20:28:19.363Z","updated_at":"2025-10-06T22:59:29.937Z","avatar_url":"https://github.com/appcypher.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eREQUESTS\u003c/h1\u003e\n\n![Requests](media/requests-mockup.png)\n\nYou can find the mockups [here](https://www.figma.com/file/CEAsuJTXG1nRShKSMkLdRW4U/Untitled?node-id=0%3A1)\n\n\n[![CircleCI](https://circleci.com/gh/appcypher/requests.svg?style=svg)](https://circleci.com/gh/appcypher/requests)\n[![Coverage Status](https://coveralls.io/repos/github/appcypher/requests/badge.svg?branch=master)](https://coveralls.io/github/appcypher/requests?branch=master)\n[![Maintainability](https://api.codeclimate.com/v1/badges/dda736c170b430d64dc7/maintainability)](https://codeclimate.com/github/appcypher/requests/maintainability)\n![Maintained](https://img.shields.io/maintenance/yes/2019.svg)\n\nRequests is part of a larger application. It allows the staff of an imaginary company to register and track clients' feature requests.\n\n~See Requests running [here](http://requests2-env.ytcuuufw3p.us-east-2.elasticbeanstalk.com/)~\n\n\n\n\n### 🛠 INSTALLATION\n##### REQUIREMENTS\n- [Python 3.7+](https://www.python.org/downloads/) - Python interpreter\n- [Pip](https://pip.pypa.io/en/stable/installing/) (Should be installed along with Python) - Python package manager\n- [Nodejs](https://nodejs.org/en/download/) - Javascript server-side Virtual Machine\n- [NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) (Should be installed along with Nodejs) - Nodejs package manager\n- [PostgreSQL](https://www.postgresql.org/download/) - Database management system\n\n##### STEPS\n- Clone the repository\n    ```bash\n    git clone https://www.github.com/appcypher/requests.git\n    ```\n\n- Change working directory to project's directory\n    ```bash\n    cd requests\n    ```\n\n- Create `requests` and `requests_test` databases\n\n- Install dependecies and build project\n    ```bash\n    . requests.sh build\n    ```\n\n- Activate the project's virtual environment.\n    ```bash\n    pipenv shell\n    ```\n\n- Apply migration files.\n    ```bash\n    flask db upgrade -d server/migrations\n    ```\n\n- Add seeds to the database.\n    ```bash\n    flask model seed all\n    ```\n\n- Start the flask app\n    ```bash\n    flask run\n    ```\n\n- Visit `localhost:5000` on your browser to see the page.\n\n\n### ✅ TESTING\n##### REQUIREMENTS\n- Same as [installation](#-installation) requirements.\n\n##### STEPS\n- You can run all the tests in a single command.\n    ```bash\n    pipenv run pytest\n    ```\n\n    Some useful defaults are already set in [pytest.ini file](pytest.ini)\n\n- The tests are all unit tests, so you can run them individually\n    ```bash\n    pipenv run pytest -k test_client_model_gets_all_rows_correctly_after_saving\n    ```\n\n\n\n### 📦 STARTING UP DOCKER CONTAINERS\n##### REQUIREMENTS\n- [Docker](https://docs.docker.com/v17.12/install/)\n\n\n##### STEPS\n- Start all the project's containers together with docker-compose\n    ```bash\n    docker-compose -f docker/compose.yml up\n    ```\n\n- You can also build and start them individually\n\n- Build and start flask app container\n    ```bash\n    docker image build -t flask-app:latest -f ./docker/app/Dockerfile ./\n    ```\n\n    ```bash\n    docker container create --name flask-app -p 80:80 flask-app\n    ```\n\n    ```bash\n    docker container start flask-app\n    ```\n\n- Build and start nginx server container\n    ```bash\n    docker image build -t nginx-server:latest -f ./docker/server/Dockerfile ./docker/server/\n    ```\n\n    ```bash\n    docker container create --name nginx-server -p 80:80 nginx-server\n    ```\n\n    ```bash\n    docker container start nginx-server\n    ```\n\n\n\n### 🚀 DEPLOYMENT TO [AWS ECS](https://aws.amazon.com/ecs/)\nThis project contains a buildspec.yml file for automating deployment. The deployment process relies on a few AWS automation services like CodePipeline and CodeBuild. Ideally the buildspec file needs to be customized for your use case. However, if you are willing to take the manual approach, you can follow the steps below.\n\n##### REQUIREMENTS\n- [AWS](https://aws.amazon.com) - Amazon web services\n- [Github](https://github.com/) - Git repository hub\n- [AWS EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html) - Command line tool for managing Amazon Elastic Beanstalk (EB) applications remotely\n\n##### STEPS\n- For the following to work, you need to have [configured](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) your AWS CLI using your EC2 [keypairs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html).\n\n- Initialize the platform by following the prompt given by\n    ```bash\n    eb init\n    ```\n\n- Create an environement.\n    ```\n    eb create request_app_environment\n    ```\n\n- Deploy the application.\n    ```bash\n    eb deploy\n    ```\n\n\n\n### ⚙️ AVAILABLE TASK RUNNERS\n- ```flask model seed all``` → Seeds the database with relevant initial data\n- ```npm run build:prod``` → Builds the frontend code with optimizations turned on and generates a sourcemap\n- ```npm run build:dev:watch``` → Watches the frontend code for any change and rebuilds with debug options enabled\n- ```sh requests.sh --help``` → Shows helpful information about `requests.sh` script\n- ```sh requests.sh build``` → Downloads and builds the projects dependencies\n- ```sh requests.sh start``` → Starts the flask application using a Gunicorn (wsgi) server\n\n\n\n\n\n### ↔️ API\n- A detailed documentation of the API is available [here](https://documenter.getpostman.com/view/4928310/S1EQSHJX).\n\n- The project's Postman collection can be accessed with the button below.\n\n    [![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/84067ae32777b6dea8ef)\n\n- This project doesn't do any user authentication, it is assumed the larger app has this figured out already.\n\n##### REQUESTS\n- GET: ```/api/v1/requests``` → Gets all the requests\n- POST: ```/api/v1/requests``` → Saves a request\n- GET: ```/api/v1/requests/:id``` → Gets the request with the specified id\n\n##### COMMENTS\n- GET: ```/api/v1/requests/:id/comments``` → Gets all the comments under a request\n- POST: ```/api/v1/requests/:id/comments``` →  Adds a new comment under a request\n\n##### STAFF\n- GET: ```/api/v1/staff/:id``` →  Gets the staff with the specified id\n\n##### CLIENT\n- GET: ```/api/v1/client/:id``` →  Gets the client with the specified id\n\n\n\n\n### 🥘 MADE WITH\n##### MOCKUP\n- ```Figma``` → Cloud-based design tool\n\n##### CLIENT\n- ```Knockout``` → MVVM-based JavaScript library\n- ```JQuery``` → A fast, small and feature-rich JavaScript library\n- ```Webpack``` → Package bundler with minification\n- ```SCSS``` → Flexible superset of CSS\n\n##### SERVER\n- ```Flask``` → Micro web framework for Python\n- ```SQLAlchemy``` → SQL database ORM\n- ```Marshmallow``` → Serialization and validation tool\n- ```Gunicorn``` → WSGI-compliant web server\n- ```Nginx``` → Web server for reverse proxying, load balancing, caching and more\n\n##### DATABASE\n- ```PostgreSQL``` → Database management system\n\n##### CI/CD\n- ```Docker``` → Container and image creation and management tool\n- ```CircleCI``` → Continous integration services\n- ```CodeClimate``` → Code maintenance and coverage services\n- ```Coveralls``` → Code coverage report services\n- ```Amazon ECS \u0026 Elastic Beanstalk``` → Amazon's container orchestration services\n- ```Amazon CodePipeline, CodeBuild, CodeCommit``` → A set of AWS automation services for CI/CD\n\n##### TESTS\n- ```Pytest``` → Testing framework\n\n\n### 👍 CREDITS\nThis project looks nicer; thanks to the free icons and logos provided by these awesome [creators](CREDITS.md)\n\n\n\n\n### 🤝 LICENSE\n[Apache License 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappcypher%2Frequests","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappcypher%2Frequests","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappcypher%2Frequests/lists"}