1/**
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15import dataShare from '@ohos.data.dataShare';
16import dataSharePredicates from '@ohos.data.dataSharePredicates';
17
18import BaseModel from './BaseModel';
19import common from '../data/commonData';
20import HiLog from '../utils/HiLog';
21import mmsTable from '../data/tableData';
22import LooseObject from '../data/LooseObject'
23
24const TAG = 'ContactsModel';
25
26export default class ContactsModel extends BaseModel {
27  public async queryContactDataByCondition(actionData, callback, context): Promise<void> {
28    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
29    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData);
30    let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI;
31    dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => {
32      let resultList: Array<LooseObject> = [];
33      if (resultSet.rowCount > 0) {
34        while (resultSet.goToNextRow()) {
35          resultList.push(this.buildContactDataResult(resultSet));
36        }
37      }
38      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
39      resultSet.close();
40    }).catch(error => {
41      HiLog.e(TAG, 'queryContactDataByCondition fail, error: ' + JSON.stringify(error));
42      callback(this.encapsulateReturnCode(common.int.FAILURE));
43    });
44  }
45
46  public async queryContactDataSizeByCondition(actionData, callback, context): Promise<void> {
47    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
48    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData);
49    let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI;
50    dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => {
51      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
52      resultSet.close();
53    }).catch(error => {
54      HiLog.e(TAG, 'queryContactDataSizeByCondition fail, error: ' + JSON.stringify(error));
55      callback(this.encapsulateReturnCode(common.int.FAILURE));
56    });
57  }
58
59  public async queryContactByCondition(actionData, callback, context): Promise<void> {
60    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
61    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData);
62    let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI;
63    dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => {
64      let resultList: Array<LooseObject> = [];
65      if (resultSet.rowCount > 0) {
66        while (resultSet.goToNextRow()) {
67          resultList.push(this.buildContactResult(resultSet));
68        }
69      }
70      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
71      resultSet.close();
72    }).catch(error => {
73      HiLog.e(TAG, 'queryContactByCondition fail, error: ' + JSON.stringify(error));
74      callback(this.encapsulateReturnCode(common.int.FAILURE));
75    });
76  }
77
78  public async queryContactSizeByCondition(actionData, callback, context): Promise<void> {
79    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
80    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData);
81    let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI;
82    dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => {
83      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
84      resultSet.close();
85    }).catch(error => {
86      HiLog.e(TAG, 'queryContactSizeByCondition fail, error: ' + JSON.stringify(error));
87      callback(this.encapsulateReturnCode(common.int.FAILURE));
88    });
89  }
90
91  public async queryRawContactSizeByCondition(actionData, callback, context): Promise<void> {
92    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
93    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryRawContactCondition(actionData);
94    let rawContactUri: string = common.string.URI_ROW_CONTACTS + common.string.PROFILE_DATA_URI;
95    dataHelper.query(rawContactUri, condition, this.buildRawContactTablePartColumns()).then(resultSet => {
96      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount));
97      resultSet.close();
98    }).catch(error => {
99      HiLog.e(TAG, 'queryRawContactSizeByCondition fail, error: ' + JSON.stringify(error));
100      callback(this.encapsulateReturnCode(common.int.FAILURE));
101    });
102  }
103
104  public async queryContactViewByCondition(actionData, callback, context): Promise<void> {
105    let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS);
106    let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactViewCondition(actionData);
107    let searchContactViewUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_SEARCHE;
108    dataHelper.query(searchContactViewUri, condition, this.buildRawContactViewPartColumns()).then(resultSet => {
109      let resultList: Array<LooseObject> = [];
110      if (resultSet.rowCount > 0) {
111        while (resultSet.goToNextRow()) {
112          resultList.push(this.buildContactViewResult(resultSet));
113        }
114      }
115      callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList));
116      resultSet.close();
117    }).catch(error => {
118      HiLog.e(TAG, 'queryContactViewByCondition fail, error: ' + JSON.stringify(error));
119      callback(this.encapsulateReturnCode(common.int.FAILURE));
120    });
121  }
122
123  private buildContactDataTablePartColumns(): Array<string> {
124    // part of contact_data table columns
125    return [
126    mmsTable.contactDataColumns.detailInfo,
127    mmsTable.contactDataColumns.displayName,
128    ];
129  }
130
131  private buildContactTablePartColumns(): Array<string> {
132    // part of contact table columns
133    return [
134    mmsTable.contactColumns.id
135    ];
136  }
137
138  private buildRawContactTablePartColumns(): Array<string> {
139    // part of raw_contact table columns
140    return [
141    mmsTable.contactDataColumns.id
142    ];
143  }
144
145  private buildRawContactViewPartColumns(): Array<string> {
146    // part of contact view table columns
147    return [
148    mmsTable.searchContactView.detailInfo,
149    mmsTable.searchContactView.displayName
150    ];
151  }
152
153  private buildContactDataResult(resultSet): LooseObject {
154    let result: LooseObject = {};
155    result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo));
156    result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName));
157    return result;
158  }
159
160  private buildContactResult(resultSet): LooseObject {
161    let result: LooseObject = {};
162    result.id = Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.contactColumns.id)));
163    return result;
164  }
165
166  private buildContactViewResult(resultSet): LooseObject {
167    let result: LooseObject = {};
168    result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo));
169    result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName));
170    return result;
171  }
172
173  private buildQueryContactDataCondition(actionData): dataSharePredicates.DataSharePredicates {
174    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
175    condition.equalTo(mmsTable.contactDataColumns.typeId, '5');
176    if (actionData.hasDelete != null) {
177      condition.and().equalTo(mmsTable.contactDataColumns.hasDelete, actionData.hasDelete);
178    }
179    if (actionData.contactIds != null && actionData.contactIds.length > 0) {
180      condition.and().in(mmsTable.contactDataColumns.contactId, actionData.contactIds);
181    }
182    if (actionData.telephones != null && actionData.telephones.length > 0) {
183      condition.and().in(mmsTable.contactDataColumns.detailInfo, actionData.telephones);
184    }
185    return condition;
186  }
187
188  private buildQueryContactCondition(actionData): dataSharePredicates.DataSharePredicates {
189    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
190    condition.isNotNull(mmsTable.contactColumns.id);
191    if (actionData.page != null && actionData.limit != null) {
192      let offset: number = (actionData.page - 1) * actionData.limit;
193      condition.and().limit(actionData.limit, offset);
194    }
195    if (actionData.telephone != null) {
196      condition.and()
197        .equalTo(mmsTable.searchContactView.contentType, 'phone')
198        .beginWrap()
199        .contains(mmsTable.searchContactView.displayName, actionData.telephone)
200        .or()
201        .contains(mmsTable.searchContactView.detailInfo, actionData.telephone)
202        .endWrap();
203    }
204    if (actionData.orderByTimeDesc != null) {
205      condition.orderByDesc(mmsTable.contactColumns.lastestContactedTime);
206    }
207    return condition;
208  }
209
210  private buildQueryRawContactCondition(actionData): dataSharePredicates.DataSharePredicates {
211    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
212    return condition;
213  }
214
215  private buildQueryContactViewCondition(actionData): dataSharePredicates.DataSharePredicates {
216    let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
217    condition.equalTo(mmsTable.searchContactView.contentType, 'phone')
218      .beginWrap()
219      .contains(mmsTable.searchContactView.displayName, actionData.telephone)
220      .or()
221      .contains(mmsTable.searchContactView.detailInfo, actionData.telephone)
222      .endWrap();
223    return condition;
224  }
225}