/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.base.service;
import static com.axelor.common.StringUtils.isBlank;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Singleton;
import javax.mail.internet.InternetAddress;
import com.axelor.apps.base.db.Partner;
import com.axelor.apps.base.db.repo.PartnerRepository;
import com.axelor.apps.message.service.MailServiceMessageImpl;
import com.axelor.auth.db.User;
import com.axelor.auth.db.repo.UserRepository;
import com.axelor.db.Model;
import com.axelor.db.Query;
import com.axelor.exception.service.TraceBackService;
import com.axelor.inject.Beans;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
@Singleton
public class MailServiceBaseImpl extends MailServiceMessageImpl{
@Override
public Model resolve(String email) {
final UserRepository users = Beans.get(UserRepository.class);
final User user = users.all().filter("self.partner.emailAddress.address = ?1", email).fetchOne();
if (user != null) {
return user;
}
final PartnerRepository partners = Beans.get(PartnerRepository.class);
final Partner partner = partners.all().filter("self.emailAddress.address = ?1", email).fetchOne();
if (partner != null) {
return partner;
}
return super.resolve(email);
}
@Override
public List<InternetAddress> findEmails(String matching, List<String> selected, int maxResult) {
//Users
List<String> selectedWithoutNull = new ArrayList<String>(selected);
for (int i = 0; i < selected.size() ; i++) {
if(Strings.isNullOrEmpty(selected.get(i))) selectedWithoutNull.remove(i);
}
final List<String> where = new ArrayList<>();
final Map<String, Object> params = new HashMap<>();
where.add("((self.partner is not null AND self.partner.emailAddress is not null) OR (self.email is not null))");
if (!isBlank(matching)) {
where.add("(LOWER(self.partner.emailAddress.address) like LOWER(:email) OR LOWER(self.partner.fullName) like LOWER(:email) OR LOWER(self.email) like LOWER(:email) OR LOWER(self.name) like LOWER(:email))");
params.put("email", "%" + matching + "%");
}
if (selectedWithoutNull != null && !selectedWithoutNull.isEmpty()) {
where.add("self.partner.emailAddress.address not in (:selected)");
params.put("selected", selectedWithoutNull);
}
final String filter = Joiner.on(" AND ").join(where);
final Query<User> query = Query.of(User.class);
if (!isBlank(filter)) {
query.filter(filter);
query.bind(params);
}
final List<InternetAddress> addresses = new ArrayList<>();
for (User user : query.fetch(maxResult)) {
try {
if(user.getPartner().getEmailAddress() != null && !Strings.isNullOrEmpty(user.getPartner().getEmailAddress().getAddress())){
final InternetAddress item = new InternetAddress(user.getPartner().getEmailAddress().getAddress(), user.getFullName());
addresses.add(item);
selectedWithoutNull.add(user.getPartner().getEmailAddress().getAddress());
}
else if(!Strings.isNullOrEmpty(user.getEmail())){
final InternetAddress item = new InternetAddress(user.getEmail(), user.getFullName());
addresses.add(item);
selectedWithoutNull.add(user.getEmail());
}
} catch (UnsupportedEncodingException e) {
TraceBackService.trace(e);
}
}
//Partners
final List<String> where2 = new ArrayList<>();
final Map<String, Object> params2 = new HashMap<>();
where2.add("self.emailAddress is not null");
if (!isBlank(matching)) {
where2.add("(LOWER(self.emailAddress.address) like LOWER(:email) OR LOWER(self.fullName) like LOWER(:email))");
params2.put("email", "%" + matching + "%");
}
if (selectedWithoutNull != null && !selectedWithoutNull.isEmpty()) {
where2.add("self.emailAddress.address not in (:selected)");
params2.put("selected", selectedWithoutNull);
}
final String filter2 = Joiner.on(" AND ").join(where2);
final Query<Partner> query2 = Query.of(Partner.class);
if (!isBlank(filter2)) {
query2.filter(filter2);
query2.bind(params2);
}
for (Partner partner : query2.fetch(maxResult)) {
try {
if(partner.getEmailAddress() != null && !Strings.isNullOrEmpty(partner.getEmailAddress().getAddress())){
final InternetAddress item = new InternetAddress(partner.getEmailAddress().getAddress(), partner.getFullName());
addresses.add(item);
}
} catch (UnsupportedEncodingException e) {
TraceBackService.trace(e);
}
}
return addresses;
}
}