{"id":16986924,"url":"https://github.com/amamenko/glowlabs","last_synced_at":"2025-03-17T09:30:36.289Z","repository":{"id":35319273,"uuid":"218162097","full_name":"amamenko/GlowLabs","owner":"amamenko","description":"MERN stack application for appointment booking and employee/client management","archived":false,"fork":false,"pushed_at":"2023-02-12T23:26:25.000Z","size":13633,"stargazers_count":118,"open_issues_count":2,"forks_count":56,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-16T10:33:17.634Z","etag":null,"topics":["appointments","booking","booking-appointments","calendar","card-information","consent-forms","mjml","shopping","skincare","square","staff-management","twilio"],"latest_commit_sha":null,"homepage":"https://glow-labs.vercel.app","language":"JavaScript","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/amamenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2019-10-28T23:10:28.000Z","updated_at":"2025-03-03T02:09:51.000Z","dependencies_parsed_at":"2023-02-17T01:46:43.487Z","dependency_job_id":null,"html_url":"https://github.com/amamenko/GlowLabs","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/amamenko%2FGlowLabs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2FGlowLabs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2FGlowLabs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amamenko%2FGlowLabs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amamenko","download_url":"https://codeload.github.com/amamenko/GlowLabs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244008887,"owners_count":20382927,"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":["appointments","booking","booking-appointments","calendar","card-information","consent-forms","mjml","shopping","skincare","square","staff-management","twilio"],"created_at":"2024-10-14T02:47:20.469Z","updated_at":"2025-03-17T09:30:33.260Z","avatar_url":"https://github.com/amamenko.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![MIT License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/amamenko/GlowLabs\"\u003e\n    \u003cimg src=\"Client/src/images/GlowLabsCroppedLogo.jpg\" alt=\"Logo\" width=\"350\" /\u003e\n  \u003c/a\u003e\n\n  \u003ch3 align=\"center\"\u003eGlow Labs Facial Bar - CRUD Application\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    MERN stack appointment scheduling and employee/client management application\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://glow-labs.vercel.app\"\u003eView Demo\u003c/a\u003e\n     ·\n    \u003ca href=\"https://www.youtube.com/watch?v=6skXNTfSanQ\"\u003eWatch Video Demo\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/amamenko/GlowLabs/issues\"\u003eReport Issue\u003c/a\u003e \n  \u003c/p\u003e\n\u003c/p\u003e\n\n## Background\n\nGlow Labs, a small business, has been using [Square](https://squareup.com/us/en) for booking appointments, managing clients and employees, and as a point of sale (POS) system. Its website, built by using [Wix](https://www.wix.com/), displays its Square booking workflow\nin an iframe. It has also been using [WaiverForever](https://www.waiverforever.com/) for handling consent forms - clients are not able to receive copies.\n\nSquare Appointments does not charge a monthly subscription fee if there is only one staff member. However, [a monthly charge of $50 for 2-5 members and $90 for 6-11 members (and even more for even larger teams)](https://squareup.com/help/us/en/article/6238-square-appointments-faqs) is incurred.\nGlow Labs has several staff members and therefore has to pay a monthly fee. Square's [POS](https://squareup.com/us/en/point-of-sale/software) system is free to use and there are no setup fees or monthly subscription fees.\n\nIdeally, appointments, consent forms, and profile management would all be handled on the same domain. Also, sensitive client-entered credit card information should be handled securely and integrated with Square's POS system.\n\n## Functionality\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://glow-labs.vercel.app\"\u003e\n    \u003cimg  src=\"Client/src/images/GL_Responsive.png\" alt=\"Glow Labs Skin Care Responsiveness Demo Screenshots\" /\u003e\n\u003c/a\u003e\n\u003c/span\u003e\n\u003cbr/ \u003e\n\u003cbr /\u003e\n\nThis is a MERN (MongoDB, Express, React, Node.js) stack application that uses [Redux](https://github.com/reduxjs/redux) for state management and [Apollo Client](https://www.npmjs.com/package/apollo-boost) to fetch data from a MongoDB database via [GraphQL](https://graphql.org/). It has some of the following features:\n\n\u003cstrong\u003eResponsive design, SEO, and performance optimizations by means of:\u003c/strong\u003e\n\n- Custom, effective meta tags with [metatags.io](https://metatags.io/) and favicons with [favicon.io](https://favicon.io/).\n- SVG compression using [SVGOMG](https://jakearchibald.github.io/svgomg/), static site image compression using [Squoosh](https://squoosh.app/), and user-uploaded image compression using [browser-image-compression](https://www.npmjs.com/package/browser-image-compression) and [LZString](https://github.com/pieroxy/lz-string)).\n- Lazy loading and SVG stroke-dashoffset animation triggers and animation on landing page with the [Intersection Observer API](https://www.npmjs.com/package/react-intersection-observer) and [react-spring](https://www.npmjs.com/package/react-spring).\n- [Code-splitting](https://reactjs.org/docs/code-splitting.html) along shopping cart routes and authenticated user routes.\n\n\u003cstrong\u003eGuest clients are able to:\u003c/strong\u003e\n\n- Add and remove facial treatments and add-ons (certain combinations disallowed) from their shopping cart.\n- Select a staff member they would like their service with (or, if no preference, select a random staff member).\n- Choose an available time and date for their appointment.\n- Fill out contact information and any appointment notes.\n- Submit credit card information securely through a [Square Payment Form](https://github.com/square/react-square-payment-form) to hold their appointment. This form is an iframe (no credit card information is stored on Glow Labs' MongoDB database. Rather, this information goes to Square's POS).\n- Book selected appointments and receive:\n  - Confirmation and reminder texts via [Twilio](https://www.npmjs.com/package/twilio) and [node-cron](https://www.npmjs.com/package/node-cron) (to which they can reply to confirm their appointment).\n  - Confirmation emails (created using the [MJML](https://github.com/mjmlio/mjml) markup language) via [Nodemailer](https://www.npmjs.com/package/nodemailer).\n  - Link to fill out and sign a consent form.\n- Log in or create an account by entering details or using [Passport](https://www.npmjs.com/package/passport-facebook) to authenticate with Facebook via OAuth 2.0. Authentication is done by [JSON Web Tokens](https://jwt.io/introduction/) and [HttpOnly](https://owasp.org/www-community/HttpOnly) access and refresh cookies, as well as an additional client-visible \"dummy\" cookie after validation.\n\n\u003cstrong\u003eAuthenticated clients are able to do all of the above, as well as:\u003c/strong\u003e\n\n- See upcoming and past appointments.\n- Cancel an upcoming appointment.\n- Save their credit card information for future bookings, if they wish (again, this card information is not saved to Glow Labs' MongoDB database, but is queried from [Square](https://github.com/square/square-nodejs-sdk)).\n- Download PDF copies of their latest consent forms via [React-PDF](https://www.npmjs.com/package/react-pdf).\n\n\u003cstrong\u003eAuthenticated staff members are able to:\u003c/strong\u003e\n\n- Receive real-time relevant activity updates such as new bookings or cancellations in their employee dashboard via GraphQL [subscriptions](https://www.apollographql.com/docs/react/data/subscriptions/) powered by [Google Cloud Pub/Sub](https://cloud.google.com/pubsub/docs/overview).\n- View all clients and staff members and each individual's upcoming and past appointments, as well as PDF copies of client consent forms, if present.\n- Update client and their own profile photos by uploading a photo or taking a photo with a [webcam](https://github.com/MABelanger/react-html5-camera-photo).\n- Add, delete, or update appointments and personal events in their own calendar.\n\n\u003cstrong\u003eAuthenticated staff members with \"admin\" status are also able to:\u003c/strong\u003e\n\n- Add new staff members.\n- Delete clients and staff members.\n- Update all clients' and staff members' profile photos.\n- View and manage all staff members' calendars.\n\n## Deployment\n\nServer deployed via [AWS EC2](https://aws.amazon.com/ec2/) instance with [NGINX](https://www.nginx.com/) and SSL secured with [Let's Encrypt](https://letsencrypt.org/). Client-side deployed with [Vercel](https://vercel.com/). Custom domain from [Freenom](https://www.freenom.com/) with DNS routing by [Cloudflare](https://www.cloudflare.com/).\n\n## Local Development\n\nTo develop this project locally, follow the steps below.\n\n### Prerequisites\n\nYou will need to have the following software installed:\n\n- npm\n- Git\n- Node.js\n\n### Installation\n\n1. Create a [Google Maps Platform](https://developers.google.com/maps/gmp-get-started) billing account, create a project, enable the Google Maps API, and get an [API key](https://developers.google.com/maps/documentation/javascript/get-api-key).\n2. Enable the [Google Pub/Sub API](https://cloud.google.com/pubsub) for that same project, add a new topic with a name of your choosing, and then add a new subscription with the name \"getUpdatedEmployee.\" Leave the delivery type as \"Pull.\"\n3. Create a new [Square Developer](https://squareup.com/signup?country_code=us\u0026v=developers) account, create a new application, and get its Sandbox credentials.\n4. Create a [Twilio](https://www.twilio.com/try-twilio) account and get its account SID and authorization token.\n5. Create a [Facebook for Developers](https://developers.facebook.com/) account, register a new application, and get its ID and secret.\n6. Create a [MongoDB](https://account.mongodb.com/account/register) account, create a new database, and get its connection string to connect to [Mongoose](https://mongoosejs.com/docs/).\n7. Clone the Github repository.\n   ```sh\n   git clone https://github.com/amamenko/GlowLabs.git\n   ```\n8. Install all client-side NPM packages.\n   ```sh\n   cd Client\n   npm install\n   ```\n9. Enter your Google Maps API token and Square Sandbox application details as client-side environment variables.\n   ```sh\n   REACT_APP_GOOGLE_MAPS_API_KEY=YOUR GOOGLE MAPS API KEY\n   REACT_APP_SQUARE_SANDBOX_APPLICATION_ID=YOUR SQUARE SANDBOX APPLICATION ID\n   REACT_APP_SQUARE_SANDBOX_LOCATION_ID=YOUR SQUARE SANDBOX LOCATION ID\n   REACT_APP_SQUARE_SANDBOX_ACCESS_TOKEN=YOUR SQUARE SANDBOX ACCESS TOKEN\n   ```\n10. Install all server-side NPM packages.\n    ```sh\n    cd ..\n    npm install\n    ```\n11. Enter your Square Sandbox, Twilio, Facebook for Developers, Google Cloud, and MongoDB credentials as server-side environment variables. Also enter your own Nodemailer email/password combinations and JSON Web Token secret keys as environment variables.\n    ```sh\n     SQUARE_SANDBOX_ACCESS_TOKEN=YOUR SQUARE SANDBOX ACCESS TOKEN\n     TWILIO_ACCOUNT_SID=YOUR TWILIO ACCOUNT SID\n     TWILIO_AUTH_TOKEN=YOUR TWILIO AUTH TOKEN\n     GLOW_LABS_TEXT_NUMBER=YOUR TWILIO TEXTING NUMBER\n     TWILIO_TEST_TEXT_NUMBER=YOUR OUTBOUND TEST TEXT NUMBER\n     FACEBOOK_APP_ID=YOUR FACEBOOK APP ID\n     FACEBOOK_APP_SECRET=YOUR FACEBOOK APP SECRET\n     JWT_SECRET_KEY_DUMMY=YOUR DUMMY JWT KEY\n     JWT_SECRET_KEY_ACCESS=YOUR ACCESS JWT KEY\n     JWT_SECRET_KEY_REFRESH=YOUR REFRESH JWT KEY\n     MONGO_DB_USERNAME=YOUR MONGODB USERNAME\n     MONGO_DB_PASSWORD=YOUR MONGODB PASSWORD\n     GOOGLE_PUB_SUB_PROJECT_ID=YOUR GOOGLE CLOUD PUB/SUB PROJECT ID\n     GOOGLE_PUB_SUB_CLIENT_EMAIL=YOUR GOOGLE CLOUD PUB/SUB CLIENT EMAIL\n     GOOGLE_PUB_SUB_PRIVATE_KEY_PART_ONE=PART ONE OF YOUR GOOGLE CLOUD PUB/SUB PRIVATE KEY\n     GOOGLE_PUB_SUB_PRIVATE_KEY_PART_TWO=PART TWO OF YOUR GOOGLE CLOUD PUB/SUB PRIVATE KEY\n     GLOW_LABS_EMAIL=YOUR EMAIL\n     GLOW_LABS_EMAIL_APP_PASSWORD=YOUR EMAIL PASSWORD\n    ```\n12. Build for production.\n    ```sh\n    npm run build\n    ```\n\n\u003c!-- CONTRIBUTING --\u003e\n\n## Contributing\n\nContributions are welcome!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/MyFeature`)\n3. Commit your Changes (`git commit -m 'Add my feature'`)\n4. Push to the Branch (`git push origin feature/MyFeature`)\n5. Open a Pull Request\n\n\u003c!-- LICENSE --\u003e\n\n## License\n\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n\u003c!-- CONTACT --\u003e\n\n## Contact\n\nAvraham (Avi) Mamenko - avimamenko@gmail.com\n\nProject Link: [https://github.com/amamenko/GlowLabs](https://github.com/amamenko/GlowLabs)\n\n\u003c!-- ACKNOWLEDGEMENTS --\u003e\n\n## Acknowledgements\n\n- Glow Labs\n- [Square Developer](https://developer.squareup.com/us/en)\n- [Facebook for Developers](https://developers.facebook.com/)\n- [Twilio](https://www.npmjs.com/package/twilio)\n- [Nodemailer](https://www.npmjs.com/package/nodemailer)\n- [MJML](https://github.com/mjmlio/mjml)\n- [Moment.js](https://github.com/moment/moment)\n- [Google Maps API](https://developers.google.com/maps/)\n- [React-PDF](https://www.npmjs.com/package/react-pdf)\n- [React Icons](https://react-icons.github.io/react-icons)\n- [react-spring](https://www.npmjs.com/package/react-spring)\n- [Tippy.js for React](https://www.npmjs.com/package/@tippyjs/react)\n- [React Burger Menu](https://github.com/negomi/react-burger-menu)\n- [node-cron](https://www.npmjs.com/package/node-cron)\n- [Best-README-Template](https://github.com/othneildrew/Best-README-Template)\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[license-shield]: https://img.shields.io/github/license/othneildrew/Best-README-Template.svg?style=for-the-badge\n[license-url]: https://github.com/amamenko/GlowLabs/blob/master/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://www.linkedin.com/in/avrahammamenko\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famamenko%2Fglowlabs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famamenko%2Fglowlabs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famamenko%2Fglowlabs/lists"}