- Description
- Technologies Used
- Learning Goals
- How To Use
- Endpoints
- Database Schema
- Challenges
- Successes
- Extensions
- Developers
- Frontend Repo
- Production
SOPHIA is a speech operated personal household interactive assistant. This app is built for two audiences: Clients and Caretakers. Clients are anyone with a disability (physical, cognitive, long-term, temporary) who needs care. Caretakers include anyone who is willing to help take care of clients. Taking care could include running errands, cleaning, yardwork, paying bills, grocery shopping, etc. SOPHIA was built to connect clients to caretakers to help meet their daily needs.
Please reference the user stories to understand the full functionality of SOPHIA.
SOPHIA is an A11Y app with a large focus on accessibility.
This is a unique opportunity that presents some valuable goals:
- Ultimately, demonstrate knowledge you’ve gained throughout Turing
- Use an agile process to turn well defined requirements into deployed and production ready software
- Gain experience dividing applications into components and domains of responsibilities to facilitate multi-developer teams.
- Service oriented architecture concepts and patterns are highly encouraged.
- Explore and implement new concepts, patterns, or libraries that have not been explicitly taught while at Turing
- Practice an advanced, professional git workflow (see whole-team expectations)
- Gain more experience using continuous integration tools to build and automate the deployment of features in various environments
- Build applications that execute in development, test, CI, and production environments
- Focus on communication between front-end and back-end teams in order to complete and deploy features that have been outlined by the project spec
- Clone this repository
cd sophia
bundle install
rails db:create
rails db:migrate
rails db:seed
rails server
- Navigate to http://localhost:3000
- Clone this repository
- Make sure docker is running
cd sophia
git checkout dockerize
docker-compose build
docker-compose run web rails db:{create,migrate,seed}
docker-compose up
- Navigate to http://localhost:3000
Testing Requests:
bundle exec rspec spec/requests
Testing Google Text to Speech:
Google Speech api will look for an Environment Variable called GOOGLE_APPLICATION_CREDENTIALS that points to the path of key.json assigned by google. More info can be found here in the 'Before you begin' section.
bundle exec rspec spec/services
Testing Models:
bundle exec rspec spec/models
Send a GET request to receive all information related to a single client
if a client does not have diet_restrictions, needs, allergies, or medications, these attributes do not show. The client below has no 'allergies' associated
Content-Type: application/json
Accept: application/json
{
"id": "1",
"username": "katierulz",
"name": "Katie",
"street_address": "123 Test St",
"city": "Denver",
"state": "CO",
"zip": "12345",
"email": "katierulz@gmail.com",
"phone_number": "1235551234",
"needs": ["groceries", "bills"],
"medications": ["drug_1", "drug_2"],
"diet_restrictions": ["vegetarian", "peanut-free"],
"role": "client",
"created_at": "DateTime",
"updated_at": "DateTime"
}
A valid client ID must be provided or a 404 status code (page not found) will be returned.
Send a POST request to create a client
Content-Type: application/json
Accept: application/json
MUST have password AND password confirmation and they must match
{
"username": "string-required",
"name": "string-required",
"password": "password",
"password_confirmation": "password",
"street_address": "string-required",
"city": "string-required",
"state": "string-required",
"zip": "string-required",
"email": "string-required",
"phone_number": "string-required",
"needs": ["array"],
"allergies": ["array"],
"medications": ["array"],
"diet_restrictions": ["array"],
"role": "client"
}
{
"id": "1",
"username": "katierulz",
"name": "Katie",
"street_address": "123 Test St",
"city": "Denver",
"state": "CO",
"zip": "12345",
"email": "katierulz@gmail.com",
"phone_number": "1235551234",
"needs": ["groceries", "bills"],
"allergies": ["pollen", "peanuts"],
"medications": ["drug_1", "drug_2"],
"diet_restrictions": ["vegetarian", "peanut-free"],
"role": "client",
"created_at": "DateTime",
"updated_at": "DateTime"
}
{
"email": ["has already been taken"]
}
{
"state": ["can't be blank"]
}
{
"password_confirmation": ["does not match password"]
}
Send a PATCH request to update a clients profile
Content-Type: application/json
Accept: application/json
{
"email": "vincecarollo@gmail.com"
}
{
"id": "1",
"username": "katierulz",
"name": "Katie",
"street_address": "123 Test St",
"city": "Denver",
"state": "CO",
"zip": "12345",
"email": "vincecarollo@gmail.com",
"phone_number": "1235551234",
"needs": ["groceries", "bills"],
"allergies": ["pollen", "peanuts"],
"medications": ["drug_1", "drug_2"],
"created_at": "DateTime",
"updated_at": "DateTime"
}
A valid client ID must be provided or a 404 status code (page not found) will be returned.
Send a DELETE request to delete a client
will return a 204 status code with no body
A valid client ID must be provided or a 404 status code (page not found) will be returned.
Send a GET request to receive all information related to a single caretaker
{
"id": "1",
"username": "katierulz",
"name": "Katie",
"email": "katierulz@gmail.com",
"phone_number": "1235551234",
"abilities": "ability_1",
"role": "caretaker",
"created_at": "DateTime",
"updated_at": "DateTime"
}
A valid caretaker ID must be provided or a 404 status code (page not found) will be returned.
Send a POST request to create a caretaker
Content-Type: application/json
Accept: application/json
MUST have password AND password confirmation and they must match
{
"username": "string-required",
"name": "string-required",
"password": "password",
"password_confirmation": "password",
"email": "string-required",
"phone_number": "string-required",
"abilities": "ability_1",
"role": "caretaker"
}
{
"id": "1",
"username": "katierulz",
"name": "Katie",
"email": "katierulz@gmail.com",
"phone_number": "1235551234",
"abilities": "ability_1",
"role": "caretaker",
"created_at": "DateTime",
"updated_at": "DateTime"
}
{
"message": ["Username has been taken"]
}
{
"message": ["Email has been taken"]
}
{
"password_confirmation": ["does not match password"]
}
Send a PATCH request to update a caretaker
Content-Type: application/json
Accept: application/json
{
"username": "updated_username",
"name": "update_name",
"email": "updated_email@email.com",
"phone_number": "updated_number",
"abilities": "updated_ability_1"
}
{
"id": "1",
"username": "updated_username",
"name": "update_name",
"email": "updated_email@email.com",
"phone_number": "updated_number",
"abilities": "updated_ability_1",
"created_at": "DateTime",
"updated_at": "DateTime"
}
{
"message": ["Username has been taken"]
}
{
"message": ["Email has been taken"]
}
Send a DELETE request to delete a caretaker
will return a 204 status code with no body
A valid caretaker ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
?client_id=2
or
?caretaker_id=2
Successful Response:
[
{
"id": 1,
"name": "Groceries",
"client_id": 1,
"created_at": "2019-09-21T18:56:50.716Z",
"updated_at": "2019-09-21T18:56:50.716Z",
"created_for": "caretaker",
"caretaker_id": 1
},
{
"id": 2,
"name": "Dinner Party Errands",
"client_id": 1,
"created_at": "2019-09-21T18:56:50.746Z",
"updated_at": "2019-09-21T18:56:50.746Z",
"created_for": "caretaker",
"caretaker_id": 1
}
]
Unsuccessful Response: A valid client or caretaker ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
Successful Response:
{
"id": 1,
"name": "Groceries",
"client_id": 1,
"created_at": "2019-09-21T18:56:50.716Z",
"updated_at": "2019-09-21T18:56:50.716Z",
"created_for": "caretaker",
"caretaker_id": 1
}
Unsuccessful Response: A valid list ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
{
name: 'Groceries',
client_id: 3,
caretaker_id: 6,
created_for: 'caretaker'
}
created_for can be 'caretaker' or 'client' only
Successful Response:
{
"id": 3238,
"name": "Groceries",
"client_id": 4227,
"created_at": "2019-09-24T23:21:44.326Z",
"updated_at": "2019-09-24T23:21:44.326Z",
"created_for": "caretaker",
"caretaker_id": 2759
}
Unsuccessful Response: A valid client ID must be provided or a 404 status code (page not found) will be returned.
caretakers are optional
Content-Type: application/json
Accept: application/json
{
name: 'New Name'
}
Successful Response:
{
"id": 3238,
"name": "New Name",
"client_id": 4227,
"created_at": "2019-09-24T23:21:44.326Z",
"updated_at": "2019-09-24T23:21:44.326Z",
"created_for": "caretaker",
"caretaker_id": 2759
}
Unsuccessful Response: A valid list ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
Successful Response: Returns 204 status with no body
Unsuccessful Response: A valid list ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
Successful Response:
[
{
"id": 1,
"list_id": 1,
"name": "Gala Apples",
"description": "Should be on sale",
"completed": false,
"created_at": "2019-09-21T18:56:50.730Z",
"updated_at": "2019-09-21T18:56:50.730Z"
},
{
"id": 2,
"list_id": 1,
"name": "Green Onions",
"description": "Should be on sale",
"completed": false,
"created_at": "2019-09-21T18:56:50.738Z",
"updated_at": "2019-09-21T18:56:50.738Z"
}
]
Unsuccessful Response: A valid client or caretaker ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
Successful Response:
{
"id": 2,
"list_id": 1,
"name": "Green Onions",
"description": "Should be on sale",
"completed": false,
"created_at": "2019-09-21T18:56:50.738Z",
"updated_at": "2019-09-21T18:56:50.738Z"
}
Unsuccessful Response: A valid list and task ID must be provided or a 404 status code (page not found) will be returned. Also the task given must be associated with the list given or a 404 will be returned.
Content-Type: application/json
Accept: application/json
{
name: 'Mow Back Yard',
description: 'make sure to weedeat',
list_id: 3,
due_date: '2019-12-25'
}
due date is optional
Successful Response:
{
"id": 77,
"list_id": 3,
"name": "Mow Back Yard",
"description": "make sure to weedeat",
"completed": false,
"created_at": "2019-09-25T19:33:36.071Z",
"updated_at": "2019-09-25T19:33:36.071Z",
"due_date": "12/25"
}
Due date format is due to front end request
Unsuccessful Response: A valid list ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
{
name: 'New Name'
}
Successful Response:
{
"id": 77,
"list_id": 3,
"name": "New Name",
"description": "make sure to weedeat",
"completed": false,
"created_at": "2019-09-25T19:33:36.071Z",
"updated_at": "2019-09-25T19:33:36.071Z",
"due_date": "12/25"
}
Unsuccessful Response: A valid list and task ID must be provided or a 404 status code (page not found) will be returned.
Content-Type: application/json
Accept: application/json
Successful Response: Returns 204 status with no body
Unsuccessful Response: A valid list and task ID must be provided or a 404 status code (page not found) will be returned.
Send a POST request to get user id from username and password
Content-Type: application/json
Accept: application/json
{
username: "testClient",
password: "pass"
}
returns the user object who matches given username and password
{
"id": "1",
"username": "testClient",
"name": "Katie",
"street_address": "123 Test St",
"city": "Denver",
"state": "CO",
"zip": "12345",
"email": "katierulz@gmail.com",
"phone_number": "1235551234",
"needs": ["groceries", "bills"],
"medications": ["drug_1", "drug_2"],
"diet_restrictions": ["vegetarian", "peanut-free"],
"created_at": "DateTime",
"updated_at": "DateTime"
}
Returns 400 and body:
{
"message": "Invalid Username/Password"
}
Send a POST request to turn a .caf audio file into text
Google Speech api will look for an Environment Variable called GOOGLE_APPLICATION_CREDENTIALS that points to the path of key.json assigned by google. More info can be found here in the 'Before you begin' section.
Content-Type: application/octet-stream
Body Should contain an audio blob originating from a .caf file
{
"text": "groceries"
}
{
"text": "No Matching Text Found"
}
Technical Debt: This project has two types of users, a client and a caretaker. When planning our database architecture, we were more focused on implementing the client functionality first. When we moved on to implementing the caretaker functionality, we had to rearrange much of the existing routes and controllers to accommodate.
- Implementing Speech to Text
- MVP goals were reached in 2 weeks with front end team
- Implement Websockets to stream audio from front end
- Rearrange routing to allow list and task CRUD without client or caretaker association
👤 Noah Flint, Vince Carollo, Katie Lewis, Andreea Hanson
- Heroku: Sophia Rails Application