sberdevices/salutejs

SmartProfile Integration

Yeti-or opened this issue · 0 comments

https://developer.sberdevices.ru/docs/ru/smartservices/smartprofile-api

We need:

  • user address
  • user phone number

Example of SmartProfile usage using SmartCode:

// Коды ответов и их описание
var PROFILE_STATUS_CODE = {
    '1': {
        'value': '1',
        'desc': 'SUCCESS',
        'comment': 'Данные существует и получено клиентское согласие'
    },
    '100': {
        'value': '100',
        'desc': 'EMPTY DATA',
        'comment': 'Данные отсутствуют в профиле'
    },
    '101': {
        'value': '101',
        'desc': 'CLIENT DENIED',
        'comment': 'Клиент отклонил автозаполнение'
    },
    '102': {
        'value': '102',
        'desc': 'FORBIDDEN',
        'comment': 'Запрещенный вызов от навыка для GET_PROFILE_DATA'
    },
    '103': {
        'value': '103',
        'desc': 'FORBIDDEN REQUEST',
        'comment': 'Запрещенный вызов от навыка для CHOOSE_PROFILE_DATA и DETAILED_PROFILE_DATA  в случае отсутствия клиентского согласия.'
    },
    '104': {
        'value': '104',
        'desc': 'Access Denied',
        'comment': 'Запрещенный вызов от навыка  для CHOOSE_PROFILE_DATA и DETAILED_PROFILE_DATA в случае запроса на изменение/детализирование данных отстуствующих в Access Rights для навыка.'
    }
};


// Названия возможных сообщений (messageName)
var MESSAGE_NAME = {
    'DETAILED_PROFILE_DATA' : 'DETAILED_PROFILE_DATA',
    'CHOOSE_PROFILE_DATA' : 'CHOOSE_PROFILE_DATA',
    'GET_PROFILE_DATA' : 'GET_PROFILE_DATA',
    'TAKE_PROFILE_DATA' : 'TAKE_PROFILE_DATA'
};


// Возможные поля для каждого типа сообщений, где это предусмотрено
var FIELDS_GET_FROM_PROFILE = {
    'DETAILED_PROFILE_DATA': {
        'phone_number': 'phone_number',
        'address': 'address',
    },
    'CHOOSE_PROFILE_DATA': {
        'phone_number': 'phone_number',
        'address': 'address'
    }
};


// Функция, которая отправляет сообщение с заданным messageName
function sendCommandCustomMessageName(items, messageName) {
    var response = $jsapi.context().response;
    var payload = items;
    response.replies = response.replies || [];
    response.replies.push({
        'type': "raw",
        'messageName': messageName,
        'body': payload
    });
}


// Функция для чтения ответа сервиса SmartProfile
function readMessageTakeProfileData() {
    var answer = {
        'status': false,
        'code': null
    };
    var request = $jsapi.context().request.rawRequest;
    var payload = request.payload;
    var statusCode = payload.status_code;

    if (statusCode.code.toString() === PROFILE_STATUS_CODE["1"].value) {
        // все получили
        answer.status = true;
        answer.code = statusCode.code;
        answer['code_desc'] = PROFILE_STATUS_CODE[statusCode.code.toString()].comment;
        answer['profile_data'] = readProfileData(payload.profile_data);
    } else if (statusCode.code &&
        statusCode.code.toString() in PROFILE_STATUS_CODE) {
        // пришел известный статус код, но резльтат не success
        var errorDesc = PROFILE_STATUS_CODE[statusCode.code.toString()].comment;
        answer.code = statusCode.code;
        answer['code_desc'] = errorDesc;
    } else {
        // Пришел неизвестный статус код
    }

    /*
    * формат ответа:
    * {
    *   status: <bool>, // required
    *   code: <number>, // optional
    *   code_desc: <string>,  // optional
    *   profile_data: {  // optional
    *       'customer_name': <string>,  // optional
    *       'phone_number': <string>,  // optional
    *       'address': <object>  // optional
    *   }
    * }
    */
    return answer;
}


// Необязательная функция, проверяет наличие определенных полей. Ели их нет - создает и делает пустые значения внутри
function readProfileData(profileData) {
    var customerName = profileData.customer_name || '';
    var phoneNumber = profileData.phone_number || '';
    var address = profileData.address || {};
    return {
        'customer_name': customerName,
        'phone_number': phoneNumber,
        'address': address
    };
}


// Функция для создания запроса изменения адреса в сервис SmartProfile
function commandChooseProfileData(arrayOfData) {
    // arrayOfData = ['address', phone_number]
    var body = {'fields': [] };

    if (arrayOfData === undefined ||
        (Array.isArray(arrayOfData) && arrayOfData.length === 0)) {
        body.fields = [
            FIELDS_GET_FROM_PROFILE.CHOOSE_PROFILE_DATA.address,
            FIELDS_GET_FROM_PROFILE.CHOOSE_PROFILE_DATA.phone_number
        ];
    } else {
        body.fields = arrayOfData;
    }

    sendCommandCustomMessageName(body, MESSAGE_NAME.CHOOSE_PROFILE_DATA);
}


// Функция для создания запроса доуточнения/изменения текущего адреса в сервис SmartProfile
function commandDetailedProfileData(arrayOfData) {
    // arrayOfData = ['address', phone_number]
    var body = {'fields': [] };

    if (arrayOfData === undefined ||
        (Array.isArray(arrayOfData) && arrayOfData.length === 0)) {
        body.fields = [
            FIELDS_GET_FROM_PROFILE.DETAILED_PROFILE_DATA.address,
            // FIELDS_GET_FROM_PROFILE.DETAILED_PROFILE_DATA.phone_number
        ];
    } else {
        body.fields = arrayOfData;
    }

    sendCommandCustomMessageName(body, MESSAGE_NAME.DETAILED_PROFILE_DATA);
}


// Функция для создания запроса полчения текущего выбранного пользователем адреса в сервисе SmartProfile
function commandGetProfileData() {
    var body = {};
    sendCommandCustomMessageName(body, MESSAGE_NAME.GET_PROFILE_DATA);
}