Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
No ambiente digital atual, os usuários trabalham com uma ampla gama de dados organizacionais, incluindo e-mails, chats, arquivos, eventos de calendário e muito mais. Isso pode levar a mudanças frequentes de contexto — alternar entre tarefas ou aplicativos — o que pode interromper o foco e reduzir a produtividade. Por exemplo, um usuário que trabalha em um projeto pode precisar alternar de seu aplicativo atual para o Outlook para encontrar detalhes cruciais em um email ou alternar para o OneDrive for Business para localizar um arquivo relacionado. Essa ação de ida e volta interrompe o foco e desperdiça tempo que poderia ser melhor gasto na tarefa em questão.
Para melhorar a eficiência, você pode integrar dados organizacionais diretamente nos aplicativos que os usuários usam todos os dias. Ao trazer dados organizacionais para seus aplicativos, os usuários podem acessar e gerenciar informações de forma mais perfeita, minimizando as mudanças de contexto e melhorando a produtividade. Além disso, essa integração fornece informações e contexto valiosos, permitindo que os usuários tomem decisões informadas e trabalhem de forma mais eficaz.
Neste exercício, você irá:
- Saiba como o componente Web mgt-search-results no Microsoft Graph Toolkit pode ser usado para pesquisar arquivos.
- Saiba como chamar o Microsoft Graph diretamente para recuperar arquivos do OneDrive for Business e mensagens de bate-papo do Microsoft Teams.
- Entenda como enviar mensagens de bate-papo para canais do Microsoft Teams usando o Microsoft Graph.
Usando o recurso de dados organizacionais
Em um exercício anterior , você criou um registro de aplicativo no Microsoft Entra ID e iniciou o servidor de aplicativos e o servidor de API. Você também atualizou os seguintes valores no
.env
arquivo.ENTRAID_CLIENT_ID=<APPLICATION_CLIENT_ID_VALUE> TEAM_ID=<TEAMS_TEAM_ID> CHANNEL_ID=<TEAMS_CHANNEL_ID>
Certifique-se de ter concluído o exercício anterior antes de continuar.
Volte ao navegador (http://localhost:4200). Se ainda não tiver iniciado sessão, selecione Iniciar sessão no cabeçalho e inicie sessão com um utilizador do seu inquilino do Microsoft 365 Developer.
Observação
Além de autenticar o usuário, o componente da Web mgt-login também recupera um token de acesso que pode ser usado pelo Microsoft Graph para acessar arquivos, chats, e-mails, eventos de calendário e outros dados organizacionais. O token de acesso contém os escopos (permissões), como
Chat.ReadWrite
,Files.Read.All
e outros que você viu anteriormente:Providers.globalProvider = new Msal2Provider({ clientId: ENTRAID_CLIENT_ID, // retrieved from .env file scopes: ['User.Read', 'Presence.Read', 'Chat.ReadWrite', 'Calendars.Read', 'ChannelMessage.Read.All', 'ChannelMessage.Send', 'Files.Read.All', 'Mail.Read'] });
Selecione Exibir Conteúdo Relacionado para a linha Adatum Corporation na grade de dados. Isso fará com que dados organizacionais, como arquivos, chats, e-mails e eventos de calendário, sejam recuperados usando o Microsoft Graph. Assim que os dados forem carregados, eles serão exibidos abaixo da grade de dados em uma interface com guias. É importante mencionar que você pode não ver nenhum dado neste momento, pois ainda não adicionou arquivos, bate-papos, e-mails ou eventos de calendário para o usuário em seu locatário de desenvolvedor do Microsoft 365. Vamos corrigir isso na próxima etapa.
Seu locatário do Microsoft 365 pode não ter nenhum dado organizacional relacionado para a Adatum Corporation neste estágio. Para adicionar alguns dados de exemplo, execute pelo menos uma das seguintes ações:
Adicione arquivos visitando https://onedrive.com e entrando usando suas credenciais de locatário do Microsoft 365 Developer.
- Selecione Meus arquivos na navegação à esquerda.
- Selecione + Adicionar novo e, em seguida, Carregar pasta no menu.
- Selecione a pasta openai-acs-msgraph/customer documents do projeto clonado.
Adicione mensagens de chat e eventos de calendário visitando https://teams.microsoft.com e entrando usando suas credenciais de locatário do Microsoft 365 Developer.
Selecione Equipas no painel de navegação esquerdo.
Selecione uma equipa e um canal.
Selecione Iniciar uma publicação.
Insira Novo pedido feito para a Adatum Corporation para o assunto e qualquer texto adicional que você gostaria de adicionar no corpo da mensagem. Selecione o botão Postar .
Sinta-se à vontade para adicionar mensagens de bate-papo adicionais que mencionem outras empresas usadas no aplicativo, como Adventure Works Cycles, Contoso Pharmaceuticals e Tailwind Traders.
Selecione Calendário na navegação à esquerda.
Selecione Nova reunião.
Digite "Reunir-se com a Adatum Corporation sobre o cronograma do projeto" para o título e o corpo.
Selecione Guardar.
Adicione emails visitando https://outlook.com e entrando usando suas credenciais de locatário do Microsoft 365 Developer.
Selecione Novo e-mail.
Introduza o seu endereço de e-mail pessoal no campo Para.
Digite Novo pedido feito para a Adatum Corporation para o assunto e qualquer coisa que você gostaria para o corpo.
Selecione Enviar.
Volte para o aplicativo no navegador e atualize a página. Selecione Exibir Conteúdo Relacionado novamente para a linha Adatum Corporation . Agora você deve ver os dados exibidos nas guias, dependendo de quais tarefas você executou na etapa anterior.
Vamos explorar o código que habilita o recurso de dados organizacionais no aplicativo. Para recuperar os dados, a parte do lado do cliente do aplicativo usa o token de acesso recuperado pelo componente mgt-login que você examinou anteriormente para fazer chamadas para APIs do Microsoft Graph.
Explorando o código de pesquisa de arquivos
Sugestão
Se você estiver usando o Visual Studio Code, poderá abrir arquivos diretamente selecionando:
- Windows/Linux: Ctrl + P
- Mac: Cmd + P
Em seguida, digite o nome do arquivo que deseja abrir.
Vamos começar examinando como os dados de arquivo são recuperados do OneDrive for Business. Abra files.component.html e reserve um momento para examinar o código. O caminho completo para o arquivo é client/src/app/files/files.component.html.
Localize o componente mgt-search-results e observe os seguintes atributos:
<mgt-search-results class="search-results" entity-types="driveItem" [queryString]="searchText" (dataChange)="dataChange($any($event))" />
O componente mgt-search-results faz parte do Microsoft Graph Toolkit e, como o nome indica, é usado para exibir resultados de pesquisa do Microsoft Graph. O componente usa os seguintes recursos neste exemplo:
O
class
atributo é usado para especificar que asearch-results
classe CSS deve ser aplicada ao componente.O
entity-types
atributo é usado para especificar o tipo de dados a serem pesquisados. Nesse caso, o valor édriveItem
usado para pesquisar arquivos no OneDrive for Business.O
queryString
atributo é usado para especificar o termo de pesquisa. Nesse caso, o valor é vinculado àsearchText
propriedade que é passada para o componente files quando o usuário seleciona Exibir Conteúdo Relacionado para uma linha na grade de dados. Os colchetes ao redorqueryString
indicam que a propriedade está vinculada aosearchText
valor.O
dataChange
evento é acionado quando os resultados da pesquisa são alterados. Nesse caso, uma função de cliente chamadadataChange()
é chamada no componente de arquivos e os dados do evento são passados para a função. Os parênteses ao redordataChange
indicam que o evento está ligado àdataChange()
função.Como nenhum modelo personalizado é fornecido, o modelo padrão incorporado
mgt-search-results
é usado para exibir os resultados da pesquisa.
Uma alternativa ao uso de componentes como mgt-search-results é chamar APIs do Microsoft Graph diretamente usando código. Para ver como isso funciona, abra o arquivo graph.service.ts e localize a
searchFiles()
função. O caminho completo para o arquivo é client/src/app/core/graph.service.ts.Você notará que um
query
parâmetro é passado para a função. Este é o termo de pesquisa que é passado quando o usuário seleciona Exibir Conteúdo Relacionado para uma linha na grade de dados. Se nenhum termo de pesquisa for passado, uma matriz vazia será retornada.async searchFiles(query: string) { const files: DriveItem[] = []; if (!query) return files; ... }
Em seguida, é criado um filtro que define o tipo de pesquisa a ser realizada. Nesse caso, o código está procurando por arquivos no OneDrive for Business, portanto,
driveItem
é usado exatamente como você viu anteriormente com omgt-search-results
componente. Isso é o mesmo que passardriveItem
paraentity-types
o componente mgt-search-results que você viu anteriormente. Oquery
parâmetro é então adicionado aoqueryString
filtro junto comContentType:Document
.const filter = { "requests": [ { "entityTypes": [ "driveItem" ], "query": { "queryString": `${query} AND ContentType:Document` } } ] };
Em seguida, é feita uma chamada para a API do
/search/query
Microsoft Graph usando aProviders.globalProvider.graph.client.api()
função. Ofilter
objeto é passado para apost()
função que envia os dados para a API.const searchResults = await Providers.globalProvider.graph.client.api('/search/query').post(filter);
Os resultados da pesquisa são então iterados para localizar
hits
. Cadahit
um contém informações sobre um documento que foi encontrado. Uma propriedade chamadaresource
contém os metadados do documento e é adicionadafiles
à matriz.if (searchResults.value.length !== 0) { for (const hitContainer of searchResults.value[0].hitsContainers) { if (hitContainer.hits) { for (const hit of hitContainer.hits) { files.push(hit.resource); } } } }
A
files
matriz é então devolvida ao chamador.return files;
Olhando através deste código, você pode ver que o componente web mgt-search-results que você explorou anteriormente faz muito trabalho para você e reduz significativamente a quantidade de código que você tem que escrever! No entanto, pode haver cenários em que você queira chamar o Microsoft Graph diretamente para ter mais controle sobre os dados enviados para a API ou como os resultados são processados.
Abra o arquivo files.component.ts e localize a
search()
função. O caminho completo para o arquivo é client/src/app/files/files.component.ts.Embora o corpo dessa função seja comentado devido ao componente mgt-search-results ser usado, a função pode ser usada para fazer a chamada para o Microsoft Graph quando o usuário seleciona Exibir Conteúdo Relacionado para uma linha na grade de dados. A
search()
função chamasearchFiles()
graph.service.ts e passa oquery
parâmetro para ela (o nome da empresa neste exemplo). Os resultados da pesquisa são então atribuídos àdata
propriedade do componente.override async search(query: string) { this.data = await this.graphService.searchFiles(query); }
O componente arquivos pode usar a
data
propriedade para exibir os resultados da pesquisa. Você pode lidar com isso usando associações HTML personalizadas ou usando outro controle do Microsoft Graph Toolkit chamadomgt-file-list
. Aqui está um exemplo de vinculação dadata
propriedade a uma das propriedades do componente nomeadasfiles
e manipulação doitemClick
evento à medida que o usuário interage com um arquivo.<mgt-file-list (itemClick)="itemClick($any($event))" [files]="data"></mgt-file-list>
Se você optar por usar o componente mgt-search-results mostrado anteriormente ou escrever código personalizado para chamar o Microsoft Graph dependerá do seu cenário específico. Neste exemplo, o componente mgt-search-results é usado para simplificar o código e reduzir a quantidade de trabalho que você precisa fazer.
Explorando o código de pesquisa de mensagens de bate-papo do Teams
Volte para graph.service.ts e localize a
searchChatMessages()
função. Você verá que é semelhante àsearchFiles()
função que você olhou anteriormente.- Ele posta dados de filtro na API do
/search/query
Microsoft Graph e converte os resultados em uma matriz de objetos que têm informações sobre oteamId
,channelId
emessageId
que correspondem ao termo de pesquisa. - Para recuperar as mensagens do canal do Teams, uma segunda chamada é feita para a
/teams/${chat.teamId}/channels/${chat.channelId}/messages/${chat.messageId}
API e para oteamId
,channelId
emessageId
são passadas. Isso retorna os detalhes completos da mensagem. - Tarefas de filtragem adicionais são executadas e as mensagens resultantes são retornadas para
searchChatMessages()
o chamador.
- Ele posta dados de filtro na API do
Abra o arquivo chats.component.ts e localize a
search()
função. O caminho completo para o arquivo é client/src/app/chats/chats.component.ts. Asearch()
função chamasearchChatMessages()
graph.service.ts e passa oquery
parâmetro para ela.override async search(query: string) { this.data = await this.graphService.searchChatMessages(query); }
Os resultados da pesquisa são atribuídos à
data
propriedade do componente e a vinculação de dados é usada para iterar através da matriz de resultados e renderizar os dados. Este exemplo usa um componente de cartão Material Angular para exibir os resultados da pesquisa.@if (this.data.length) { <div> @for (chatMessage of this.data;track chatMessage.id) { <mat-card> <mat-card-header> <mat-card-title [innerHTML]="chatMessage.summary"></mat-card-title> <!-- <mat-card-subtitle [innerHTML]="chatMessage.body"></mat-card-subtitle> --> </mat-card-header> <mat-card-actions> <a mat-stroked-button color="basic" [href]="chatMessage.webUrl" target="_blank">View Message</a> </mat-card-actions> </mat-card> } </div> }
Enviar uma mensagem para um canal do Microsoft Teams
Além de procurar mensagens de bate-papo do Microsoft Teams, o aplicativo também permite que um usuário envie mensagens para um canal do Microsoft Teams. Isso pode ser feito chamando o
/teams/${teamId}/channels/${channelId}/messages
ponto de extremidade do Microsoft Graph.No código a seguir, você verá que uma URL é criada que inclui os
teamId
valores echannelId
. Os valores das variáveis de ambiente são usados para o ID da equipe e o ID do canal neste exemplo, mas esses valores também podem ser recuperados dinamicamente usando o Microsoft Graph. Abody
constante contém a mensagem a ser enviada. Uma solicitação POST é então feita e os resultados são retornados ao chamador.async sendTeamsChat(message: string): Promise<TeamsDialogData> { if (!message) new Error('No message to send.'); if (!TEAM_ID || !CHANNEL_ID) new Error('Team ID or Channel ID not set in environment variables. Please set TEAM_ID and CHANNEL_ID in the .env file.'); const url = `https://graph.microsoft.com/v1.0/teams/${TEAM_ID}/channels/${CHANNEL_ID}/messages`; const body = { "body": { "contentType": "html", "content": message } }; const response = await Providers.globalProvider.graph.client.api(url).post(body); return { id: response.id, teamId: response.channelIdentity.teamId, channelId: response.channelIdentity.channelId, message: response.body.content, webUrl: response.webUrl, title: 'Send Teams Chat' }; }
Aproveitar esse tipo de funcionalidade no Microsoft Graph fornece uma ótima maneira de aprimorar a produtividade do usuário, permitindo que os usuários interajam com o Microsoft Teams diretamente do aplicativo que já estão usando.