Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

...

Property

Sub-property

Values

Description

name

{category name}

name of the category.

pid

{parent category id}

under which parent category, this category should get created.

Context

Code Block
{
  "type": "course",
  "identifier": "$courseId"
}

or

Code Block
{
  "type": "batch",
  "identifier": "$batchId”
}
Code Block
{
  "type": "course",
  "identifier": "do_37819”
}

or

Code Block
{
  "type": "batch",
  "identifier": "0312047"
}

  • type: this is the sbType

  • identifier: this is the sbIdentifier

  • if you want to add different types we have to change the value of types
    ex: “Course”, “Batch”, “Group”, “GroupMember”

enbaleGroups
(to de discussed)

true / false

If set true then, It will be used to create groups to add privileges to a certain set of user (according to our requirement)

groups (optional)

Code Block
{
  "name": "<group name>",
  "privileges": [
    < set of privileges >
  ]
}

Code Block
{
  "name": "category owner",
  "privileges": [
    "groups:topics:reply",
    "groups:topics:create"
  ]
}

  • If this object is exist then create the group else don't create

  • It will be used to define certain set of privileges so that it can be used for the categories.

  • If copyFromCategory is defined, then this is optional. Because all the groups added for copyFromCategory will be adding to this category

privileges

  • To set some rules for the users, if we dont want to create the groups. That

copytoChildren

true/false

  • This is used to copy the groups to all sub-categories

  • The same group will be added to sub-categories with the privileges.

copyFromCategory

{category_id}

  • When we mention this property, groups object will become optional.

  • It will copy all the groups & privileges from the specified category & add it to the new category(with the same group name & privileges)

copytoChildren

true / false

If set, it will take the rules

from the given category.

copyFromCategory

category_id, from where it should take the privileges. groups are optional when category_id mention here. It will copy the group & privileges from category_id

subcategories

categories which is gonna be created under the parent category

name

Example: “Announcement“, “General discussion“

name of the subcategory

pid

parent category id under which the sub-category will be created

description

description of the sub-category

context

Code Block
{
    "type": "batch",
    "identifier": "$batchId"
}
Code Block
{
    "type": "batch",
    "identifier": "0123456"
}

this is to communicate with the mapping table.

privileges

This is to override the privileges given at category level for group or user

copyFromCategory

category_id, from where it should take the privileges.

groups

Code Block
{
  "groups": [
    {
      "name": "<group_name>",
      "privileges": [
        <privileges for the group>
      ]
    }
  ]
}
Code Block
{
  "groups": [
    {
      "name": "enrolled users group",
      "privileges": [
        "groups:topics:reply"
      ]
    }
  ]
}

It will be used to define certain set of privileges so that it can be used for the categories. this is optional.

users

Code Block
"users": [
    {
      "uid": "{nodebb_uid}",
      "privileges": [
        <previleges for given set of users>
      ]
    }
  ]
Code Block
"users": [
    {
      "uid": "test_df_1994",
      "privileges": [
       "groups:topics:reply"
      ]
    }
  ]

the set of users, the privilges gonaa be set for.

Postman collection

https://www.getpostman.com/collections/d0ee01a742409791dcc5

Geeralization of api

This api is for creating a context with mappig category and enablig groups ad adding users into groups.

Code Block
curl --location --request POST 'https://dev.sunbirded.org/discussion/forum/v3/create' \
--header 'Connection: keep-alive' \
--header 'Access-Control-Allow-Origin: *' \
--header 'Accept: application/json' \
--header 'X-App-Id: dev.sunbird.portal' \
--header 'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' \
--header 'X-Device-Id: 6d20ec529bbe2081fbbd2ab80398e81c' \
--header 'X-Channel-Id: b00bc992ef25f1a9a8d63291e20efc8d' \
--header 'Content-Type: application/json' \
--header 'Origin: https://dev.sunbirded.org' \
--header 'Sec-Fetch-Site: same-origin' \
--header 'Sec-Fetch-Mode: cors' \
--header 'Sec-Fetch-Dest: empty' \
--header 'Referer: https://dev.sunbirded.org/my-groups/group-details/5bb0f6d6-58b8-4e90-8fa9-77c38901d8b4' \
--header 'Accept-Language: en-US,en;q=0.9' \
--header 'Cookie: _csrf=5E5KVAVALy__G4RVgzUGt7Za; connect.sid=s%3AztbChUZUWd1Ch8XpFtKm-8WMpqI8ojIq.kI9DLqKrBoTRyj%2FVknHYEgl8BEbaRnuqvyRIwtUL63U' \
--data-raw '{
    "category": {
        "name": "Test Generalization API - 2",
        "pid": "34",
        "uid": "1",
        "description": "",
        "context": [
           {
            "type": "course",
            "identifier": "KP_FT_1602790320113"
          }
        ],
        "enbaleGroups": "true",
                "groups": [
          {
            "name": "Owner Group",
            "privileges": [
              "groups:topics:reply",
              "groups:topics:create"
            ],
              "sbUids" : ["8454cb21-3ce9-4e30-85b5-fade097880d8", "fca2925f-1eee-4654-9177-fece3fd6afc9"]
          },
          {
            "name": "enrolled users group",
            "privileges": [
              "groups:topics:reply"
            ],
              "sbUids" : ["8454cb21-3ce9-4e30-85b5-fade097880d8", "fca2925f-1eee-4654-9177-fece3fd6afc9"]
          }
        ],
         "privileges": {
          "copytoChildren": "false",
          "copyFromCategory": ""
        }
    }
}'

