598 lines
10 KiB
Markdown
598 lines
10 KiB
Markdown
|
|
# Group Membership API
|
||
|
|
|
||
|
|
BotServer provides RESTful endpoints for managing user groups, team memberships, and collaborative workspaces.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The Group Membership API enables:
|
||
|
|
- Group creation and management
|
||
|
|
- Member addition and removal
|
||
|
|
- Role assignments within groups
|
||
|
|
- Permission inheritance
|
||
|
|
- Team collaboration features
|
||
|
|
- Workspace organization
|
||
|
|
|
||
|
|
## Base URL
|
||
|
|
|
||
|
|
```
|
||
|
|
http://localhost:8080/api/v1/groups
|
||
|
|
```
|
||
|
|
|
||
|
|
## Authentication
|
||
|
|
|
||
|
|
All Group Membership API requests require authentication:
|
||
|
|
|
||
|
|
```http
|
||
|
|
Authorization: Bearer <token>
|
||
|
|
```
|
||
|
|
|
||
|
|
## Endpoints
|
||
|
|
|
||
|
|
### Create Group
|
||
|
|
|
||
|
|
**POST** `/groups`
|
||
|
|
|
||
|
|
Create a new group or team.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "Engineering Team",
|
||
|
|
"description": "Product engineering team",
|
||
|
|
"type": "team",
|
||
|
|
"visibility": "private",
|
||
|
|
"settings": {
|
||
|
|
"allow_join_requests": true,
|
||
|
|
"require_approval": true,
|
||
|
|
"max_members": 50
|
||
|
|
},
|
||
|
|
"permissions": ["bot.use", "kb.read", "reports.view"]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"name": "Engineering Team",
|
||
|
|
"type": "team",
|
||
|
|
"created_at": "2024-01-15T10:00:00Z",
|
||
|
|
"created_by": "usr_admin",
|
||
|
|
"member_count": 0
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Get Group
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}`
|
||
|
|
|
||
|
|
Retrieve group information.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"name": "Engineering Team",
|
||
|
|
"description": "Product engineering team",
|
||
|
|
"type": "team",
|
||
|
|
"visibility": "private",
|
||
|
|
"member_count": 12,
|
||
|
|
"created_at": "2024-01-15T10:00:00Z",
|
||
|
|
"settings": {
|
||
|
|
"allow_join_requests": true,
|
||
|
|
"require_approval": true,
|
||
|
|
"max_members": 50
|
||
|
|
},
|
||
|
|
"permissions": ["bot.use", "kb.read", "reports.view"]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Update Group
|
||
|
|
|
||
|
|
**PATCH** `/groups/{group_id}`
|
||
|
|
|
||
|
|
Update group information.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "Engineering & DevOps Team",
|
||
|
|
"description": "Combined engineering and operations team",
|
||
|
|
"settings": {
|
||
|
|
"max_members": 75
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Delete Group
|
||
|
|
|
||
|
|
**DELETE** `/groups/{group_id}`
|
||
|
|
|
||
|
|
Delete a group (requires admin permissions).
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"deleted": true,
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"members_removed": 12
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### List Groups
|
||
|
|
|
||
|
|
**GET** `/groups`
|
||
|
|
|
||
|
|
List all groups with filtering.
|
||
|
|
|
||
|
|
**Query Parameters:**
|
||
|
|
- `type` - Filter by group type: `team`, `department`, `project`
|
||
|
|
- `visibility` - Filter by visibility: `public`, `private`
|
||
|
|
- `member` - Filter groups containing specific user
|
||
|
|
- `search` - Search in name and description
|
||
|
|
- `page` - Page number (default: 1)
|
||
|
|
- `limit` - Items per page (default: 20)
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"groups": [
|
||
|
|
{
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"name": "Engineering Team",
|
||
|
|
"type": "team",
|
||
|
|
"member_count": 12,
|
||
|
|
"visibility": "private"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"total": 8,
|
||
|
|
"page": 1,
|
||
|
|
"limit": 20
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Member Management
|
||
|
|
|
||
|
|
### Add Member
|
||
|
|
|
||
|
|
**POST** `/groups/{group_id}/members`
|
||
|
|
|
||
|
|
Add a member to a group.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"role": "member",
|
||
|
|
"permissions": ["read", "write"],
|
||
|
|
"notify": true
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"membership_id": "mem_123",
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"role": "member",
|
||
|
|
"joined_at": "2024-01-15T10:30:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Bulk Add Members
|
||
|
|
|
||
|
|
**POST** `/groups/{group_id}/members/bulk`
|
||
|
|
|
||
|
|
Add multiple members at once.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"members": [
|
||
|
|
{"user_id": "usr_001", "role": "admin"},
|
||
|
|
{"user_id": "usr_002", "role": "member"},
|
||
|
|
{"user_id": "usr_003", "role": "member"}
|
||
|
|
],
|
||
|
|
"notify_all": true
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"added": 3,
|
||
|
|
"failed": 0,
|
||
|
|
"memberships": [
|
||
|
|
{"user_id": "usr_001", "status": "added"},
|
||
|
|
{"user_id": "usr_002", "status": "added"},
|
||
|
|
{"user_id": "usr_003", "status": "added"}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### List Members
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/members`
|
||
|
|
|
||
|
|
List group members.
|
||
|
|
|
||
|
|
**Query Parameters:**
|
||
|
|
- `role` - Filter by role
|
||
|
|
- `status` - Filter by status: `active`, `pending`, `suspended`
|
||
|
|
- `search` - Search in member names
|
||
|
|
- `page` - Page number
|
||
|
|
- `limit` - Items per page
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"members": [
|
||
|
|
{
|
||
|
|
"membership_id": "mem_123",
|
||
|
|
"user": {
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"username": "johndoe",
|
||
|
|
"full_name": "John Doe",
|
||
|
|
"avatar_url": "https://example.com/avatar.jpg"
|
||
|
|
},
|
||
|
|
"role": "admin",
|
||
|
|
"status": "active",
|
||
|
|
"joined_at": "2024-01-15T10:30:00Z",
|
||
|
|
"last_active": "2024-01-15T14:00:00Z"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"total": 12,
|
||
|
|
"page": 1,
|
||
|
|
"limit": 20
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Update Member Role
|
||
|
|
|
||
|
|
**PATCH** `/groups/{group_id}/members/{user_id}`
|
||
|
|
|
||
|
|
Update a member's role or permissions.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"role": "admin",
|
||
|
|
"permissions": ["read", "write", "delete"]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Remove Member
|
||
|
|
|
||
|
|
**DELETE** `/groups/{group_id}/members/{user_id}`
|
||
|
|
|
||
|
|
Remove a member from a group.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"removed": true,
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"removed_at": "2024-01-15T15:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Group Roles
|
||
|
|
|
||
|
|
### List Roles
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/roles`
|
||
|
|
|
||
|
|
List available roles in a group.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"roles": [
|
||
|
|
{
|
||
|
|
"role_id": "owner",
|
||
|
|
"name": "Owner",
|
||
|
|
"permissions": ["all"],
|
||
|
|
"member_count": 1
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"role_id": "admin",
|
||
|
|
"name": "Administrator",
|
||
|
|
"permissions": ["manage_members", "manage_settings", "read", "write"],
|
||
|
|
"member_count": 2
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"role_id": "member",
|
||
|
|
"name": "Member",
|
||
|
|
"permissions": ["read", "write"],
|
||
|
|
"member_count": 9
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Create Custom Role
|
||
|
|
|
||
|
|
**POST** `/groups/{group_id}/roles`
|
||
|
|
|
||
|
|
Create a custom role for a group.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "Moderator",
|
||
|
|
"permissions": ["read", "write", "moderate"],
|
||
|
|
"description": "Can moderate content and manage posts"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Join Requests
|
||
|
|
|
||
|
|
### Request to Join
|
||
|
|
|
||
|
|
**POST** `/groups/{group_id}/join-requests`
|
||
|
|
|
||
|
|
Request to join a private group.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"message": "I would like to join the engineering team",
|
||
|
|
"referred_by": "usr_admin"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"request_id": "req_456",
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"status": "pending",
|
||
|
|
"submitted_at": "2024-01-15T10:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### List Join Requests
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/join-requests`
|
||
|
|
|
||
|
|
List pending join requests (admin only).
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"requests": [
|
||
|
|
{
|
||
|
|
"request_id": "req_456",
|
||
|
|
"user": {
|
||
|
|
"user_id": "usr_xyz789",
|
||
|
|
"username": "newuser",
|
||
|
|
"full_name": "New User"
|
||
|
|
},
|
||
|
|
"message": "I would like to join the engineering team",
|
||
|
|
"status": "pending",
|
||
|
|
"submitted_at": "2024-01-15T10:00:00Z"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"total": 3
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Approve/Reject Request
|
||
|
|
|
||
|
|
**PATCH** `/groups/{group_id}/join-requests/{request_id}`
|
||
|
|
|
||
|
|
Process a join request.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"action": "approve",
|
||
|
|
"role": "member",
|
||
|
|
"note": "Welcome to the team!"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Group Invitations
|
||
|
|
|
||
|
|
### Send Invitation
|
||
|
|
|
||
|
|
**POST** `/groups/{group_id}/invitations`
|
||
|
|
|
||
|
|
Invite users to join a group.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"emails": ["user1@example.com", "user2@example.com"],
|
||
|
|
"role": "member",
|
||
|
|
"message": "You're invited to join our team!",
|
||
|
|
"expires_in_days": 7
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"invitations": [
|
||
|
|
{
|
||
|
|
"invitation_id": "inv_789",
|
||
|
|
"email": "user1@example.com",
|
||
|
|
"status": "sent",
|
||
|
|
"expires_at": "2024-01-22T10:00:00Z"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"sent": 2,
|
||
|
|
"failed": 0
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Accept Invitation
|
||
|
|
|
||
|
|
**POST** `/invitations/{invitation_id}/accept`
|
||
|
|
|
||
|
|
Accept a group invitation.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"membership_id": "mem_999",
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"joined_at": "2024-01-15T11:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Group Permissions
|
||
|
|
|
||
|
|
### Get Group Permissions
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/permissions`
|
||
|
|
|
||
|
|
List group permissions.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"permissions": [
|
||
|
|
{
|
||
|
|
"permission": "bot.use",
|
||
|
|
"description": "Use bots",
|
||
|
|
"inherited_from": null
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"permission": "kb.read",
|
||
|
|
"description": "Read knowledge base",
|
||
|
|
"inherited_from": "parent_group"
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Update Permissions
|
||
|
|
|
||
|
|
**PATCH** `/groups/{group_id}/permissions`
|
||
|
|
|
||
|
|
Update group permissions.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"add": ["reports.create", "analytics.view"],
|
||
|
|
"remove": ["kb.write"]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Hierarchical Groups
|
||
|
|
|
||
|
|
### Create Subgroup
|
||
|
|
|
||
|
|
**POST** `/groups/{parent_id}/subgroups`
|
||
|
|
|
||
|
|
Create a subgroup under a parent group.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "Frontend Team",
|
||
|
|
"inherit_permissions": true,
|
||
|
|
"inherit_members": false
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### List Subgroups
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/subgroups`
|
||
|
|
|
||
|
|
List all subgroups.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"subgroups": [
|
||
|
|
{
|
||
|
|
"group_id": "grp_sub123",
|
||
|
|
"name": "Frontend Team",
|
||
|
|
"member_count": 5,
|
||
|
|
"created_at": "2024-01-15T10:00:00Z"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"total": 2
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Group Analytics
|
||
|
|
|
||
|
|
### Get Group Analytics
|
||
|
|
|
||
|
|
**GET** `/groups/{group_id}/analytics`
|
||
|
|
|
||
|
|
Get group activity analytics.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"group_id": "grp_abc123",
|
||
|
|
"analytics": {
|
||
|
|
"member_growth": {
|
||
|
|
"current": 12,
|
||
|
|
"last_month": 10,
|
||
|
|
"growth_rate": 0.20
|
||
|
|
},
|
||
|
|
"activity": {
|
||
|
|
"messages_sent": 456,
|
||
|
|
"tasks_completed": 23,
|
||
|
|
"avg_response_time": 3600
|
||
|
|
},
|
||
|
|
"engagement": {
|
||
|
|
"active_members": 10,
|
||
|
|
"engagement_rate": 0.83
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"period": "30d"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Error Responses
|
||
|
|
|
||
|
|
### 403 Forbidden
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"error": "permission_denied",
|
||
|
|
"message": "You don't have permission to manage this group"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 409 Conflict
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"error": "member_exists",
|
||
|
|
"message": "User is already a member of this group"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 422 Unprocessable Entity
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"error": "group_full",
|
||
|
|
"message": "Group has reached maximum member limit",
|
||
|
|
"max_members": 50,
|
||
|
|
"current_members": 50
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
1. **Use Descriptive Names**: Group names should clearly indicate purpose
|
||
|
|
2. **Set Member Limits**: Prevent groups from becoming too large
|
||
|
|
3. **Regular Cleanup**: Remove inactive members periodically
|
||
|
|
4. **Permission Inheritance**: Use hierarchy for easier management
|
||
|
|
5. **Document Purpose**: Always include group descriptions
|
||
|
|
6. **Review Requests**: Don't auto-approve join requests for sensitive groups
|
||
|
|
|
||
|
|
## Related APIs
|
||
|
|
|
||
|
|
- [User Security API](./user-security.md) - User management
|
||
|
|
- [Notifications API](./notifications-api.md) - Group notifications
|
||
|
|
- [Tasks API](./tasks-api.md) - Group task management
|