A web application to share your voice on a topic.
Hammad is an employee of a large organization
Hammad wants to be able to submit his concerns to leaders in his organization with confidence that they will be read and addressed.
Hammad wants his concerns to be visible to all members of this organization. If some one shares his concern, he wants them to be able to +1 him. He feels this will make his concern be taken more seriously.
Hammad thinks that leaders of his organization can dodge hard questions using techniques they learned in media training. He wants a real answer.
Emilie is a leader of a large organization
Emilie wants to hear the concerns of all employees so she can address them timely. She wants to do that in an inclusive but time efficient manner.
Emilie wants to know what concerns are more prevalent so she can prioritize them.
When Emilie addresses a concern, she wants it to reach everyone. She find that often she has to address the same concern multiple times.
This is where I dump my thoughts on tech implementation.
I want make it extremely easy to integrate this app with an arbitrary authentication system. There are so many popular authentication standards out there; it impossible to support all or choose some. So to meet my goal of easy integration I have decided to keep authentication completely out of this app.
This app should be deployed behind a proxy that handles authentication and just passes the username of the authenticated user to this app. The authenticated username is passed as a header (default name 'X-Forwarded-User').
This app only accepts requests from localhost. This will ensure that no external user can bypass the proxy and connect directly to the app with a fake header.
Topic: Conversation subject. Voice: Think of it as a comment.
creator: Username of the creator of a topic slug: a url friendly identifier for a topic. Together, creator and slug uniquely identify any topic.
Table: Topics
creator string | partition key
slug string | sort key
title string
timestamp string
lastupdated string
Table: Voices
topicIdentifier string | partition key (topicIdentifier = creator + slug)
voiceItentidier string | sort key (voiceItentidier = speaker's username + timestamp)
timestamp string
username string
text string
upvotedBy arrayOfString | username
heardBy arrayOfString | username
responseVoiceIdentifiers arrayOfStrings | {voiceItentidier}
type string | primary or response
archived bool
/ homepage explaining the tool + list top N topics by lastupdated + create new button
/creator list all topics of user by last updated + create new topic
/creator/slug list all voices by creation date + add voice
Create Topic | creator + slug
Get Topic | creator + slug
Add Voice | topicIdentifier + speaker's username
Delete Voice | topicIdentifier + voiceIdentifier
Mark Read | topicIdentifier + voiceIdentifier + username
Add up-vote | topicIdentifier + voiceIdentifier + username
Remove up-vote | topicIdentifier + voiceIdentifier + username
Add response voice topicIdentifier + voiceIdentifier + speaker's username
Remove response voice topicIdentifier + voiceIdentifier
-
Setup Node/React env
-
Create database tables
-
Integrate with a material-ui module. (choose http://www.material-ui.com/)
-
Setup redux
-
Basic topic feature
- add topic database controller
- get topic database controller
- get topics database controller
- add topic react communicator
- get topic react communicator
- / page. See topics
- / page. Add topic modal
- / page.
- /creator page. See topics
-
Basic Voices feature
-
add voice database controller
-
get voices database controller
-
add voice react communicator
-
get voices react communicator
-
/creator/slug page. See topic info
-
/creator/slug page. See voices
-
/creator/slug page. Add voice
-
support pagination on getVoices. dynamodb paginates results at 1MB i.e about 4k to 8k voices
-
Delete Voice feature
-
delete voice database controller
-
delete voice react communicator
-
delete voice UI
-
-
Upvote Voices feature
- upvote database controller
- upvote react communicator
- upvote UI
-
Voice Heard Feature
- mark as heard database controller
- mark as heard react communicator
- heard UI
- heard auto detector based on scroll
-
Auto username feature
- openID integration so we can get username automatically. (See Tech Notes)
- readonly support for those without ID
-
Response voice feature
- add response voice database controller
- add response voice react communicator
- add response voice UI
-
auto load changes made by other users
- add voice
- delete voice
- add response voice
- delete response voice
- edit topic ?
-
Create react database communicator to talk to node database controller
-
Sorting Voice feature
- do we need to do something on the backend for optimization?
- sorting UI
Edit dynamoDB configurations in '.env' file so they points to a valid DB.
NOTE: For a better development experience you can setup a local dynamoDB instance. See: https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/
Once the '.env' file points to a valid dynamoDB, create required tables and initialize table values:
node ./server/databaseHandlers/initializer
Prerequisite: DynamoDB Setup. See section above.
npm install
npm run start