github.com/line/line-bot-sdk-go/v7@v7.21.0/linebot/insight.go (about)

     1  // Copyright 2019 LINE Corporation
     2  //
     3  // LINE Corporation licenses this file to you under the Apache License,
     4  // version 2.0 (the "License"); you may not use this file except in compliance
     5  // with the License. You may obtain a copy of the License at:
     6  //
     7  //   http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    11  // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    12  // License for the specific language governing permissions and limitations
    13  // under the License.
    14  
    15  package linebot
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  	"net/url"
    21  )
    22  
    23  // InsightType type
    24  type InsightType string
    25  
    26  // InsightType constants
    27  const (
    28  	InsightTypeMessageDelivery      InsightType = "message/delivery"
    29  	InsightTypeUserInteractionStats InsightType = "message/event"
    30  	InsightTypeFollowers            InsightType = "followers"
    31  	InsightTypeDemographic          InsightType = "demographic"
    32  )
    33  
    34  // GetNumberMessagesDeliveryCall type
    35  type GetNumberMessagesDeliveryCall struct {
    36  	c   *Client
    37  	ctx context.Context
    38  
    39  	date        string
    40  	insightType InsightType
    41  }
    42  
    43  // GetNumberMessagesDelivery method
    44  func (client *Client) GetNumberMessagesDelivery(date string) *GetNumberMessagesDeliveryCall {
    45  	return &GetNumberMessagesDeliveryCall{
    46  		c:           client,
    47  		date:        date,
    48  		insightType: InsightTypeMessageDelivery,
    49  	}
    50  }
    51  
    52  // WithContext method
    53  func (call *GetNumberMessagesDeliveryCall) WithContext(ctx context.Context) *GetNumberMessagesDeliveryCall {
    54  	call.ctx = ctx
    55  	return call
    56  }
    57  
    58  // Do method
    59  func (call *GetNumberMessagesDeliveryCall) Do() (*MessagesNumberDeliveryResponse, error) {
    60  	endpoint := fmt.Sprintf(APIEndpointInsight, call.insightType)
    61  	q := url.Values{}
    62  	if call.date != "" {
    63  		q.Add("date", call.date)
    64  	}
    65  	res, err := call.c.get(call.ctx, call.c.endpointBase, endpoint, q)
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  	defer closeResponse(res)
    70  	return decodeToMessagesNumberDeliveryResponse(res)
    71  }
    72  
    73  // GetNumberFollowersCall type
    74  type GetNumberFollowersCall struct {
    75  	c   *Client
    76  	ctx context.Context
    77  
    78  	date        string
    79  	insightType InsightType
    80  }
    81  
    82  // GetNumberFollowers method
    83  func (client *Client) GetNumberFollowers(date string) *GetNumberFollowersCall {
    84  	return &GetNumberFollowersCall{
    85  		c:           client,
    86  		date:        date,
    87  		insightType: InsightTypeFollowers,
    88  	}
    89  }
    90  
    91  // WithContext method
    92  func (call *GetNumberFollowersCall) WithContext(ctx context.Context) *GetNumberFollowersCall {
    93  	call.ctx = ctx
    94  	return call
    95  }
    96  
    97  // Do method
    98  func (call *GetNumberFollowersCall) Do() (*MessagesNumberFollowersResponse, error) {
    99  	endpoint := fmt.Sprintf(APIEndpointInsight, call.insightType)
   100  	q := url.Values{}
   101  	if call.date != "" {
   102  		q.Add("date", call.date)
   103  	}
   104  	res, err := call.c.get(call.ctx, call.c.endpointBase, endpoint, q)
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  	defer closeResponse(res)
   109  	return decodeToMessagesNumberFollowersResponse(res)
   110  }
   111  
   112  // GetFriendDemographicsCall type
   113  type GetFriendDemographicsCall struct {
   114  	c   *Client
   115  	ctx context.Context
   116  
   117  	insightType InsightType
   118  }
   119  
   120  // GetFriendDemographics method
   121  func (client *Client) GetFriendDemographics() *GetFriendDemographicsCall {
   122  	return &GetFriendDemographicsCall{
   123  		c:           client,
   124  		insightType: InsightTypeDemographic,
   125  	}
   126  }
   127  
   128  // WithContext method
   129  func (call *GetFriendDemographicsCall) WithContext(ctx context.Context) *GetFriendDemographicsCall {
   130  	call.ctx = ctx
   131  	return call
   132  }
   133  
   134  // Do method
   135  func (call *GetFriendDemographicsCall) Do() (*MessagesFriendDemographicsResponse, error) {
   136  	endpoint := fmt.Sprintf(APIEndpointInsight, call.insightType)
   137  	var q url.Values
   138  
   139  	res, err := call.c.get(call.ctx, call.c.endpointBase, endpoint, q)
   140  	if err != nil {
   141  		return nil, err
   142  	}
   143  	defer closeResponse(res)
   144  	return decodeToMessagesFriendDemographicsResponse(res)
   145  }
   146  
   147  // GetUserInteractionStatsCall type
   148  type GetUserInteractionStatsCall struct {
   149  	c   *Client
   150  	ctx context.Context
   151  
   152  	requestID   string
   153  	insightType InsightType
   154  }
   155  
   156  // GetUserInteractionStats method
   157  func (client *Client) GetUserInteractionStats(requestID string) *GetUserInteractionStatsCall {
   158  	return &GetUserInteractionStatsCall{
   159  		c:           client,
   160  		requestID:   requestID,
   161  		insightType: InsightTypeUserInteractionStats,
   162  	}
   163  }
   164  
   165  // WithContext method
   166  func (call *GetUserInteractionStatsCall) WithContext(ctx context.Context) *GetUserInteractionStatsCall {
   167  	call.ctx = ctx
   168  	return call
   169  }
   170  
   171  // Do method, returns MessagesUserInteractionStatsResponse
   172  func (call *GetUserInteractionStatsCall) Do() (*MessagesUserInteractionStatsResponse, error) {
   173  	endpoint := fmt.Sprintf(APIEndpointInsight, call.insightType)
   174  	q := url.Values{}
   175  	if call.requestID != "" {
   176  		q.Add("requestId", call.requestID)
   177  	}
   178  	res, err := call.c.get(call.ctx, call.c.endpointBase, endpoint, q)
   179  	if err != nil {
   180  		return nil, err
   181  	}
   182  	defer closeResponse(res)
   183  	return decodeToMessagesUserInteractionStatsResponse(res)
   184  }