---
# System prepended metadata

title: wayfair-teams

---

# wayfair-teams

Create as many end-points as we believe is sensible and provide responses that are functionally equivalent to the old API.

<br/>

## **Content**
- [Models](#Models)
    - TeamModel
    - CommunicationChannelModel
    - EmployeeModel
- [Endpoints](#Endpoints)
    - [Teams Metadata](#Teams-Metadata)
        - GET /teams
        - GET /teams/{team_id}
        - POST /teams
        - PATCH /teams/{team_id}
    - [Teams Membership](#Teams-Membership)
        - GET /teams/{team_id}/employees
        - POST /teams/{team_id}/employees
        - DELETE /teams/{team_id}/employees
        - GET /teams/{team_id}/admin(TBD)
        - PUT /teams/{team_id}/admin(TBD)
    - [Teams Hierarchy](#Teams-Hierarchy)
        - GET /teams/{team_id}/children
        - POST /teams/{team_id}/children
        - DELETE /teams/{team_id}/children
        - GET /teams/{team_id}/parent
- [Logging](#Logging)

<br/>

## **Models**

**REQUEST**


**RESPONSE**

*ResponseTeamModel*
```json=
{
    team_id: int,
    team_name: str,
    team_description: str,
    team_label: {label_id: int, label_name: str},
    team_type: {type_id: int, type_name: str},
    team_icon: {icon_id: int, icon_name: str},
    team_keywords: List[],
    team_created: datetime,
    team_updated: datetime,
    team_archived:datetime,
    contacts: List[ContactModel],
    employees: Optional[List[EmployeeModel]],
    member_count: int
}
```


TeamContactModel
```json=
{
    type: str, 
    identifier: str,
    labels: List[str]
}
```

EmployeeModel
```json=
{
    employee_id: int,
    employee_name: str,
    role_name: str,
    join_date: datetime
}
```



<br/>

## Endpoints
version 1.0

### **Teams Metadata**
***Route: team***

***GET /teams***
Get multiple teams metadata

*Functional Equivalency:*
1. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v2/teams.py#L24

@endpoint.router.get("", tags=[TEAMS_TAG])

2. https://github.csnzoo.com/shared/data-team-service/blob/d9b011658c34baf8d8a010916efb25f413b58ecb/components/fastapi_/endpoints/v1/team.py#L203

@endpoint.router.get("/check_team_name/{_team_name}", tags=[TEAM_TAG])

3. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/teams.py#L37

@endpoint.router.get("/batch", tags=[TEAMS_TAG])

Parameters:
* filters
    * team-ids: List[int] - semicolon delimited. For example: /teams?team-ids=1,2,3,4 
    * team-names: List[str]
    * team-type: str
    * team_created_before: str
    * team_created_after: str
* sort: Optional[str]
* offset: Optional[int] = 0
* limit: Optional[int] = 100
* fields: Optional[List[str]] = [] -- select the fields to be returned for each team, e.g. team_id, team_name, or team_description

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = List[TeamModel]
```

***GET /teams/{team_id}***
Get the metadata of a specific team.
 
Functional Equivalency:
https://github.csnzoo.com/shared/data-team-service/blob/d9b011658c34baf8d8a010916efb25f413b58ecb/components/fastapi_/endpoints/v1/team.py#L82

@endpoint.router.get("/{team_id}", tags=[TEAM_TAG])
@endpoint.router.get("/name/{team_name}", tags=[TEAM_TAG])

Parameters:
* Required:
    * team_id: int

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = TeamModel
```

***POST /teams***
Create a new team with the provided metadata.

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/d9b011658c34baf8d8a010916efb25f413b58ecb/components/fastapi_/endpoints/v1/team.py#L219

@endpoint.router.post("/create_team", tags=[TEAM_TAG])

Request Body
* Required: 
    * team_name: str
    * team_label: int
    * team_type: int
* Optional:
    * team_description: str
    * team_isactive: bool
    * team_created: datetime
    * communication_channels: 
    ```
    List[{
        identifier: str, 
        communication_mode: str,
        labels: List[str]
    }],
    ```

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = TeamModel
```

***PATCH /teams/{team_id}***
Update the metadata of an existing team.

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/d9b011658c34baf8d8a010916efb25f413b58ecb/components/fastapi_/endpoints/v1/team.py#L137

@endpoint.router.post("/edit_team", tags=[TEAM_TAG])

Parameters:
* Required:
    * team_id: int

Request Body
* Optional:
    * team_label: int,
    * team_description: str
    * team_type: int
    * team_isactive: bool
    * team_icon: int
    * team_created: datetime
    * communication_channels: 
    ```
    List[{
        identifier: str, 
        communication_mode: str,
        labels: List[str]
    }],
    ```    

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = TeamModel
```

<br/>

### **Teams Membership**
***GET /teams/{team_id}/employees***
Get all employees of a specific team

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L246

@endpoint.router.get("/{team_id}/employees", tags=[TEAM_MEMBER_TAG])

Parameters:
* Required:
    * team_id: int

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = List[EmployeeModel]
```

***POST /teams/{team_id}/employees***
Add one or multiple employees to a team

*Functional Equivalency:*
1. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L347

@endpoint.router.post("/add_employee", tags=[TEAM_MEMBER_TAG])

2. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L391

@endpoint.router.post("/batch_add_employees", tags=[TEAM_MEMBER_TAG])

Parameters:
* Required:
    * team_id: int

Request Body
* employee_ids: List[int]

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = List[EmployeeModel]
```

***DELETE /teams/{team_id}/employees***
Remove employees from a team

*Functional Equivalency:*
1. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L446

@endpoint.router.post("/remove_employee", tags=[TEAM_MEMBER_TAG])

2. https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L505

@endpoint.router.post("/batch_remove_employees", tags=[TEAM_MEMBER_TAG])

Parameters:
* Required:
    * team_id: int

Request Body
* employee_ids: List[int]

Response: 
```
HTTP/1.1 200 OK
```

***GET /employee/{employee_id}/member_of_team/{team_id}***

*Functional Equivalency*
https://github.csnzoo.com/shared/data-team-service/blob/main/components/fastapi_/endpoints/v1/team.py#L292

@endpoint.router.get("/{team_id}/check_employee_in_team", tags=[USER_METADATA_TAG])

Parameters:
* Required:
    * team_id: int
    * employee_id: int


Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = Boolean
```
_______________________
***GET /employee/{employee_id}/roles***



-----------------------
**ROLES/PERMISSIONS STUFF**  -- TBD

***GET /teams/{team_id}/admin(TBD)***
Get the admin of a team
> [name=Rita Linets] I think that we should generally have a set of end-points that expose roles/permissions. Something like:

> GET /roles/<employee_id> etc.; 
> The problem of course is that it's hard to predict where the product team is headed.

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L313

@endpoint.router.get("/{team_id}/check_employee_is_admin", tags=[USER_METADATA_TAG])

Parameters:
* Required:
    * team_id: int

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = EmployeeModel
```

***PUT /teams/{team_id}/admin(TBD)***
Creat or update the admin of a team

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team.py#L595

@endpoint.router.post("/edit_team_admin", tags=[TEAM_MEMBER_TAG])

Parameters:
* Required:
    * team_id: int

Request Body:
* Required:
    * employee_id: str
    * employee_name: str

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = EmployeeModel -- is_team_admin = True
```

<br/>

### **Teams Hierarchy**
***GET /teams/{team_id}/children***
Get all children of a team

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team_hierarchy.py#L32

@endpoint.router.get("/{team_id}/children", tags=[TEAM_HIERARCHY_TAG])

Parameters:
* Required:
    * team_id: int

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = List[TeamModel]
```
***POST /teams/{team_id}/children***
Add one or multiple children to a team
*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team_hierarchy.py#L111

@endpoint.router.post(
    "/{team_id}/add_parent/{parent_team_id}", tags=[TEAM_HIERARCHY_TAG]
)

Parameters:
* Required:
    * team_id: int

Request Body:
* team_id: List[int]

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

// list of children
Response = List[TeamModel]
```


***DELETE /teams/{team_id}/children***
Remove one or multiple children of a team
*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team_hierarchy.py#L154

@endpoint.router.delete(
    "/{team_id}/remove_parent/{parent_team_id}", tags=[TEAM_HIERARCHY_TAG]
)

Parameters:
* Required:
    * team_id: int

Request Body:
* team_ids: List[int]

Response: 
```
HTTP/1.1 200 OK
```

***GET /teams/{team_id}/parent***
Get the parent of a team

*Functional Equivalency:*
https://github.csnzoo.com/shared/data-team-service/blob/e00b5893d6752c1c840dae8424125d88dbc64152/components/fastapi_/endpoints/v1/team_hierarchy.py#L76

@endpoint.router.get("/{team_id}/parent", tags=[TEAM_HIERARCHY_TAG])

Parameters:
* Required:
    * team_id: int

Response: 
```
HTTP/1.1 200 OK
Content-Type: application/json

Response = TeamModel
```

## Logging

Metrics:
- _id
- Timestamp
- Username
- Endpoint URI
- Request Method
- Payload
- Response status
- Response time
- Error message

Performance Monitoring(Grafana?):
- Memory usage
- CPU usage
