1115cd2caSopenharmony_ci/*
2115cd2caSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3115cd2caSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4115cd2caSopenharmony_ci * you may not use this file except in compliance with the License.
5115cd2caSopenharmony_ci * You may obtain a copy of the License at
6115cd2caSopenharmony_ci *
7115cd2caSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8115cd2caSopenharmony_ci *
9115cd2caSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10115cd2caSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11115cd2caSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12115cd2caSopenharmony_ci * See the License for the specific language governing permissions and
13115cd2caSopenharmony_ci * limitations under the License.
14115cd2caSopenharmony_ci */
15115cd2caSopenharmony_ci
16115cd2caSopenharmony_ci#include "contacts_api.h"
17115cd2caSopenharmony_ci
18115cd2caSopenharmony_ci#include <mutex>
19115cd2caSopenharmony_ci
20115cd2caSopenharmony_ci#include "datashare_predicates.h"
21115cd2caSopenharmony_ci#include "rdb_errno.h"
22115cd2caSopenharmony_ci#include "rdb_helper.h"
23115cd2caSopenharmony_ci#include "rdb_open_callback.h"
24115cd2caSopenharmony_ci#include "rdb_predicates.h"
25115cd2caSopenharmony_ci#include "rdb_store.h"
26115cd2caSopenharmony_ci#include "result_set.h"
27115cd2caSopenharmony_ci#include "securec.h"
28115cd2caSopenharmony_ci
29115cd2caSopenharmony_ci#include "contacts_control.h"
30115cd2caSopenharmony_ci#include "contacts_napi_common.h"
31115cd2caSopenharmony_ci#include "contacts_napi_utils.h"
32115cd2caSopenharmony_ci#include "hilog_wrapper_api.h"
33115cd2caSopenharmony_ci#include "result_convert.h"
34115cd2caSopenharmony_ci#include "contacts_telephony_permission.h"
35115cd2caSopenharmony_ci
36115cd2caSopenharmony_cinamespace OHOS {
37115cd2caSopenharmony_cinamespace ContactsApi {
38115cd2caSopenharmony_cinamespace {
39115cd2caSopenharmony_cistd::mutex g_mutex;
40115cd2caSopenharmony_ci}
41115cd2caSopenharmony_ci/**
42115cd2caSopenharmony_ci * @brief Initialize NAPI object
43115cd2caSopenharmony_ci *
44115cd2caSopenharmony_ci * @param env Conditions for initialize operation
45115cd2caSopenharmony_ci * @param object Conditions for initialize operation
46115cd2caSopenharmony_ci * @param hold Attribute of object
47115cd2caSopenharmony_ci * @param attr Attribute of object
48115cd2caSopenharmony_ci * @param contact Attribute of object
49115cd2caSopenharmony_ci */
50115cd2caSopenharmony_civoid ObjectInit(napi_env env, napi_value object, napi_value &hold, napi_value &attr, napi_value &contact)
51115cd2caSopenharmony_ci{
52115cd2caSopenharmony_ci    int type = GetType(env, object);
53115cd2caSopenharmony_ci    switch (type) {
54115cd2caSopenharmony_ci        case TYPE_HOLDER:
55115cd2caSopenharmony_ci            hold = object;
56115cd2caSopenharmony_ci            break;
57115cd2caSopenharmony_ci        case TYPE_ATTR:
58115cd2caSopenharmony_ci            attr = object;
59115cd2caSopenharmony_ci            break;
60115cd2caSopenharmony_ci        case TYPE_CONTACT:
61115cd2caSopenharmony_ci            contact = object;
62115cd2caSopenharmony_ci            break;
63115cd2caSopenharmony_ci        default:
64115cd2caSopenharmony_ci            break;
65115cd2caSopenharmony_ci    }
66115cd2caSopenharmony_ci}
67115cd2caSopenharmony_ci
68115cd2caSopenharmony_ci/**
69115cd2caSopenharmony_ci * @brief Initialize NAPI number object
70115cd2caSopenharmony_ci *
71115cd2caSopenharmony_ci * @param env Conditions for initialize operation
72115cd2caSopenharmony_ci * @param object Conditions for initialize operation
73115cd2caSopenharmony_ci * @param id Number object
74115cd2caSopenharmony_ci */
75115cd2caSopenharmony_civoid ObjectInitId(napi_env env, napi_value object, napi_value &id)
76115cd2caSopenharmony_ci{
77115cd2caSopenharmony_ci    int type = GetType(env, object);
78115cd2caSopenharmony_ci    switch (type) {
79115cd2caSopenharmony_ci        case TYPE_NAPI_NUMBER:
80115cd2caSopenharmony_ci            id = object;
81115cd2caSopenharmony_ci            break;
82115cd2caSopenharmony_ci        default:
83115cd2caSopenharmony_ci            break;
84115cd2caSopenharmony_ci    }
85115cd2caSopenharmony_ci}
86115cd2caSopenharmony_ci
87115cd2caSopenharmony_ci/**
88115cd2caSopenharmony_ci * @brief Initialize NAPI string object
89115cd2caSopenharmony_ci *
90115cd2caSopenharmony_ci * @param env Conditions for initialize operation
91115cd2caSopenharmony_ci * @param object Conditions for initialize operation
92115cd2caSopenharmony_ci * @param key String object
93115cd2caSopenharmony_ci */
94115cd2caSopenharmony_civoid ObjectInitString(napi_env env, napi_value object, napi_value &key)
95115cd2caSopenharmony_ci{
96115cd2caSopenharmony_ci    int type = GetType(env, object);
97115cd2caSopenharmony_ci    switch (type) {
98115cd2caSopenharmony_ci        case TYPE_NAPI_STRING:
99115cd2caSopenharmony_ci            key = object;
100115cd2caSopenharmony_ci            break;
101115cd2caSopenharmony_ci        default:
102115cd2caSopenharmony_ci            break;
103115cd2caSopenharmony_ci    }
104115cd2caSopenharmony_ci}
105115cd2caSopenharmony_ci
106115cd2caSopenharmony_ci/**
107115cd2caSopenharmony_ci * @brief Get NAPI object type
108115cd2caSopenharmony_ci *
109115cd2caSopenharmony_ci * @param env Conditions for get type operation
110115cd2caSopenharmony_ci * @param value Conditions for get type operation
111115cd2caSopenharmony_ci *
112115cd2caSopenharmony_ci * @return The result returned by get type operation
113115cd2caSopenharmony_ci */
114115cd2caSopenharmony_ciint GetType(napi_env env, napi_value value)
115115cd2caSopenharmony_ci{
116115cd2caSopenharmony_ci    napi_valuetype valueType;
117115cd2caSopenharmony_ci    napi_typeof(env, value, &valueType);
118115cd2caSopenharmony_ci    bool result = false;
119115cd2caSopenharmony_ci    switch (valueType) {
120115cd2caSopenharmony_ci        case napi_number:
121115cd2caSopenharmony_ci            return TYPE_NAPI_NUMBER;
122115cd2caSopenharmony_ci            break;
123115cd2caSopenharmony_ci        case napi_string:
124115cd2caSopenharmony_ci            return TYPE_NAPI_STRING;
125115cd2caSopenharmony_ci            break;
126115cd2caSopenharmony_ci        case napi_object:
127115cd2caSopenharmony_ci            napi_value key;
128115cd2caSopenharmony_ci            napi_create_string_utf8(env, "bundleName", NAPI_AUTO_LENGTH, &key);
129115cd2caSopenharmony_ci            napi_has_property(env, value, key, &result);
130115cd2caSopenharmony_ci            if (result) {
131115cd2caSopenharmony_ci                return TYPE_HOLDER;
132115cd2caSopenharmony_ci            }
133115cd2caSopenharmony_ci            napi_create_string_utf8(env, "attributes", NAPI_AUTO_LENGTH, &key);
134115cd2caSopenharmony_ci            napi_has_property(env, value, key, &result);
135115cd2caSopenharmony_ci            if (result) {
136115cd2caSopenharmony_ci                return TYPE_ATTR;
137115cd2caSopenharmony_ci            }
138115cd2caSopenharmony_ci            return TYPE_CONTACT;
139115cd2caSopenharmony_ci            break;
140115cd2caSopenharmony_ci        default:
141115cd2caSopenharmony_ci            return TYPE_NAPI_ERROR;
142115cd2caSopenharmony_ci            break;
143115cd2caSopenharmony_ci    }
144115cd2caSopenharmony_ci}
145115cd2caSopenharmony_ci
146115cd2caSopenharmony_ci/**
147115cd2caSopenharmony_ci * @brief Get dataShareHelper
148115cd2caSopenharmony_ci *
149115cd2caSopenharmony_ci * @param env Conditions for get dataShareHelper operation
150115cd2caSopenharmony_ci *
151115cd2caSopenharmony_ci * @return The result returned by get dataShareHelper
152115cd2caSopenharmony_ci */
153115cd2caSopenharmony_cibool GetDataShareHelper(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper)
154115cd2caSopenharmony_ci{
155115cd2caSopenharmony_ci    napi_value global;
156115cd2caSopenharmony_ci    bool isStageMode = false;
157115cd2caSopenharmony_ci    napi_value abilityContext = nullptr;
158115cd2caSopenharmony_ci    napi_status status = napi_get_global(env, &global);
159115cd2caSopenharmony_ci    if (executeHelper->abilityContext != nullptr) {
160115cd2caSopenharmony_ci        isStageMode = true;
161115cd2caSopenharmony_ci        status = napi_ok;
162115cd2caSopenharmony_ci        abilityContext = executeHelper->abilityContext;
163115cd2caSopenharmony_ci    } else {
164115cd2caSopenharmony_ci        if (status != napi_ok) {
165115cd2caSopenharmony_ci            HILOG_ERROR("GetDataShareHelper napi_get_global != napi_ok");
166115cd2caSopenharmony_ci        }
167115cd2caSopenharmony_ci        napi_value globalThis;
168115cd2caSopenharmony_ci        status = napi_get_named_property(env, global, "globalThis", &globalThis);
169115cd2caSopenharmony_ci        if (status != napi_ok) {
170115cd2caSopenharmony_ci            HILOG_ERROR("GetDataShareHelper napi_get_globalThis != napi_ok");
171115cd2caSopenharmony_ci        }
172115cd2caSopenharmony_ci        status = napi_get_named_property(env, globalThis, "abilityContext", &abilityContext);
173115cd2caSopenharmony_ci        if (status != napi_ok) {
174115cd2caSopenharmony_ci            HILOG_ERROR("GetDataShareHelper napi_get_abilityContext != napi_ok");
175115cd2caSopenharmony_ci        }
176115cd2caSopenharmony_ci        status = OHOS::AbilityRuntime::IsStageContext(env, abilityContext, isStageMode);
177115cd2caSopenharmony_ci    }
178115cd2caSopenharmony_ci
179115cd2caSopenharmony_ci    std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = nullptr;
180115cd2caSopenharmony_ci    if (status != napi_ok || !isStageMode) {
181115cd2caSopenharmony_ci        HILOG_INFO("GetFAModeContext");
182115cd2caSopenharmony_ci        auto ability = OHOS::AbilityRuntime::GetCurrentAbility(env);
183115cd2caSopenharmony_ci        if (ability == nullptr) {
184115cd2caSopenharmony_ci            HILOG_ERROR("Failed to get native ability instance");
185115cd2caSopenharmony_ci            return false;
186115cd2caSopenharmony_ci        }
187115cd2caSopenharmony_ci        auto context = ability->GetContext();
188115cd2caSopenharmony_ci        if (context == nullptr) {
189115cd2caSopenharmony_ci            HILOG_ERROR("Failed to get native context instance");
190115cd2caSopenharmony_ci            return false;
191115cd2caSopenharmony_ci        }
192115cd2caSopenharmony_ci        executeHelper->dataShareHelper = DataShare::DataShareHelper::Creator(context->GetToken(), CONTACTS_DATA_URI);
193115cd2caSopenharmony_ci    } else {
194115cd2caSopenharmony_ci        HILOG_INFO("GetStageModeContext");
195115cd2caSopenharmony_ci        auto context = OHOS::AbilityRuntime::GetStageModeContext(env, abilityContext);
196115cd2caSopenharmony_ci        if (context == nullptr) {
197115cd2caSopenharmony_ci            HILOG_ERROR("Failed to get native stage context instance");
198115cd2caSopenharmony_ci            return false;
199115cd2caSopenharmony_ci        }
200115cd2caSopenharmony_ci        executeHelper->dataShareHelper = DataShare::DataShareHelper::Creator(context->GetToken(), CONTACTS_DATA_URI);
201115cd2caSopenharmony_ci    }
202115cd2caSopenharmony_ci    return false;
203115cd2caSopenharmony_ci}
204115cd2caSopenharmony_ci
205115cd2caSopenharmony_ci/**
206115cd2caSopenharmony_ci * @brief Establish predicates condition by holder object
207115cd2caSopenharmony_ci *
208115cd2caSopenharmony_ci * @param holder Conditions for establish predicates operation
209115cd2caSopenharmony_ci * @param predicates Conditions for establish predicates operation
210115cd2caSopenharmony_ci */
211115cd2caSopenharmony_civoid HolderPredicates(Holder &holder, DataShare::DataSharePredicates &predicates)
212115cd2caSopenharmony_ci{
213115cd2caSopenharmony_ci    if (!holder.bundleName.empty()) {
214115cd2caSopenharmony_ci        predicates.And();
215115cd2caSopenharmony_ci        predicates.EqualTo("account_type", holder.bundleName);
216115cd2caSopenharmony_ci    }
217115cd2caSopenharmony_ci    if (!holder.displayName.empty()) {
218115cd2caSopenharmony_ci        predicates.And();
219115cd2caSopenharmony_ci        predicates.EqualTo("account_name", holder.displayName);
220115cd2caSopenharmony_ci    }
221115cd2caSopenharmony_ci    if (holder.holderId > 0) {
222115cd2caSopenharmony_ci        predicates.And();
223115cd2caSopenharmony_ci        predicates.EqualTo("account_id", std::to_string(holder.holderId));
224115cd2caSopenharmony_ci    }
225115cd2caSopenharmony_ci}
226115cd2caSopenharmony_ci
227115cd2caSopenharmony_ci/**
228115cd2caSopenharmony_ci * @brief Establish predicates condition by attributes object
229115cd2caSopenharmony_ci *
230115cd2caSopenharmony_ci * @param attrs Conditions for establish predicates operation
231115cd2caSopenharmony_ci * @param predicates Conditions for establish predicates operation
232115cd2caSopenharmony_ci */
233115cd2caSopenharmony_civoid AttributesPredicates(bool isBegin, ContactAttributes &attrs, DataShare::DataSharePredicates &predicates)
234115cd2caSopenharmony_ci{
235115cd2caSopenharmony_ci    unsigned int size = attrs.attributes.size();
236115cd2caSopenharmony_ci    if (size > 0) {
237115cd2caSopenharmony_ci        if (!isBegin) {
238115cd2caSopenharmony_ci            predicates.And();
239115cd2caSopenharmony_ci        }
240115cd2caSopenharmony_ci        predicates.BeginWrap();
241115cd2caSopenharmony_ci    }
242115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; ++i) {
243115cd2caSopenharmony_ci        predicates.EqualTo("type_id", std::to_string(attrs.attributes[i]));
244115cd2caSopenharmony_ci        if (i != size - 1) {
245115cd2caSopenharmony_ci            predicates.Or();
246115cd2caSopenharmony_ci        }
247115cd2caSopenharmony_ci    }
248115cd2caSopenharmony_ci    if (size > 0) {
249115cd2caSopenharmony_ci        predicates.EndWrap();
250115cd2caSopenharmony_ci    }
251115cd2caSopenharmony_ci}
252115cd2caSopenharmony_ci
253115cd2caSopenharmony_civoid CheckAttributes(ContactAttributes &attrs)
254115cd2caSopenharmony_ci{
255115cd2caSopenharmony_ci    unsigned int size = attrs.attributes.size();
256115cd2caSopenharmony_ci    if (size == 0) {
257115cd2caSopenharmony_ci        HILOG_INFO("attributes not exist, it means all attribute");
258115cd2caSopenharmony_ci        attrs.attributes.push_back(EMAIL);
259115cd2caSopenharmony_ci        attrs.attributes.push_back(IM);
260115cd2caSopenharmony_ci        attrs.attributes.push_back(NICKNAME);
261115cd2caSopenharmony_ci        attrs.attributes.push_back(ORGANIZATION);
262115cd2caSopenharmony_ci        attrs.attributes.push_back(PHONE);
263115cd2caSopenharmony_ci        attrs.attributes.push_back(NAME);
264115cd2caSopenharmony_ci        attrs.attributes.push_back(POSTAL_ADDRESS);
265115cd2caSopenharmony_ci        attrs.attributes.push_back(PHOTO);
266115cd2caSopenharmony_ci        attrs.attributes.push_back(GROUP_MEMBERSHIP);
267115cd2caSopenharmony_ci        attrs.attributes.push_back(NOTE);
268115cd2caSopenharmony_ci        attrs.attributes.push_back(CONTACT_EVENT);
269115cd2caSopenharmony_ci        attrs.attributes.push_back(WEBSITE);
270115cd2caSopenharmony_ci        attrs.attributes.push_back(RELATION);
271115cd2caSopenharmony_ci        attrs.attributes.push_back(SIP_ADDRESS);
272115cd2caSopenharmony_ci    }
273115cd2caSopenharmony_ci}
274115cd2caSopenharmony_ci
275115cd2caSopenharmony_ci/**
276115cd2caSopenharmony_ci * @brief Resolve object interface in DELETE_CONTACT case
277115cd2caSopenharmony_ci *
278115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
279115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
280115cd2caSopenharmony_ci */
281115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildDeleteContactPredicates(napi_env env, ExecuteHelper *executeHelper)
282115cd2caSopenharmony_ci{
283115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
284115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
285115cd2caSopenharmony_ci    std::string keyValue = contactsBuild.NapiGetValueString(env, executeHelper->argv[0]);
286115cd2caSopenharmony_ci    if (!keyValue.empty()) {
287115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
288115cd2caSopenharmony_ci        predicates.And();
289115cd2caSopenharmony_ci        predicates.EqualTo("quick_search_key", keyValue);
290115cd2caSopenharmony_ci    }
291115cd2caSopenharmony_ci    return predicates;
292115cd2caSopenharmony_ci}
293115cd2caSopenharmony_ci
294115cd2caSopenharmony_ci/**
295115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_CONTACT case
296115cd2caSopenharmony_ci *
297115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
298115cd2caSopenharmony_ci * @param key Conditions for resolve object interface operation
299115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
300115cd2caSopenharmony_ci * @param attr Conditions for resolve object interface operation
301115cd2caSopenharmony_ci */
302115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryContactPredicates(
303115cd2caSopenharmony_ci    napi_env env, napi_value key, napi_value hold, napi_value attr)
304115cd2caSopenharmony_ci{
305115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
306115cd2caSopenharmony_ci    std::string keyValue = contactsBuild.NapiGetValueString(env, key);
307115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
308115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
309115cd2caSopenharmony_ci    if (!keyValue.empty()) {
310115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
311115cd2caSopenharmony_ci        predicates.And();
312115cd2caSopenharmony_ci        predicates.EqualTo("quick_search_key", keyValue);
313115cd2caSopenharmony_ci        HolderPredicates(holder, predicates);
314115cd2caSopenharmony_ci    }
315115cd2caSopenharmony_ci    return predicates;
316115cd2caSopenharmony_ci}
317115cd2caSopenharmony_ci
318115cd2caSopenharmony_civoid HoldersStructure(std::map<std::string, std::string> &holders, Holder &holder)
319115cd2caSopenharmony_ci{
320115cd2caSopenharmony_ci    if (!holder.bundleName.empty()) {
321115cd2caSopenharmony_ci        holders["account_type"] = holder.bundleName;
322115cd2caSopenharmony_ci    }
323115cd2caSopenharmony_ci    if (!holder.displayName.empty()) {
324115cd2caSopenharmony_ci        holders["account_name"] = holder.displayName;
325115cd2caSopenharmony_ci    }
326115cd2caSopenharmony_ci    if (holder.holderId > 0) {
327115cd2caSopenharmony_ci        holders["account_id"] = std::to_string(holder.holderId);
328115cd2caSopenharmony_ci    }
329115cd2caSopenharmony_ci}
330115cd2caSopenharmony_ci
331115cd2caSopenharmony_ci/**
332115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_CONTACTS case
333115cd2caSopenharmony_ci *
334115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
335115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
336115cd2caSopenharmony_ci * @param attr Conditions for resolve object interface operation
337115cd2caSopenharmony_ci */
338115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryContactsPredicates(napi_env env, napi_value hold, napi_value attr)
339115cd2caSopenharmony_ci{
340115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
341115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
342115cd2caSopenharmony_ci    ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr);
343115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
344115cd2caSopenharmony_ci    std::map<std::string, std::string> holders;
345115cd2caSopenharmony_ci    HoldersStructure(holders, holder);
346115cd2caSopenharmony_ci    unsigned int size = attrs.attributes.size();
347115cd2caSopenharmony_ci    unsigned int mapSize = holders.size();
348115cd2caSopenharmony_ci    std::map<std::string, std::string>::iterator it;
349115cd2caSopenharmony_ci    for (it = holders.begin(); it != holders.end(); ++it) {
350115cd2caSopenharmony_ci        predicates.EqualTo(it->first, it->second);
351115cd2caSopenharmony_ci        if (it != --holders.end()) {
352115cd2caSopenharmony_ci            predicates.And();
353115cd2caSopenharmony_ci        }
354115cd2caSopenharmony_ci    }
355115cd2caSopenharmony_ci    if (mapSize > 0) {
356115cd2caSopenharmony_ci        predicates.And();
357115cd2caSopenharmony_ci    }
358115cd2caSopenharmony_ci    if (size > 0) {
359115cd2caSopenharmony_ci        predicates.BeginWrap();
360115cd2caSopenharmony_ci    }
361115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; ++i) {
362115cd2caSopenharmony_ci        predicates.EqualTo("type_id", std::to_string(attrs.attributes[i]));
363115cd2caSopenharmony_ci        if (i != size - 1) {
364115cd2caSopenharmony_ci            predicates.Or();
365115cd2caSopenharmony_ci        }
366115cd2caSopenharmony_ci    }
367115cd2caSopenharmony_ci    if (size > 0) {
368115cd2caSopenharmony_ci        predicates.EndWrap();
369115cd2caSopenharmony_ci    }
370115cd2caSopenharmony_ci    if (size > 0 || mapSize > 0) {
371115cd2caSopenharmony_ci        predicates.And();
372115cd2caSopenharmony_ci    }
373115cd2caSopenharmony_ci    predicates.EqualTo("is_deleted", "0");
374115cd2caSopenharmony_ci    return predicates;
375115cd2caSopenharmony_ci}
376115cd2caSopenharmony_ci
377115cd2caSopenharmony_ci/**
378115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_CONTACTS_BY_EMAIL case
379115cd2caSopenharmony_ci *
380115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
381115cd2caSopenharmony_ci * @param emailobject Conditions for resolve object interface operation
382115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
383115cd2caSopenharmony_ci * @param attr Conditions for resolve object interface operation
384115cd2caSopenharmony_ci */
385115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryContactsByEmailPredicates(
386115cd2caSopenharmony_ci    napi_env env, napi_value emailobject, napi_value hold, napi_value attr)
387115cd2caSopenharmony_ci{
388115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
389115cd2caSopenharmony_ci    std::string email = contactsBuild.NapiGetValueString(env, emailobject);
390115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
391115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
392115cd2caSopenharmony_ci    if (!email.empty() || email != "") {
393115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
394115cd2caSopenharmony_ci        predicates.And();
395115cd2caSopenharmony_ci        predicates.EqualTo("detail_info", email);
396115cd2caSopenharmony_ci        predicates.And();
397115cd2caSopenharmony_ci        predicates.EqualTo("content_type", "email");
398115cd2caSopenharmony_ci        HolderPredicates(holder, predicates);
399115cd2caSopenharmony_ci    }
400115cd2caSopenharmony_ci    return predicates;
401115cd2caSopenharmony_ci}
402115cd2caSopenharmony_ci
403115cd2caSopenharmony_ci/**
404115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_CONTACTS_BY_PHONE_NUMBER case
405115cd2caSopenharmony_ci *
406115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
407115cd2caSopenharmony_ci * @param number Conditions for resolve object interface operation
408115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
409115cd2caSopenharmony_ci * @param attr Conditions for resolve object interface operation
410115cd2caSopenharmony_ci */
411115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryContactsByPhoneNumberPredicates(
412115cd2caSopenharmony_ci    napi_env env, napi_value number, napi_value hold, napi_value attr)
413115cd2caSopenharmony_ci{
414115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
415115cd2caSopenharmony_ci    std::string phoneNumber = contactsBuild.NapiGetValueString(env, number);
416115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
417115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
418115cd2caSopenharmony_ci    if (!phoneNumber.empty() || phoneNumber != "") {
419115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
420115cd2caSopenharmony_ci        predicates.And();
421115cd2caSopenharmony_ci        predicates.EqualTo("detail_info", phoneNumber);
422115cd2caSopenharmony_ci        predicates.And();
423115cd2caSopenharmony_ci        predicates.EqualTo("content_type", "phone");
424115cd2caSopenharmony_ci        HolderPredicates(holder, predicates);
425115cd2caSopenharmony_ci    }
426115cd2caSopenharmony_ci    return predicates;
427115cd2caSopenharmony_ci}
428115cd2caSopenharmony_ci
429115cd2caSopenharmony_ci/**
430115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_GROUPS case
431115cd2caSopenharmony_ci *
432115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
433115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
434115cd2caSopenharmony_ci */
435115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryGroupsPredicates(napi_env env, napi_value hold)
436115cd2caSopenharmony_ci{
437115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
438115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
439115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
440115cd2caSopenharmony_ci    std::map<std::string, std::string> holders;
441115cd2caSopenharmony_ci    HoldersStructure(holders, holder);
442115cd2caSopenharmony_ci    predicates.EqualTo("is_deleted", "0");
443115cd2caSopenharmony_ci    unsigned int size = holders.size();
444115cd2caSopenharmony_ci    if (size > 0) {
445115cd2caSopenharmony_ci        predicates.And();
446115cd2caSopenharmony_ci    }
447115cd2caSopenharmony_ci    std::map<std::string, std::string>::iterator it;
448115cd2caSopenharmony_ci    for (it = holders.begin(); it != holders.end(); ++it) {
449115cd2caSopenharmony_ci        predicates.EqualTo(it->first, it->second);
450115cd2caSopenharmony_ci        if (it != --holders.end()) {
451115cd2caSopenharmony_ci            predicates.And();
452115cd2caSopenharmony_ci        }
453115cd2caSopenharmony_ci    }
454115cd2caSopenharmony_ci    return predicates;
455115cd2caSopenharmony_ci}
456115cd2caSopenharmony_ci
457115cd2caSopenharmony_ci/**
458115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_KEY case
459115cd2caSopenharmony_ci *
460115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
461115cd2caSopenharmony_ci * @param id Conditions for resolve object interface operation
462115cd2caSopenharmony_ci * @param hold Conditions for resolve object interface operation
463115cd2caSopenharmony_ci */
464115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryKeyPredicates(napi_env env, napi_value id, napi_value hold)
465115cd2caSopenharmony_ci{
466115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
467115cd2caSopenharmony_ci    int value = contactsBuild.GetInt(env, id);
468115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
469115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
470115cd2caSopenharmony_ci    if (value != 0) {
471115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
472115cd2caSopenharmony_ci        predicates.And();
473115cd2caSopenharmony_ci        predicates.EqualTo("contact_id", std::to_string(value));
474115cd2caSopenharmony_ci        HolderPredicates(holder, predicates);
475115cd2caSopenharmony_ci    }
476115cd2caSopenharmony_ci    return predicates;
477115cd2caSopenharmony_ci}
478115cd2caSopenharmony_ci
479115cd2caSopenharmony_ci/**
480115cd2caSopenharmony_ci * @brief Resolve object interface in QUERY_MY_CARD case
481115cd2caSopenharmony_ci *
482115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
483115cd2caSopenharmony_ci * @param attr Conditions for resolve object interface operation
484115cd2caSopenharmony_ci */
485115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryMyCardPredicates(napi_env env, napi_value attr)
486115cd2caSopenharmony_ci{
487115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
488115cd2caSopenharmony_ci    ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr);
489115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
490115cd2caSopenharmony_ci    unsigned int size = attrs.attributes.size();
491115cd2caSopenharmony_ci    predicates.EqualTo("is_deleted", "0");
492115cd2caSopenharmony_ci    if (size > 0) {
493115cd2caSopenharmony_ci        predicates.And();
494115cd2caSopenharmony_ci    }
495115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; ++i) {
496115cd2caSopenharmony_ci        predicates.EqualTo("type_id", std::to_string(attrs.attributes[i]));
497115cd2caSopenharmony_ci        if (i != size - 1) {
498115cd2caSopenharmony_ci            predicates.Or();
499115cd2caSopenharmony_ci        }
500115cd2caSopenharmony_ci    }
501115cd2caSopenharmony_ci    return predicates;
502115cd2caSopenharmony_ci}
503115cd2caSopenharmony_ci
504115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildQueryContactData(napi_env env, napi_value &contactObject, napi_value &attrObject,
505115cd2caSopenharmony_ci    std::vector<DataShare::DataShareValuesBucket> &valueContactData)
506115cd2caSopenharmony_ci{
507115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
508115cd2caSopenharmony_ci    Contacts contact;
509115cd2caSopenharmony_ci    contactsBuild.GetContactDataByObject(env, contactObject, contact);
510115cd2caSopenharmony_ci    ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attrObject);
511115cd2caSopenharmony_ci    CheckAttributes(attrs);
512115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
513115cd2caSopenharmony_ci    std::vector<std::string> fields;
514115cd2caSopenharmony_ci    fields.push_back("raw_contact_id");
515115cd2caSopenharmony_ci    if (contact.id != 0) {
516115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
517115cd2caSopenharmony_ci        predicates.And();
518115cd2caSopenharmony_ci        predicates.EqualTo("contact_id", std::to_string(contact.id));
519115cd2caSopenharmony_ci        predicates.GroupBy(fields);
520115cd2caSopenharmony_ci    }
521115cd2caSopenharmony_ci    unsigned int size = attrs.attributes.size();
522115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; i++) {
523115cd2caSopenharmony_ci        contactsBuild.BuildValueContactDataByType(contact, attrs.attributes[i], valueContactData);
524115cd2caSopenharmony_ci    }
525115cd2caSopenharmony_ci    return predicates;
526115cd2caSopenharmony_ci}
527115cd2caSopenharmony_ci
528115cd2caSopenharmony_cistd::vector<std::string> BuildUpdateContactColumns()
529115cd2caSopenharmony_ci{
530115cd2caSopenharmony_ci    std::vector<std::string> columns;
531115cd2caSopenharmony_ci    columns.push_back("raw_contact_id");
532115cd2caSopenharmony_ci    return columns;
533115cd2caSopenharmony_ci}
534115cd2caSopenharmony_ci
535115cd2caSopenharmony_ciint GetRawIdByResultSet(const std::shared_ptr<DataShare::DataShareResultSet> &resultSet)
536115cd2caSopenharmony_ci{
537115cd2caSopenharmony_ci    if (resultSet == nullptr) {
538115cd2caSopenharmony_ci        return -1;
539115cd2caSopenharmony_ci    }
540115cd2caSopenharmony_ci    int resultSetNum = resultSet->GoToFirstRow();
541115cd2caSopenharmony_ci    int intValue = 0;
542115cd2caSopenharmony_ci    while (resultSetNum == OHOS::NativeRdb::E_OK) {
543115cd2caSopenharmony_ci        resultSet->GetInt(0, intValue);
544115cd2caSopenharmony_ci        resultSetNum = resultSet->GoToNextRow();
545115cd2caSopenharmony_ci    }
546115cd2caSopenharmony_ci    resultSet->Close();
547115cd2caSopenharmony_ci    return intValue;
548115cd2caSopenharmony_ci}
549115cd2caSopenharmony_ci
550115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildUpdateContactConvertParams(napi_env env, napi_value &contact,
551115cd2caSopenharmony_ci    napi_value &attr, ExecuteHelper *executeHelper)
552115cd2caSopenharmony_ci{
553115cd2caSopenharmony_ci    executeHelper->valueContactData.clear();
554115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates =
555115cd2caSopenharmony_ci        BuildQueryContactData(env, contact, attr, executeHelper->valueContactData);
556115cd2caSopenharmony_ci    executeHelper->columns = BuildUpdateContactColumns();
557115cd2caSopenharmony_ci    executeHelper->deletePredicates = BuildDeleteContactDataPredicates(env, attr);
558115cd2caSopenharmony_ci    return predicates;
559115cd2caSopenharmony_ci}
560115cd2caSopenharmony_ci
561115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildDeleteContactDataPredicates(napi_env env, napi_value attr)
562115cd2caSopenharmony_ci{
563115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
564115cd2caSopenharmony_ci    ContactAttributes attrs = contactsBuild.GetContactAttributes(env, attr);
565115cd2caSopenharmony_ci    CheckAttributes(attrs);
566115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
567115cd2caSopenharmony_ci    AttributesPredicates(true, attrs, predicates);
568115cd2caSopenharmony_ci    return predicates;
569115cd2caSopenharmony_ci}
570115cd2caSopenharmony_ci
571115cd2caSopenharmony_ci/**
572115cd2caSopenharmony_ci * @brief Resolve object interface in IS_LOCAL_CONTACT case
573115cd2caSopenharmony_ci *
574115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
575115cd2caSopenharmony_ci * @param id Conditions for resolve object interface operation
576115cd2caSopenharmony_ci */
577115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildIsLocalContactPredicates(napi_env env, napi_value id)
578115cd2caSopenharmony_ci{
579115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
580115cd2caSopenharmony_ci    int value = contactsBuild.GetInt(env, id);
581115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
582115cd2caSopenharmony_ci    if (value != 0) {
583115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
584115cd2caSopenharmony_ci        predicates.And();
585115cd2caSopenharmony_ci        predicates.EqualTo("contact_id", std::to_string(value));
586115cd2caSopenharmony_ci        predicates.And();
587115cd2caSopenharmony_ci        predicates.EqualTo("account_type", "com.ohos.contacts");
588115cd2caSopenharmony_ci        predicates.And();
589115cd2caSopenharmony_ci        predicates.EqualTo("account_name", "phone");
590115cd2caSopenharmony_ci    }
591115cd2caSopenharmony_ci    return predicates;
592115cd2caSopenharmony_ci}
593115cd2caSopenharmony_ci
594115cd2caSopenharmony_ci/**
595115cd2caSopenharmony_ci * @brief Resolve object interface in IS_MY_CARD case
596115cd2caSopenharmony_ci *
597115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
598115cd2caSopenharmony_ci * @param id Conditions for resolve object interface operation
599115cd2caSopenharmony_ci */
600115cd2caSopenharmony_ciDataShare::DataSharePredicates BuildIsMyCardPredicates(napi_env env, napi_value id)
601115cd2caSopenharmony_ci{
602115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
603115cd2caSopenharmony_ci    int value = contactsBuild.GetInt(env, id);
604115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
605115cd2caSopenharmony_ci    if (value != 0) {
606115cd2caSopenharmony_ci        predicates.EqualTo("is_deleted", "0");
607115cd2caSopenharmony_ci        predicates.And();
608115cd2caSopenharmony_ci        predicates.EqualTo("contact_id", std::to_string(value));
609115cd2caSopenharmony_ci    }
610115cd2caSopenharmony_ci    return predicates;
611115cd2caSopenharmony_ci}
612115cd2caSopenharmony_ci
613115cd2caSopenharmony_civoid ExecuteDone(napi_env env, napi_status status, void *data)
614115cd2caSopenharmony_ci{
615115cd2caSopenharmony_ci    HILOG_INFO("contactApi ExecuteDone start===>");
616115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = reinterpret_cast<ExecuteHelper *>(data);
617115cd2caSopenharmony_ci    HILOG_INFO("ExecuteDone workName: %{public}d", executeHelper->actionCode);
618115cd2caSopenharmony_ci    napi_value result = nullptr;
619115cd2caSopenharmony_ci    napi_deferred deferred = executeHelper->deferred;
620115cd2caSopenharmony_ci    HandleExecuteResult(env, executeHelper, result);
621115cd2caSopenharmony_ci    if (executeHelper->abilityContext != nullptr) {
622115cd2caSopenharmony_ci        HILOG_INFO("executeHelper->abilityContext != nullptr");
623115cd2caSopenharmony_ci        napi_value errorCode = nullptr;
624115cd2caSopenharmony_ci        HandleExecuteErrorCode(env, executeHelper, errorCode);
625115cd2caSopenharmony_ci        if (errorCode != nullptr) {
626115cd2caSopenharmony_ci            NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, deferred, errorCode));
627115cd2caSopenharmony_ci        } else {
628115cd2caSopenharmony_ci            NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, deferred, result));
629115cd2caSopenharmony_ci        }
630115cd2caSopenharmony_ci    } else {
631115cd2caSopenharmony_ci        HILOG_INFO("executeHelper->abilityContext = nullptr");
632115cd2caSopenharmony_ci        NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, deferred, result));
633115cd2caSopenharmony_ci    }
634115cd2caSopenharmony_ci    executeHelper->deferred = nullptr;
635115cd2caSopenharmony_ci    if (executeHelper->valueUpdateContact.capacity() != 0) {
636115cd2caSopenharmony_ci        std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
637115cd2caSopenharmony_ci    }
638115cd2caSopenharmony_ci    if (executeHelper->valueContact.capacity() != 0) {
639115cd2caSopenharmony_ci        std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
640115cd2caSopenharmony_ci    }
641115cd2caSopenharmony_ci    if (executeHelper->valueContactData.capacity() != 0) {
642115cd2caSopenharmony_ci        std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
643115cd2caSopenharmony_ci    }
644115cd2caSopenharmony_ci
645115cd2caSopenharmony_ci    NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, executeHelper->work));
646115cd2caSopenharmony_ci    if (executeHelper->dataShareHelper != nullptr) {
647115cd2caSopenharmony_ci        executeHelper->dataShareHelper->Release();
648115cd2caSopenharmony_ci        executeHelper->dataShareHelper = nullptr;
649115cd2caSopenharmony_ci    }
650115cd2caSopenharmony_ci    delete executeHelper;
651115cd2caSopenharmony_ci    executeHelper = nullptr;
652115cd2caSopenharmony_ci}
653115cd2caSopenharmony_ci
654115cd2caSopenharmony_civoid ExecuteSyncDone(napi_env env, napi_status status, void *data)
655115cd2caSopenharmony_ci{
656115cd2caSopenharmony_ci    HILOG_INFO("contactApi ExecuteSyncDone start===>");
657115cd2caSopenharmony_ci    if (status != napi_ok) {
658115cd2caSopenharmony_ci        HILOG_ERROR("ExecuteSyncDone status is not ok===>");
659115cd2caSopenharmony_ci        return;
660115cd2caSopenharmony_ci    }
661115cd2caSopenharmony_ci    if (data != nullptr) {
662115cd2caSopenharmony_ci        ExecuteHelper *executeHelper = reinterpret_cast<ExecuteHelper *>(data);
663115cd2caSopenharmony_ci        HILOG_INFO("ExecuteSyncDone workName: %{public}d", executeHelper->actionCode);
664115cd2caSopenharmony_ci        napi_value global;
665115cd2caSopenharmony_ci        napi_get_global(env, &global);
666115cd2caSopenharmony_ci        napi_value resultData[RESULT_DATA_SIZE];
667115cd2caSopenharmony_ci        if (executeHelper->abilityContext != nullptr) {
668115cd2caSopenharmony_ci            HandleExecuteErrorCode(env, executeHelper, resultData[0]);
669115cd2caSopenharmony_ci            HandleExecuteResult(env, executeHelper, resultData[1]);
670115cd2caSopenharmony_ci        } else {
671115cd2caSopenharmony_ci            if (executeHelper->resultData < 0) {
672115cd2caSopenharmony_ci                HandleExecuteErrorCode(env, executeHelper, resultData[0]);
673115cd2caSopenharmony_ci                HandleExecuteResult(env, executeHelper, resultData[1]);
674115cd2caSopenharmony_ci            } else {
675115cd2caSopenharmony_ci                napi_get_undefined(env, &resultData[0]);
676115cd2caSopenharmony_ci                HandleExecuteResult(env, executeHelper, resultData[1]);
677115cd2caSopenharmony_ci            }
678115cd2caSopenharmony_ci        }
679115cd2caSopenharmony_ci
680115cd2caSopenharmony_ci        napi_value result;
681115cd2caSopenharmony_ci        napi_value callBack;
682115cd2caSopenharmony_ci        napi_get_reference_value(env, executeHelper->callBack, &callBack);
683115cd2caSopenharmony_ci        napi_valuetype valuetype = napi_undefined;
684115cd2caSopenharmony_ci        napi_typeof(env, callBack, &valuetype);
685115cd2caSopenharmony_ci        if (valuetype != napi_function) {
686115cd2caSopenharmony_ci            HILOG_ERROR("contactApi params not is function");
687115cd2caSopenharmony_ci            return;
688115cd2caSopenharmony_ci        }
689115cd2caSopenharmony_ci        napi_call_function(env, global, callBack, RESULT_DATA_SIZE, resultData, &result);
690115cd2caSopenharmony_ci        if (executeHelper->work != nullptr) {
691115cd2caSopenharmony_ci            napi_delete_async_work(env, executeHelper->work);
692115cd2caSopenharmony_ci        }
693115cd2caSopenharmony_ci        executeHelper->work = nullptr;
694115cd2caSopenharmony_ci        executeHelper->deferred = nullptr;
695115cd2caSopenharmony_ci        if (executeHelper->valueUpdateContact.capacity() != 0) {
696115cd2caSopenharmony_ci            std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
697115cd2caSopenharmony_ci        }
698115cd2caSopenharmony_ci        if (executeHelper->valueContact.capacity() != 0) {
699115cd2caSopenharmony_ci            std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
700115cd2caSopenharmony_ci        }
701115cd2caSopenharmony_ci        if (executeHelper->valueContactData.capacity() != 0) {
702115cd2caSopenharmony_ci            std::vector<DataShare::DataShareValuesBucket>().swap(executeHelper->valueUpdateContact);
703115cd2caSopenharmony_ci        }
704115cd2caSopenharmony_ci        if (executeHelper->dataShareHelper != nullptr) {
705115cd2caSopenharmony_ci            executeHelper->dataShareHelper->Release();
706115cd2caSopenharmony_ci            executeHelper->dataShareHelper = nullptr;
707115cd2caSopenharmony_ci        }
708115cd2caSopenharmony_ci        delete executeHelper;
709115cd2caSopenharmony_ci        executeHelper = nullptr;
710115cd2caSopenharmony_ci    }
711115cd2caSopenharmony_ci    HILOG_INFO("contactApi ExecuteSyncDone done===>");
712115cd2caSopenharmony_ci}
713115cd2caSopenharmony_ci
714115cd2caSopenharmony_civoid HandleExecuteErrorCode(napi_env env, ExecuteHelper *executeHelper, napi_value &result)
715115cd2caSopenharmony_ci{
716115cd2caSopenharmony_ci    HILOG_INFO("HandleExecuteErrorCode");
717115cd2caSopenharmony_ci    ResultConvert resultConvert;
718115cd2caSopenharmony_ci    switch (executeHelper->actionCode) {
719115cd2caSopenharmony_ci        case ADD_CONTACT:
720115cd2caSopenharmony_ci        case DELETE_CONTACT:
721115cd2caSopenharmony_ci        case UPDATE_CONTACT:
722115cd2caSopenharmony_ci        case SELECT_CONTACT:
723115cd2caSopenharmony_ci        case IS_LOCAL_CONTACT:
724115cd2caSopenharmony_ci        case IS_MY_CARD:
725115cd2caSopenharmony_ci        case QUERY_CONTACT:
726115cd2caSopenharmony_ci        case QUERY_MY_CARD:
727115cd2caSopenharmony_ci        case QUERY_KEY:
728115cd2caSopenharmony_ci        case QUERY_CONTACTS:
729115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_EMAIL:
730115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_PHONE_NUMBER:
731115cd2caSopenharmony_ci        case QUERY_GROUPS:
732115cd2caSopenharmony_ci        case QUERY_HOLDERS:
733115cd2caSopenharmony_ci            HILOG_INFO("HandleExecuteErrorCode resultData");
734115cd2caSopenharmony_ci            if (executeHelper->resultData == RDB_PARAMETER_ERROR || executeHelper->resultData == ERROR) {
735115cd2caSopenharmony_ci                HILOG_ERROR("handleExecuteErrorCode handle parm error");
736115cd2caSopenharmony_ci                result = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
737115cd2caSopenharmony_ci            } else if (executeHelper->resultData == VERIFICATION_PERMISSION_ERROR) {
738115cd2caSopenharmony_ci                HILOG_ERROR("parameter verification failed error");
739115cd2caSopenharmony_ci                result = ContactsNapiUtils::CreateErrorByVerification(env, PARAMETER_ERROR);
740115cd2caSopenharmony_ci            } else if (executeHelper->resultData == RDB_PERMISSION_ERROR) {
741115cd2caSopenharmony_ci                HILOG_ERROR("permission error");
742115cd2caSopenharmony_ci                result = ContactsNapiUtils::CreateError(env, PERMISSION_ERROR);
743115cd2caSopenharmony_ci            }
744115cd2caSopenharmony_ci            break;
745115cd2caSopenharmony_ci        default:
746115cd2caSopenharmony_ci            break;
747115cd2caSopenharmony_ci    }
748115cd2caSopenharmony_ci}
749115cd2caSopenharmony_ci
750115cd2caSopenharmony_civoid HandleExecuteResult(napi_env env, ExecuteHelper *executeHelper, napi_value &result)
751115cd2caSopenharmony_ci{
752115cd2caSopenharmony_ci    ResultConvert resultConvert;
753115cd2caSopenharmony_ci    napi_value results = nullptr;
754115cd2caSopenharmony_ci    switch (executeHelper->actionCode) {
755115cd2caSopenharmony_ci        case ADD_CONTACT:
756115cd2caSopenharmony_ci        case DELETE_CONTACT:
757115cd2caSopenharmony_ci        case UPDATE_CONTACT:
758115cd2caSopenharmony_ci        case SELECT_CONTACT:
759115cd2caSopenharmony_ci            if (executeHelper->resultData == RDB_PERMISSION_ERROR) {
760115cd2caSopenharmony_ci                napi_create_int64(env, ERROR, &result);
761115cd2caSopenharmony_ci            } else {
762115cd2caSopenharmony_ci                napi_create_int64(env, executeHelper->resultData, &result);
763115cd2caSopenharmony_ci            }
764115cd2caSopenharmony_ci            break;
765115cd2caSopenharmony_ci        case IS_LOCAL_CONTACT:
766115cd2caSopenharmony_ci        case IS_MY_CARD:
767115cd2caSopenharmony_ci            napi_get_boolean(env, executeHelper->resultData != 0, &result);
768115cd2caSopenharmony_ci            break;
769115cd2caSopenharmony_ci        case QUERY_CONTACT:
770115cd2caSopenharmony_ci        case QUERY_MY_CARD:
771115cd2caSopenharmony_ci            results = resultConvert.ResultSetToObject(env, executeHelper->resultSet);
772115cd2caSopenharmony_ci            if (results != nullptr) {
773115cd2caSopenharmony_ci                napi_get_element(env, results, 0, &result);
774115cd2caSopenharmony_ci            }
775115cd2caSopenharmony_ci            break;
776115cd2caSopenharmony_ci        case QUERY_KEY:
777115cd2caSopenharmony_ci            results = resultConvert.ResultSetToObject(env, executeHelper->resultSet);
778115cd2caSopenharmony_ci            if (results != nullptr) {
779115cd2caSopenharmony_ci                napi_get_element(env, results, 0, &result);
780115cd2caSopenharmony_ci            }
781115cd2caSopenharmony_ci            napi_get_named_property(env, result, "key", &result);
782115cd2caSopenharmony_ci            break;
783115cd2caSopenharmony_ci        case QUERY_CONTACTS:
784115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_EMAIL:
785115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_PHONE_NUMBER:
786115cd2caSopenharmony_ci            result = resultConvert.ResultSetToObject(env, executeHelper->resultSet);
787115cd2caSopenharmony_ci            break;
788115cd2caSopenharmony_ci        case QUERY_GROUPS:
789115cd2caSopenharmony_ci            result = resultConvert.ResultSetToGroup(env, executeHelper->resultSet);
790115cd2caSopenharmony_ci            break;
791115cd2caSopenharmony_ci        case QUERY_HOLDERS:
792115cd2caSopenharmony_ci            result = resultConvert.ResultSetToHolder(env, executeHelper->resultSet);
793115cd2caSopenharmony_ci            break;
794115cd2caSopenharmony_ci        default:
795115cd2caSopenharmony_ci            break;
796115cd2caSopenharmony_ci    }
797115cd2caSopenharmony_ci}
798115cd2caSopenharmony_ci
799115cd2caSopenharmony_civoid LocalExecuteAddContact(napi_env env, ExecuteHelper *executeHelper)
800115cd2caSopenharmony_ci{
801115cd2caSopenharmony_ci    if (executeHelper->valueContactData.empty()) {
802115cd2caSopenharmony_ci        HILOG_ERROR("addContact contact_data can not be empty");
803115cd2caSopenharmony_ci        executeHelper->resultData = ERROR;
804115cd2caSopenharmony_ci        return;
805115cd2caSopenharmony_ci    }
806115cd2caSopenharmony_ci    ContactsControl contactsControl;
807115cd2caSopenharmony_ci    int rawId = contactsControl.RawContactInsert(
808115cd2caSopenharmony_ci        executeHelper->dataShareHelper, (executeHelper->valueContact)[0]);
809115cd2caSopenharmony_ci    std::vector<DataShare::DataShareValuesBucket> value = executeHelper->valueContactData;
810115cd2caSopenharmony_ci    unsigned int size = value.size();
811115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; ++i) {
812115cd2caSopenharmony_ci        (executeHelper->valueContactData)[i].Put("raw_contact_id", rawId);
813115cd2caSopenharmony_ci    }
814115cd2caSopenharmony_ci    int code = contactsControl.ContactDataInsert(executeHelper->dataShareHelper, executeHelper->valueContactData);
815115cd2caSopenharmony_ci    if (code == 0) {
816115cd2caSopenharmony_ci        executeHelper->resultData = rawId;
817115cd2caSopenharmony_ci    } else {
818115cd2caSopenharmony_ci        executeHelper->resultData = code;
819115cd2caSopenharmony_ci    }
820115cd2caSopenharmony_ci}
821115cd2caSopenharmony_ci
822115cd2caSopenharmony_civoid LocalExecuteDeleteContact(napi_env env, ExecuteHelper *executeHelper)
823115cd2caSopenharmony_ci{
824115cd2caSopenharmony_ci    ContactsControl contactsControl;
825115cd2caSopenharmony_ci    int ret = contactsControl.ContactDelete(executeHelper->dataShareHelper, executeHelper->predicates);
826115cd2caSopenharmony_ci    HILOG_INFO("LocalExecuteDeleteContact contact ret = %{public}d", ret);
827115cd2caSopenharmony_ci    executeHelper->resultData = ret;
828115cd2caSopenharmony_ci}
829115cd2caSopenharmony_ci
830115cd2caSopenharmony_civoid LocalExecuteQueryContact(napi_env env, ExecuteHelper *executeHelper)
831115cd2caSopenharmony_ci{
832115cd2caSopenharmony_ci    ContactsControl contactsControl;
833115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.ContactQuery(
834115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
835115cd2caSopenharmony_ci    executeHelper->resultData = SUCCESS;
836115cd2caSopenharmony_ci}
837115cd2caSopenharmony_ci
838115cd2caSopenharmony_civoid LocalExecuteQueryContactsOrKey(napi_env env, ExecuteHelper *executeHelper)
839115cd2caSopenharmony_ci{
840115cd2caSopenharmony_ci    ContactsControl contactsControl;
841115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.ContactQuery(
842115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
843115cd2caSopenharmony_ci    executeHelper->resultData = SUCCESS;
844115cd2caSopenharmony_ci}
845115cd2caSopenharmony_ci
846115cd2caSopenharmony_civoid LocalExecuteQueryContactsByData(napi_env env, ExecuteHelper *executeHelper)
847115cd2caSopenharmony_ci{
848115cd2caSopenharmony_ci    ContactsControl contactsControl;
849115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.ContactDataQuery(
850115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
851115cd2caSopenharmony_ci    std::shared_ptr<DataShare::DataShareResultSet> resultSet = executeHelper->resultSet;
852115cd2caSopenharmony_ci    int rowCount = 0;
853115cd2caSopenharmony_ci    resultSet->GetRowCount(rowCount);
854115cd2caSopenharmony_ci    if (rowCount == 0) {
855115cd2caSopenharmony_ci        executeHelper->resultData = RDB_PARAMETER_ERROR;
856115cd2caSopenharmony_ci        resultSet->Close();
857115cd2caSopenharmony_ci    } else {
858115cd2caSopenharmony_ci        executeHelper->resultData = SUCCESS;
859115cd2caSopenharmony_ci    }
860115cd2caSopenharmony_ci}
861115cd2caSopenharmony_ci
862115cd2caSopenharmony_civoid LocalExecuteQueryGroup(napi_env env, ExecuteHelper *executeHelper)
863115cd2caSopenharmony_ci{
864115cd2caSopenharmony_ci    ContactsControl contactsControl;
865115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.GroupsQuery(
866115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
867115cd2caSopenharmony_ci    executeHelper->resultData = SUCCESS;
868115cd2caSopenharmony_ci}
869115cd2caSopenharmony_ci
870115cd2caSopenharmony_civoid LocalExecuteQueryHolders(napi_env env, ExecuteHelper *executeHelper)
871115cd2caSopenharmony_ci{
872115cd2caSopenharmony_ci    ContactsControl contactsControl;
873115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.HolderQuery(
874115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
875115cd2caSopenharmony_ci    executeHelper->resultData = SUCCESS;
876115cd2caSopenharmony_ci}
877115cd2caSopenharmony_ci
878115cd2caSopenharmony_civoid LocalExecuteQueryMyCard(napi_env env, ExecuteHelper *executeHelper)
879115cd2caSopenharmony_ci{
880115cd2caSopenharmony_ci    ContactsControl contactsControl;
881115cd2caSopenharmony_ci    executeHelper->resultSet = contactsControl.MyCardQuery(
882115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
883115cd2caSopenharmony_ci    executeHelper->resultData = SUCCESS;
884115cd2caSopenharmony_ci}
885115cd2caSopenharmony_ci
886115cd2caSopenharmony_civoid LocalExecuteUpdateContact(napi_env env, ExecuteHelper *executeHelper)
887115cd2caSopenharmony_ci{
888115cd2caSopenharmony_ci    ContactsControl contactsControl;
889115cd2caSopenharmony_ci    // query raw_contact_id
890115cd2caSopenharmony_ci    std::shared_ptr<DataShare::DataShareResultSet> resultSet = contactsControl.ContactDataQuery(
891115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
892115cd2caSopenharmony_ci    int rawId = GetRawIdByResultSet(resultSet);
893115cd2caSopenharmony_ci    if (rawId == 0) {
894115cd2caSopenharmony_ci        HILOG_ERROR("LocalExecuteUpdateContact contact rawId equals 0");
895115cd2caSopenharmony_ci        executeHelper->resultData = ERROR;
896115cd2caSopenharmony_ci        return;
897115cd2caSopenharmony_ci    }
898115cd2caSopenharmony_ci    std::vector<DataShare::DataShareValuesBucket> value = executeHelper->valueContactData;
899115cd2caSopenharmony_ci    unsigned int size = value.size();
900115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; ++i) {
901115cd2caSopenharmony_ci        (executeHelper->valueContactData)[i].Put("raw_contact_id", rawId);
902115cd2caSopenharmony_ci    }
903115cd2caSopenharmony_ci    executeHelper->deletePredicates.And();
904115cd2caSopenharmony_ci    executeHelper->deletePredicates.EqualTo("raw_contact_id", std::to_string(rawId));
905115cd2caSopenharmony_ci    int resultCode = contactsControl.ContactDataDelete(
906115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->deletePredicates);
907115cd2caSopenharmony_ci    if (resultCode >= 0) {
908115cd2caSopenharmony_ci        resultCode = contactsControl.ContactDataInsert(
909115cd2caSopenharmony_ci            executeHelper->dataShareHelper, executeHelper->valueContactData);
910115cd2caSopenharmony_ci    }
911115cd2caSopenharmony_ci    executeHelper->resultData = resultCode;
912115cd2caSopenharmony_ci}
913115cd2caSopenharmony_ci
914115cd2caSopenharmony_civoid LocalExecuteIsLocalContact(napi_env env, ExecuteHelper *executeHelper)
915115cd2caSopenharmony_ci{
916115cd2caSopenharmony_ci    int64_t isLocal = 0;
917115cd2caSopenharmony_ci    ContactsControl contactsControl;
918115cd2caSopenharmony_ci    std::shared_ptr<DataShare::DataShareResultSet> resultSet = contactsControl.ContactQuery(
919115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
920115cd2caSopenharmony_ci    if (resultSet == nullptr) {
921115cd2caSopenharmony_ci        executeHelper->resultData = isLocal;
922115cd2caSopenharmony_ci        return;
923115cd2caSopenharmony_ci    }
924115cd2caSopenharmony_ci    int resultSetNum = resultSet->GoToFirstRow();
925115cd2caSopenharmony_ci    if (resultSetNum == OHOS::NativeRdb::E_OK) {
926115cd2caSopenharmony_ci        isLocal = 1;
927115cd2caSopenharmony_ci    }
928115cd2caSopenharmony_ci    executeHelper->resultData = isLocal;
929115cd2caSopenharmony_ci    resultSet->Close();
930115cd2caSopenharmony_ci}
931115cd2caSopenharmony_ci
932115cd2caSopenharmony_civoid LocalExecuteIsMyCard(napi_env env, ExecuteHelper *executeHelper)
933115cd2caSopenharmony_ci{
934115cd2caSopenharmony_ci    int64_t isMyCard = 0;
935115cd2caSopenharmony_ci    ContactsControl contactsControl;
936115cd2caSopenharmony_ci    std::shared_ptr<DataShare::DataShareResultSet> resultSet = contactsControl.MyCardQuery(
937115cd2caSopenharmony_ci        executeHelper->dataShareHelper, executeHelper->columns, executeHelper->predicates);
938115cd2caSopenharmony_ci    if (resultSet == nullptr) {
939115cd2caSopenharmony_ci        executeHelper->resultData = isMyCard;
940115cd2caSopenharmony_ci        return;
941115cd2caSopenharmony_ci    }
942115cd2caSopenharmony_ci    int rowCount = 0;
943115cd2caSopenharmony_ci    resultSet->GetRowCount(rowCount);
944115cd2caSopenharmony_ci    int resultSetNum = resultSet->GoToFirstRow();
945115cd2caSopenharmony_ci    if (resultSetNum == OHOS::NativeRdb::E_OK) {
946115cd2caSopenharmony_ci        isMyCard = 1;
947115cd2caSopenharmony_ci    }
948115cd2caSopenharmony_ci    executeHelper->resultData = isMyCard;
949115cd2caSopenharmony_ci    resultSet->Close();
950115cd2caSopenharmony_ci}
951115cd2caSopenharmony_ci
952115cd2caSopenharmony_civoid LocalExecute(napi_env env, ExecuteHelper *executeHelper)
953115cd2caSopenharmony_ci{
954115cd2caSopenharmony_ci    if (executeHelper->dataShareHelper == nullptr) {
955115cd2caSopenharmony_ci        HILOG_ERROR("create dataShareHelper is null, please check your permission");
956115cd2caSopenharmony_ci        executeHelper->resultData = RDB_PERMISSION_ERROR;
957115cd2caSopenharmony_ci        return;
958115cd2caSopenharmony_ci    }
959115cd2caSopenharmony_ci    switch (executeHelper->actionCode) {
960115cd2caSopenharmony_ci        case ADD_CONTACT:
961115cd2caSopenharmony_ci            LocalExecuteAddContact(env, executeHelper);
962115cd2caSopenharmony_ci            break;
963115cd2caSopenharmony_ci        case DELETE_CONTACT:
964115cd2caSopenharmony_ci            LocalExecuteDeleteContact(env, executeHelper);
965115cd2caSopenharmony_ci            break;
966115cd2caSopenharmony_ci        case UPDATE_CONTACT:
967115cd2caSopenharmony_ci            LocalExecuteUpdateContact(env, executeHelper);
968115cd2caSopenharmony_ci            break;
969115cd2caSopenharmony_ci        default:
970115cd2caSopenharmony_ci            LocalExecuteSplit(env, executeHelper);
971115cd2caSopenharmony_ci            HILOG_INFO("LocalExecute case error===>");
972115cd2caSopenharmony_ci            break;
973115cd2caSopenharmony_ci    }
974115cd2caSopenharmony_ci}
975115cd2caSopenharmony_ci
976115cd2caSopenharmony_civoid LocalExecuteSplit(napi_env env, ExecuteHelper *executeHelper)
977115cd2caSopenharmony_ci{
978115cd2caSopenharmony_ci    ContactsTelephonyPermission permission;
979115cd2caSopenharmony_ci    if (!permission.CheckPermission(ContactsApi::Permission::READ_CONTACTS)) {
980115cd2caSopenharmony_ci        HILOG_ERROR("LocalExecuteQueryContactsByData Permission denied!");
981115cd2caSopenharmony_ci        executeHelper->resultData = RDB_PERMISSION_ERROR;
982115cd2caSopenharmony_ci        return;
983115cd2caSopenharmony_ci    } else if (executeHelper->resultData == VERIFICATION_PERMISSION_ERROR) {
984115cd2caSopenharmony_ci        HILOG_ERROR("PARAMETER_ERROR, please check your PARAMETER");
985115cd2caSopenharmony_ci        return;
986115cd2caSopenharmony_ci    }
987115cd2caSopenharmony_ci    switch (executeHelper->actionCode) {
988115cd2caSopenharmony_ci        case QUERY_CONTACT:
989115cd2caSopenharmony_ci            LocalExecuteQueryContact(env, executeHelper);
990115cd2caSopenharmony_ci            break;
991115cd2caSopenharmony_ci        case QUERY_CONTACTS:
992115cd2caSopenharmony_ci            LocalExecuteQueryContactsOrKey(env, executeHelper);
993115cd2caSopenharmony_ci            break;
994115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_EMAIL:
995115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_PHONE_NUMBER:
996115cd2caSopenharmony_ci            LocalExecuteQueryContactsByData(env, executeHelper);
997115cd2caSopenharmony_ci            break;
998115cd2caSopenharmony_ci        case QUERY_GROUPS:
999115cd2caSopenharmony_ci            LocalExecuteQueryGroup(env, executeHelper);
1000115cd2caSopenharmony_ci            break;
1001115cd2caSopenharmony_ci        case QUERY_HOLDERS:
1002115cd2caSopenharmony_ci            LocalExecuteQueryHolders(env, executeHelper);
1003115cd2caSopenharmony_ci            break;
1004115cd2caSopenharmony_ci        case QUERY_KEY:
1005115cd2caSopenharmony_ci            LocalExecuteQueryContactsOrKey(env, executeHelper);
1006115cd2caSopenharmony_ci            break;
1007115cd2caSopenharmony_ci        case QUERY_MY_CARD:
1008115cd2caSopenharmony_ci            LocalExecuteQueryMyCard(env, executeHelper);
1009115cd2caSopenharmony_ci            break;
1010115cd2caSopenharmony_ci        case IS_LOCAL_CONTACT:
1011115cd2caSopenharmony_ci            LocalExecuteIsLocalContact(env, executeHelper);
1012115cd2caSopenharmony_ci            break;
1013115cd2caSopenharmony_ci        case IS_MY_CARD:
1014115cd2caSopenharmony_ci            LocalExecuteIsMyCard(env, executeHelper);
1015115cd2caSopenharmony_ci            break;
1016115cd2caSopenharmony_ci        default:
1017115cd2caSopenharmony_ci            HILOG_INFO("LocalExecute case error===>");
1018115cd2caSopenharmony_ci            break;
1019115cd2caSopenharmony_ci    }
1020115cd2caSopenharmony_ci}
1021115cd2caSopenharmony_ci
1022115cd2caSopenharmony_civoid Execute(napi_env env, void *data)
1023115cd2caSopenharmony_ci{
1024115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = static_cast<ExecuteHelper *>(data);
1025115cd2caSopenharmony_ci    HILOG_INFO("Execute start workName: %{public}d", executeHelper->actionCode);
1026115cd2caSopenharmony_ci    LocalExecute(env, executeHelper);
1027115cd2caSopenharmony_ci}
1028115cd2caSopenharmony_ci
1029115cd2caSopenharmony_cinapi_value CreateAsyncWork(napi_env env, ExecuteHelper *executeHelper)
1030115cd2caSopenharmony_ci{
1031115cd2caSopenharmony_ci    napi_value workName;
1032115cd2caSopenharmony_ci    napi_value result = nullptr;
1033115cd2caSopenharmony_ci    if (executeHelper->sync == NAPI_CALL_TYPE_CALLBACK) {
1034115cd2caSopenharmony_ci        napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &workName);
1035115cd2caSopenharmony_ci        napi_create_reference(env, executeHelper->argv[executeHelper->argc - 1], 1, &executeHelper->callBack);
1036115cd2caSopenharmony_ci        napi_create_async_work(env, nullptr, workName, Execute, ExecuteSyncDone,
1037115cd2caSopenharmony_ci            reinterpret_cast<void *>(executeHelper), &(executeHelper->work));
1038115cd2caSopenharmony_ci        napi_get_null(env, &result);
1039115cd2caSopenharmony_ci    } else {
1040115cd2caSopenharmony_ci        napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &workName);
1041115cd2caSopenharmony_ci        napi_create_promise(env, &(executeHelper->deferred), &result);
1042115cd2caSopenharmony_ci        napi_create_async_work(env, nullptr, workName, Execute, ExecuteDone,
1043115cd2caSopenharmony_ci            reinterpret_cast<void *>(executeHelper), &(executeHelper->work));
1044115cd2caSopenharmony_ci    }
1045115cd2caSopenharmony_ci    napi_queue_async_work(env, executeHelper->work);
1046115cd2caSopenharmony_ci    executeHelper->promise = result;
1047115cd2caSopenharmony_ci    return result;
1048115cd2caSopenharmony_ci}
1049115cd2caSopenharmony_ci
1050115cd2caSopenharmony_ciDataShare::DataSharePredicates ConvertParamsSwitchSplit(int code, napi_env env, const napi_value &key,
1051115cd2caSopenharmony_ci    const napi_value &hold, const napi_value &attr, ExecuteHelper *executeHelper)
1052115cd2caSopenharmony_ci{
1053115cd2caSopenharmony_ci    DataShare::DataSharePredicates predicates;
1054115cd2caSopenharmony_ci    switch (code) {
1055115cd2caSopenharmony_ci        case QUERY_CONTACT:
1056115cd2caSopenharmony_ci            VerificationParameterHolderId(env, executeHelper, hold);
1057115cd2caSopenharmony_ci            predicates = BuildQueryContactPredicates(env, key, hold, attr);
1058115cd2caSopenharmony_ci            break;
1059115cd2caSopenharmony_ci        case QUERY_CONTACTS:
1060115cd2caSopenharmony_ci            VerificationParameterHolderId(env, executeHelper, hold);
1061115cd2caSopenharmony_ci            predicates = BuildQueryContactsPredicates(env, hold, attr);
1062115cd2caSopenharmony_ci            break;
1063115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_EMAIL:
1064115cd2caSopenharmony_ci            VerificationParameterHolderId(env, executeHelper, hold);
1065115cd2caSopenharmony_ci            predicates = BuildQueryContactsByEmailPredicates(env, key, hold, attr);
1066115cd2caSopenharmony_ci            break;
1067115cd2caSopenharmony_ci        case QUERY_CONTACTS_BY_PHONE_NUMBER:
1068115cd2caSopenharmony_ci            VerificationParameterHolderId(env, executeHelper, hold);
1069115cd2caSopenharmony_ci            predicates = BuildQueryContactsByPhoneNumberPredicates(env, key, hold, attr);
1070115cd2caSopenharmony_ci            break;
1071115cd2caSopenharmony_ci        case QUERY_GROUPS:
1072115cd2caSopenharmony_ci            VerificationParameterHolderId(env, executeHelper, hold);
1073115cd2caSopenharmony_ci            predicates = BuildQueryGroupsPredicates(env, hold);
1074115cd2caSopenharmony_ci            break;
1075115cd2caSopenharmony_ci        case QUERY_HOLDERS:
1076115cd2caSopenharmony_ci            break;
1077115cd2caSopenharmony_ci        case QUERY_MY_CARD:
1078115cd2caSopenharmony_ci            predicates = BuildQueryMyCardPredicates(env, attr);
1079115cd2caSopenharmony_ci            break;
1080115cd2caSopenharmony_ci        default:
1081115cd2caSopenharmony_ci            HILOG_ERROR("ConvertParamsSwitchSplit code is no match");
1082115cd2caSopenharmony_ci            break;
1083115cd2caSopenharmony_ci    }
1084115cd2caSopenharmony_ci    return predicates;
1085115cd2caSopenharmony_ci}
1086115cd2caSopenharmony_ci
1087115cd2caSopenharmony_civoid SetChildActionCodeAndConvertParams(napi_env env, ExecuteHelper *executeHelper)
1088115cd2caSopenharmony_ci{
1089115cd2caSopenharmony_ci    napi_value id = nullptr;
1090115cd2caSopenharmony_ci    napi_value key = nullptr;
1091115cd2caSopenharmony_ci    napi_value hold = nullptr;
1092115cd2caSopenharmony_ci    napi_value attr = nullptr;
1093115cd2caSopenharmony_ci    napi_value contact = nullptr;
1094115cd2caSopenharmony_ci    unsigned int size = executeHelper->argc;
1095115cd2caSopenharmony_ci    for (unsigned int i = 0; i < size; i++) {
1096115cd2caSopenharmony_ci        ObjectInitId(env, executeHelper->argv[i], id);
1097115cd2caSopenharmony_ci        ObjectInitString(env, executeHelper->argv[i], key);
1098115cd2caSopenharmony_ci        ObjectInit(env, executeHelper->argv[i], hold, attr, contact);
1099115cd2caSopenharmony_ci    }
1100115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
1101115cd2caSopenharmony_ci    switch (executeHelper->actionCode) {
1102115cd2caSopenharmony_ci        case ADD_CONTACT:
1103115cd2caSopenharmony_ci            contactsBuild.GetContactData(
1104115cd2caSopenharmony_ci                env, executeHelper->argv[0], executeHelper->valueContact, executeHelper->valueContactData);
1105115cd2caSopenharmony_ci            break;
1106115cd2caSopenharmony_ci        case DELETE_CONTACT:
1107115cd2caSopenharmony_ci            executeHelper->predicates = BuildDeleteContactPredicates(env, executeHelper);
1108115cd2caSopenharmony_ci            break;
1109115cd2caSopenharmony_ci        case UPDATE_CONTACT:
1110115cd2caSopenharmony_ci            executeHelper->predicates = BuildUpdateContactConvertParams(env, contact, attr, executeHelper);
1111115cd2caSopenharmony_ci            break;
1112115cd2caSopenharmony_ci        case IS_LOCAL_CONTACT:
1113115cd2caSopenharmony_ci            VerificationParameterId(env, id, executeHelper, hold);
1114115cd2caSopenharmony_ci            executeHelper->predicates = BuildIsLocalContactPredicates(env, id);
1115115cd2caSopenharmony_ci            break;
1116115cd2caSopenharmony_ci        case IS_MY_CARD:
1117115cd2caSopenharmony_ci            VerificationParameterId(env, id, executeHelper, hold);
1118115cd2caSopenharmony_ci            executeHelper->predicates = BuildIsMyCardPredicates(env, id);
1119115cd2caSopenharmony_ci            break;
1120115cd2caSopenharmony_ci        case QUERY_KEY:
1121115cd2caSopenharmony_ci            VerificationParameterId(env, id, executeHelper, hold);
1122115cd2caSopenharmony_ci            executeHelper->predicates = BuildQueryKeyPredicates(env, id, hold);
1123115cd2caSopenharmony_ci            break;
1124115cd2caSopenharmony_ci        default:
1125115cd2caSopenharmony_ci            executeHelper->predicates = ConvertParamsSwitchSplit(executeHelper->actionCode, env, key, hold,
1126115cd2caSopenharmony_ci                attr, executeHelper);
1127115cd2caSopenharmony_ci            break;
1128115cd2caSopenharmony_ci    }
1129115cd2caSopenharmony_ci}
1130115cd2caSopenharmony_ci
1131115cd2caSopenharmony_civoid VerificationParameterId(napi_env env, napi_value id, ExecuteHelper *executeHelper, napi_value hold)
1132115cd2caSopenharmony_ci{
1133115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
1134115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
1135115cd2caSopenharmony_ci    int holderId = holder.holderId;
1136115cd2caSopenharmony_ci    int valueId = contactsBuild.GetInt(env, id);
1137115cd2caSopenharmony_ci    if (valueId <= 0 || isinf(valueId)) {
1138115cd2caSopenharmony_ci        executeHelper->resultData = VERIFICATION_PERMISSION_ERROR;
1139115cd2caSopenharmony_ci        HILOG_ERROR("PARAMETER_ERROR valueId: %{public}d", valueId);
1140115cd2caSopenharmony_ci    } else if (hold != nullptr && holderId != 1) {
1141115cd2caSopenharmony_ci        executeHelper->resultData = VERIFICATION_PERMISSION_ERROR;
1142115cd2caSopenharmony_ci        HILOG_ERROR("PARAMETER_ERROR holderId: %{public}d", holderId);
1143115cd2caSopenharmony_ci    }
1144115cd2caSopenharmony_ci}
1145115cd2caSopenharmony_ci
1146115cd2caSopenharmony_civoid VerificationParameterHolderId(napi_env env, ExecuteHelper *executeHelper, napi_value hold)
1147115cd2caSopenharmony_ci{
1148115cd2caSopenharmony_ci    ContactsBuild contactsBuild;
1149115cd2caSopenharmony_ci    Holder holder = contactsBuild.GetHolder(env, hold);
1150115cd2caSopenharmony_ci    int holderId = holder.holderId;
1151115cd2caSopenharmony_ci    if (hold != nullptr && holderId != 1) {
1152115cd2caSopenharmony_ci        executeHelper->resultData = VERIFICATION_PERMISSION_ERROR;
1153115cd2caSopenharmony_ci        HILOG_ERROR("PARAMETER_ERROR holderId: %{public}d", holderId);
1154115cd2caSopenharmony_ci    }
1155115cd2caSopenharmony_ci}
1156115cd2caSopenharmony_ci
1157115cd2caSopenharmony_cinapi_value Scheduling(napi_env env, napi_callback_info info, ExecuteHelper *executeHelper, int actionCode)
1158115cd2caSopenharmony_ci{
1159115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1160115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1161115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1162115cd2caSopenharmony_ci    executeHelper->argc = argc;
1163115cd2caSopenharmony_ci    executeHelper->actionCode = actionCode;
1164115cd2caSopenharmony_ci
1165115cd2caSopenharmony_ci    if (argc > 0) {
1166115cd2caSopenharmony_ci        napi_valuetype valuetype = napi_undefined;
1167115cd2caSopenharmony_ci        napi_typeof(env, argv[argc - 1], &valuetype);
1168115cd2caSopenharmony_ci        // last params is function as callback
1169115cd2caSopenharmony_ci        if (valuetype == napi_function) {
1170115cd2caSopenharmony_ci            executeHelper->sync = NAPI_CALL_TYPE_CALLBACK;
1171115cd2caSopenharmony_ci        } else {
1172115cd2caSopenharmony_ci            executeHelper->sync = NAPI_CALL_TYPE_PROMISE;
1173115cd2caSopenharmony_ci        }
1174115cd2caSopenharmony_ci    }
1175115cd2caSopenharmony_ci    bool isStageMode = false;
1176115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1177115cd2caSopenharmony_ci    if (isStageMode) {
1178115cd2caSopenharmony_ci        HILOG_INFO("use API 10 interface");
1179115cd2caSopenharmony_ci        for (int i = 1; i < MAX_PARAMS; i++) {
1180115cd2caSopenharmony_ci            executeHelper->argv[i - 1] = argv[i];
1181115cd2caSopenharmony_ci        }
1182115cd2caSopenharmony_ci        executeHelper->abilityContext = argv[0];
1183115cd2caSopenharmony_ci        executeHelper->argc -= 1;
1184115cd2caSopenharmony_ci    } else {
1185115cd2caSopenharmony_ci        HILOG_INFO("use API 7 interface");
1186115cd2caSopenharmony_ci        for (int i = 0; i < MAX_PARAMS; i++) {
1187115cd2caSopenharmony_ci            executeHelper->argv[i] = argv[i];
1188115cd2caSopenharmony_ci        }
1189115cd2caSopenharmony_ci    }
1190115cd2caSopenharmony_ci
1191115cd2caSopenharmony_ci    SetChildActionCodeAndConvertParams(env, executeHelper);
1192115cd2caSopenharmony_ci    GetDataShareHelper(env, info, executeHelper);
1193115cd2caSopenharmony_ci
1194115cd2caSopenharmony_ci    napi_value result = CreateAsyncWork(env, executeHelper);
1195115cd2caSopenharmony_ci    return result;
1196115cd2caSopenharmony_ci}
1197115cd2caSopenharmony_ci
1198115cd2caSopenharmony_ci/**
1199115cd2caSopenharmony_ci * @brief Test interface ADD_CONTACT
1200115cd2caSopenharmony_ci *
1201115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1202115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1203115cd2caSopenharmony_ci *
1204115cd2caSopenharmony_ci * @return The result returned by test
1205115cd2caSopenharmony_ci */
1206115cd2caSopenharmony_cinapi_value AddContact(napi_env env, napi_callback_info info)
1207115cd2caSopenharmony_ci{
1208115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1209115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1210115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1211115cd2caSopenharmony_ci    void *data;
1212115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1213115cd2caSopenharmony_ci    bool isStageMode = false;
1214115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1215115cd2caSopenharmony_ci    if (isStageMode) {
1216115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1217115cd2caSopenharmony_ci        switch (argc) {
1218115cd2caSopenharmony_ci            case ARGS_TWO:
1219115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object })) {
1220115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1221115cd2caSopenharmony_ci                }
1222115cd2caSopenharmony_ci                break;
1223115cd2caSopenharmony_ci            case ARGS_THREE:
1224115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_function })) {
1225115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1226115cd2caSopenharmony_ci                }
1227115cd2caSopenharmony_ci                break;
1228115cd2caSopenharmony_ci            default:
1229115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1230115cd2caSopenharmony_ci                break;
1231115cd2caSopenharmony_ci        }
1232115cd2caSopenharmony_ci    }
1233115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1234115cd2caSopenharmony_ci    napi_value result = nullptr;
1235115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1236115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, ADD_CONTACT);
1237115cd2caSopenharmony_ci        return result;
1238115cd2caSopenharmony_ci    }
1239115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1240115cd2caSopenharmony_ci    return result;
1241115cd2caSopenharmony_ci}
1242115cd2caSopenharmony_ci
1243115cd2caSopenharmony_ci/**
1244115cd2caSopenharmony_ci * @brief Test interface DELETE_CONTACT
1245115cd2caSopenharmony_ci *
1246115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1247115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1248115cd2caSopenharmony_ci *
1249115cd2caSopenharmony_ci * @return The result returned by test
1250115cd2caSopenharmony_ci */
1251115cd2caSopenharmony_cinapi_value DeleteContact(napi_env env, napi_callback_info info)
1252115cd2caSopenharmony_ci{
1253115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1254115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1255115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1256115cd2caSopenharmony_ci    void *data;
1257115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1258115cd2caSopenharmony_ci    bool isStageMode = false;
1259115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1260115cd2caSopenharmony_ci    if (isStageMode) {
1261115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1262115cd2caSopenharmony_ci        switch (argc) {
1263115cd2caSopenharmony_ci            case ARGS_TWO:
1264115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string })) {
1265115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1266115cd2caSopenharmony_ci                }
1267115cd2caSopenharmony_ci                break;
1268115cd2caSopenharmony_ci            case ARGS_THREE:
1269115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string, napi_function })) {
1270115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1271115cd2caSopenharmony_ci                }
1272115cd2caSopenharmony_ci                break;
1273115cd2caSopenharmony_ci            default:
1274115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1275115cd2caSopenharmony_ci                break;
1276115cd2caSopenharmony_ci        }
1277115cd2caSopenharmony_ci    }
1278115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1279115cd2caSopenharmony_ci    napi_value result = nullptr;
1280115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1281115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, DELETE_CONTACT);
1282115cd2caSopenharmony_ci        return result;
1283115cd2caSopenharmony_ci    }
1284115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1285115cd2caSopenharmony_ci    return result;
1286115cd2caSopenharmony_ci}
1287115cd2caSopenharmony_ci
1288115cd2caSopenharmony_ci/**
1289115cd2caSopenharmony_ci * @brief Test interface UPDATE_CONTACT
1290115cd2caSopenharmony_ci *
1291115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1292115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1293115cd2caSopenharmony_ci *
1294115cd2caSopenharmony_ci * @return The result returned by test
1295115cd2caSopenharmony_ci */
1296115cd2caSopenharmony_cinapi_value UpdateContact(napi_env env, napi_callback_info info)
1297115cd2caSopenharmony_ci{
1298115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1299115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1300115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1301115cd2caSopenharmony_ci    void *data;
1302115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1303115cd2caSopenharmony_ci    bool isStageMode = false;
1304115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1305115cd2caSopenharmony_ci    if (isStageMode) {
1306115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1307115cd2caSopenharmony_ci        switch (argc) {
1308115cd2caSopenharmony_ci            case ARGS_TWO:
1309115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object })) {
1310115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1311115cd2caSopenharmony_ci                }
1312115cd2caSopenharmony_ci                break;
1313115cd2caSopenharmony_ci            case ARGS_THREE:
1314115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_function })
1315115cd2caSopenharmony_ci                    && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_object })) {
1316115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1317115cd2caSopenharmony_ci                }
1318115cd2caSopenharmony_ci                break;
1319115cd2caSopenharmony_ci            case ARGS_FOUR:
1320115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1321115cd2caSopenharmony_ci                    { napi_object, napi_object, napi_object, napi_function })) {
1322115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1323115cd2caSopenharmony_ci                }
1324115cd2caSopenharmony_ci                break;
1325115cd2caSopenharmony_ci            default:
1326115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1327115cd2caSopenharmony_ci                break;
1328115cd2caSopenharmony_ci        }
1329115cd2caSopenharmony_ci    }
1330115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1331115cd2caSopenharmony_ci    napi_value result = nullptr;
1332115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1333115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, UPDATE_CONTACT);
1334115cd2caSopenharmony_ci        return result;
1335115cd2caSopenharmony_ci    }
1336115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1337115cd2caSopenharmony_ci    return result;
1338115cd2caSopenharmony_ci}
1339115cd2caSopenharmony_ci
1340115cd2caSopenharmony_ci/**
1341115cd2caSopenharmony_ci * @brief Test interface QUERY_CONTACT
1342115cd2caSopenharmony_ci *
1343115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1344115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1345115cd2caSopenharmony_ci *
1346115cd2caSopenharmony_ci * @return The result returned by test
1347115cd2caSopenharmony_ci */
1348115cd2caSopenharmony_cinapi_value QueryContact(napi_env env, napi_callback_info info)
1349115cd2caSopenharmony_ci{
1350115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1351115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1352115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1353115cd2caSopenharmony_ci    void *data;
1354115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1355115cd2caSopenharmony_ci    bool isStageMode = false;
1356115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1357115cd2caSopenharmony_ci    if (isStageMode) {
1358115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1359115cd2caSopenharmony_ci        switch (argc) {
1360115cd2caSopenharmony_ci            case ARGS_TWO:
1361115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string })) {
1362115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1363115cd2caSopenharmony_ci                }
1364115cd2caSopenharmony_ci                break;
1365115cd2caSopenharmony_ci            case ARGS_THREE:
1366115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string, napi_function })) {
1367115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1368115cd2caSopenharmony_ci                }
1369115cd2caSopenharmony_ci                break;
1370115cd2caSopenharmony_ci            case ARGS_FOUR:
1371115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1372115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_function }) &&
1373115cd2caSopenharmony_ci                    !ContactsNapiUtils::MatchParameters(env, argv,
1374115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_object })) {
1375115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1376115cd2caSopenharmony_ci                }
1377115cd2caSopenharmony_ci                break;
1378115cd2caSopenharmony_ci            case ARGS_FIVE:
1379115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1380115cd2caSopenharmony_ci                    {
1381115cd2caSopenharmony_ci                        napi_object, napi_string, napi_object, napi_object, napi_function
1382115cd2caSopenharmony_ci                    })) {
1383115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1384115cd2caSopenharmony_ci                }
1385115cd2caSopenharmony_ci                break;
1386115cd2caSopenharmony_ci            default:
1387115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1388115cd2caSopenharmony_ci                break;
1389115cd2caSopenharmony_ci        }
1390115cd2caSopenharmony_ci    }
1391115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1392115cd2caSopenharmony_ci    napi_value result = nullptr;
1393115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1394115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_CONTACT);
1395115cd2caSopenharmony_ci        return result;
1396115cd2caSopenharmony_ci    }
1397115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1398115cd2caSopenharmony_ci    return result;
1399115cd2caSopenharmony_ci}
1400115cd2caSopenharmony_ci
1401115cd2caSopenharmony_ci/**
1402115cd2caSopenharmony_ci * @brief Test interface QUERY_CONTACTS
1403115cd2caSopenharmony_ci *
1404115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1405115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1406115cd2caSopenharmony_ci *
1407115cd2caSopenharmony_ci * @return The result returned by test
1408115cd2caSopenharmony_ci */
1409115cd2caSopenharmony_cinapi_value QueryContacts(napi_env env, napi_callback_info info)
1410115cd2caSopenharmony_ci{
1411115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1412115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1413115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1414115cd2caSopenharmony_ci    void *data;
1415115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1416115cd2caSopenharmony_ci    bool isStageMode = false;
1417115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1418115cd2caSopenharmony_ci    if (isStageMode) {
1419115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1420115cd2caSopenharmony_ci        switch (argc) {
1421115cd2caSopenharmony_ci            case ARGS_ONE:
1422115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object })) {
1423115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1424115cd2caSopenharmony_ci                }
1425115cd2caSopenharmony_ci                break;
1426115cd2caSopenharmony_ci            case ARGS_TWO:
1427115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_function })) {
1428115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1429115cd2caSopenharmony_ci                }
1430115cd2caSopenharmony_ci                break;
1431115cd2caSopenharmony_ci            case ARGS_THREE:
1432115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_function })
1433115cd2caSopenharmony_ci                && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_object })
1434115cd2caSopenharmony_ci                ) {
1435115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1436115cd2caSopenharmony_ci                }
1437115cd2caSopenharmony_ci                break;
1438115cd2caSopenharmony_ci            case ARGS_FOUR:
1439115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1440115cd2caSopenharmony_ci                    { napi_object, napi_object, napi_object, napi_function })) {
1441115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1442115cd2caSopenharmony_ci                }
1443115cd2caSopenharmony_ci                break;
1444115cd2caSopenharmony_ci            default:
1445115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1446115cd2caSopenharmony_ci                break;
1447115cd2caSopenharmony_ci        }
1448115cd2caSopenharmony_ci    }
1449115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1450115cd2caSopenharmony_ci    napi_value result = nullptr;
1451115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1452115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_CONTACTS);
1453115cd2caSopenharmony_ci        return result;
1454115cd2caSopenharmony_ci    }
1455115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1456115cd2caSopenharmony_ci    return result;
1457115cd2caSopenharmony_ci}
1458115cd2caSopenharmony_ci
1459115cd2caSopenharmony_ci/**
1460115cd2caSopenharmony_ci * @brief Test interface QUERY_CONTACTS_BY_EMAIL
1461115cd2caSopenharmony_ci *
1462115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1463115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1464115cd2caSopenharmony_ci *
1465115cd2caSopenharmony_ci * @return The result returned by test
1466115cd2caSopenharmony_ci */
1467115cd2caSopenharmony_cinapi_value QueryContactsByEmail(napi_env env, napi_callback_info info)
1468115cd2caSopenharmony_ci{
1469115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1470115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1471115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1472115cd2caSopenharmony_ci    void *data;
1473115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1474115cd2caSopenharmony_ci    bool isStageMode = false;
1475115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1476115cd2caSopenharmony_ci    if (isStageMode) {
1477115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1478115cd2caSopenharmony_ci        switch (argc) {
1479115cd2caSopenharmony_ci            case ARGS_TWO:
1480115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string })) {
1481115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1482115cd2caSopenharmony_ci                }
1483115cd2caSopenharmony_ci                break;
1484115cd2caSopenharmony_ci            case ARGS_THREE:
1485115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string, napi_function })) {
1486115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1487115cd2caSopenharmony_ci                }
1488115cd2caSopenharmony_ci                break;
1489115cd2caSopenharmony_ci            case ARGS_FOUR:
1490115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1491115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_function }) &&
1492115cd2caSopenharmony_ci                    !ContactsNapiUtils::MatchParameters(env, argv,
1493115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_function }) &&
1494115cd2caSopenharmony_ci                    !ContactsNapiUtils::MatchParameters(env, argv,
1495115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_object })) {
1496115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1497115cd2caSopenharmony_ci                }
1498115cd2caSopenharmony_ci                break;
1499115cd2caSopenharmony_ci            case ARGS_FIVE:
1500115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1501115cd2caSopenharmony_ci                    {
1502115cd2caSopenharmony_ci                        napi_object, napi_string, napi_object, napi_object, napi_function
1503115cd2caSopenharmony_ci                    })) {
1504115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1505115cd2caSopenharmony_ci                }
1506115cd2caSopenharmony_ci                break;
1507115cd2caSopenharmony_ci            default:
1508115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1509115cd2caSopenharmony_ci                break;
1510115cd2caSopenharmony_ci        }
1511115cd2caSopenharmony_ci    }
1512115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1513115cd2caSopenharmony_ci    napi_value result = nullptr;
1514115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1515115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_CONTACTS_BY_EMAIL);
1516115cd2caSopenharmony_ci        return result;
1517115cd2caSopenharmony_ci    }
1518115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1519115cd2caSopenharmony_ci    return result;
1520115cd2caSopenharmony_ci}
1521115cd2caSopenharmony_ci
1522115cd2caSopenharmony_ci/**
1523115cd2caSopenharmony_ci * @brief Test interface QUERY_CONTACTS_BY_PHONE_NUMBER
1524115cd2caSopenharmony_ci *
1525115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1526115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1527115cd2caSopenharmony_ci *
1528115cd2caSopenharmony_ci * @return The result returned by test
1529115cd2caSopenharmony_ci */
1530115cd2caSopenharmony_cinapi_value QueryContactsByPhoneNumber(napi_env env, napi_callback_info info)
1531115cd2caSopenharmony_ci{
1532115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1533115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1534115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1535115cd2caSopenharmony_ci    void *data;
1536115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1537115cd2caSopenharmony_ci    bool isStageMode = false;
1538115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1539115cd2caSopenharmony_ci    if (isStageMode) {
1540115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1541115cd2caSopenharmony_ci        switch (argc) {
1542115cd2caSopenharmony_ci            case ARGS_TWO:
1543115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string })) {
1544115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1545115cd2caSopenharmony_ci                }
1546115cd2caSopenharmony_ci                break;
1547115cd2caSopenharmony_ci            case ARGS_THREE:
1548115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_string, napi_function })) {
1549115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1550115cd2caSopenharmony_ci                }
1551115cd2caSopenharmony_ci                break;
1552115cd2caSopenharmony_ci            case ARGS_FOUR:
1553115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1554115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_function }) &&
1555115cd2caSopenharmony_ci                    !ContactsNapiUtils::MatchParameters(env, argv,
1556115cd2caSopenharmony_ci                    { napi_object, napi_string, napi_object, napi_object })) {
1557115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1558115cd2caSopenharmony_ci                }
1559115cd2caSopenharmony_ci                break;
1560115cd2caSopenharmony_ci            case ARGS_FIVE:
1561115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1562115cd2caSopenharmony_ci                    {
1563115cd2caSopenharmony_ci                        napi_object, napi_string, napi_object, napi_object, napi_function
1564115cd2caSopenharmony_ci                    })) {
1565115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1566115cd2caSopenharmony_ci                }
1567115cd2caSopenharmony_ci                break;
1568115cd2caSopenharmony_ci            default:
1569115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1570115cd2caSopenharmony_ci                break;
1571115cd2caSopenharmony_ci        }
1572115cd2caSopenharmony_ci    }
1573115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1574115cd2caSopenharmony_ci    napi_value result = nullptr;
1575115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1576115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_CONTACTS_BY_PHONE_NUMBER);
1577115cd2caSopenharmony_ci        return result;
1578115cd2caSopenharmony_ci    }
1579115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1580115cd2caSopenharmony_ci    return result;
1581115cd2caSopenharmony_ci}
1582115cd2caSopenharmony_ci
1583115cd2caSopenharmony_ci/**
1584115cd2caSopenharmony_ci * @brief Test interface QUERY_CONTACTS_BY_PHONE_NUMBER
1585115cd2caSopenharmony_ci *
1586115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1587115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1588115cd2caSopenharmony_ci *
1589115cd2caSopenharmony_ci * @return The result returned by test
1590115cd2caSopenharmony_ci */
1591115cd2caSopenharmony_cinapi_value QueryGroups(napi_env env, napi_callback_info info)
1592115cd2caSopenharmony_ci{
1593115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1594115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1595115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1596115cd2caSopenharmony_ci    void *data;
1597115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1598115cd2caSopenharmony_ci    bool isStageMode = false;
1599115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1600115cd2caSopenharmony_ci    if (isStageMode) {
1601115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1602115cd2caSopenharmony_ci        switch (argc) {
1603115cd2caSopenharmony_ci            case ARGS_ONE:
1604115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object })) {
1605115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1606115cd2caSopenharmony_ci                }
1607115cd2caSopenharmony_ci                break;
1608115cd2caSopenharmony_ci            case ARGS_TWO:
1609115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_function })
1610115cd2caSopenharmony_ci                    && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object })) {
1611115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1612115cd2caSopenharmony_ci                }
1613115cd2caSopenharmony_ci                break;
1614115cd2caSopenharmony_ci            case ARGS_THREE:
1615115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_function })) {
1616115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1617115cd2caSopenharmony_ci                }
1618115cd2caSopenharmony_ci                break;
1619115cd2caSopenharmony_ci            default:
1620115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1621115cd2caSopenharmony_ci                break;
1622115cd2caSopenharmony_ci        }
1623115cd2caSopenharmony_ci    }
1624115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1625115cd2caSopenharmony_ci    napi_value result = nullptr;
1626115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1627115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_GROUPS);
1628115cd2caSopenharmony_ci        return result;
1629115cd2caSopenharmony_ci    }
1630115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1631115cd2caSopenharmony_ci    return result;
1632115cd2caSopenharmony_ci}
1633115cd2caSopenharmony_ci
1634115cd2caSopenharmony_ci/**
1635115cd2caSopenharmony_ci * @brief Test interface QUERY_HOLDERS
1636115cd2caSopenharmony_ci *
1637115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1638115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1639115cd2caSopenharmony_ci *
1640115cd2caSopenharmony_ci * @return The result returned by test
1641115cd2caSopenharmony_ci */
1642115cd2caSopenharmony_cinapi_value QueryHolders(napi_env env, napi_callback_info info)
1643115cd2caSopenharmony_ci{
1644115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1645115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1646115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1647115cd2caSopenharmony_ci    void *data;
1648115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1649115cd2caSopenharmony_ci    bool isStageMode = false;
1650115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1651115cd2caSopenharmony_ci    if (isStageMode) {
1652115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1653115cd2caSopenharmony_ci        switch (argc) {
1654115cd2caSopenharmony_ci            case ARGS_ONE:
1655115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object })) {
1656115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1657115cd2caSopenharmony_ci                }
1658115cd2caSopenharmony_ci                break;
1659115cd2caSopenharmony_ci            case ARGS_TWO:
1660115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_function })) {
1661115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1662115cd2caSopenharmony_ci                }
1663115cd2caSopenharmony_ci                break;
1664115cd2caSopenharmony_ci            default:
1665115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1666115cd2caSopenharmony_ci                break;
1667115cd2caSopenharmony_ci        }
1668115cd2caSopenharmony_ci    }
1669115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1670115cd2caSopenharmony_ci    napi_value result = nullptr;
1671115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1672115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_HOLDERS);
1673115cd2caSopenharmony_ci        return result;
1674115cd2caSopenharmony_ci    }
1675115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1676115cd2caSopenharmony_ci    return result;
1677115cd2caSopenharmony_ci}
1678115cd2caSopenharmony_ci
1679115cd2caSopenharmony_ci/**
1680115cd2caSopenharmony_ci * @brief Test interface QUERY_KEY
1681115cd2caSopenharmony_ci *
1682115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1683115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1684115cd2caSopenharmony_ci *
1685115cd2caSopenharmony_ci * @return The result returned by test
1686115cd2caSopenharmony_ci */
1687115cd2caSopenharmony_cinapi_value QueryKey(napi_env env, napi_callback_info info)
1688115cd2caSopenharmony_ci{
1689115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1690115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1691115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1692115cd2caSopenharmony_ci    void *data;
1693115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1694115cd2caSopenharmony_ci    bool isStageMode = false;
1695115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1696115cd2caSopenharmony_ci    if (isStageMode) {
1697115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1698115cd2caSopenharmony_ci        switch (argc) {
1699115cd2caSopenharmony_ci            case ARGS_ONE:
1700115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object })) {
1701115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1702115cd2caSopenharmony_ci                }
1703115cd2caSopenharmony_ci                break;
1704115cd2caSopenharmony_ci            case ARGS_TWO:
1705115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_function })
1706115cd2caSopenharmony_ci                && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number })) {
1707115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1708115cd2caSopenharmony_ci                }
1709115cd2caSopenharmony_ci                break;
1710115cd2caSopenharmony_ci            case ARGS_THREE:
1711115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number, napi_function })
1712115cd2caSopenharmony_ci                && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number, napi_object })) {
1713115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1714115cd2caSopenharmony_ci                }
1715115cd2caSopenharmony_ci                break;
1716115cd2caSopenharmony_ci            case ARGS_FOUR:
1717115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv,
1718115cd2caSopenharmony_ci                    { napi_object, napi_number, napi_object, napi_function })) {
1719115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1720115cd2caSopenharmony_ci                }
1721115cd2caSopenharmony_ci                break;
1722115cd2caSopenharmony_ci            default:
1723115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1724115cd2caSopenharmony_ci                break;
1725115cd2caSopenharmony_ci        }
1726115cd2caSopenharmony_ci    }
1727115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1728115cd2caSopenharmony_ci    napi_value result = nullptr;
1729115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1730115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_KEY);
1731115cd2caSopenharmony_ci        return result;
1732115cd2caSopenharmony_ci    }
1733115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1734115cd2caSopenharmony_ci    return result;
1735115cd2caSopenharmony_ci}
1736115cd2caSopenharmony_ci
1737115cd2caSopenharmony_ci/**
1738115cd2caSopenharmony_ci * @brief Test interface QUERY_MY_CARD
1739115cd2caSopenharmony_ci *
1740115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1741115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1742115cd2caSopenharmony_ci *
1743115cd2caSopenharmony_ci * @return The result returned by test
1744115cd2caSopenharmony_ci */
1745115cd2caSopenharmony_cinapi_value QueryMyCard(napi_env env, napi_callback_info info)
1746115cd2caSopenharmony_ci{
1747115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1748115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1749115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1750115cd2caSopenharmony_ci    void *data;
1751115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1752115cd2caSopenharmony_ci    bool isStageMode = false;
1753115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1754115cd2caSopenharmony_ci    if (isStageMode) {
1755115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1756115cd2caSopenharmony_ci        switch (argc) {
1757115cd2caSopenharmony_ci            case ARGS_ONE:
1758115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object })) {
1759115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1760115cd2caSopenharmony_ci                }
1761115cd2caSopenharmony_ci                break;
1762115cd2caSopenharmony_ci            case ARGS_TWO:
1763115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object })
1764115cd2caSopenharmony_ci                    && !ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_function })) {
1765115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1766115cd2caSopenharmony_ci                }
1767115cd2caSopenharmony_ci                break;
1768115cd2caSopenharmony_ci            case ARGS_THREE:
1769115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_object, napi_function })) {
1770115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1771115cd2caSopenharmony_ci                }
1772115cd2caSopenharmony_ci                break;
1773115cd2caSopenharmony_ci            default:
1774115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1775115cd2caSopenharmony_ci                break;
1776115cd2caSopenharmony_ci        }
1777115cd2caSopenharmony_ci    }
1778115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1779115cd2caSopenharmony_ci    napi_value result = nullptr;
1780115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1781115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, QUERY_MY_CARD);
1782115cd2caSopenharmony_ci        return result;
1783115cd2caSopenharmony_ci    }
1784115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1785115cd2caSopenharmony_ci    return result;
1786115cd2caSopenharmony_ci}
1787115cd2caSopenharmony_ci
1788115cd2caSopenharmony_ci/**
1789115cd2caSopenharmony_ci * @brief Test interface IS_MY_CARD
1790115cd2caSopenharmony_ci *
1791115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1792115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1793115cd2caSopenharmony_ci *
1794115cd2caSopenharmony_ci * @return The result returned by test
1795115cd2caSopenharmony_ci */
1796115cd2caSopenharmony_cinapi_value IsMyCard(napi_env env, napi_callback_info info)
1797115cd2caSopenharmony_ci{
1798115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1799115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1800115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1801115cd2caSopenharmony_ci    void *data;
1802115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1803115cd2caSopenharmony_ci    bool isStageMode = false;
1804115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1805115cd2caSopenharmony_ci    if (isStageMode) {
1806115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1807115cd2caSopenharmony_ci        switch (argc) {
1808115cd2caSopenharmony_ci            case ARGS_TWO:
1809115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number })) {
1810115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1811115cd2caSopenharmony_ci                }
1812115cd2caSopenharmony_ci                break;
1813115cd2caSopenharmony_ci            case ARGS_THREE:
1814115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number, napi_function })) {
1815115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1816115cd2caSopenharmony_ci                }
1817115cd2caSopenharmony_ci                break;
1818115cd2caSopenharmony_ci            default:
1819115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1820115cd2caSopenharmony_ci                break;
1821115cd2caSopenharmony_ci        }
1822115cd2caSopenharmony_ci    }
1823115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1824115cd2caSopenharmony_ci    napi_value result = nullptr;
1825115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1826115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, IS_MY_CARD);
1827115cd2caSopenharmony_ci        return result;
1828115cd2caSopenharmony_ci    }
1829115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1830115cd2caSopenharmony_ci    return result;
1831115cd2caSopenharmony_ci}
1832115cd2caSopenharmony_ci
1833115cd2caSopenharmony_ci/**
1834115cd2caSopenharmony_ci * @brief Test interface IS_LOCAL_CONTACT
1835115cd2caSopenharmony_ci *
1836115cd2caSopenharmony_ci * @param env Conditions for resolve object interface operation
1837115cd2caSopenharmony_ci * @param info Conditions for resolve object interface operation
1838115cd2caSopenharmony_ci *
1839115cd2caSopenharmony_ci * @return The result returned by test
1840115cd2caSopenharmony_ci */
1841115cd2caSopenharmony_cinapi_value IsLocalContact(napi_env env, napi_callback_info info)
1842115cd2caSopenharmony_ci{
1843115cd2caSopenharmony_ci    size_t argc = MAX_PARAMS;
1844115cd2caSopenharmony_ci    napi_value argv[MAX_PARAMS] = {0};
1845115cd2caSopenharmony_ci    napi_value thisVar = nullptr;
1846115cd2caSopenharmony_ci    void *data;
1847115cd2caSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1848115cd2caSopenharmony_ci    bool isStageMode = false;
1849115cd2caSopenharmony_ci    OHOS::AbilityRuntime::IsStageContext(env, argv[0], isStageMode);
1850115cd2caSopenharmony_ci    if (isStageMode) {
1851115cd2caSopenharmony_ci        napi_value errorCode = ContactsNapiUtils::CreateError(env, PARAMETER_ERROR);
1852115cd2caSopenharmony_ci        switch (argc) {
1853115cd2caSopenharmony_ci            case ARGS_TWO:
1854115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number })) {
1855115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1856115cd2caSopenharmony_ci                }
1857115cd2caSopenharmony_ci                break;
1858115cd2caSopenharmony_ci            case ARGS_THREE:
1859115cd2caSopenharmony_ci                if (!ContactsNapiUtils::MatchParameters(env, argv, { napi_object, napi_number, napi_function })) {
1860115cd2caSopenharmony_ci                    napi_throw(env, errorCode);
1861115cd2caSopenharmony_ci                }
1862115cd2caSopenharmony_ci                break;
1863115cd2caSopenharmony_ci            default:
1864115cd2caSopenharmony_ci                napi_throw(env, errorCode);
1865115cd2caSopenharmony_ci                break;
1866115cd2caSopenharmony_ci        }
1867115cd2caSopenharmony_ci    }
1868115cd2caSopenharmony_ci    ExecuteHelper *executeHelper = new (std::nothrow) ExecuteHelper();
1869115cd2caSopenharmony_ci    napi_value result = nullptr;
1870115cd2caSopenharmony_ci    if (executeHelper != nullptr) {
1871115cd2caSopenharmony_ci        result = Scheduling(env, info, executeHelper, IS_LOCAL_CONTACT);
1872115cd2caSopenharmony_ci        return result;
1873115cd2caSopenharmony_ci    }
1874115cd2caSopenharmony_ci    napi_create_int64(env, ERROR, &result);
1875115cd2caSopenharmony_ci    return result;
1876115cd2caSopenharmony_ci}
1877115cd2caSopenharmony_ci
1878115cd2caSopenharmony_cinapi_value DeclareContactConst(napi_env env, napi_value exports)
1879115cd2caSopenharmony_ci{
1880115cd2caSopenharmony_ci    // Contact
1881115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
1882115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_CONTACT_ID",
1883115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Contacts::INVALID_CONTACT_ID))),
1884115cd2caSopenharmony_ci    };
1885115cd2caSopenharmony_ci    napi_value result = nullptr;
1886115cd2caSopenharmony_ci    napi_define_class(env, "Contact", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
1887115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
1888115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "Contact", result);
1889115cd2caSopenharmony_ci    return exports;
1890115cd2caSopenharmony_ci}
1891115cd2caSopenharmony_ci
1892115cd2caSopenharmony_cinapi_value DeclareEmailConst(napi_env env, napi_value exports)
1893115cd2caSopenharmony_ci{
1894115cd2caSopenharmony_ci    // Email
1895115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
1896115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
1897115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Email::CUSTOM_LABEL))),
1898115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EMAIL_HOME",
1899115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Email::EMAIL_HOME))),
1900115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EMAIL_WORK",
1901115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Email::EMAIL_WORK))),
1902115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EMAIL_OTHER",
1903115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Email::EMAIL_OTHER))),
1904115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
1905115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Email::INVALID_LABEL_ID))),
1906115cd2caSopenharmony_ci    };
1907115cd2caSopenharmony_ci    napi_value result = nullptr;
1908115cd2caSopenharmony_ci    napi_define_class(env, "Email", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
1909115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
1910115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "Email", result);
1911115cd2caSopenharmony_ci    return exports;
1912115cd2caSopenharmony_ci}
1913115cd2caSopenharmony_ci
1914115cd2caSopenharmony_cinapi_value DeclareEventConst(napi_env env, napi_value exports)
1915115cd2caSopenharmony_ci{
1916115cd2caSopenharmony_ci    // Event
1917115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
1918115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
1919115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Event::CUSTOM_LABEL))),
1920115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EVENT_ANNIVERSARY",
1921115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Event::EVENT_ANNIVERSARY))),
1922115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EVENT_OTHER",
1923115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Event::EVENT_OTHER))),
1924115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EVENT_BIRTHDAY",
1925115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Event::EVENT_BIRTHDAY))),
1926115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
1927115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Event::INVALID_LABEL_ID))),
1928115cd2caSopenharmony_ci    };
1929115cd2caSopenharmony_ci    napi_value result = nullptr;
1930115cd2caSopenharmony_ci    napi_define_class(env, "Event", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
1931115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
1932115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "Event", result);
1933115cd2caSopenharmony_ci    return exports;
1934115cd2caSopenharmony_ci}
1935115cd2caSopenharmony_ci
1936115cd2caSopenharmony_cinapi_value DeclareImAddressConst(napi_env env, napi_value exports)
1937115cd2caSopenharmony_ci{
1938115cd2caSopenharmony_ci    // ImAddress
1939115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
1940115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
1941115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::CUSTOM_LABEL))),
1942115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_AIM",
1943115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_AIM))),
1944115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_MSN",
1945115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_MSN))),
1946115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_YAHOO",
1947115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_YAHOO))),
1948115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_SKYPE",
1949115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_SKYPE))),
1950115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_QQ",
1951115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_QQ))),
1952115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_ICQ",
1953115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_ICQ))),
1954115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IM_JABBER",
1955115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::IM_JABBER))),
1956115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
1957115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(ImAddress::INVALID_LABEL_ID))),
1958115cd2caSopenharmony_ci    };
1959115cd2caSopenharmony_ci    napi_value result = nullptr;
1960115cd2caSopenharmony_ci    napi_define_class(env, "ImAddress", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
1961115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
1962115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "ImAddress", result);
1963115cd2caSopenharmony_ci    return exports;
1964115cd2caSopenharmony_ci}
1965115cd2caSopenharmony_ci
1966115cd2caSopenharmony_cinapi_value DeclarePhoneNumberConst(napi_env env, napi_value exports)
1967115cd2caSopenharmony_ci{
1968115cd2caSopenharmony_ci    // PhoneNumber
1969115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
1970115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
1971115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::CUSTOM_LABEL))),
1972115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_HOME",
1973115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_HOME))),
1974115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_MOBILE",
1975115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_MOBILE))),
1976115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_WORK",
1977115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_WORK))),
1978115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_FAX_WORK",
1979115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_FAX_WORK))),
1980115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_FAX_HOME",
1981115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_FAX_HOME))),
1982115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_PAGER",
1983115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_PAGER))),
1984115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_OTHER",
1985115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_OTHER))),
1986115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_CALLBACK",
1987115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_CALLBACK))),
1988115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_CAR",
1989115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_CAR))),
1990115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_COMPANY_MAIN",
1991115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_COMPANY_MAIN))),
1992115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_ISDN",
1993115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_ISDN))),
1994115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_MAIN",
1995115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_MAIN))),
1996115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_OTHER_FAX",
1997115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_OTHER_FAX))),
1998115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_RADIO",
1999115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_RADIO))),
2000115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_TELEX",
2001115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_TELEX))),
2002115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_TTY_TDD",
2003115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_TTY_TDD))),
2004115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_WORK_MOBILE",
2005115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_WORK_MOBILE))),
2006115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_WORK_PAGER",
2007115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_WORK_PAGER))),
2008115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_ASSISTANT",
2009115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_ASSISTANT))),
2010115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUM_MMS",
2011115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::NUM_MMS))),
2012115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
2013115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PhoneNumber::INVALID_LABEL_ID))),
2014115cd2caSopenharmony_ci    };
2015115cd2caSopenharmony_ci    napi_value result = nullptr;
2016115cd2caSopenharmony_ci    napi_define_class(env, "PhoneNumber", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
2017115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
2018115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "PhoneNumber", result);
2019115cd2caSopenharmony_ci    return exports;
2020115cd2caSopenharmony_ci}
2021115cd2caSopenharmony_ci
2022115cd2caSopenharmony_cinapi_value DeclarePostalAddressConst(napi_env env, napi_value exports)
2023115cd2caSopenharmony_ci{
2024115cd2caSopenharmony_ci    // PostalAddress
2025115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
2026115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
2027115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PostalAddress::CUSTOM_LABEL))),
2028115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ADDR_HOME",
2029115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PostalAddress::ADDR_HOME))),
2030115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ADDR_WORK",
2031115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PostalAddress::ADDR_WORK))),
2032115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ADDR_OTHER",
2033115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PostalAddress::ADDR_OTHER))),
2034115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
2035115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(PostalAddress::INVALID_LABEL_ID))),
2036115cd2caSopenharmony_ci    };
2037115cd2caSopenharmony_ci    napi_value result = nullptr;
2038115cd2caSopenharmony_ci    napi_define_class(env, "PostalAddress", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
2039115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
2040115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "PostalAddress", result);
2041115cd2caSopenharmony_ci    return exports;
2042115cd2caSopenharmony_ci}
2043115cd2caSopenharmony_ci
2044115cd2caSopenharmony_cinapi_value DeclareRelationConst(napi_env env, napi_value exports)
2045115cd2caSopenharmony_ci{
2046115cd2caSopenharmony_ci    // Relation
2047115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
2048115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
2049115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::CUSTOM_LABEL))),
2050115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_ASSISTANT",
2051115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_ASSISTANT))),
2052115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_BROTHER",
2053115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_BROTHER))),
2054115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_CHILD",
2055115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_CHILD))),
2056115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_DOMESTIC_PARTNER",
2057115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_DOMESTIC_PARTNER))),
2058115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_FATHER",
2059115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_FATHER))),
2060115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_FRIEND",
2061115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_FRIEND))),
2062115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_MANAGER",
2063115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_MANAGER))),
2064115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_MOTHER",
2065115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_MOTHER))),
2066115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_PARENT",
2067115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_PARENT))),
2068115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_PARTNER",
2069115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_PARTNER))),
2070115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_REFERRED_BY",
2071115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_REFERRED_BY))),
2072115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_RELATIVE",
2073115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_RELATIVE))),
2074115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_SISTER",
2075115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_SISTER))),
2076115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("RELATION_SPOUSE",
2077115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::RELATION_SPOUSE))),
2078115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
2079115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Relation::INVALID_LABEL_ID))),
2080115cd2caSopenharmony_ci    };
2081115cd2caSopenharmony_ci    napi_value result = nullptr;
2082115cd2caSopenharmony_ci    napi_define_class(env, "Relation", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
2083115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
2084115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "Relation", result);
2085115cd2caSopenharmony_ci    return exports;
2086115cd2caSopenharmony_ci}
2087115cd2caSopenharmony_ci
2088115cd2caSopenharmony_cinapi_value DeclareSipAddressConst(napi_env env, napi_value exports)
2089115cd2caSopenharmony_ci{
2090115cd2caSopenharmony_ci    // SipAddress
2091115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
2092115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CUSTOM_LABEL",
2093115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(SipAddress::CUSTOM_LABEL))),
2094115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SIP_HOME",
2095115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(SipAddress::SIP_HOME))),
2096115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SIP_WORK",
2097115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(SipAddress::SIP_WORK))),
2098115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SIP_OTHER",
2099115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(SipAddress::SIP_OTHER))),
2100115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("INVALID_LABEL_ID",
2101115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(SipAddress::INVALID_LABEL_ID))),
2102115cd2caSopenharmony_ci    };
2103115cd2caSopenharmony_ci    napi_value result = nullptr;
2104115cd2caSopenharmony_ci    napi_define_class(env, "SipAddress", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
2105115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
2106115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "SipAddress", result);
2107115cd2caSopenharmony_ci    return exports;
2108115cd2caSopenharmony_ci}
2109115cd2caSopenharmony_ci
2110115cd2caSopenharmony_cinapi_value DeclareAttributeConst(napi_env env, napi_value exports)
2111115cd2caSopenharmony_ci{
2112115cd2caSopenharmony_ci    // Attribute
2113115cd2caSopenharmony_ci    napi_property_descriptor desc[] = {
2114115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_CONTACT_EVENT",
2115115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_CONTACT_EVENT))),
2116115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_EMAIL",
2117115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_EMAIL))),
2118115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_GROUP_MEMBERSHIP",
2119115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_GROUP_MEMBERSHIP))),
2120115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_IM",
2121115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_IM))),
2122115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_NAME",
2123115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_NAME))),
2124115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_NICKNAME",
2125115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_NICKNAME))),
2126115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_NOTE",
2127115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_NOTE))),
2128115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_ORGANIZATION",
2129115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_ORGANIZATION))),
2130115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_PHONE",
2131115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_PHONE))),
2132115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_PORTRAIT",
2133115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_PORTRAIT))),
2134115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_POSTAL_ADDRESS",
2135115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_POSTAL_ADDRESS))),
2136115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_RELATION",
2137115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_RELATION))),
2138115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_SIP_ADDRESS",
2139115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_SIP_ADDRESS))),
2140115cd2caSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ATTR_WEBSITE",
2141115cd2caSopenharmony_ci            ContactsNapiUtils::ToInt32Value(env, static_cast<int32_t>(Attribute::ATTR_WEBSITE))),
2142115cd2caSopenharmony_ci    };
2143115cd2caSopenharmony_ci    napi_value result = nullptr;
2144115cd2caSopenharmony_ci    napi_define_class(env, "Attribute", NAPI_AUTO_LENGTH, ContactsNapiUtils::CreateClassConstructor, nullptr,
2145115cd2caSopenharmony_ci        sizeof(desc) / sizeof(*desc), desc, &result);
2146115cd2caSopenharmony_ci    napi_set_named_property(env, exports, "Attribute", result);
2147115cd2caSopenharmony_ci    return exports;
2148115cd2caSopenharmony_ci}
2149115cd2caSopenharmony_ci
2150115cd2caSopenharmony_civoid Init(napi_env env, napi_value exports)
2151115cd2caSopenharmony_ci{
2152115cd2caSopenharmony_ci    napi_property_descriptor exportFuncs[] = {
2153115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("addContact", OHOS::ContactsApi::AddContact),
2154115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("deleteContact", OHOS::ContactsApi::DeleteContact),
2155115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("updateContact", OHOS::ContactsApi::UpdateContact),
2156115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryContact", OHOS::ContactsApi::QueryContact),
2157115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryContacts", OHOS::ContactsApi::QueryContacts),
2158115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryContactsByEmail", OHOS::ContactsApi::QueryContactsByEmail),
2159115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryContactsByPhoneNumber", OHOS::ContactsApi::QueryContactsByPhoneNumber),
2160115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryGroups", OHOS::ContactsApi::QueryGroups),
2161115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryHolders", OHOS::ContactsApi::QueryHolders),
2162115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryKey", OHOS::ContactsApi::QueryKey),
2163115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("queryMyCard", OHOS::ContactsApi::QueryMyCard),
2164115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("isMyCard", OHOS::ContactsApi::IsMyCard),
2165115cd2caSopenharmony_ci        DECLARE_NAPI_FUNCTION("isLocalContact", OHOS::ContactsApi::IsLocalContact),
2166115cd2caSopenharmony_ci    };
2167115cd2caSopenharmony_ci    napi_define_properties(env, exports, sizeof(exportFuncs) / sizeof(*exportFuncs), exportFuncs);
2168115cd2caSopenharmony_ci    // Declare class const initialization
2169115cd2caSopenharmony_ci    DeclareContactConst(env, exports);
2170115cd2caSopenharmony_ci    DeclareEmailConst(env, exports);
2171115cd2caSopenharmony_ci    DeclareEventConst(env, exports);
2172115cd2caSopenharmony_ci    DeclareImAddressConst(env, exports);
2173115cd2caSopenharmony_ci    DeclarePhoneNumberConst(env, exports);
2174115cd2caSopenharmony_ci    DeclarePostalAddressConst(env, exports);
2175115cd2caSopenharmony_ci    DeclareRelationConst(env, exports);
2176115cd2caSopenharmony_ci    DeclareSipAddressConst(env, exports);
2177115cd2caSopenharmony_ci    DeclareAttributeConst(env, exports);
2178115cd2caSopenharmony_ci}
2179115cd2caSopenharmony_ci} // namespace ContactsApi
2180115cd2caSopenharmony_ci} // namespace OHOS
2181