curl --request GET \
--url https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"student_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"student_name": "<string>",
"student_email": "jsmith@example.com",
"anonymized": true,
"has_access": true,
"access_until": "2023-11-07T05:31:56Z",
"mentor_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mentor_name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_entered_at": "2023-11-07T05:31:56Z",
"next_session_at": "2023-11-07T05:31:56Z"
}
],
"total": 123
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Quadro de mentorados
Quem tem direito agora e quem já passou pela mentoria, sem ninguém precisar entrar.
curl --request GET \
--url https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.weve.cx/v1/clubs/{clubId}/mentorships/{mentorshipId}/participants")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"student_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"student_name": "<string>",
"student_email": "jsmith@example.com",
"anonymized": true,
"has_access": true,
"access_until": "2023-11-07T05:31:56Z",
"mentor_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mentor_name": "<string>",
"stage_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stage_entered_at": "2023-11-07T05:31:56Z",
"next_session_at": "2023-11-07T05:31:56Z"
}
],
"total": 123
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Token OPACO de sessão de quem administra, emitido por
/v1/auth/admin/sign-in e verificado contra a nossa tabela — o mesmo
desenho do studentSession, para a outra identidade.
É o esquema de quem ADMINISTRA — o dashboard. O aluno do classroom usa o
studentSession; uma rota consumida pelos dois declara os dois
esquemas, e o middleware aceita qualquer um deles. As duas credenciais
são opacas e chegam pelo mesmo cabeçalho: quem as separa é a tabela em
que cada uma existe.
O dashboard o guarda em cookie httpOnly, que o BFF troca pelo
Authorization a cada chamada.
Path Parameters
Id público da organização — o mesmo que GET /v1/me devolve em
organization_id.
Na URL o recurso se chama club; no contrato e no domínio, organization.
A divergência é deliberada: clubs é a palavra do produto, e a URL é o que
as pessoas leem.
É o identificador do provedor de autenticação, e é assim de propósito: o cliente precisa nomear a organização ao pedir o token, e o token é o que prova o escopo. Um id só nosso obrigaria a traduzir um no outro antes de ter um token — e a tradução exigiria uma chamada escopada, que é justamente a que ainda não dá para fazer.
O uuid interno da organização não aparece no contrato: ele é o que as chaves estrangeiras do domínio referenciam, e continua sendo nosso.
Query Parameters
Só quem ainda não tem mentor designado.
Só quem está na primeira coluna, sem etapa.
Com acesso agora (true) ou só com histórico (false).
Trecho do nome ou começo do e-mail.
2001 <= x <= 100x >= 1