calendari's Issues
Build Models with MVP in mind, making non-necessary values as the default value of NULL
@mmlawton15 is going to tackle this upfront
TODOs
Schema Notes
-
User
- Anyone that can sign into the app.
- Schema:
- _id
- name_first
- name_last
- username - What your name previews as to others
- emailEmailRequiredUnique
- password_salt - Their unique password salt created at time of user creation
- Required
- String
- password_hash
- Required
- String
- Their password after being salted
- verified - User has verified their account
- date_Created - Account created
- date_Login - Last Login
- DateTime
- Auto-Updated on login
- user_calendar - Association to users calendar
- Array
- Type Internal / Google
- Name
- DateTime - availbiliy
- Appointments - relation to appointment data type
- Array
- Type Internal / Google
- Name
- DateTime - availbiliy
- business_id - Association to business
- account_id - The state of their account
- user_type_id - Association to user type
-
Business
- A Business is the parent of all users. A business has a primary account associated with it, contains Appointments, Contains Users, and contains a Calendar for managing Appointments based on user.
- _id
- name
- Internally your name
- String
- Required
- brand_name
- What customers see
- String
- Required
- business_logo
- Settings
- All account specific options
- Obj
- Relation
- Configuration
- Unique system-specific options
- Obj
- Relation
- Appointments_Type
- Appointments
- Users
- admin_user_id
-
Appointment
- All Existing Appointments
- Schema:
- id
- user_id
- business_id
- Appointment
- Obj containing appointment details
- Name
- Duration
- Date
- Start Time
- End Time
- Universal time-zone
- Client
- Obj containing client details
- Name
- Email
- Phone
- Summary
- timezone
- status
- Scheduled
- Completed
- Canceled
-
Appointment_Type
- id
- user_id
- business_id
- Appointment_Details
- Obj containing appointment details
- Name
- Email
- Phone
- Summary
- Duration
- Date
- Universal time-zone
Add Validation to the form values within the Client
When a Business signs into their dashboard page, they can manage date/time availability
After downloading the most up-to-date main/develop branch content, I was unable to create new users.
Issues
1. Typo
When trying to create a new account, the mutation ADD_USER
, GraphQL was throwing an error regarding the mutation ADD_USER
and value busienss_brand_name
Problem/Resolution: busieness_brand_name
and should be business_brand_name
according to server/model/user.
2. Variable Mismatch
User Model value name of business_brand_name
and Business Model value name of brand_name
is creating conflict between the CLIENT and the SERVER preventing a user from being created properly.
Build the Homepage Concept
Directly Similar Apps
Indirectly Similar Apps
Doing an overall evaluation of the code to find/squish bugs🐛 and verify MVP reqs are met.
Functionality
Issues
Draft content
Notes below are subject to change, incomplete, and not a true representation of the idea.
Phase 0: Build Project Framework
All Basic Project Requirements are Completed, allowing for clear workload division.
This is completed when...
1. Repo is Setup
2. All project-requirement App framework is built in the App
When a User is signed in to their account, they are able to send an email to a Client containing a Direct Link to a specific scheduler. When that link is selected, the Client is able to fill out the details.
When appointments are created, they appear in the business's appointments section
GraphQL is onboarded for the Server in collaboration with the Schema
@NicaVulcan is managing this one
See #14 for context on the schema
TODOs
Add Configuration Templates that mirror database requirements to server as a point of reference, for seed data, and other future things.
Originally posted by @ErikPlachta in #29 (comment)
Publish the Node Server onto Heroku ( the controller ) and Host the Database on MongoDB Atlas ( the model )
Bob
Move Login to the last element when signed out, so appears in same spot as sign out when signed in.
Host App on Custom Domain
When an Appointment exists in the Database, then the Appointment page can be used to verify or manage an existing appointment.
Props (business, appointment_id)
business
: Takes business_id or business_name to validate the appointment ID
appointment
: Take appointment_id, to validate with business_id
export default function Appointment(business, appointment) {
//-- Can be the busines_id or the business_name
const business_Id_Name = business;
//-- The ID of the specific appointment for the business above.
const appointment_id = appointment;
return (
<div>TODO:: ADD CONTENT</div>
)
}
Logic concept
- Take URL Params and run an API Call
- Check for business in database
- business can be business_id or business_name
- Check for an appointment_id in database
- Evaluate Accordingly
// if arguements not provided
if(!business_id || !appointment_id){
re-direct to page stating does not exist
}
// if business_id or business_name do not exist
if(!business_id || !business_name) {
re-direct to to business does not exist page
}
// if the busines_id or business_name contains the appointment ID, return page to manage
if( ( business[business_id].appointments ) contains appointment_id || business[business_name].appointments ) contains appointment_id ){
- return page with appointment to either verify, cancel, or re-schedule
}
//-- if it got here somehow, re-route to app homepage
Build a functional Server Framework that connects to MongoDB
@ErikPlachta writing out the Schema Design Idea WIthout Concern for MVP to get the Idea out.
Notes below may be incomplete, inaccurate, and are draft quality at best. Not meant for anything beyond a strategic conversation.
- System
- Business
- User -
- User_Account - All Users have an Account Type associated with them.
Schema
System
Log
- id
- type
- payload - The message to be logged
- date_time
- user_id
- business_id
- appointment_id
- calendar_id
- calient_id
Log_Type
Ideas
- Business_Log
- A broad collection of activities related to Businesses for internal admin-related purposes. As events happen the System automatically will record them here.
- Appointment_Log
- User_Log
- A broad collection of activity related to users for internal admin-related purposes. As events happen the System automatically will record them here.
Business Related Specifics
Business
A Business is the parent of all users. A business has a primary account associated with it, contains Appointments, Contains Users, and contains a Calendar for managing Appointments based on user.
- _id
- name
- Internally your name
- String
- Required
- brand_name
- What customers see
- String
- Required
- business_logo
- Settings
- All account specific options
- Obj
- Relation
- Configuration
- Unique system-specific options
- Obj
- Relation
- Appointments_Type
- Appointments
- Users
- admin_user_id
Appointment
All Existing Appointments
Schema:
- id
- user_id
- business_id
- Appointment_Details
- Obj containing appointment details
- Name
- Email
- Phone
- Summary
- Duration
- Date
- Time_Start
- Time_End
- Universal time-zone
- Status
- Scheduled
- Completed
- Canceled
Appointment_Type
Schema:
- id
- user_id
- business_id
- Appointment_Details
- Obj containing appointment details
- Name
- Email
- Phone
- Summary
- Duration
- Date
- Universal time-zone
User
Anyone that can sign into the app.
Schema:
- _id
- name_first
- name_last
- username - What your name previews as to others
- email
-
- password_salt - Their unique password salt created at time of user creation
- Required
- String
- password_hash
- Required
- String
- Their password after being salted
- verified - User has verified their account
- date_Created - Account created
- date_Login - Last Login
- DateTime
- Auto-Updated on login
- user_calendar - Association to users calendar
- Array
- Type Internal / Google
- Name
- DateTime - availbiliy
- Appointments - relation to appointment data type
- Array
- Type Internal / Google
- Name
- DateTime - availbiliy
- business_id - Association to business
- account_id - The state of their account
- user_type_id - Association to user type
User_Account
All Users must have an Account Type. Used for tracking user Account Types like memberships, trial accounts, closed accounts, and things related to this.
Using a DB to hold this information to ensure it's easy to access, manage and update. Won't be changed a lot but contains vital info.
This is all data we would seed, not filled in by users. Eventually, we'd want to have a front-end we can use to manage the app if it were a legit business. For now, seeding from the CLI is good.
- _id
- account_type - Contains name for account type
- summary
Examples of Types of Accounts
- Active Free - No customization. All user experience has our app branding 100%.
- Active Basic - Limited options. Some custom branding.
- Active Premium - Full customization. Little to no branding from our App._
- Trial - Basic account for x days
- Closed - Trial expired, sub ended
- Suspended - We banned username
User_Type
Role-specific permissions.
Similar to User_Account, holds data for the app to access. And can be managed by CLI for now.
- _id
- name
- summary - explaining what it is
- systemFullAdmin - Can do everything
- systemUserAdmin - Can edit all business data
- systemUserAdmin - Can edit all user data
- systemBot - Performs logging and automated things related to non-critical systems
- business - Can edit user-specific business info
- appointment - can edit business-specific appointment info
- user - can edit business-specific other users info
- calendar - Can view the calendar and appointment details
Examples of User Types
- Internal
- Bot
- Automated events that bots would perform, like messages to customers with accounts
- system: true
- business: false
- appointment: false
- user: false
- calendar: true
- SysAdmin
- External
- Owner
- Owner of business account
- Full business admin rights
- Manager
- Has permissions to control all things except for business.
- business: false
- appointment: true
- user: true
- calendar: true
- Employee
- business: false
- appointment: false
- user: false
- calendar: true
- Client
- Customer making appointments
- No account Creation happening here just log of details
user_calendar
- id
- type
- name
- display_name
- date_time
- Array
- Days of week
- Start / End Times
A Concept Business/User is fully built and functional with hard-coded data to verify base integrity of the App
TODO
Overall Concept
An online appointment management system that automates Creating, Updating, Canceling, and overall communication to our customers and their clients. Our customers have a unique login, URL, and the ability to customize their availability, appointment types, Business Name, and overall styling to create a unique customer experience that fits their needs.
User Story
When a User wants to provide an Online Scheduling solution to their customers
- WHEN a User creates an account, THEN they're able to define their business details, and availability for appointments.
- WHEN a User creates an appointment type, THEN they are able to define all of the appointment details.
- WHEN an appointment type is created, THEN it can be published to make it available to a public URL.
- WHEN a User's customer schedules an appointment from the shared link, THEN the User's customer selects their appointment type, fills in the details, and approves the appointment.
- WHEN a Users customer finishes the appointment, THEN User and their customer are sent an email confirmation.
When a User Creates an account
- Users can create new accounts for their business to simplify online management.
- WHEN User creates a new account, THEN can use Google to signup or fill in the basic information manually.
- WHEN you sign in, THEN you're routed to your Business Management dashboard
- WHEN account configuration is incomplete, THEN your Dashboard will guide you to a resolution.
- WHEN setting up your account, THEN you will be required to do the following before your Scheduler will become availble.
- Confirm your Business Details
2. Verify your Business Name as it appears to a customer
4. Define your Business Hours
6. Define your Business Contact Phone Number
7. Define your business Contact Email
- Setup your Calendar ( optional )
1. User has the option to link to Google Calendar
2. User has the option to NOT have a calendar
- When customers request appointments, an email is sent off the request with no calendar association.
- Setup your Appointment Details
- Define global Date-Time availability
- Affects all appointments by default unless otherwise specified.
- Select at least 1 Appointment
- User was presented with a few basic templates.
- When selected, the user can define the dynamic details of an appointment.
- Optionally, you can also do the following
- Configure your User Account
- Create new Users
A Fully Functional Working Prototype in alignment with MVP of the APP is Completed
P0: Client - Build Hardcoded Data Payloads
To build hardcoded JSON payloads for each component to allow quick and easy testing without needing the server to be configured.
@ErikPlachta handling this one.
MVP of Business Page Finalized
Form at end of creating an appointment to Verify Client Details
When a user enter a URL with the Business Name followed by the Appointment Type id, the scheduler loads.
All API Framework for App is Built and Functional with
Scheduler
A Public URL
These are public URLs to allow scheduling with people.
Each users must choose a unique Business
To scheduler an appointment you need to use the users Business URL.
These are the links to share with their customers to make appointments
AppName.com/s/id:BusinessName/
root businesss scheduler page
AppName.com/s/id:BusinessName/id:type
unique business type
When using the Scheduler, appointments are created in database for business
Define the name of the App: Calendari
BrainStorming
When branches pushed to develop and main, CI execution runs to verify integrity of all tests
Testing - jest.js
CI - evaluate.yml
CD - deploy.yml
Phase 4: Polishing App
Overall cleanup, adding features that feel like they're "missing", simplifying, and making the app feel complete.
Build a functional and complete navigational page.
When a user is logged in, the navigation is updated with direct links to the business VIA the business brand_name
NOTE: The resolution was made possible via the work on #66
When user accounts are created, a unique Salt is Generated for them to hash their password. That unique Salt is stored in the User Model.
We can use bcrypt for this.
Originally posted by @ErikPlachta in #21 (comment)
Build seeder for server with data for quick and easy testing
See #12 for payload that @ErikPlachta built for #3
Completed and pushed to #21
Type Relations to be handled on #24
When creating an appointment, recaptcha is required