Generalization api for Update(If there is any mistakes)

...

List of privileges

Privilege

Value

Description

groups:find

true/false

groups:Allow the user get fetch category using api

groups:read

true/false

Allow the user to access category from UI

groups:topics:read

true/false

Access Topics

groups:topics:create

true/false

Create Topics

groups:topics:reply

true/false

Reply to Topics

groups:topics:tag

true/false

Can access Tag Topics

groups:posts:edit

true/false

User can edit the post

groups:posts:history

true/false

User can able to see edit history

groups:posts:delete

true/false

user can able to delete post

groups:posts:upvote

true/false

user can upvote to a post

groups:posts:downvote

true/false

user can down vote to a post

groups:topics:delete

true/false

user can delete the topic

groups:posts:view_deleted

true/false

user can see the deleted posts

groups:purge

true/false

user can able to remove

groups:moderate

true/false

user can be a moderator

Get groups List

To get list of groups, follow the below CURL

...

Code Block
curl --location --request POST 'http://localhost:4567/api/forum/v2/uids' \
--header 'Authorization: Bearer 550998a7-4036-4482-b152-03ff5dedcde0' \
--header 'Content-Type: application/json' \
--header 'Cookie: express.sid=s%3AafcKVNRDU5uKTnTDVIWvs1zZbtdfRYj9.2gZpGnKf6S8PhOk0GsDauciGdZ%2F%2BxPqNPTSy6wQ6WZU' \
--data-raw '{
    "request": {
        "sbIdentifiers": ["fca2925f-1eee-4654-9177-fece3fd6afc9","8454cb21-3ce9-4e30-85b5-fade097880d8"]
    }
}'

Form API config for generalization API

Group for course/batch/groups etc:


Code Block
groups: [
    {
        "name": "Group_name", // Group for all creators
        "sbIds": [$userIdentifier],
        "privileges": [group:topic:create, group:topic:reply]
    }
]


We are calling this api when the new course created from UI (can be sunbird/IGOT).

the payload looks like


Form Read

Code Block
{
    "id": "api.form.read",
    "params": {
        "resmsgid": "cbdc71cb-8c0f-4714-b164-1ee2c4f98125",
        "msgid": "74b0c5df-720d-4777-8d12-123d0c094ce1",
        "status": "successful"
    },
    "responseCode": "OK",
    "result": {
        "form": {
            "type": "global",
            "subtype": "forum",
            "action": "creation",
            "component": "*",
            "framework": "*",
            "data": {
                "templateName": "defaultTemplate",
                "action": "creation",
                "fields": [
                    {
                        "index": 0,
                        "type": "Course",
                        "title": "Course",
                        "primaryCategoryId": "2 ",
                        "groups": [
                            {
                                "name": "Course_Owner",
                                "permissions": [
                                    "read",
                                    "vote",
                                    "post",
                                    "moderate",
                                    "topic"
                                ],
                                "SbIds": ["$Sunbird_identifier"] // can be changed
                            }
                        ],
                        "subCategoris": [
]
                    }
                ]
            },
            "created_on": "2021-02-04T09:27:01.635Z",
            "last_modified_on": "2021-02-04T10:08:29.445Z",
            "rootOrgId": "*"
        }
    },
    "ts": "2021-03-16T15:20:46.990Z",
    "ver": "1.0"
}


Request Payload

Code Block
{
    "category": {
        "name": "Course Name",
        "pid": "120", // categoryId which holds all course categories
        "description": "Creators can start discussions", // can be change
        "context": [
            {
                "type": "course",
                "identifier": "course_013178064710950002"
            }
        ],
       "groups": [
            {
                "name": "Creator_Group", // group name
                "privileges": [          // what are the privileges that creator role has
                    "groups:topics:reply",
                    "groups:topics:create"
                ],
                "sbUids": [ // subbird identifiers
                    "8454cb21-3ce9-4e30-85b5-fade097880d8"
                ]
            }
       ]
    }
}



