1048147e0Sopenharmony_ci/**
2048147e0Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3048147e0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4048147e0Sopenharmony_ci * you may not use this file except in compliance with the License.
5048147e0Sopenharmony_ci * You may obtain a copy of the License at
6048147e0Sopenharmony_ci *
7048147e0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8048147e0Sopenharmony_ci *
9048147e0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10048147e0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11048147e0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12048147e0Sopenharmony_ci * See the License for the specific language governing permissions and
13048147e0Sopenharmony_ci * limitations under the License.
14048147e0Sopenharmony_ci */
15048147e0Sopenharmony_ciimport dataShare from '@ohos.data.dataShare';
16048147e0Sopenharmony_ciimport dataSharePredicates from '@ohos.data.dataSharePredicates';
17048147e0Sopenharmony_ci
18048147e0Sopenharmony_ciimport BaseModel from './BaseModel';
19048147e0Sopenharmony_ciimport common from '../data/commonData';
20048147e0Sopenharmony_ciimport HiLog from '../utils/HiLog';
21048147e0Sopenharmony_ciimport mmsTable from '../data/tableData';
22048147e0Sopenharmony_ciimport LooseObject from '../data/LooseObject'
23048147e0Sopenharmony_ci
24048147e0Sopenharmony_ciconst TAG = 'ContactsModel';
25048147e0Sopenharmony_ci
26048147e0Sopenharmony_ciexport default class ContactsModel extends BaseModel {
27048147e0Sopenharmony_ci  public async queryContactDataByCondition(actionData, callback, context): Promise<void> {
28048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
29048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData);
30048147e0Sopenharmony_ci    let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI;
31048147e0Sopenharmony_ci    dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => {
32048147e0Sopenharmony_ci      let resultList: Array<LooseObject> = [];
33048147e0Sopenharmony_ci      if (resultSet.rowCount > 0) {
34048147e0Sopenharmony_ci        while (resultSet.goToNextRow()) {
35048147e0Sopenharmony_ci          resultList.push(this.buildContactDataResult(resultSet));
36048147e0Sopenharmony_ci        }
37048147e0Sopenharmony_ci      }
38048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
39048147e0Sopenharmony_ci      resultSet.close();
40048147e0Sopenharmony_ci    }).catch(error => {
41048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryContactDataByCondition fail, error: ' + JSON.stringify(error));
42048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
43048147e0Sopenharmony_ci    });
44048147e0Sopenharmony_ci  }
45048147e0Sopenharmony_ci
46048147e0Sopenharmony_ci  public async queryContactDataSizeByCondition(actionData, callback, context): Promise<void> {
47048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
48048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData);
49048147e0Sopenharmony_ci    let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI;
50048147e0Sopenharmony_ci    dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => {
51048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
52048147e0Sopenharmony_ci      resultSet.close();
53048147e0Sopenharmony_ci    }).catch(error => {
54048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryContactDataSizeByCondition fail, error: ' + JSON.stringify(error));
55048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
56048147e0Sopenharmony_ci    });
57048147e0Sopenharmony_ci  }
58048147e0Sopenharmony_ci
59048147e0Sopenharmony_ci  public async queryContactByCondition(actionData, callback, context): Promise<void> {
60048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
61048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData);
62048147e0Sopenharmony_ci    let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI;
63048147e0Sopenharmony_ci    dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => {
64048147e0Sopenharmony_ci      let resultList: Array<LooseObject> = [];
65048147e0Sopenharmony_ci      if (resultSet.rowCount > 0) {
66048147e0Sopenharmony_ci        while (resultSet.goToNextRow()) {
67048147e0Sopenharmony_ci          resultList.push(this.buildContactResult(resultSet));
68048147e0Sopenharmony_ci        }
69048147e0Sopenharmony_ci      }
70048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
71048147e0Sopenharmony_ci      resultSet.close();
72048147e0Sopenharmony_ci    }).catch(error => {
73048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryContactByCondition fail, error: ' + JSON.stringify(error));
74048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
75048147e0Sopenharmony_ci    });
76048147e0Sopenharmony_ci  }
77048147e0Sopenharmony_ci
78048147e0Sopenharmony_ci  public async queryContactSizeByCondition(actionData, callback, context): Promise<void> {
79048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
80048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData);
81048147e0Sopenharmony_ci    let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI;
82048147e0Sopenharmony_ci    dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => {
83048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
84048147e0Sopenharmony_ci      resultSet.close();
85048147e0Sopenharmony_ci    }).catch(error => {
86048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryContactSizeByCondition fail, error: ' + JSON.stringify(error));
87048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
88048147e0Sopenharmony_ci    });
89048147e0Sopenharmony_ci  }
90048147e0Sopenharmony_ci
91048147e0Sopenharmony_ci  public async queryRawContactSizeByCondition(actionData, callback, context): Promise<void> {
92048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
93048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryRawContactCondition(actionData);
94048147e0Sopenharmony_ci    let rawContactUri: string = common.string.URI_ROW_CONTACTS + common.string.PROFILE_DATA_URI;
95048147e0Sopenharmony_ci    dataHelper.query(rawContactUri, condition, this.buildRawContactTablePartColumns()).then(resultSet => {
96048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
97048147e0Sopenharmony_ci      resultSet.close();
98048147e0Sopenharmony_ci    }).catch(error => {
99048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryRawContactSizeByCondition fail, error: ' + JSON.stringify(error));
100048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
101048147e0Sopenharmony_ci    });
102048147e0Sopenharmony_ci  }
103048147e0Sopenharmony_ci
104048147e0Sopenharmony_ci  public async queryContactViewByCondition(actionData, callback, context): Promise<void> {
105048147e0Sopenharmony_ci    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
106048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactViewCondition(actionData);
107048147e0Sopenharmony_ci    let searchContactViewUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_SEARCHE;
108048147e0Sopenharmony_ci    dataHelper.query(searchContactViewUri, condition, this.buildRawContactViewPartColumns()).then(resultSet => {
109048147e0Sopenharmony_ci      let resultList: Array<LooseObject> = [];
110048147e0Sopenharmony_ci      if (resultSet.rowCount > 0) {
111048147e0Sopenharmony_ci        while (resultSet.goToNextRow()) {
112048147e0Sopenharmony_ci          resultList.push(this.buildContactViewResult(resultSet));
113048147e0Sopenharmony_ci        }
114048147e0Sopenharmony_ci      }
115048147e0Sopenharmony_ci      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
116048147e0Sopenharmony_ci      resultSet.close();
117048147e0Sopenharmony_ci    }).catch(error => {
118048147e0Sopenharmony_ci      HiLog.e(TAG, 'queryContactViewByCondition fail, error: ' + JSON.stringify(error));
119048147e0Sopenharmony_ci      callback(this.encapsulateReturnCode(common.int.FAILURE));
120048147e0Sopenharmony_ci    });
121048147e0Sopenharmony_ci  }
122048147e0Sopenharmony_ci
123048147e0Sopenharmony_ci  private buildContactDataTablePartColumns(): Array<string> {
124048147e0Sopenharmony_ci    // part of contact_data table columns
125048147e0Sopenharmony_ci    return [
126048147e0Sopenharmony_ci    mmsTable.contactDataColumns.detailInfo,
127048147e0Sopenharmony_ci    mmsTable.contactDataColumns.displayName,
128048147e0Sopenharmony_ci    ];
129048147e0Sopenharmony_ci  }
130048147e0Sopenharmony_ci
131048147e0Sopenharmony_ci  private buildContactTablePartColumns(): Array<string> {
132048147e0Sopenharmony_ci    // part of contact table columns
133048147e0Sopenharmony_ci    return [
134048147e0Sopenharmony_ci    mmsTable.contactColumns.id
135048147e0Sopenharmony_ci    ];
136048147e0Sopenharmony_ci  }
137048147e0Sopenharmony_ci
138048147e0Sopenharmony_ci  private buildRawContactTablePartColumns(): Array<string> {
139048147e0Sopenharmony_ci    // part of raw_contact table columns
140048147e0Sopenharmony_ci    return [
141048147e0Sopenharmony_ci    mmsTable.contactDataColumns.id
142048147e0Sopenharmony_ci    ];
143048147e0Sopenharmony_ci  }
144048147e0Sopenharmony_ci
145048147e0Sopenharmony_ci  private buildRawContactViewPartColumns(): Array<string> {
146048147e0Sopenharmony_ci    // part of contact view table columns
147048147e0Sopenharmony_ci    return [
148048147e0Sopenharmony_ci    mmsTable.searchContactView.detailInfo,
149048147e0Sopenharmony_ci    mmsTable.searchContactView.displayName
150048147e0Sopenharmony_ci    ];
151048147e0Sopenharmony_ci  }
152048147e0Sopenharmony_ci
153048147e0Sopenharmony_ci  private buildContactDataResult(resultSet): LooseObject {
154048147e0Sopenharmony_ci    let result: LooseObject = {};
155048147e0Sopenharmony_ci    result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo));
156048147e0Sopenharmony_ci    result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName));
157048147e0Sopenharmony_ci    return result;
158048147e0Sopenharmony_ci  }
159048147e0Sopenharmony_ci
160048147e0Sopenharmony_ci  private buildContactResult(resultSet): LooseObject {
161048147e0Sopenharmony_ci    let result: LooseObject = {};
162048147e0Sopenharmony_ci    result.id = Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.contactColumns.id)));
163048147e0Sopenharmony_ci    return result;
164048147e0Sopenharmony_ci  }
165048147e0Sopenharmony_ci
166048147e0Sopenharmony_ci  private buildContactViewResult(resultSet): LooseObject {
167048147e0Sopenharmony_ci    let result: LooseObject = {};
168048147e0Sopenharmony_ci    result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo));
169048147e0Sopenharmony_ci    result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName));
170048147e0Sopenharmony_ci    return result;
171048147e0Sopenharmony_ci  }
172048147e0Sopenharmony_ci
173048147e0Sopenharmony_ci  private buildQueryContactDataCondition(actionData): dataSharePredicates.DataSharePredicates {
174048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
175048147e0Sopenharmony_ci    condition.equalTo(mmsTable.contactDataColumns.typeId, '5');
176048147e0Sopenharmony_ci    if (actionData.hasDelete != null) {
177048147e0Sopenharmony_ci      condition.and().equalTo(mmsTable.contactDataColumns.hasDelete, actionData.hasDelete);
178048147e0Sopenharmony_ci    }
179048147e0Sopenharmony_ci    if (actionData.contactIds != null && actionData.contactIds.length > 0) {
180048147e0Sopenharmony_ci      condition.and().in(mmsTable.contactDataColumns.contactId, actionData.contactIds);
181048147e0Sopenharmony_ci    }
182048147e0Sopenharmony_ci    if (actionData.telephones != null && actionData.telephones.length > 0) {
183048147e0Sopenharmony_ci      condition.and().in(mmsTable.contactDataColumns.detailInfo, actionData.telephones);
184048147e0Sopenharmony_ci    }
185048147e0Sopenharmony_ci    return condition;
186048147e0Sopenharmony_ci  }
187048147e0Sopenharmony_ci
188048147e0Sopenharmony_ci  private buildQueryContactCondition(actionData): dataSharePredicates.DataSharePredicates {
189048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
190048147e0Sopenharmony_ci    condition.isNotNull(mmsTable.contactColumns.id);
191048147e0Sopenharmony_ci    if (actionData.page != null && actionData.limit != null) {
192048147e0Sopenharmony_ci      let offset: number = (actionData.page - 1) * actionData.limit;
193048147e0Sopenharmony_ci      condition.and().limit(actionData.limit, offset);
194048147e0Sopenharmony_ci    }
195048147e0Sopenharmony_ci    if (actionData.telephone != null) {
196048147e0Sopenharmony_ci      condition.and()
197048147e0Sopenharmony_ci        .equalTo(mmsTable.searchContactView.contentType, 'phone')
198048147e0Sopenharmony_ci        .beginWrap()
199048147e0Sopenharmony_ci        .contains(mmsTable.searchContactView.displayName, actionData.telephone)
200048147e0Sopenharmony_ci        .or()
201048147e0Sopenharmony_ci        .contains(mmsTable.searchContactView.detailInfo, actionData.telephone)
202048147e0Sopenharmony_ci        .endWrap();
203048147e0Sopenharmony_ci    }
204048147e0Sopenharmony_ci    if (actionData.orderByTimeDesc != null) {
205048147e0Sopenharmony_ci      condition.orderByDesc(mmsTable.contactColumns.lastestContactedTime);
206048147e0Sopenharmony_ci    }
207048147e0Sopenharmony_ci    return condition;
208048147e0Sopenharmony_ci  }
209048147e0Sopenharmony_ci
210048147e0Sopenharmony_ci  private buildQueryRawContactCondition(actionData): dataSharePredicates.DataSharePredicates {
211048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
212048147e0Sopenharmony_ci    return condition;
213048147e0Sopenharmony_ci  }
214048147e0Sopenharmony_ci
215048147e0Sopenharmony_ci  private buildQueryContactViewCondition(actionData): dataSharePredicates.DataSharePredicates {
216048147e0Sopenharmony_ci    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
217048147e0Sopenharmony_ci    condition.equalTo(mmsTable.searchContactView.contentType, 'phone')
218048147e0Sopenharmony_ci      .beginWrap()
219048147e0Sopenharmony_ci      .contains(mmsTable.searchContactView.displayName, actionData.telephone)
220048147e0Sopenharmony_ci      .or()
221048147e0Sopenharmony_ci      .contains(mmsTable.searchContactView.detailInfo, actionData.telephone)
222048147e0Sopenharmony_ci      .endWrap();
223048147e0Sopenharmony_ci    return condition;
224048147e0Sopenharmony_ci  }
225048147e0Sopenharmony_ci}