Как мне узнать, на какую вкладку / место попадает План?
Я пытаюсь создать полный клон сайта группы Microsoft, используя Microsoft Graph, выполнив базовый клон сайта группы, а затем с помощью API скопировать и настроить весь контент.
Моя первая задача - скопировать Планировщик. Я сделал это достаточно далеко, чтобы скопировать все доступные планы, корзины и задачи.
Моя проблема в том, что я не могу понять:
1) К какой вкладке / местоположению принадлежал план в старой команде
2) Как поместить новый план в указанную вкладку / местоположение в новой команде
public async Task<IEnumerable<Channel>> GetChannels(string accessToken, string teamId) {
string endpoint = $"{GraphRootUri}/teams/{teamId}/channels";
HttpResponseMessage response =
await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken); //old functionality of stolen method - ignore these two lines
string destinationTeamID = "Teamid";
//find all plans
endpoint = $"{GraphRootUri}/groups/{teamId}/planner/plans";
HttpResponseMessage responsePlans = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
var plansIn = await ParseList<Planner>(responsePlans);
//the following two sections are just me seeing if I can find references to the plans
endpoint = $"{GraphRootUri}/teams/{teamId}/channels";
HttpResponseMessage responseChannels = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
var inChannels = await responseChannels.Content.ReadAsStringAsync();
endpoint = $"{GraphRootUri}/teams/{teamId}/channels/mychannellocation/tabs";
HttpResponseMessage responseTabs = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
var inTabs = await responseTabs.Content.ReadAsStringAsync();
//the following code copies the plans, buckets and tasks
foreach (Planner plan in plansIn) {
//first we get everything from the previous team plan
//grab tasks from the previous plan
endpoint = $"{GraphRootUri}/planner/plans/{plan.id}/tasks";
HttpResponseMessage responseTasks = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
var inTasks = await ParseList<plannerTask>(responseTasks);
//get all buckets
endpoint = $"{GraphRootUri}/planner/plans/{plan.id}/buckets";
HttpResponseMessage responseBuckets = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
var inBuckets = await ParseList<plannerBucket>(responseBuckets);
endpoint = $"{GraphRootUri}/planner/tasks";
//HttpResponseMessage responseTasks = await ServiceHelper.SendRequest(HttpMethod.Get, endpoint, accessToken);
// .content .Deserialize<plannerPlan>(); ;
//then we start to create everything in the new team
//create the plan in the new team
endpoint = $"{GraphRootUri}/planner/plans";
var sendPlanResponse =
await ServiceHelper.SendRequest(HttpMethod.Post, endpoint, accessToken, new plannerStub(plan, destinationTeamID));
var newPlanString = await sendPlanResponse.Content.ReadAsStringAsync();
//get the created plan
var newPlan = JsonConvert.DeserializeObject<Planner>(newPlanString);
//create buckets in the new team
Dictionary<string, string> bucketIdMap = new Dictionary<string, string>();
foreach (plannerBucket bucket in inBuckets) {
endpoint = $"{GraphRootUri}/planner/buckets";
var outBucket = new plannerBucketStub(bucket, newPlan.id);
var sendBucketResponse =
await ServiceHelper.SendRequest(HttpMethod.Post, endpoint, accessToken, new plannerStub(plan, destinationTeamID));
//get the created Bucket
var newBucket = JsonConvert.DeserializeObject<plannerBucket>(await sendPlanResponse.Content.ReadAsStringAsync());
bucketIdMap[bucket.id] = newBucket.id; //so we can send the tasks to our new bucket
}
//create tasks in the new team
foreach (plannerTask task in inTasks) {
endpoint = $"{GraphRootUri}/planner/tasks";
task.bucketId = bucketIdMap[task.bucketId];
task.planId = newPlan.id;
var sendBucketResponse = await ServiceHelper.SendRequest(HttpMethod.Post, endpoint, accessToken, task);
}
//put planner in appropriate tab - stuck at this point
endpoint = $"{GraphRootUri}/teams/{newPlan.id}/channels/";
}
}
Предыдущий код - это то, что у меня есть, знает ли кто-нибудь, как я могу узнать, где жил старый планировщик и как разместить нового планировщика в том же месте в новой команде?
Команда назначения сейчас является клоном первой команды.
Мое лучшее предположение - использовать "контексты" планировщика, но я не могу найти никакой документации по этому вопросу. Кто-нибудь знает, как с этим справиться? редактировать. Я пытался использовать контексты безрезультатно, я официально потерян.
Кстати, если кто-то нашел репозиторий кода, который делает полный клон сайтов Microsoft Teams, который я был слишком толстым, чтобы найти, пожалуйста, дайте мне знать
Любой, у кого есть мой вопрос достаточно времени, чтобы прочитать это далеко, большое спасибо за вашу помощь, любой совет был бы оценен в этот момент.
2 ответа
Поиск позиции вкладки
Вы можете определить положение вкладки канала, анализируя результаты, возвращаемые /v1.0/teams/{group-id}/channels/{channel-id}/tabs
, Результирующий teamsTab
массив будет содержать вкладки в обратном порядке (первая вкладка последняя):
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#teams('{{id}}')/channels('{id}')/tabs",
"value": [
{
"id": "{id}",
"displayName": "Tab #2",
"webUrl": "{url}",
"configuration": {
"entityId": null,
"contentUrl": null,
"removeUrl": null,
"websiteUrl": null,
"wikiTabId": 1,
"wikiDefaultTab": true,
"hasContent": false
}
},
{
"id": "{id}",
"displayName": "Tab #1",
"webUrl": "{url}",
"configuration": {
"entityId": "{plan-id}",
"contentUrl": "{url}",
"removeUrl": "{url}",
"websiteUrl": "{url}",
"dateAdded": "2019-02-04T17:38:11.079Z"
}
}
]
}
Имейте в виду, что беседы и файлы на самом деле не являются вкладками, и их положение фиксировано. Таким образом, ни один не будет отображаться в /tabs
результат. Ваш код должен предполагать, что ваш порядок вкладок фактически начинается с 3-й позиции вкладки в пользовательском интерфейсе.
Установка позиции вкладки
Чтобы продублировать порядок закрепленных вкладок, вам нужно добавить вкладки в том порядке, в котором вы хотите. Если вам нужно изменить порядок существующих вкладок, вам нужно сначала удалить их и воссоздать их в нужном вам порядке.
При интеграции Команды и Планировщика ссылки на планы поддерживаются командами, поэтому лучше всего заглянуть туда, чтобы узнать, можно ли где-нибудь найти идентификатор плана. К сожалению, я не знаком с этими API.
В Planner есть два необязательных свойства, которые помогают вернуться к командам. Во-первых, это контекст плана, который содержит свойство displayNameSegments. Это должно соответствовать структуре названия команды / канала. Второе - это contextDetails в PlanDetails, который содержит URL для команды. Эти свойства доступны только в бета-версии. Они не гарантированы для заполнения и могут быть неточными.