Changes between Version 31 and Version 32 of api_v1


Ignore:
Timestamp:
2012-11-06T00:28:17Z (12 years ago)
Author:
Pan Luo
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • api_v1

    v31 v32  
    1 == Overview ==
     1[[PageOutline(1-100,Table of Contents)]]
     2
     3= Overview =
    24
    35This is the first version of API. The main purpose of this version of API is to provide a way for external applications, e.g., learning management system, to interact with iPeer with tighter integration and better user experience. Data returned will be in JSON format with XML support coming later.
    46
    5 == Authentication ==
     7= Authentication =
    68OAuth 1.0a
    79
    8 == Resources ==
    9 
    10 === Users ===
    11 
    12 ||GET||/v1/users||get a list of users||
    13 || ||parameter||none||
    14 || ||input||none||
    15 || ||status (success)||HTTP/1.1 200 OK||
    16 || ||output (success)||[{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"id":"USER1_ID","role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}]||
    17 || ||status (failure)||HTTP/1.1 404 Not Found||
    18 || ||output (failure)||none||
    19 ||GET||/v1/users/{id}||get a user with id||
    20 || ||parameter||USER_ID||
    21 || ||input||none||
    22 || ||status (success)||HTTP/1.1 200 OK||
    23 || ||output (success)||{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
    24 || ||status (failure)||HTTP/1.1 404 Not Found||
    25 || ||output (failure)||none||
    26 ||POST||/v1/users||create a user||
    27 || ||parameter||none||
    28 || ||input||{"role_id":"ROLE_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
    29 || ||status (success)||HTTP/1.1 201 CREATED||
    30 || ||output (success)||{"id":"USER_ID","role_id":"ROLE_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
    31 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    32 || ||output (failure)||none||
    33 ||POST||/v1/users||create users||
    34 || ||parameter||none||
    35 || ||input||{"role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
    36 || ||status (success)||HTTP/1.1 201 CREATED||
    37 || ||output (success)||{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"id":"USER1_ID","role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
    38 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    39 || ||output (failure)||none||
    40 ||DELETE||/v1/users/{id}||remove a user with id||
    41 || ||parameter||USER_ID||
    42 || ||input||none||
    43 || ||status (success)||HTTP/1.1 204 No Content||
    44 || ||output (success)||none||
    45 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    46 || ||output (failure)||none||
    47 ||PUT||/v1/users/{id}||update a user with id||
    48 || ||parameter||COURSE_ID||
    49 || ||input||{"id":"USER_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME","role_id":"ROLE_ID"}||
    50 || ||status (success)||HTTP/1.1 200 OK||
    51 || ||output (success)||{"id":"USER_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME","role_id":"ROLE_ID"}||
    52 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    53 || ||output (failure)||none||
    54 
    55 === Courses ===
    56 
    57 ||GET||/v1/courses||get a list of courses for current logged in user||
    58 || ||parameter||none||
    59 || ||input||none||
    60 || ||status (success)||HTTP/1.1 200 OK||
    61 || ||output (success)||[{"id":"COURSE0_ID","course":"COURSE0_CODE","title":"COURSE0_TITLE"},{"id":"COURSE1_ID","course":"COURSE1_CODE","title":"COURSE1_TITLE"}]||
    62 || ||status (failure)||HTTP/1.1 404 Not Found||
    63 || ||output (failure)||No courses can be found||
    64 ||GET||/v1/courses/{id}||get a course with id||
    65 || ||parameter||COURSE_ID||
    66 || ||input||none||
    67 || ||status (success)||HTTP/1.1 200 OK||
    68 || ||output (success)||{"id":"COURSE_ID","course":"COURSE_CODE","title":"COURSE_TITLE"}||
    69 || ||status (failure)||HTTP/1.1 404 Not Found||
    70 || ||status (failure)||No course with id COURSE_ID can be found||
    71 ||POST||/v1/courses||create a course||
    72 || ||parameter||none||
    73 || ||input||{"Course":{"course":"COURSE_CODE","title":"COURSE_TITLE"},"Department":{"Department":[DEPARTMENT_ID]}}||
    74 || ||status (success)||HTTP/1.1 201 Created||
    75 || ||output (success)||COURSE_ID||
    76 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    77 || ||output (failure)||Error: the course was not added||
    78 ||DELETE||/v1/courses/{id}||remove a course with id||
    79 || ||parameter||COURSE_ID||
    80 || ||input||none||
    81 || ||status (success)||HTTP/1.1 204 No Content||
    82 || ||output (success)||COURSE_ID||
    83 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    84 || ||output (failure)||Error: the course was not deleted||
    85 ||PUT||/v1/courses/{id}||update a course with id||
    86 || ||parameter||none||
    87 || ||input||{"Course":{"id":"COURSE_ID","course":"COURSE_CODE","title":"COURSE_TITLE"}}||
    88 || ||status (success)||HTTP/1.1 200 OK||
    89 || ||output (success)||COURSE_ID||
    90 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    91 || ||output (failure)||Error: the course was not edited||
    92 
    93 === !Courses/Users ===
    94 
    95 ||GET||/v1/courses/{course_id}/users||get a list of users associated within the course {course_id}||
    96 || ||parameter||COURSE_ID||
    97 || ||input|| none
    98 || ||status (success)||HTTP/1.1 201 Created||
    99 || ||output (success)||[{"id": "1", "username":"username1", "role_id":1}, {"id": "2", "username":"username2", "role_id":1},{"id": "3", "username":"username3", "role_id":2}]||
    100 || ||status (failure)||HTTP/1.1 400 Unrecognizable Request||
    101 || ||output (failure)|| none ||
    102 ||POST||/v1/courses{course_id}/users||associate users to the course by {course_id}||
    103 || ||parameter||COURSE_ID||
    104 || ||input||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}], other fields in request will be ignored||
    105 || ||status (success)||HTTP/1.1 200 OK||
    106 || ||output (success)||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}]||
    107 || ||status (failure)||HTTP/1.1 501 Unsupported role for {username}||
    108 || ||note (failure)|| The role_id was unrecognized, recognized role_ids right now are student (5), tutor (4), and instructor (3) ||
    109 || ||status (failure)||HTTP/1.1 501 Fail to enrol {username}||
    110 || ||note (failure)|| Tried to save the new enrolments but failed due to a database error. ||
    111 ||DELETE||/v1/courses/{course_id}/users||remove a user from the course||
    112 || ||parameter||COURSE_ID||
    113 || ||input||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}], other fields in request will be ignored||
    114 || ||status (success)||HTTP/1.1 200 OK||
    115 || ||output (success)||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}]||
    116 || ||status (failure)||HTTP/1.1 501 Unsupported role for {username}||
    117 || ||note (failure)|| The role_id was unrecognized, recognized role_ids right now are student (5), tutor (4), and instructor (3) ||
    118 || ||status (failure)||HTTP/1.1 501 Fail to drop {username}||
    119 || ||note (failure)|| Tried to save the new enrolments but failed due to a database error. ||
    120 
    121 === !Courses/Departments ===
    122 
    123 ||POST||/v1/courses/{course_id}/departments/{department_id}||add a course to a department||
    124 || ||parameter||DEPARTMENT_ID||
    125 || ||parameter||COURSE_ID||
    126 || ||status (success)||HTTP/1.1 201 Created||
    127 || ||output (success)||{"course_id":"COURSE_ID", "department_id":"DEPARTMENT_ID"}||
    128 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    129 || ||output (failure)||none||
    130 ||DELETE||/v1/courses/{course_id}departments/{department_id}/||delete a course from a department||
    131 || ||parameter||DEPARTMENT_ID||
    132 || ||parameter||COURSE_ID||
    133 || ||status (success)||HTTP/1.1 204 No Content||
    134 || ||output (success)||none||
    135 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    136 || ||output (failure)||none||
    137 
    138 === Departments ===
    139 
    140 ||GET||v1/departments||get a list of departments the user has access to||
    141 || ||parameter||none||
    142 || ||status (success)||HTTP/1.1 200 OK||
    143 || ||output (success)||[{"id":"DEPT_ID0","name":"DEPT_NAME0"},{"id":"DEPT_ID1","name":"DEPT_NAME1"}]||
    144 || ||status (failure)||HTTP/1.1 404 Not Found||
    145 || ||output (failure)||none||
    146 ||GET||v1/departments/{department_id}||gets a list of courses that belongs to the department with DEPARTMENT_ID||
    147 || ||parameter||DEPARTMENT_ID||
    148 || ||status (success)||HTTP/1.1 200 OK||
    149 || ||output (success)||[{"id":"COURSE0_ID","course":"COURSE0_CODE","title":"COURSE0_TITLE"},{"id":"COURSE1_ID","course":"COURSE1_CODE","title":"COURSE1_TITLE"}]||
    150 || ||status (failure)||HTTP/1.1 404 Not Found||
    151 || ||output (failure)||none||
    152 
    153 === Groups ===
    154 
    155 ||GET||/v1/courses/{course_id}/groups||get a list of groups in course {course_id}||
    156 || ||parameter||COURSE_ID||
    157 || ||input||none||
    158 || ||status (success)||HTTP/1.1 200 OK||
    159 || ||output (success)||[{"id":"GROUP_IDO","group_num":"GROUP_NUM0","group_name":"GROUP_NAME0","course_id":"COURSE_ID"},{"id":"GROUP_ID1","group_num":"GROUP_NUM1","group_name":"GROUP_NAME1","course_id":"COURSE_ID"}], or [] if there is no group||
    160 || ||status (failure)||HTTP/1.1 500 Internal Error||
    161 || ||output (failure)||none||
    162 ||GET||/v1/courses/{course_id}/groups/id||get a group in course by group id, course_id will be ignored||
    163 || ||parameter||COURSE_ID||
    164 || ||parameter||GROUP_ID||
    165 || ||status (success)||HTTP/1.1 200 OK||
    166 || ||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
    167 || ||status (failure)||HTTP/1.1 404 Not Found||
    168 || ||output (failure)||none||
    169 ||POST||/v1/courses/{course_id}/groups||create a group in course {course_id}||
    170 || ||parameter||COURSE_ID||
    171 || ||input||{"group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
    172 || ||status (success)||HTTP/1.1 201 Created||
    173 || ||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
    174 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    175 || ||output (failure)||none||
    176 ||DELETE||/v1/courses/{course_id}/groups/{id}||remove a group  in course by group id, course_id will be ignored||
    177 || ||parameter||COURSE_ID||
    178 || ||parameter||GROUP_ID||
    179 || ||status (success)||HTTP/1.1 204 No Content||
    180 || ||output (success)||none||
    181 || ||status (failure)||HTTP/1.1 500 Internal Server Error||
    182 || ||output (failure)||none||
    183 ||PUT||/v1/courses/{course_id}/groups/{id}||update a group in course by group id, course_id will be ignored||
    184 || ||parameter||COURSE_ID||
    185 || ||parameter||GROUP_ID||
    186 || ||input||{"id":"GROUP_ID","course_id":"COURSE_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME"}||
    187 || ||status (success)||HTTP/1.1 200 OK||
    188 || ||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
    189 || ||status (failure)||HTTP/1.1 200 OK||
    190 || ||output (failure)||none||
    191 
    192 === !Groups/Users ===
    193 
    194 ||GET||/v1/groups/{group_id}/users||get a list of users associated within the group {group_id}||
    195 ||POST||/v1/groups{group_id}/users||associate users to the group by {group_id}||
    196 ||DELETE||/v1/groups/{group_id}/users/{user_id}||remove a user from the group||
    197 || ||parameter||GROUP_ID||
    198 || ||parameter||USER_ID||
    199 || ||status (success)||HTTP/1.1 204 No Content||
    200 || ||output (success)||none||
    201 || ||status (failure)||HTTP/1.1 500 users were not deleted||
    202 || ||output (failure)|| none ||
    203 
    204 === Grades ===
    205 
    206 ||GET||/v1/events/{event_id}/grades||get a list of grades in event {event_id}||
    207 || ||parameter||EVENT_ID||
    208 || ||status (success)||HTTP/1.1 200 OK||
    209 || ||output (success)||[{"evaluatee":"EVALUATEE_ID","score":"SCORE"},{"evaluatee":"EVALUATEE_ID","score":"SCORE"}]||
    210 || ||status (failure)||HTTP/1.1 404 Not Found||
    211 || ||output (failure)||none||
    212 ||GET||/v1/events/{event_id}/grades/{user_id}||get a grades for a user with {user_id} in the event {event_id}||
    213 || ||parameter||EVENT_ID||
    214 || ||parameter||USER_ID||
    215 || ||status (success)||HTTP/1.1 200 OK||
    216 || ||output (success)||{"evaluatee":"USER_ID","score":"SCORE"}
    217 || ||status (failure)||HTTP/1.1 404 Not Found||
    218 || ||output (failure)||none||
     10= Responses & Status Code =
     11The API attempts to return appropriate HTTP status codes for every request.
     12
     13Status Code:
     14|| Code || Text || Description ||
     15|| 200 || OK || Success ||
     16|| 201 || Created || Resource has been created ||
     17|| 404 || Not Found || Resource is not found ||
     18|| 500 || Internal Server Error || Something is broken ||
     19
     20If querying a collection and there is nothing in the collection, an empty array will be return.
     21  In JSON, it will be "[]".
     22
     23
     24= Resources =
     25
     26== Users ==
     27
     28=== Get List of Users ===
     29GET /v1/users
     30||Return (success)||[{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"id":"USER1_ID","role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}]||
     31
     32=== Get a User with ID ===
     33GET /v1/users/{id}
     34 
     35||parameter||USER_ID||
     36||output (success)||{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
     37
     38=== Create a User ===
     39POST /v1/users
     40||parameter||none||
     41||input||{"role_id":"ROLE_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
     42||status (success)||HTTP/1.1 201 CREATED||
     43||output (success)||{"id":"USER_ID","role_id":"ROLE_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
     44||status (failure)||HTTP/1.1 500 Internal Server Error||
     45||output (failure)||none||
     46
     47=== Create Users ===
     48POST /v1/users
     49||parameter||none||
     50||input||{"role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
     51||status (success)||HTTP/1.1 201 CREATED||
     52||output (success)||{"id":"USER0_ID","role_id":"ROLE_ID","username":"USERNAME0","last_name":"LAST_NAME","first_name":"FIRST_NAME"},{"id":"USER1_ID","role_id":"ROLE_ID","username":"USERNAME1","last_name":"LAST_NAME","first_name":"FIRST_NAME"}||
     53||status (failure)||HTTP/1.1 500 Internal Server Error||
     54||output (failure)||none||
     55
     56=== Remove a user with id ===
     57DELETE /v1/users/{id}
     58||parameter||USER_ID||
     59||input||none||
     60||status (success)||HTTP/1.1 204 No Content||
     61||output (success)||none||
     62||status (failure)||HTTP/1.1 500 Internal Server Error||
     63||output (failure)||none||
     64
     65=== Update a user with id ===
     66PUT /v1/users/{id}
     67||parameter||COURSE_ID||
     68||input||{"id":"USER_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME","role_id":"ROLE_ID"}||
     69||status (success)||HTTP/1.1 200 OK||
     70||output (success)||{"id":"USER_ID","username":"USERNAME","last_name":"LAST_NAME","first_name":"FIRST_NAME","role_id":"ROLE_ID"}||
     71||status (failure)||HTTP/1.1 500 Internal Server Error||
     72||output (failure)||none||
     73
     74== Courses ==
     75
     76=== Get a list of courses for current logged in user ===
     77GET /v1/courses
     78||parameter||none||
     79||input||none||
     80||status (success)||HTTP/1.1 200 OK||
     81||output (success)||[{"id":"COURSE0_ID","course":"COURSE0_CODE","title":"COURSE0_TITLE"},{"id":"COURSE1_ID","course":"COURSE1_CODE","title":"COURSE1_TITLE"}]||
     82||status (failure)||HTTP/1.1 404 Not Found||
     83||output (failure)||No courses can be found||
     84
     85=== Get a course with id ===
     86GET /v1/courses/{id}
     87||parameter||COURSE_ID||
     88||input||none||
     89||status (success)||HTTP/1.1 200 OK||
     90||output (success)||{"id":"COURSE_ID","course":"COURSE_CODE","title":"COURSE_TITLE"}||
     91||status (failure)||HTTP/1.1 404 Not Found||
     92||status (failure)||No course with id COURSE_ID can be found||
     93
     94=== Create a course ===
     95POST /v1/courses
     96||parameter||none||
     97||input||{"Course":{"course":"COURSE_CODE","title":"COURSE_TITLE"},"Department":{"Department":[DEPARTMENT_ID]}}||
     98||status (success)||HTTP/1.1 201 Created||
     99||output (success)||COURSE_ID||
     100||status (failure)||HTTP/1.1 500 Internal Server Error||
     101||output (failure)||Error: the course was not added||
     102
     103=== Remove a course with id ===
     104DELETE /v1/courses/{id}
     105||parameter||COURSE_ID||
     106||input||none||
     107||status (success)||HTTP/1.1 204 No Content||
     108||output (success)||COURSE_ID||
     109||status (failure)||HTTP/1.1 500 Internal Server Error||
     110||output (failure)||Error: the course was not deleted||
     111
     112=== Update a course with id ===
     113PUT /v1/courses/{id}
     114||parameter||none||
     115||input||{"Course":{"id":"COURSE_ID","course":"COURSE_CODE","title":"COURSE_TITLE"}}||
     116||status (success)||HTTP/1.1 200 OK||
     117||output (success)||COURSE_ID||
     118||status (failure)||HTTP/1.1 500 Internal Server Error||
     119||output (failure)||Error: the course was not edited||
     120
     121== !Courses/Users ==
     122
     123=== Get a list of users associated within the course {course_id} ===
     124GET /v1/courses/{course_id}/users
     125||parameter||COURSE_ID||
     126||input|| none
     127||status (success)||HTTP/1.1 201 Created||
     128||output (success)||[{"id": "1", "username":"username1", "role_id":1}, {"id": "2", "username":"username2", "role_id":1},{"id": "3", "username":"username3", "role_id":2}]||
     129||status (failure)||HTTP/1.1 400 Unrecognizable Request||
     130||output (failure)|| none ||
     131
     132=== Associate users to the course by {course_id} ===
     133POST /v1/courses{course_id}/users
     134||parameter||COURSE_ID||
     135||input||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}], other fields in request will be ignored||
     136||status (success)||HTTP/1.1 200 OK||
     137||output (success)||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}]||
     138||status (failure)||HTTP/1.1 501 Unsupported role for {username}||
     139||note (failure)|| The role_id was unrecognized, recognized role_ids right now are student (5), tutor (4), and instructor (3) ||
     140||status (failure)||HTTP/1.1 501 Fail to enrol {username}||
     141||note (failure)|| Tried to save the new enrolments but failed due to a database error. ||
     142
     143=== Remove a user from the course ===
     144DELETE /v1/courses/{course_id}/users||
     145||parameter||COURSE_ID||
     146||input||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}], other fields in request will be ignored||
     147||status (success)||HTTP/1.1 200 OK||
     148||output (success)||[{"username":"username1", "role_id":5}, {"username":"username2", "role_id":5},{"username":"username3", "role_id":4}]||
     149||status (failure)||HTTP/1.1 501 Unsupported role for {username}||
     150||note (failure)|| The role_id was unrecognized, recognized role_ids right now are student (5), tutor (4), and instructor (3) ||
     151||status (failure)||HTTP/1.1 501 Fail to drop {username}||
     152||note (failure)|| Tried to save the new enrolments but failed due to a database error. ||
     153
     154== !Courses/Departments ==
     155
     156=== Add a course to a department ===
     157POST /v1/courses/{course_id}/departments/{department_id}
     158||parameter||DEPARTMENT_ID||
     159||parameter||COURSE_ID||
     160||status (success)||HTTP/1.1 201 Created||
     161||output (success)||{"course_id":"COURSE_ID", "department_id":"DEPARTMENT_ID"}||
     162||status (failure)||HTTP/1.1 500 Internal Server Error||
     163||output (failure)||none||
     164
     165=== Delete a course from a department ===
     166DELETE /v1/courses/{course_id}departments/{department_id}
     167||parameter||DEPARTMENT_ID||
     168||parameter||COURSE_ID||
     169||status (success)||HTTP/1.1 204 No Content||
     170||output (success)||none||
     171||status (failure)||HTTP/1.1 500 Internal Server Error||
     172||output (failure)||none||
     173
     174== Departments ==
     175
     176=== Get a list of departments the user has access to ===
     177GET v1/departments
     178||parameter||none||
     179||status (success)||HTTP/1.1 200 OK||
     180||output (success)||[{"id":"DEPT_ID0","name":"DEPT_NAME0"},{"id":"DEPT_ID1","name":"DEPT_NAME1"}]||
     181||status (failure)||HTTP/1.1 404 Not Found||
     182||output (failure)||none||
     183
     184=== Get a list of courses that belongs to the department ===
     185GET v1/departments/{department_id}
     186||parameter||DEPARTMENT_ID||
     187||status (success)||HTTP/1.1 200 OK||
     188||output (success)||[{"id":"COURSE0_ID","course":"COURSE0_CODE","title":"COURSE0_TITLE"},{"id":"COURSE1_ID","course":"COURSE1_CODE","title":"COURSE1_TITLE"}]||
     189||status (failure)||HTTP/1.1 404 Not Found||
     190||output (failure)||none||
     191
     192== Groups ==
     193
     194=== Get a list of groups in course {course_id} ===
     195GET /v1/courses/{course_id}/groups
     196||parameter||COURSE_ID||
     197||input||none||
     198||status (success)||HTTP/1.1 200 OK||
     199||output (success)||[{"id":"GROUP_IDO","group_num":"GROUP_NUM0","group_name":"GROUP_NAME0","course_id":"COURSE_ID"},{"id":"GROUP_ID1","group_num":"GROUP_NUM1","group_name":"GROUP_NAME1","course_id":"COURSE_ID"}], or [] if there is no group||
     200||status (failure)||HTTP/1.1 500 Internal Error||
     201||output (failure)||none||
     202
     203=== Get a group in course by group id, course_id will be ignored ===
     204GET /v1/courses/{course_id}/groups/id
     205||parameter||COURSE_ID||
     206||parameter||GROUP_ID||
     207||status (success)||HTTP/1.1 200 OK||
     208||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
     209||status (failure)||HTTP/1.1 404 Not Found||
     210||output (failure)||none||
     211
     212=== Create a group in course {course_id} ===
     213POST /v1/courses/{course_id}/groups
     214||parameter||COURSE_ID||
     215||input||{"group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
     216||status (success)||HTTP/1.1 201 Created||
     217||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
     218||status (failure)||HTTP/1.1 500 Internal Server Error||
     219||output (failure)||none||
     220
     221=== Remove a group  in course by group id, course_id will be ignored ===
     222DELETE /v1/courses/{course_id}/groups/{id}
     223||parameter||COURSE_ID||
     224||parameter||GROUP_ID||
     225||status (success)||HTTP/1.1 204 No Content||
     226||output (success)||none||
     227||status (failure)||HTTP/1.1 500 Internal Server Error||
     228||output (failure)||none||
     229
     230=== Update a group in course by group id, course_id will be ignored ===
     231PUT /v1/courses/{course_id}/groups/{id}
     232||parameter||COURSE_ID||
     233||parameter||GROUP_ID||
     234||input||{"id":"GROUP_ID","course_id":"COURSE_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME"}||
     235||status (success)||HTTP/1.1 200 OK||
     236||output (success)||{"id":"GROUP_ID","group_num":"GROUP_NUM","group_name":"GROUP_NAME","course_id":"COURSE_ID"}||
     237||status (failure)||HTTP/1.1 200 OK||
     238||output (failure)||none||
     239
     240== !Groups/Users ==
     241
     242=== Get a list of users associated within the group {group_id} ===
     243GET /v1/groups/{group_id}/users
     244
     245=== Associate users to the group by {group_id} ===
     246POST /v1/groups{group_id}/users
     247
     248=== Remove a user from the group ===
     249DELETE /v1/groups/{group_id}/users/{user_id}
     250||parameter||GROUP_ID||
     251||parameter||USER_ID||
     252||status (success)||HTTP/1.1 204 No Content||
     253||output (success)||none||
     254||status (failure)||HTTP/1.1 500 users were not deleted||
     255||output (failure)|| none ||
     256
     257== Grades ==
     258
     259=== Get a list of grades in event {event_id} ===
     260GET /v1/events/{event_id}/grades
     261||parameter||EVENT_ID||
     262||status (success)||HTTP/1.1 200 OK||
     263||output (success)||[{"evaluatee":"EVALUATEE_ID","score":"SCORE"},{"evaluatee":"EVALUATEE_ID","score":"SCORE"}]||
     264||status (failure)||HTTP/1.1 404 Not Found||
     265||output (failure)||none||
     266
     267=== Get a grades for a user with {user_id} in the event {event_id} ===
     268GET /v1/events/{event_id}/grades/{user_id}
     269||parameter||EVENT_ID||
     270||parameter||USER_ID||
     271||status (success)||HTTP/1.1 200 OK||
     272||output (success)||{"evaluatee":"USER_ID","score":"SCORE"}
     273||status (failure)||HTTP/1.1 404 Not Found||
     274||output (failure)||none||
    219275
    220276* Grades are read-only
    221277
    222 === Events ===
    223 
    224 ||GET||/v1/courses/{course_id}/events||get a list of events in course {course_id}||
    225 || ||parameter||COURSE_ID||
    226 || ||status (success)||HTTP/1.1 200 OK||
    227 || ||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]
    228 || ||status (failure)||HTTP/1.1 Not Found||
    229 || ||output (failure)||none||
    230 ||GET||/v1/courses/{course_id}/events/{event_id}||get a event in course {course_id}||
    231 || ||parameter||COURSE_ID||
    232 || ||parameter||EVENT_ID||
    233 || ||status (success)||HTTP/1.1 200 OK||
    234 || ||output (success)||{"title":"TITLE","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID"}||
    235 || ||status (failure)||HTTP/1.1 404 Not Found||
    236 || ||output (failure)||none||
    237 ||GET||/v1/courses/{course_id}/users/{username}/events||get events for a user in a course||
    238 || ||parameter||COURSE_ID||
    239 || ||parameter||USERNAME||
    240 || ||status (success)||HTTP/1.1 200 OK||
    241 || ||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]||
    242 || ||status (failure)||HTTP/1.1 404 Not Found||
    243 || ||output (failure)||none||
    244 ||GET||/v1/users/{username}/events||get events for a user||
    245 || ||parameter||USERNAME||
    246 || ||status (success)||HTTP/1.1 200 OK||
    247 || ||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]||
    248 || ||status (failure)||HTTP/1.1 404 Not Found||
    249 || ||output (failure)||none||
     278== Events ==
     279
     280=== Get a list of events in course {course_id} ===
     281GET /v1/courses/{course_id}/events
     282||parameter||COURSE_ID||
     283||status (success)||HTTP/1.1 200 OK||
     284||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]
     285||status (failure)||HTTP/1.1 Not Found||
     286||output (failure)||none||
     287
     288=== Get a event in course {course_id} ===
     289GET /v1/courses/{course_id}/events/{event_id}
     290||parameter||COURSE_ID||
     291||parameter||EVENT_ID||
     292||status (success)||HTTP/1.1 200 OK||
     293||output (success)||{"title":"TITLE","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID"}||
     294||status (failure)||HTTP/1.1 404 Not Found||
     295||output (failure)||none||
     296
     297=== Get events for a user in a course ===
     298GET /v1/courses/{course_id}/users/{username}/events
     299||parameter||COURSE_ID||
     300||parameter||USERNAME||
     301||status (success)||HTTP/1.1 200 OK||
     302||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]||
     303||status (failure)||HTTP/1.1 404 Not Found||
     304||output (failure)||none||
     305
     306=== Get events for a user ===
     307GET /v1/users/{username}/events
     308||parameter||USERNAME||
     309||status (success)||HTTP/1.1 200 OK||
     310||output (success)||[{"title":"TITLE0","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID0"},{"title":"TITLE1","course_id":"COURSE_ID","event_template_type_id":"TEMPLATE_ID","id":"EVENT_ID1"}]||
     311||status (failure)||HTTP/1.1 404 Not Found||
     312||output (failure)||none||
    250313
    251314* Events are read-only