====== Requirement ====== Groups - Users of the learning site can create groups. - While creation a group can be made Public or Private. - If a group is private, it means that users will require an invite from the group owner to join the group. - If a group is public it may be publicly listed and searchable. Users can initiate a request to join such group. The group owner can also invite users to join public group. - While creating a public group the creator can specify whether the owner's approval is required for each join request or the users can join the group without approval (i.e. auto approval) Invitations - Group owner can invite users to join the group. - Invitations can be made to users who are currently part of the learning website or to the people who are not part of the system. In both the cases an invitation email will be sent to the person. The email message will contain links to "Accept" or "Decline" the invitation. - The users who are invited and are part of the learning system will also see the invitation message in the "messages" section from where they can accept or decline the invitation. - Users who are invited and are not part of the learning system will be asked to register if they "Accept" the invitation. After registration they will be added to the group. - Till the time the invited users have not taken any action on the invitation their invitation will be put under "Pending" status. Membership Requests - If the group is public then the users can request to join the group. A notification will be sent to the group owner (if auto approval is turned off) indicating that someone has requested to join the group. There should be some section in the UI (Manage Group) which should provide list of pending membership request. Misc features related to groups - **Group Searching/Listing** - There should be a public page which allows searching/listing all the public groups, with a "Join Group" link next to each group. Users can search/view for the groups here and click on "Join" to request to join the group. * If user is already part of the group, we should not show the "Join Group" link next to that group in the public listing page, instead it should read "Leave Group". - **My Groups** - Each user should have a section called **"My groups"** from where they can see their groups (i.e. groups created by them as well as groups that the user is part of). Clicking on a group should open a "Group details" page. - **Group Details** - This detailed page of a group can have tabs like "List members", "Manage Group", "Group statistics", "Discussions" * **List Members** tab should list all the members of the group. Next to each member we can have action links like "Send Message" (to send personal message to the user), "Remove User" (to remove user from group. Option available only if the current user is owner of group), "Chat" (to do one to one chat with the user). * **Manage Group** tab can have various links/tabs that initiate some actions. This tab will be available only if current user is owner of the group. The possible actions can be: * "Edit" - To open a UI from where group information like name, description etc... can be edited. * "Requests to join" - UI that lists the users whose requests to join are pending for approval along with "Accept" and "Decline" links next to each user. * "Invited" - UI that lists all the users to whom an invitation was sent to join the group. Next to each invitation we show current status of the invitation i.e. "pending", "accepted" or "declined". The if the status is "pending" we can have a link to "Expire" the invitation. If the invitation is expired, the user to whom he invitation was sent can no longer accept the invitation. * "Send Invitations" - Opens UI from where the owner can send invitations to other users to join the group. Owner can type in list of comma separated email address and some message that will be sent in the invitation mail. * **Group statistics** tab should show charts and statistics related to the group. e.g. number of members over a period of time, activity over period of time etc... * **Group Discussions** - Group discussions are similar to forums but more of an informal kind of forum. Any group user can post a Discussion topic. This topic will be visible to the group members in "Discussions" tab, from where the members can comment on the topic. - **Group messaging** * Messages that are sent/received as part of group invitation, join request etc. will have a type="Group Notification". This will make it easy to categorize the messages. The messages section can have a filter to filter the messages based on the type. * There should be an option to send messages to the group. A message sent to a group will internally send the message to all the group members and will show in their inbox section. Such message will also have type="Group Notification", so that it can be easily filtered from other messages. - **Group enrollment** * Courses can be created for a particular group and only members of that group can see and enroll * Enrollment is based on membership in that group (here groups act as a flat organization, with no linkage to other groups) * Visibility is based on membership in that group ====== DB schema ====== Table Name : groups ^ Column_name ^type ^ Description ^ | id | integer | primary key | | name| varchar | name of the group | | description| text | description of the group | | rules| text | Text that contains rules to follow when doing any activity in the group | | owner_id| integer | owner of the group | | is_private| boolean | indicates whether the group is private or public e.g. for private group the users need invitation to join. For public groups owner can invite and also users can request to join the group | | auto_approve_members | boolean | Indicates whether join requests are auto approved or not. Value in this field is valid if the group is public. | | logo_id | integer | Id of the photo which will serve as group's logo | | member_count | integer | number of members in the group. | | create_at | date_time |created date | | updated_at | date_time|updated date | | deleted_at | date_time|deleted date | Table Name : group_users ^ Column_name ^type ^ Description ^ | id | integer | primary key | | group_id | integer | refers to the group | | user_id | integer | user id | | status | integer | status of membership. (Pending, Rejected, Accepted). This column is important when user requests to join the group. | | created_at| date_time | join date of the user to the group | | updated_at| date_time | | | deleted_at| date_time | date when member was removed | Table Name: invites ^ Column_name ^type ^ Description ^ | id | integer | primary key | | message | string | message sent along with the invitation | | user_id | integer | user who had sent the invitation | | associated_id | integer | foreign key of the associated entity | | associated_type | string | class name of the associated entity e.g. Group (right now we might have only invitation to group, in future we may have some other types of invites) | | created_at | integer | Time when the record was created | | updated_at | integer | Time when the record was updated | Table Name: invite_users ^ Column_name ^type ^ Description ^ | id | integer | primary key | | invite_id | integer | reference to ID column of invites table | | user_id | integer | user to whom the invitation was sent (will have value only if invitation is sent to user who is part of the learning system) | | security_token | string | security_token used when the invitation is sent via email to people who are not registered with the system | | status | integer | status of the invitation (Declined, Pending, Accepted,Expired ) | | email | string | Email address to which the invitation was sent (will have value only if invitation is sent to person who is not part of the learning system) | | created_at | integer | Time when the record was created | | updated_at | integer | Time when the record was updated | Modify Table: messages This change is required so that it is easy to identify and categorize the messages. ^ Column_name ^type ^ Description ^ | type | string | type of message (e.g. General, Notification) |