Batch

Code Block
groups: [
    {
      "name": "Group_name", // Group for all mentor
        "sbIds": [$userIdentifier],
        "privileges": [group:topic:create, group:topic:reply]
    }
]


We are calling this api when the new batch created from UI (can be sunbird/IGOT).

Note: sbIds batch mentors id's and this id's added into mentors groups

the payload looks like


Code Block
{
    "id": "api.form.read",
    "params": {
        "resmsgid": "cbdc71cb-8c0f-4714-b164-1ee2c4f98125",
        "msgid": "74b0c5df-720d-4777-8d12-123d0c094ce1",
        "status": "successful"
    },
    "responseCode": "OK",
    "result": {
        "form": {
            "type": "global",
            "subtype": "forum",
            "action": "creation",
            "component": "*",
            "framework": "*",
            "data": {
                "templateName": "defaultTemplate",
                "action": "creation",
                "fields": [
                    {
                        "index": 0,
                        "type": "Course",
                        "title": "Course",
                        "primaryCategoryId": "2 ",
                        "groups": [
                            {
                                "name": "Course_Owner",
                                "permissions": [
                                    "read",
                                    "vote",
                                    "post",
                                    "moderate",
                                    "topic"
                                ],
                                "SbIds": ["$Sunbird_identifier"] // can be changed
                            }
                        ],
                        "subCategories": [
                            {
                                "name": "Announcements",
                                "groups": [
                                    {
                                        "name": "Group_name",
                                        "sbIds": ["$userIdentifier"],
                                        "privileges": ["group:topic:create", "group:topic:reply"]
                                    }
                                ],
                                "privileges": {
                                    "copyFromParent": "true/false"
                                }
                            },
                            {
                                "name": "General Discussions",
                                "groups": [
                                    {
                                        "name": "Group_name",
                                        "sbIds": ["$userIdentifier"],
                                        "privileges": ["group:topic:create", "group:topic:reply"]
                                    }
                                ],
                                "privileges": {
                                    "copyFromParent": "true/false"
                                }
                            }
                        ]
                    }
                ]
            },
            "created_on": "2021-02-04T09:27:01.635Z",
            "last_modified_on": "2021-02-04T10:08:29.445Z",
            "rootOrgId": "*"
        }
    },
    "ts": "2021-03-16T15:20:46.990Z",
    "ver": "1.0"
}


Request payload

Code Block
{
    "category": {
        "name": "Batch Name",
        "pid": "120", // categoryId which holds all course categories
        "description": "Creators can start discussions", // can be change
        "context": [
            {
                "type": "batch",
                "identifier": "batch_013178064710950002"
            }
        ],
        "groups": [
                {
                    "name": "Creator_Group", // group name
                    "privileges": [          // what are the privileges that creator role has
                        "groups:topics:reply",
                        "groups:topics:create"
                    ],
                    "sbUids": [ // subbird identifiers
                        "8454cb21-3ce9-4e30-85b5-fade097880d8"
                    ]
                }
            ],
           "subCategories": [
                {
                    "name": "Announcements",
                    "groups": [
                        {
                            "name": "Group_name",
                            "sbIds": ["$userIdentifier"],
                            "privileges": ["group:topic:create", "group:topic:reply"]
                        }
                    ],
                    "privileges": {
                        "copyFromParent": "true/false"
                    }
                },
                {
                    "name": "General Discussions",
                    "groups": [
                        {
                            "name": "Group_name",
                            "sbIds": ["$userIdentifier"],
                            "privileges": ["group:topic:create", "group:topic:reply"]
                        }
                    ],
                    "privileges": {
                        "copyFromParent": "true/false"
                    }
                }
            ]
    }
}

Groups

Code Block
{
    "category": {
        "name": "Group Name",
        "pid": "120", // categoryId which holds all course categories
        "description": "Creators can start discussions", // can be change
        "context": [
            {
                "type": "group",
                "identifier": "group_013178064710950002"
            }
        ]
    }
}

Comments

MOM: Generalization of API

participents:

Rayulu Villa Vinu Kumar Venkatanarayana Kadiveti Sudip Mukherjee

  1. If a user passes both privileges object which contain copyFromCategory and groups object, it should throw error

req payload should contain either privileges or groups not both.

  1. Giving privileges to users directly instead of creating groups, adding privileges and adding him into groups.

  2. subcategories should have copyFromParent.

  3. Unenrolled users should have read access.

  4. We should think of a new way instead of depending on form api configuration(creating new component and there should handle all context configuration).