NodeJS对接Microsoft Graph API操作用户Outlook日历事件(三)

前言

通过Microsoft Identity Platform获取访问令牌之后,就可以在http头部添加Authorization,调用Microsoft Graph API去操作用户的outlook日历了。

其实各种请求的说明还是官方API文档比较详细,比如outlook事件的获取,附上连接 Microsoft Graph API 日历事件获取 

这里只是总结以下开发时的一些注意点,主要有以下方面:

  1. 获取用户outlook日历事件(增删改查)
  2. 获取用户事件颜色设定
  3. 共享会议与个人事件

先看下实现效果

一些共通的代码先放前面

// 标准化返回值
class ResponseInfo {
  constructor(status, data,msg) {
      this.status = status;
      this.data = data;
      this.msg = msg;
  }
}

// 用access Token注册 Graph client
function getAuthenticatedClient(accessToken) {
  // Initialize Graph client
  const client = graph.Client.init({
    // Use the provided access token to authenticate
    // requests
    authProvider: (done) => {
      done(null, accessToken);
    }
  });

  return client;
}

一,获取用户outlook日历事件(增删改查)

首先要提醒一下outlook日历下面的事件和日历是不同的,主要区别在于重复的事件,比如每天早会,通过日历视图能取得重复的事件信息,但是通过事件取得的话,只能取得一条最初的重复事件数据。

通过日历视图取得事件的话需要指定开始和结束的时间范围,而通过event取事件的话不需要指定时间范围。这里是通过event取得事件的例子。

  /**
   * 获取用户events
   * 
   * @param {*} accessToken        访问令牌
   * @param {*} userPrincipalName  用户的微软账号(邮箱)
   */
  getUserEvents : async function(accessToken,userPrincipalName){
    
    try{
      const client = getAuthenticatedClient(accessToken);

      // timeZone:时区 默认是 Pacific Standard Time
      let result = await client.api(`/users/${userPrincipalName}/events`)
                        .header('Prefer',`outlook.timezone="${timeZone}"`)
                        .get();

      //console.log(result.value);

        let response = new ResponseInfo(200,result.value,'');
        return response;
    }catch(errror) {
        let response = new ResponseInfo(400,'',error);
        return response;
      }
  },

  /**
   * 删除用户events 
   *
   * @param {*} accessToken        访问令牌
   * @param {*} userPrincipalName  用户的微软账号(邮箱)
   * @param {*} eventsId           event ID
   * @returns 
   */
  delUserEvents : async function (accessToken, userPrincipalName, eventsId) {

    try{
        const client = getAuthenticatedClient(accessToken);
      
        let result =  await client.api(`/users/${userPrincipalName}/events/${eventsId}`)
                                    .delete();

            let response = new ResponseInfo(200,result,'');
            return response;
        }catch(errror) {
            let response = new ResponseInfo(400,'',error);
            return response;
          }
   },

 /**
   * 新增用户events 
   * 
   * @param {*} accessToken       访问令牌
   * @param {*} userPrincipalName 用户的微软账号(邮箱)
   * @param {*} newEvent          event
   * @returns 
   */
  setUserNewEvent : async function (accessToken,userPrincipalName,newEvent){

    try{

      const client = getAuthenticatedClient(accessToken);

     //POST /users/{id | userPrincipalName}/events
     let result = await client.api(`/users/${userPrincipalName}/events`)
                              .header('Prefer',`outlook.timezone="${timeZone}"`)
                              .post(newEvent);

        let response = new ResponseInfo(200,result,'');
        return response;
    }catch(errror) {
        let response = new ResponseInfo(400,'',error);
        return response;
      }
  },

新增的时候event所需基本的格式如下

// timeZone:时区
const newEvent = {
        subject: “件名”,
        start: {
          dateTime: “开始时间(UTC格式)”,
          timeZone: timeZone
          },
        end: {
          dateTime: “结束时间(UTC格式)”,
          timeZone: timeZone
          },
        body: {
          contentType: 'HTML',
          content: “event内容”
          },
        location:{
          displayName: “地点”
          },
        attendees:{},
    };

二,获取用户事件颜色设定

这里需要注意,如果是通过用户认证的话,即使是管理员也只能读取自己的类别设定,无法读取认证用户之外成员的类别设定,但是通过无用户认证,也就是client  Secret认证的话,才可以访问所有用户的类别设定。

而且这里取得类别只是一下形式,没有具体的颜色信息,比如官方API放回例子如下。

写代码的时候取色了一下,不过后面没用到,应该是分别对应以下颜色:
 

类别 颜色
preset0 #FFFF14
preset1 #FF8C00
preset2 #FECB6F
preset3 #FFF100
preset4 #5FBE7D
preset5 #33BAB1
preset6 #A3B367
preset7 #55ABE5
preset8 #A895E2
preset9 #E48BB5
preset10 #B9C0CB
preset11 #4C596E
preset12 #ABABAB
preset13 #666666
preset14 #474747
preset15 #910A19
preset16 #CE4B28
preset17 #A47332
preset18 #B0A923
preset19 #026802
preset20 #1C6367
preset21 #5C6A22
preset22 #254069
preset23 #562685
preset24 #80275D
  /**
   * 用户事件类别取得
   * 
   * @param {*} accessToken 
   * @param {*} userPrincipalName 
   */
  getUserMasterCategories : async function(accessToken,userPrincipalName) {
   try{
       const client = getAuthenticatedClient(accessToken);

    let result = 
              await client.api(`/users/${userPrincipalName}/outlook/masterCategories`)
                             .get();
      //console.log(result.value);
     let response = new ResponseInfo(200,result.value,'');
        return response;
     }catch(errror) {
        let response = new ResponseInfo(400,'',error);
        return response;
      }
  },

 三,共享会议与个人事件

在outlook日历里创建共享事件之后,共享给他人的话,会变成会议,这里暂时没有找到events里面是事件还是会议的区分标志位,所以只能暂时通过取得事件attendees来判断,但是在outlook上创建的个人事件里attendees里也包含自己本身,这个要注意,对于是否是通过别人共享过来的outlook事件,则有明显标志位organizer,所以这个可以明确判断。

猜你喜欢

转载自blog.csdn.net/bai_ye_/article/details/115076939
今日推荐