Suggest a friend / group

Proposal 1
Premise: The suggestion feature allows the signed in user to suggest many contacts to one contact or group. The reason for going many-to-one as opposed to one-to-many is that many-to-one gets more (n) people involved with the site per Suggest action instead of a single (1) contact to follow through. This approach should result in higher activity and likelihood of connecting new contacts or group members. Slight alternative to this is to send bidirectional introductions i.e., Suggest this contact to many contacts as well as suggesting many contacts to this user. Suggesting a Group would work the same where where the user can suggest a group to many of their contacts.

Init: Say you are signed in as @csarven.

On /zach
Click on :
 * Web channel: POST to /main/suggest with contact=zach
 * XHR channel: POST to /main/suggest with contact=zach and ajax=1 (receives a subset of Web channel)

Create a Suggestion (Web channel: /main/suggest)

 * 1) Select from a list:
 * 2) * My contacts
 * 3) * My groups
 * 4) Input contact name to be suggested. If contact=zach, prefill it

Showing the suggestion list: Given that user wants to able to suggest this contact to anyone in their subscriptions list. If @csarven wants to suggest @zach to @evan, @aric, @nate, there are some options to do this:
 * 1) Allow the contact names to be entered (separated by space) in an input form e.g., @evan @aric @nate.
 * 2) Allow the user to go through their subscriptions list (similar to /csarven/subscriptions) with checkboxes on every profile. Prev and Next buttons will submit the current state of the form and allow the user to continue until they Submit the suggestion.
 * 3) Same as above (2) but the user first searches for a name.

Limits: There may be a need to set a max number of contacts to Suggest someone to per action. It can be configurable by admins.

Create a Suggestion (XHR channel)

 * Same as 1 and 2 from Web Channel. contact=zach is prefilled

@zach gets a DM
"@csarven suggests "

Todo

 * Review process, URLs, info on page

Proposal 2
This is the "Discovery" bit intended for post-0.9.0 release

Create a Suggestion (Web channel: /main/suggest)

 * 1) Give this suggestion a name (if it exists, load it up and allow edit)
 * 2) Option to set it public or private

On /csarven/suggests

 * Shows a timeline of all the suggestions
 * Has a list of suggestion names

On /csarven/suggests/name

 * Public page (if set to public)
 * Can be edited (add/remove) by @csarven
 * Show a list of contacts and groups where they can be subscribed (possibly similar to /csarven/subscriptions page)

On /csarven

 * Show a list of suggestions (i.e., links to /csarven/suggests/foo, /csarven/suggests/bar etc.) or maybe only a link to /csarven/suggests

Suggest a friend / group widget

 * Link for suggest a friend / group widget will be on aside with subscriptions and groups info
 * Design of widget will follow the idioms of other social network sites
 * Popup .js with checkboxes next to each friend / group
 * Suggestor can suggest multiple users / groups at one time (a list)
 * Suggestor can only suggest users who are subscribed to him/her


 * Submit will send out email to suggestee with a suggestion list link -- a URL with a code (random string similar to how invites work)


 * Following the URL in the email will take suggestee to a page where he/she is given opportunity to subscribe to each suggested user

DB
create table suggestion (   code varchar(32) not null primary key comment 'random code identifying the suggestion',    type tinyint not null default 0 comment 'whether the suggestion is for a user or a group',    suggestee_id int not null comment 'who the suggestion is to' references user (id),    suggestor_id int not null comment 'who the suggestion is from' references user (id),    suggestion_id int not null comment 'the suggested user or group',    private tinyint not null default 1 comment 'is this suggestion private? Default true.',    created datetime not null comment 'date this record was created',

index suggestion_code_idx (code) ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;


 * We will store a row for each suggestee + suggestor + suggestion + code
 * We should be able to pull up a list of suggested users by code
 * We should keep suggestion data, so we can do stuff with it later